Esempio n. 1
0
        public void PreventSettingStateAfterReadingState()
        {
            var state = new CurrentStatsState();
            var st    = state.Value;

            Assert.Throws <ArgumentException>(() => state.Set(StatsCollectionState.DISABLED));
        }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
        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();
                }
            }
        }