Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions tests/Tests.FeatureManagement/FeatureManagement.cs
Original file line number Diff line number Diff line change
Expand Up @@ -343,11 +343,7 @@ public async Task TimeWindow()
Assert.False(await featureManager.IsEnabledAsync(feature4));
Assert.True(await featureManager.IsEnabledAsync(feature5));
Assert.False(await featureManager.IsEnabledAsync(feature6));

for (int i = 0; i < 10; i++)
{
Assert.True(await featureManager.IsEnabledAsync(Features.RecurringTimeWindowTestFeature));
}
Assert.True(await featureManager.IsEnabledAsync(Features.RecurringTimeWindowTestFeature));
}

[Fact]
Expand Down
112 changes: 79 additions & 33 deletions tests/Tests.FeatureManagement/RecurrenceEvaluation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1618,122 +1618,168 @@ public async void RecurrenceEvaluationThroughCacheTest()
{
OnDemandClock mockedTimeProvider = new OnDemandClock();

IMemoryCache cache = new MemoryCache(new MemoryCacheOptions());

var mockedTimeWindowFilter = new TimeWindowFilter()
{
Cache = new MemoryCache(new MemoryCacheOptions()),
Cache = cache,
SystemClock = mockedTimeProvider
};

var context = new FeatureFilterEvaluationContext()
TimeWindowFilterSettings settings = new TimeWindowFilterSettings()
{
Settings = new TimeWindowFilterSettings()
Start = DateTimeOffset.Parse("2024-2-1T00:00:00+08:00"), // Thursday
End = DateTimeOffset.Parse("2024-2-1T12:00:00+08:00"),
Recurrence = new Recurrence()
{
Start = DateTimeOffset.Parse("2024-2-1T00:00:00+08:00"), // Thursday
End = DateTimeOffset.Parse("2024-2-1T12:00:00+08:00"),
Recurrence = new Recurrence()
Pattern = new RecurrencePattern()
{
Pattern = new RecurrencePattern()
{
Type = RecurrencePatternType.Daily,
Interval = 2
},
Range = new RecurrenceRange()
{
Type = RecurrenceRangeType.EndDate,
EndDate = DateTimeOffset.Parse("2024-2-5T12:00:00+08:00")
}
Type = RecurrencePatternType.Daily,
Interval = 2
},
Range = new RecurrenceRange()
{
Type = RecurrenceRangeType.EndDate,
EndDate = DateTimeOffset.Parse("2024-2-5T12:00:00+08:00")
}
}
};

mockedTimeProvider.UtcNow = DateTimeOffset.Parse("2024-2-2T23:00:00+08:00");
var context = new FeatureFilterEvaluationContext()
{
Settings = settings
};

DateTimeOffset? closestStart;
Assert.False(cache.TryGetValue(settings, out closestStart));

mockedTimeProvider.UtcNow = DateTimeOffset.Parse("2024-2-2T23:00:00+08:00");
Assert.False(await mockedTimeWindowFilter.EvaluateAsync(context));
Assert.True(cache.TryGetValue(settings, out closestStart));
Assert.Equal(DateTimeOffset.Parse("2024-2-3T00:00:00+08:00"), closestStart);

for (int i = 0; i < 12; i++)
{
mockedTimeProvider.UtcNow = mockedTimeProvider.UtcNow.AddHours(1);
Assert.True(await mockedTimeWindowFilter.EvaluateAsync(context));
Assert.True(cache.TryGetValue(settings, out closestStart));
Assert.Equal(DateTimeOffset.Parse("2024-2-3T00:00:00+08:00"), closestStart);
}

mockedTimeProvider.UtcNow = DateTimeOffset.Parse("2024-2-3T11:59:59+08:00");
Assert.True(await mockedTimeWindowFilter.EvaluateAsync(context));
Assert.True(cache.TryGetValue(settings, out closestStart));
Assert.Equal(DateTimeOffset.Parse("2024-2-3T00:00:00+08:00"), closestStart);

mockedTimeProvider.UtcNow = DateTimeOffset.Parse("2024-2-3T12:00:00+08:00");
Assert.False(await mockedTimeWindowFilter.EvaluateAsync(context));
Assert.True(cache.TryGetValue(settings, out closestStart));
Assert.Equal(DateTimeOffset.Parse("2024-2-5T00:00:00+08:00"), closestStart);

mockedTimeProvider.UtcNow = DateTimeOffset.Parse("2024-2-5T00:00:00+08:00");
Assert.True(await mockedTimeWindowFilter.EvaluateAsync(context));
Assert.True(cache.TryGetValue(settings, out closestStart));
Assert.Equal(DateTimeOffset.Parse("2024-2-5T00:00:00+08:00"), closestStart);

mockedTimeProvider.UtcNow = DateTimeOffset.Parse("2024-2-5T12:00:00+08:00");
Assert.False(await mockedTimeWindowFilter.EvaluateAsync(context));
Assert.True(cache.TryGetValue(settings, out closestStart));
Assert.Null(closestStart);

mockedTimeProvider.UtcNow = DateTimeOffset.Parse("2024-2-7T00:00:00+08:00");
Assert.False(await mockedTimeWindowFilter.EvaluateAsync(context));
Assert.True(cache.TryGetValue(settings, out closestStart));
Assert.Null(closestStart);

for (int i = 0; i < 10; i++ )
{
mockedTimeProvider.UtcNow = mockedTimeProvider.UtcNow.AddDays(1);
Assert.False(await mockedTimeWindowFilter.EvaluateAsync(context));
Assert.True(cache.TryGetValue(settings, out closestStart));
Assert.Null(closestStart);
}

context = new FeatureFilterEvaluationContext()
settings = new TimeWindowFilterSettings()
{
Settings = new TimeWindowFilterSettings()
Start = DateTimeOffset.Parse("2024-2-1T00:00:00+08:00"), // Thursday
End = DateTimeOffset.Parse("2024-2-1T12:00:00+08:00"),
Recurrence = new Recurrence()
{
Start = DateTimeOffset.Parse("2024-2-1T00:00:00+08:00"), // Thursday
End = DateTimeOffset.Parse("2024-2-1T12:00:00+08:00"),
Recurrence = new Recurrence()
Pattern = new RecurrencePattern()
{
Pattern = new RecurrencePattern()
{
Type = RecurrencePatternType.Weekly,
// FirstDayOfWeek is Sunday by default.
DaysOfWeek = new List<DayOfWeek>() { DayOfWeek.Thursday, DayOfWeek.Sunday }
},
Range = new RecurrenceRange()
{
Type = RecurrenceRangeType.Numbered,
NumberOfOccurrences = 2
}
Type = RecurrencePatternType.Weekly,
// FirstDayOfWeek is Sunday by default.
DaysOfWeek = new List<DayOfWeek>() { DayOfWeek.Thursday, DayOfWeek.Sunday }
},
Range = new RecurrenceRange()
{
Type = RecurrenceRangeType.Numbered,
NumberOfOccurrences = 2
}
}
};

context = new FeatureFilterEvaluationContext()
{
Settings = settings
};

Assert.False(cache.TryGetValue(settings, out closestStart));

mockedTimeProvider.UtcNow = DateTimeOffset.Parse("2024-1-31T23:00:00+08:00");
Assert.False(await mockedTimeWindowFilter.EvaluateAsync(context));
Assert.True(cache.TryGetValue(settings, out closestStart));
Assert.Equal(DateTimeOffset.Parse("2024-2-1T00:00:00+08:00"), closestStart);

for (int i = 0; i < 12; i++)
{
mockedTimeProvider.UtcNow = mockedTimeProvider.UtcNow.AddHours(1);
Assert.True(await mockedTimeWindowFilter.EvaluateAsync(context));
Assert.True(cache.TryGetValue(settings, out closestStart));
Assert.Equal(DateTimeOffset.Parse("2024-2-1T00:00:00+08:00"), closestStart);
}

mockedTimeProvider.UtcNow = DateTimeOffset.Parse("2024-2-1T11:59:59+08:00");
Assert.True(await mockedTimeWindowFilter.EvaluateAsync(context));
Assert.True(cache.TryGetValue(settings, out closestStart));
Assert.Equal(DateTimeOffset.Parse("2024-2-1T00:00:00+08:00"), closestStart);

mockedTimeProvider.UtcNow = DateTimeOffset.Parse("2024-2-1T12:00:00+08:00");
Assert.False(await mockedTimeWindowFilter.EvaluateAsync(context));
Assert.True(cache.TryGetValue(settings, out closestStart));
Assert.Equal(DateTimeOffset.Parse("2024-2-4T00:00:00+08:00"), closestStart);

mockedTimeProvider.UtcNow = DateTimeOffset.Parse("2024-2-2T00:00:00+08:00"); // Friday
Assert.False(await mockedTimeWindowFilter.EvaluateAsync(context));
Assert.True(cache.TryGetValue(settings, out closestStart));
Assert.Equal(DateTimeOffset.Parse("2024-2-4T00:00:00+08:00"), closestStart);

mockedTimeProvider.UtcNow = DateTimeOffset.Parse("2024-2-4T00:00:00+08:00"); // Sunday
Assert.True(await mockedTimeWindowFilter.EvaluateAsync(context));
Assert.True(cache.TryGetValue(settings, out closestStart));
Assert.Equal(DateTimeOffset.Parse("2024-2-4T00:00:00+08:00"), closestStart);

mockedTimeProvider.UtcNow = DateTimeOffset.Parse("2024-2-4T06:00:00+08:00");
Assert.True(await mockedTimeWindowFilter.EvaluateAsync(context));
Assert.True(cache.TryGetValue(settings, out closestStart));
Assert.Equal(DateTimeOffset.Parse("2024-2-4T00:00:00+08:00"), closestStart);

mockedTimeProvider.UtcNow = DateTimeOffset.Parse("2024-2-4T12:01:00+08:00");
Assert.False(await mockedTimeWindowFilter.EvaluateAsync(context));
Assert.True(cache.TryGetValue(settings, out closestStart));
Assert.Null(closestStart);

mockedTimeProvider.UtcNow = DateTimeOffset.Parse("2024-2-8T00:00:00+08:00");
Assert.False(await mockedTimeWindowFilter.EvaluateAsync(context));
Assert.True(cache.TryGetValue(settings, out closestStart));
Assert.Null(closestStart);

for (int i = 0; i < 10; i++)
{
mockedTimeProvider.UtcNow = mockedTimeProvider.UtcNow.AddDays(1);
Assert.False(await mockedTimeWindowFilter.EvaluateAsync(context));
Assert.True(cache.TryGetValue(settings, out closestStart));
Assert.Null(closestStart);
}
}
}
Expand Down