public void PreventSettingStateAfterReadingState() { var state = new CurrentStatsState(); var st = state.Value; Assert.Throws <ArgumentException>(() => state.Set(StatsCollectionState.DISABLED)); }
public void SetState() { CurrentStatsState state = new CurrentStatsState(); Assert.True(state.Set(StatsCollectionState.DISABLED)); Assert.Equal(StatsCollectionState.DISABLED, state.Internal); Assert.True(state.Set(StatsCollectionState.ENABLED)); Assert.Equal(StatsCollectionState.ENABLED, state.Internal); Assert.False(state.Set(StatsCollectionState.ENABLED)); }
public async Task PreventSettingStateAfterReadingState_IsThreadSafe() { // This test relies on timing, and as such may not FAIL reliably under some conditions // (e.g. more/less machine load, faster/slower processors). // It will not incorrectly fail transiently though. for (int i = 0; i < 10; i++) { var state = new CurrentStatsState(); using (var cts = new CancellationTokenSource()) { var _ = Task.Run( async() => { while (!cts.IsCancellationRequested) { try { state.Set(StatsCollectionState.DISABLED); state.Set(StatsCollectionState.ENABLED); } catch { // Throw is expected after the read is performed } } }, cts.Token); await Task.Delay(10); // Read the value a bunch of times var values = Enumerable.Range(0, 20) .Select(__ => state.Value) .ToList(); // They should all be the same foreach (var item in values) { Assert.Equal(item, values[0]); } cts.Cancel(); } } }