Esempio n. 1
0
        private void TestWithException <TException>(Delegate test, Configuration configuration, bool replay)
            where TException : Exception
        {
            configuration = configuration ?? GetConfiguration();

            Type exceptionType = typeof(TException);

            Assert.True(exceptionType.IsSubclassOf(typeof(Exception)), "Please configure the test correctly. " +
                        $"Type '{exceptionType}' is not an exception type.");

            TextWriter logger;

            if (configuration.IsVerbose)
            {
                logger = new TestOutputLogger(this.TestOutput, true);
            }
            else
            {
                logger = TextWriter.Null;
            }

            try
            {
                var engine = RunTest(test, configuration, logger);

                CheckErrors(engine, exceptionType);

                if (replay)
                {
                    configuration.SchedulingStrategy = "replay";
                    configuration.ScheduleTrace      = engine.ReproducableTrace;

                    engine = RunTest(test, configuration, logger);

                    string replayError = (engine.Strategy as ReplayStrategy).ErrorText;
                    Assert.True(replayError.Length == 0, replayError);
                    CheckErrors(engine, exceptionType);
                }
            }
            catch (Exception ex)
            {
                Assert.False(true, ex.Message + "\n" + ex.StackTrace);
            }
            finally
            {
                logger.Dispose();
            }
        }
Esempio n. 2
0
        public async SystemTasks.Task TestReceiveEventWithPredicate()
        {
            int notificationCount = 0;
            var tcs              = new TaskCompletionSource <bool>();
            var logger           = new TestOutputLogger(this.TestOutput, false);
            var mockActorManager = new MockActorManager(logger,
                                                        (notification, evt, _) =>
            {
                notificationCount++;
                if (notificationCount == 3)
                {
                    Assert.Equal(MockActorManager.Notification.ReceiveEvent, notification);
                    tcs.SetResult(true);
                }
            });

            using (var queue = new EventQueue(mockActorManager))
            {
                var receivedEventTask = queue.ReceiveEventAsync(typeof(E4), evt => (evt as E4).Value);

                var enqueueStatus = queue.Enqueue(new E4(false), null, null);
                Assert.Equal(EnqueueStatus.EventHandlerRunning, enqueueStatus);
                Assert.Equal(1, queue.Size);

                enqueueStatus = queue.Enqueue(new E4(true), null, null);
                Assert.Equal(EnqueueStatus.Received, enqueueStatus);
                Assert.Equal(1, queue.Size);

                var receivedEvent = await receivedEventTask;
                Assert.IsType <E4>(receivedEvent);
                Assert.True((receivedEvent as E4).Value);
                Assert.Equal(1, queue.Size);

                var(deqeueStatus, e, group, info) = queue.Dequeue();
                Assert.IsType <E4>(e);
                Assert.False((e as E4).Value);
                Assert.Equal(DequeueStatus.Success, deqeueStatus);
                Assert.Equal(0, queue.Size);

                (deqeueStatus, e, group, info) = queue.Dequeue();
                Assert.Equal(DequeueStatus.NotAvailable, deqeueStatus);
                Assert.Equal(0, queue.Size);

                await Task.WhenAny(tcs.Task, Task.Delay(500));

                Assert.True(tcs.Task.IsCompleted);
            }
        }
Esempio n. 3
0
        public async Task TestEnqueueReceiveEventsAlternateType()
        {
            var logger = new TestOutputLogger(this.TestOutput, false);
            var machineStateManager = new MockStateMachineManager(logger,
                                                                  (notification, evt, _) => { });

            var queue       = new EventQueue(machineStateManager);
            int numMessages = 10000;

            var enqueueTask = Task.Run(() =>
            {
                for (int i = 0; i < numMessages; i++)
                {
                    if (i % 2 == 0)
                    {
                        queue.Enqueue(new E1(), Guid.Empty, null);
                    }
                    else
                    {
                        queue.Enqueue(new E2(), Guid.Empty, null);
                    }
                }
            });

            var receiveTask = Task.Run(async() =>
            {
                for (int i = 0; i < numMessages; i++)
                {
                    if (i % 2 == 0)
                    {
                        var e = await queue.ReceiveEventAsync(typeof(E1));
                        Assert.IsType <E1>(e);
                    }
                    else
                    {
                        var e = await queue.ReceiveEventAsync(typeof(E2));
                        Assert.IsType <E2>(e);
                    }
                }
            });

            await Task.WhenAny(Task.WhenAll(enqueueTask, receiveTask), Task.Delay(3000));

            Assert.True(enqueueTask.IsCompleted);
            Assert.True(receiveTask.IsCompleted);
        }
Esempio n. 4
0
        public async Task TestReceiveEventWithoutWaiting()
        {
            int notificationCount = 0;
            var tcs    = new TaskCompletionSource <bool>();
            var logger = new TestOutputLogger(this.TestOutput, false);
            var machineStateManager = new MockMachineStateManager(logger,
                                                                  (notification, evt, _) =>
            {
                notificationCount++;
                if (notificationCount == 3)
                {
                    Assert.Equal(MockMachineStateManager.Notification.ReceiveEventWithoutWaiting, notification);
                    tcs.SetResult(true);
                }
            });

            var queue         = new EventQueue(machineStateManager);
            var enqueueStatus = queue.Enqueue(new E4(false), Guid.Empty, null);

            Assert.Equal(EnqueueStatus.EventHandlerRunning, enqueueStatus);
            Assert.Equal(1, queue.Size);

            enqueueStatus = queue.Enqueue(new E4(true), Guid.Empty, null);
            Assert.Equal(EnqueueStatus.EventHandlerRunning, enqueueStatus);
            Assert.Equal(2, queue.Size);

            var receivedEvent = await queue.ReceiveAsync(typeof(E4), evt => (evt as E4).Value);

            Assert.IsType <E4>(receivedEvent);
            Assert.True((receivedEvent as E4).Value);
            Assert.Equal(1, queue.Size);

            var(deqeueStatus, e, opGroupId, info) = queue.Dequeue();
            Assert.IsType <E4>(e);
            Assert.False((e as E4).Value);
            Assert.Equal(DequeueStatus.Success, deqeueStatus);
            Assert.Equal(0, queue.Size);

            (deqeueStatus, e, opGroupId, info) = queue.Dequeue();
            Assert.Equal(DequeueStatus.NotAvailable, deqeueStatus);
            Assert.Equal(0, queue.Size);

            await Task.WhenAny(tcs.Task, Task.Delay(500));

            Assert.True(tcs.Task.IsCompleted);
        }
Esempio n. 5
0
        public void TestEnqueueEventWithHandlerNotRunning()
        {
            var logger           = new TestOutputLogger(this.TestOutput, false);
            var mockActorManager = new MockActorManager(logger,
                                                        (notification, evt, _) => { });

            using (var queue = new EventQueue(mockActorManager))
            {
                var(deqeueStatus, e, opGroupId, info) = queue.Dequeue();
                Assert.Equal(DequeueStatus.NotAvailable, deqeueStatus);
                Assert.Equal(0, queue.Size);

                var enqueueStatus = queue.Enqueue(new E1(), Guid.Empty, null);
                Assert.Equal(EnqueueStatus.EventHandlerNotRunning, enqueueStatus);
                Assert.Equal(1, queue.Size);
            }
        }
Esempio n. 6
0
        public void TestRaiseEvent()
        {
            var logger = new TestOutputLogger(this.TestOutput, false);
            var machineStateManager = new MockMachineStateManager(logger,
                                                                  (notification, evt, _) => { });

            var queue = new EventQueue(machineStateManager);

            queue.Raise(new E1(), Guid.Empty);
            Assert.True(queue.IsEventRaised);
            Assert.Equal(0, queue.Size);

            var(deqeueStatus, e, opGroupId, info) = queue.Dequeue();
            Assert.IsType <E1>(e);
            Assert.Equal(DequeueStatus.Raised, deqeueStatus);
            Assert.False(queue.IsEventRaised);
            Assert.Equal(0, queue.Size);
        }
Esempio n. 7
0
        public void TestDeferEvent()
        {
            int notificationCount = 0;
            var logger            = new TestOutputLogger(this.TestOutput, false);

            using var queue = new TestEventQueue(logger, (notification, evt, _) =>
            {
                notificationCount++;
                if (notificationCount is 4)
                {
                    Assert.Equal(TestEventQueue.Notification.DeferEvent, notification);
                }
            }, deferredEvents: new Type[1] {
                typeof(E1)
            });

            var enqueueStatus = queue.Enqueue(new E2(), null, null);

            Assert.Equal(EnqueueStatus.EventHandlerRunning, enqueueStatus);
            Assert.Equal(1, queue.Size);

            enqueueStatus = queue.Enqueue(new E1(), null, null);
            Assert.Equal(EnqueueStatus.EventHandlerRunning, enqueueStatus);
            Assert.Equal(2, queue.Size);

            enqueueStatus = queue.Enqueue(new E3(), null, null);
            Assert.Equal(EnqueueStatus.EventHandlerRunning, enqueueStatus);
            Assert.Equal(3, queue.Size);

            var(deqeueStatus, e, group, info) = queue.Dequeue();
            Assert.IsType <E2>(e);
            Assert.Equal(DequeueStatus.Success, deqeueStatus);
            Assert.Equal(2, queue.Size);

            (deqeueStatus, e, group, info) = queue.Dequeue();
            Assert.IsType <E3>(e);
            Assert.Equal(DequeueStatus.Success, deqeueStatus);
            Assert.Equal(1, queue.Size);

            (deqeueStatus, e, group, info) = queue.Dequeue();
            Assert.Equal(DequeueStatus.Unavailable, deqeueStatus);
            Assert.Equal(1, queue.Size);
        }
Esempio n. 8
0
        public void TestRaiseEvent()
        {
            var logger           = new TestOutputLogger(this.TestOutput, false);
            var mockActorManager = new MockActorManager(logger,
                                                        (notification, evt, _) => { });

            using (var queue = new EventQueue(mockActorManager))
            {
                queue.RaiseEvent(new E1(), null);
                Assert.True(queue.IsEventRaised);
                Assert.Equal(0, queue.Size);

                var(deqeueStatus, e, group, info) = queue.Dequeue();
                Assert.IsType <E1>(e);
                Assert.Equal(DequeueStatus.Raised, deqeueStatus);
                Assert.False(queue.IsEventRaised);
                Assert.Equal(0, queue.Size);
            }
        }
Esempio n. 9
0
        public async Task TestReceiveEventMultipleTypes()
        {
            int notificationCount = 0;
            var tcs    = new TaskCompletionSource <bool>();
            var logger = new TestOutputLogger(this.TestOutput, false);
            var machineStateManager = new MockMachineStateManager(logger,
                                                                  (notification, evt, _) =>
            {
                notificationCount++;
                if (notificationCount == 2)
                {
                    Assert.Equal(MockMachineStateManager.Notification.ReceiveEvent, notification);
                    tcs.SetResult(true);
                }
            });

            var queue = new EventQueue(machineStateManager);

            var task = Task.Run(async() =>
            {
                var receivedEvent = await queue.ReceiveAsync(typeof(E1), typeof(E2));
                Assert.IsType <E2>(receivedEvent);
                Assert.Equal(0, queue.Size);
            });

            // Small delay to force ordering.
            await Task.Delay(100);

            var enqueueStatus = queue.Enqueue(new E2(), Guid.Empty, null);

            Assert.Equal(EnqueueStatus.Received, enqueueStatus);
            Assert.Equal(0, queue.Size);

            await task;

            var(deqeueStatus, e, opGroupId, info) = queue.Dequeue();
            Assert.Equal(DequeueStatus.NotAvailable, deqeueStatus);
            Assert.Equal(0, queue.Size);

            await Task.WhenAny(tcs.Task, Task.Delay(500));

            Assert.True(tcs.Task.IsCompleted);
        }
        public void LogIgnoresTestBoundaryFailure()
        {
            // This test should not fail the test runner
            var categoryName = Guid.NewGuid().ToString();
            var config       = new LoggingConfig {
                IgnoreTestBoundaryException = true
            };

            var sut = new TestOutputLogger(categoryName, _output, config);

            var task = new Task(async() =>
            {
                await Task.Delay(0).ConfigureAwait(false);

                sut.LogCritical("message2");
            });

            task.Start();
        }
        public void WriteLogThrowsExceptionWhenIgnoreTestBoundaryExceptionDisabled()
        {
            var categoryName = Guid.NewGuid().ToString();
            var message      = Guid.NewGuid().ToString();
            var config       = new LoggingConfig
            {
                IgnoreTestBoundaryException = false
            };

            var output = Substitute.For <ITestOutputHelper>();

            output.When(x => x.WriteLine(Arg.Any <string>())).Throw <InvalidOperationException>();

            var sut = new TestOutputLogger(categoryName, output, config);

            Action action = () => sut.LogInformation(message);

            action.Should().Throw <InvalidOperationException>();
        }
Esempio n. 12
0
        public void TestDequeueEvent()
        {
            var logger           = new TestOutputLogger(this.TestOutput, false);
            var mockActorManager = new MockActorManager(logger,
                                                        (notification, evt, _) => { });

            using (var queue = new EventQueue(mockActorManager))
            {
                var(deqeueStatus, e, opGroupId, info) = queue.Dequeue();
                Assert.Equal(DequeueStatus.NotAvailable, deqeueStatus);
                Assert.Equal(0, queue.Size);

                queue.Enqueue(new E1(), Guid.Empty, null);
                (deqeueStatus, e, opGroupId, info) = queue.Dequeue();
                Assert.IsType <E1>(e);
                Assert.Equal(DequeueStatus.Success, deqeueStatus);
                Assert.Equal(0, queue.Size);

                queue.Enqueue(new E3(), Guid.Empty, null);
                queue.Enqueue(new E2(), Guid.Empty, null);
                queue.Enqueue(new E1(), Guid.Empty, null);

                (deqeueStatus, e, opGroupId, info) = queue.Dequeue();
                Assert.IsType <E3>(e);
                Assert.Equal(DequeueStatus.Success, deqeueStatus);
                Assert.Equal(2, queue.Size);

                (deqeueStatus, e, opGroupId, info) = queue.Dequeue();
                Assert.IsType <E2>(e);
                Assert.Equal(DequeueStatus.Success, deqeueStatus);
                Assert.Equal(1, queue.Size);

                (deqeueStatus, e, opGroupId, info) = queue.Dequeue();
                Assert.IsType <E1>(e);
                Assert.Equal(DequeueStatus.Success, deqeueStatus);
                Assert.Equal(0, queue.Size);

                (deqeueStatus, e, opGroupId, info) = queue.Dequeue();
                Assert.Equal(DequeueStatus.NotAvailable, deqeueStatus);
                Assert.Equal(0, queue.Size);
            }
        }
Esempio n. 13
0
        public void TestEnqueueEvent()
        {
            var logger = new TestOutputLogger(this.TestOutput, false);

            using var queue = new TestEventQueue(logger, (notification, evt, _) => { });
            Assert.Equal(0, queue.Size);

            var enqueueStatus = queue.Enqueue(new E1(), null, null);

            Assert.Equal(1, queue.Size);
            Assert.Equal(EnqueueStatus.EventHandlerRunning, enqueueStatus);

            enqueueStatus = queue.Enqueue(new E2(), null, null);
            Assert.Equal(2, queue.Size);
            Assert.Equal(EnqueueStatus.EventHandlerRunning, enqueueStatus);

            enqueueStatus = queue.Enqueue(new E3(), null, null);
            Assert.Equal(3, queue.Size);
            Assert.Equal(EnqueueStatus.EventHandlerRunning, enqueueStatus);
        }
Esempio n. 14
0
        private void TestWithError(Delegate test, Configuration configuration, string[] expectedErrors, bool replay)
        {
            configuration = configuration ?? GetConfiguration();

            TextWriter logger;

            if (configuration.IsVerbose)
            {
                logger = new TestOutputLogger(this.TestOutput, true);
            }
            else
            {
                logger = TextWriter.Null;
            }

            try
            {
                var engine = RunTest(test, configuration, logger);
                CheckErrors(engine, expectedErrors);

                if (replay)
                {
                    configuration.SchedulingStrategy = "replay";
                    configuration.ScheduleTrace      = engine.ReproducableTrace;

                    engine = RunTest(test, configuration, logger);

                    string replayError = (engine.Strategy as ReplayStrategy).ErrorText;
                    Assert.True(replayError.Length == 0, replayError);
                    CheckErrors(engine, expectedErrors);
                }
            }
            catch (Exception ex)
            {
                Assert.False(true, ex.Message + "\n" + ex.StackTrace);
            }
            finally
            {
                logger.Dispose();
            }
        }
        public void LogWritesExceptionTest()
        {
            var logLevel  = LogLevel.Information;
            var eventId   = Model.Create <EventId>();
            var state     = Guid.NewGuid().ToString();
            var message   = Guid.NewGuid().ToString();
            var exception = new ArgumentNullException(Guid.NewGuid().ToString(), Guid.NewGuid().ToString());

            string Formatter(string logState, Exception?error) => message;

            var categoryName = Guid.NewGuid().ToString();

            var output = Substitute.For <ITestOutputHelper>();

            var sut = new TestOutputLogger(categoryName, output);

            sut.Log(logLevel, eventId, state, exception, Formatter);

            output.Received(1).WriteLine(Arg.Any <string>());
            output.Received()
            .WriteLine(Arg.Is <string>(x => x.Contains(exception.ToString(), StringComparison.OrdinalIgnoreCase)));
        }
        public void WritesScopeMessagesWithStructuredDataUsingFormatter()
        {
            var logLevel       = LogLevel.Error;
            var eventId        = Model.Create <EventId>();
            var message        = Guid.NewGuid().ToString();
            var sensitiveValue = Guid.NewGuid().ToString();
            var categoryName   = Guid.NewGuid().ToString();
            var config         = new LoggingConfig().Set(x => x.SensitiveValues.Add(sensitiveValue));

            var state = Model.Create <StructuredData>().Set(x => x.FirstName += " " + sensitiveValue);

            var output = Substitute.For <ITestOutputHelper>();

            var sut = new TestOutputLogger(categoryName, output, config);

            using (sut.BeginScope(state))
            {
                sut.Log(logLevel, eventId, message);
            }

            output.DidNotReceive().WriteLine(Arg.Is <string>(x => x.Contains(sensitiveValue)));
        }
Esempio n. 17
0
        public void TestDequeueEvent()
        {
            var logger = new TestOutputLogger(this.TestOutput, false);

            using var queue = new TestEventQueue(logger, (notification, evt, _) => { });
            var(deqeueStatus, e, group, info) = queue.Dequeue();
            Assert.Equal(DequeueStatus.Unavailable, deqeueStatus);
            Assert.Equal(0, queue.Size);

            queue.Enqueue(new E1(), null, null);
            (deqeueStatus, e, group, info) = queue.Dequeue();
            Assert.IsType <E1>(e);
            Assert.Equal(DequeueStatus.Success, deqeueStatus);
            Assert.Equal(0, queue.Size);

            queue.Enqueue(new E3(), null, null);
            queue.Enqueue(new E2(), null, null);
            queue.Enqueue(new E1(), null, null);

            (deqeueStatus, e, group, info) = queue.Dequeue();
            Assert.IsType <E3>(e);
            Assert.Equal(DequeueStatus.Success, deqeueStatus);
            Assert.Equal(2, queue.Size);

            (deqeueStatus, e, group, info) = queue.Dequeue();
            Assert.IsType <E2>(e);
            Assert.Equal(DequeueStatus.Success, deqeueStatus);
            Assert.Equal(1, queue.Size);

            (deqeueStatus, e, group, info) = queue.Dequeue();
            Assert.IsType <E1>(e);
            Assert.Equal(DequeueStatus.Success, deqeueStatus);
            Assert.Equal(0, queue.Size);

            (deqeueStatus, e, group, info) = queue.Dequeue();
            Assert.Equal(DequeueStatus.Unavailable, deqeueStatus);
            Assert.Equal(0, queue.Size);
        }
Esempio n. 18
0
        public void TestEnqueueEvent()
        {
            var logger = new TestOutputLogger(this.TestOutput, false);
            var machineStateManager = new MockStateMachineManager(logger,
                                                                  (notification, evt, _) => { });

            using (var queue = new EventQueue(machineStateManager))
            {
                Assert.Equal(0, queue.Size);

                var enqueueStatus = queue.Enqueue(new E1(), Guid.Empty, null);
                Assert.Equal(1, queue.Size);
                Assert.Equal(EnqueueStatus.EventHandlerRunning, enqueueStatus);

                enqueueStatus = queue.Enqueue(new E2(), Guid.Empty, null);
                Assert.Equal(2, queue.Size);
                Assert.Equal(EnqueueStatus.EventHandlerRunning, enqueueStatus);

                enqueueStatus = queue.Enqueue(new E3(), Guid.Empty, null);
                Assert.Equal(3, queue.Size);
                Assert.Equal(EnqueueStatus.EventHandlerRunning, enqueueStatus);
            }
        }
Esempio n. 19
0
        public async SystemTasks.Task TestReceiveEvent()
        {
            int notificationCount = 0;
            var tcs              = new TaskCompletionSource <bool>();
            var logger           = new TestOutputLogger(this.TestOutput, false);
            var mockActorManager = new MockActorManager(logger,
                                                        (notification, evt, _) =>
            {
                notificationCount++;
                if (notificationCount == 2)
                {
                    Assert.Equal(MockActorManager.Notification.ReceiveEvent, notification);
                    tcs.SetResult(true);
                }
            });

            using (var queue = new EventQueue(mockActorManager))
            {
                var receivedEventTask = queue.ReceiveEventAsync(typeof(E1));

                var enqueueStatus = queue.Enqueue(new E1(), Guid.Empty, null);
                Assert.Equal(EnqueueStatus.Received, enqueueStatus);
                Assert.Equal(0, queue.Size);

                var receivedEvent = await receivedEventTask;
                Assert.IsType <E1>(receivedEvent);
                Assert.Equal(0, queue.Size);

                var(deqeueStatus, e, opGroupId, info) = queue.Dequeue();
                Assert.Equal(DequeueStatus.NotAvailable, deqeueStatus);
                Assert.Equal(0, queue.Size);

                await Task.WhenAny(tcs.Task, Task.Delay(500));

                Assert.True(tcs.Task.IsCompleted);
            }
        }
Esempio n. 20
0
        public void TransactionLogger_Redacts_Properly()
        {
            var testOutputLogger = new TestOutputLogger(this.outputHelper, nameof(LoggerTests));
            var config           = new TransactionConfigImmutable(
                ExpirationTime: TimeSpan.FromMinutes(10),
                CleanupLostAttempts: false,
                CleanupClientAttempts: false,
                CleanupWindow: TimeSpan.FromSeconds(10),
                KeyValueTimeout: TimeSpan.FromSeconds(10),
                DurabilityLevel: DurabilityLevel.Majority,
                LoggerFactory: null,
                MetadataCollection: null
                );
            var ctx                = new TransactionContext(Guid.NewGuid().ToString(), DateTimeOffset.UtcNow, config, null);
            var loggerFactory      = new TransactionsLoggerFactory(new TestOutputLoggerFactory(this.outputHelper), ctx);
            var transactionsLogger = loggerFactory.CreateLogger(nameof(TransactionLogger_Redacts_Properly));
            var redactor           = new TestRedactor();

            transactionsLogger.LogDebug("Example UD: {id}", redactor.UserData("default:_default:_default" + Guid.NewGuid().ToString()));
            var logs = ctx.Logs.ToList();

            Assert.NotEmpty(logs);
            Assert.Collection(logs, s => s.Contains("</ud>"));
        }
Esempio n. 21
0
        public async Task TestReceiveEventMultipleTypes()
        {
            int notificationCount = 0;
            var tcs    = new TaskCompletionSource <bool>();
            var logger = new TestOutputLogger(this.TestOutput, false);

            using var queue = new TestEventQueue(logger, (notification, evt, _) =>
            {
                notificationCount++;
                if (notificationCount is 2)
                {
                    Assert.Equal(TestEventQueue.Notification.ReceiveEvent, notification);
                    tcs.SetResult(true);
                }
            });

            var receivedEventTask = queue.ReceiveEventAsync(typeof(E1), typeof(E2));

            var enqueueStatus = queue.Enqueue(new E2(), null, null);

            Assert.Equal(EnqueueStatus.Received, enqueueStatus);
            Assert.Equal(0, queue.Size);

            var receivedEvent = await receivedEventTask;

            Assert.IsType <E2>(receivedEvent);
            Assert.Equal(0, queue.Size);

            var(deqeueStatus, e, group, info) = queue.Dequeue();
            Assert.Equal(DequeueStatus.Unavailable, deqeueStatus);
            Assert.Equal(0, queue.Size);

            await Task.WhenAny(tcs.Task, Task.Delay(500));

            Assert.True(tcs.Task.IsCompleted);
        }
Esempio n. 22
0
    public static ITargetResult BuildScenario(string scenarioName, object properties = null, string target = "GetPackageContents", ITestOutputHelper output = null, LoggerVerbosity? verbosity = null)
    {
        var projectName = scenarioName;
        if (scenarioName.StartsWith("given", StringComparison.OrdinalIgnoreCase))
            projectName = string.Join("_", scenarioName.Split('_').Skip(2));

        var scenarioDir = Path.Combine(ModuleInitializer.BaseDirectory, "Scenarios", scenarioName);
        string projectOrSolution;

        if (File.Exists(Path.Combine(scenarioDir, $"{projectName}.csproj")))
            projectOrSolution = Path.Combine(scenarioDir, $"{projectName}.csproj");
        else
            projectOrSolution = Directory.EnumerateFiles(scenarioDir, "*.csproj").First();

        var logger = default(ILogger);
        if (output != null)
        {
            if (verbosity == null)
            {
                var data = Thread.GetNamedDataSlot(nameof(LoggerVerbosity));
                if (data != null)
                    verbosity = (LoggerVerbosity?)Thread.GetData(data);
            }

            logger = new TestOutputLogger(output, verbosity);
        }

        if (properties != null)
            return Build(projectOrSolution, target,
                properties: properties.GetType().GetProperties().ToDictionary(prop => prop.Name, prop => prop.GetValue(properties).ToString()),
                logger: logger)[target];
        else
            return Build(projectOrSolution, target, logger: logger)[target];
    }
Esempio n. 23
0
 public ApiServerTest(ITestOutputHelper testOutputHelper)
 {
     TestOutputLogger.Configure(testOutputHelper);
 }
Esempio n. 24
0
        private async Task RandomisedTest(RandomConfig config)
        {
            // ARRANGE
            var testLogger = new TestOutputLogger();
            var groupName  = Guid.NewGuid().ToString();

            await this.zkHelper.InitializeAsync("/rebalanser", TimeSpan.FromSeconds(20), TimeSpan.FromSeconds(30));

            await this.zkHelper.PrepareResourceGroupAsync(groupName, "res", config.ResourceCount);

            var        resourceMonitor = new ResourceMonitor();
            List <int> resSuffixes     = new List <int>();

            for (int i = 0; i < config.ResourceCount; i++)
            {
                resourceMonitor.CreateResource($"res{i}");
                resSuffixes.Add(i);
            }

            var clientOptions = new ClientOptions()
            {
                AutoRecoveryOnError = true,
                RestartDelay        = TimeSpan.FromSeconds(10),
                OnAssignmentDelay   = config.OnAssignmentDelay
            };

            var clients = new List <TestClient>();

            for (int i = 0; i < config.ClientCount; i++)
            {
                clients.Add(new TestClient(resourceMonitor,
                                           groupName,
                                           clientOptions,
                                           config.OnStartEventHandlerTime,
                                           config.OnStopEventHandlerTime,
                                           config.RandomiseEventHandlerTimes));
            }

            for (int i = 0; i < config.ClientCount; i++)
            {
                if (config.StartUpClientInterval.TotalMilliseconds > 0)
                {
                    await Task.Delay(config.StartUpClientInterval);
                }

                await clients[i].StartAsync(ZkHelper.ZooKeeperHosts,
                                            "/rebalanser",
                                            this.currentConfig.SessionTimeout,
                                            this.currentConfig.ConnectTimeout,
                                            this.currentConfig.minRebalancingInterval,
                                            testLogger);
            }

            await Task.Delay(TimeSpan.FromSeconds(30));

            // ACT
            var sw = new Stopwatch();

            sw.Start();
            var rand        = new Random(Guid.NewGuid().GetHashCode());
            int testCounter = 0;

            while (sw.Elapsed < config.TestDuration)
            {
                testLogger.Info("TEST RUNNER", "Test " + testCounter);

                // action == 0 -> add/remove a client
                // action == 1 -> add/remove a resource
                var action = rand.Next(2);
                if (action == 0)
                {
                    var   clientIndex = rand.Next(config.ClientCount);
                    await clients[clientIndex].PerformActionAsync(ZkHelper.ZooKeeperHosts,
                                                                  "/rebalanser",
                                                                  this.currentConfig.SessionTimeout,
                                                                  this.currentConfig.ConnectTimeout,
                                                                  this.currentConfig.minRebalancingInterval,
                                                                  testLogger);
                }
                else
                {
                    // resAction == 0 && resources exist -> remove a resource
                    // else add a resource
                    var resAction = rand.Next(2);
                    if (resAction == 0 || !resSuffixes.Any())
                    {
                        var resSuffix = resSuffixes.Any() ? resSuffixes.Max() + 1 : 0;
                        resSuffixes.Add(resSuffix);
                        resourceMonitor.AddResource($"res{resSuffix}");
                        testLogger.Info("TEST RUNNER", "Adding a resource");
                        await this.zkHelper.AddResourceAsync(groupName, $"res{resSuffix}");

                        testLogger.Info("TEST RUNNER", "Added a resource");
                    }
                    else
                    {
                        var index     = rand.Next(resSuffixes.Count);
                        var resSuffix = resSuffixes[index];
                        resSuffixes.RemoveAt(index);
                        resourceMonitor.RemoveResource($"res{resSuffix}");
                        testLogger.Info("TEST RUNNER", "Removing a resource");
                        await this.zkHelper.DeleteResourceAsync(groupName, $"res{resSuffix}");

                        testLogger.Info("TEST RUNNER", "Removed a resource");
                    }
                }

                // wait for the configured period of time before making asserts
                // this gives the necessary time for rebalancing
                TimeSpan currentTestInterval;
                if (config.RandomiseInterval)
                {
                    currentTestInterval = TimeSpan.FromMilliseconds(rand.Next((int)config.MaxInterval.TotalMilliseconds));
                }
                else
                {
                    currentTestInterval = config.MaxInterval;
                }
                await Task.Delay(currentTestInterval);

                resourceMonitor.PrintEvents($"/home/jack/tmp/rebalanser-zk/test-{groupName}");

                // check for double assignments. All test scenarios must check this. No matter
                // what happens, we can never allow double assignments - ever
                if (resourceMonitor.DoubleAssignmentsExist())
                {
                    foreach (var violation in resourceMonitor.GetDoubleAssignments())
                    {
                        testLogger.Error("TEST RUNNER", violation.ToString());
                    }
                }
                Assert.False(resourceMonitor.DoubleAssignmentsExist());

                // depending on the type of test, we'll ensure that all resources have been assigned
                // some tests that have extremely short durations between events do not leave enough time
                // for rebalancing and so do not perform this check. The conditional check will
                // only perform this check when a long enough time period has been allowed for rebalancing to complete
                if (config.CheckType == CheckType.FullCheck)
                {
                    if (clients.Any(x => x.Started))
                    {
                        testLogger.Info("TEST RUNNER", "Perform all resources assigned check");
                        Assert.True(resourceMonitor.AllResourcesAssigned());
                    }
                }
                else if (config.CheckType == CheckType.ConditionalCheck)
                {
                    if (testCounter % config.ConditionalCheckInterval == 0 && clients.Any(x => x.Started))
                    {
                        testLogger.Info("TEST RUNNER", "Grace period before all resources assigned check");
                        await Task.Delay(config.ConditionalCheckWaitPeriod);

                        testLogger.Info("TEST RUNNER", "Perform all resources assigned check");
                        Assert.True(resourceMonitor.AllResourcesAssigned());
                    }
                }

                testCounter++;
            }

            // clean up
            for (int i = 0; i < config.ClientCount; i++)
            {
                await clients[i].StopAsync();
            }
        }
Esempio n. 25
0
        public void when_compiling_twice_then_does_not_cause_new_compilation()
        {
            var logger         = new TestOutputLogger(output);
            var targetDir      = Path.Combine(ModuleInitializer.BaseDirectory, MethodBase.GetCurrentMethod().Name);
            var targetFileName = Path.Combine(targetDir, "bin", "Debug",
                                              Path.GetFileName(Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName));
            var componentFile = Path.Combine(targetDir, "Component.cs");

            var firstBuild = BuildProject(logger, (project, properties) =>
            {
                if (!Directory.Exists(targetDir))
                {
                    Directory.CreateDirectory(targetDir);
                }

                File.WriteAllText(componentFile, @"
using System;
using System.Reactive.Disposables;
using System.ComponentModel.Composition;

namespace Clide 
{
	[Component(CreationPolicy.Shared)]
	public partial class Producer : IObservable<DerivedEvent>
	{
		public IDisposable Subscribe(IObserver<DerivedEvent> observer)
		{
			observer.OnNext(new DerivedEvent());
			return Disposable.Empty;
		}
	}

	public class BaseEvent { }
	public class DerivedEvent : BaseEvent { }
}
");

                project.AddItem("Compile", "Component.cs");

                return("Build");
            });

            Assert.True(firstBuild.HasResultsForTarget("Build"));
            Assert.Equal(TargetResultCode.Success, firstBuild.ResultsByTarget["Build"].ResultCode);
            var firstPassTasks = logger.FinishedTasks.ToArray();

            var firstTimestamp = File.GetLastWriteTime(targetFileName);

            Assert.True(firstPassTasks.Any(e => e.TaskName == "FindComponents"));
            Assert.True(firstPassTasks.Any(e => e.TaskName == "ExportComponents"));

            var projectFile = Path.Combine(targetDir, "Test.csproj");
            var request     = new BuildRequestData(projectFile, new Dictionary <string, string>(), null, new[] { "Build" }, null);
            var parameters  = new BuildParameters
            {
                GlobalProperties      = new Dictionary <string, string>(),
                UseSynchronousLogging = true,
                Loggers = new[] { logger }
            };

            logger.Reset();
            var secondBuild     = BuildManager.DefaultBuildManager.Build(parameters, request);
            var secondPassTasks = logger.FinishedTasks.ToArray();
            var secondTimestamp = File.GetLastWriteTime(targetFileName);

            Assert.False(secondPassTasks.Any(e => e.TaskName == "FindComponents"), "FindComponents shouldn't have been executed on the second build.");
            Assert.False(secondPassTasks.Any(e => e.TaskName == "ExportComponents"), "ExportComponents shouldn't have been executed on the second build.");
            Assert.Equal(firstTimestamp, secondTimestamp);

            File.SetLastWriteTime(componentFile, DateTime.Now);

            logger.Reset();
            var thirdBuild     = BuildManager.DefaultBuildManager.Build(parameters, request);
            var thirdPassTasks = logger.FinishedTasks.ToArray();
            var thirdTimestamp = File.GetLastWriteTime(targetFileName);

            Assert.True(thirdPassTasks.Any(e => e.TaskName == "FindComponents"));
            Assert.True(thirdPassTasks.Any(e => e.TaskName == "ExportComponents"));
            Assert.NotEqual(secondTimestamp, thirdTimestamp);
        }
Esempio n. 26
0
		public void when_compiling_twice_then_does_not_cause_new_compilation()
		{
			var logger = new TestOutputLogger(output);
			var targetDir = Path.Combine(ModuleInitializer.BaseDirectory, MethodBase.GetCurrentMethod().Name);
			var targetFileName = Path.Combine(targetDir, "bin", "Debug", 
				Path.GetFileName(Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName));
			var componentFile = Path.Combine(targetDir, "Component.cs");

			var firstBuild = BuildProject(logger, (project, properties) =>
			{
				if (!Directory.Exists(targetDir))
					Directory.CreateDirectory(targetDir);

				File.WriteAllText(componentFile, @"
using System;
using System.Reactive.Disposables;
using System.ComponentModel.Composition;

namespace Clide 
{
	[Component(CreationPolicy.Shared)]
	public partial class Producer : IObservable<DerivedEvent>
	{
		public IDisposable Subscribe(IObserver<DerivedEvent> observer)
		{
			observer.OnNext(new DerivedEvent());
			return Disposable.Empty;
		}
	}

	public class BaseEvent { }
	public class DerivedEvent : BaseEvent { }
}
");

				project.AddItem("Compile", "Component.cs");

				return "Build";
			});

			Assert.True(firstBuild.HasResultsForTarget("Build"));
			Assert.Equal(TargetResultCode.Success, firstBuild.ResultsByTarget["Build"].ResultCode);
			var firstPassTasks = logger.FinishedTasks.ToArray();

			var firstTimestamp = File.GetLastWriteTime(targetFileName);
			Assert.True(firstPassTasks.Any(e => e.TaskName == "FindComponents"));
			Assert.True(firstPassTasks.Any(e => e.TaskName == "ExportComponents"));

			var projectFile = Path.Combine(targetDir, "Test.csproj");
			var request = new BuildRequestData(projectFile, new Dictionary<string, string>(), null, new[] { "Build" }, null);
			var parameters = new BuildParameters
			{
				GlobalProperties = new Dictionary<string, string>(),
					UseSynchronousLogging = true,
				Loggers = new[] { logger }
			};

			logger.Reset();
			var secondBuild = BuildManager.DefaultBuildManager.Build(parameters, request);
			var secondPassTasks = logger.FinishedTasks.ToArray();
			var secondTimestamp = File.GetLastWriteTime(targetFileName);

			Assert.False(secondPassTasks.Any(e => e.TaskName == "FindComponents"), "FindComponents shouldn't have been executed on the second build.");
			Assert.False(secondPassTasks.Any(e => e.TaskName == "ExportComponents"), "ExportComponents shouldn't have been executed on the second build.");
			Assert.Equal(firstTimestamp, secondTimestamp);

			File.SetLastWriteTime(componentFile, DateTime.Now);

			logger.Reset();
			var thirdBuild = BuildManager.DefaultBuildManager.Build(parameters, request);
			var thirdPassTasks = logger.FinishedTasks.ToArray();
			var thirdTimestamp = File.GetLastWriteTime(targetFileName);

			Assert.True(thirdPassTasks.Any(e => e.TaskName == "FindComponents"));
			Assert.True(thirdPassTasks.Any(e => e.TaskName == "ExportComponents"));
			Assert.NotEqual(secondTimestamp, thirdTimestamp);
		}
Esempio n. 27
0
 public ModulesProcessorTest(ITestOutputHelper testOutputHelper)
 {
     TestOutputLogger.Configure(testOutputHelper);
 }
    public static TargetResult BuildScenario(
        string scenarioName,
        object properties         = null,
        string projectName        = null,
        string target             = "GetPackageContents",
        ITestOutputHelper output  = null,
        LoggerVerbosity?verbosity = null)
    {
        var scenarioDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Scenarios", scenarioName);

        if (projectName == null)
        {
            projectName = scenarioName;
            if (scenarioName.StartsWith("given", StringComparison.OrdinalIgnoreCase))
            {
                projectName = string.Join("_", scenarioName.Split('_').Skip(2));
            }
        }
        else if (!File.Exists(Path.Combine(scenarioDir, $"{projectName}.csproj")))
        {
            throw new FileNotFoundException($"Project '{projectName}' was not found under scenario path '{scenarioDir}'.", projectName);
        }

        string projectOrSolution;

        if (File.Exists(Path.Combine(scenarioDir, $"{projectName}.csproj")))
        {
            projectOrSolution = Path.Combine(scenarioDir, $"{projectName}.csproj");
        }
        else
        {
            projectOrSolution = Directory.EnumerateFiles(scenarioDir, "*.*proj").FirstOrDefault();
        }

        var logger = default(TestOutputLogger);

        if (output != null)
        {
            if (verbosity == null)
            {
                var data = Thread.GetNamedDataSlot(nameof(LoggerVerbosity));
                if (data != null)
                {
                    verbosity = (LoggerVerbosity?)Thread.GetData(data);
                }
            }

            logger = new TestOutputLogger(output, verbosity);
        }
        else
        {
            logger = new TestOutputLogger(null);
        }

        var loggers = OpenBuildLogAttribute.IsActive ?
                      new ILogger[] { logger, new StructuredLogger {
                                          Verbosity = verbosity.GetValueOrDefault(), Parameters = scenarioName + ".binlog"
                                      } } :
        new ILogger[] { logger };

        var buildProps = properties?.GetType().GetProperties()
                         .ToDictionary(prop => prop.Name, prop => prop.GetValue(properties).ToString())
                         ?? new Dictionary <string, string>();

        buildProps[nameof(ThisAssembly.Project.Properties.NuGetRestoreTargets)] = ThisAssembly.Project.Properties.NuGetRestoreTargets;
        buildProps[nameof(ThisAssembly.Project.Properties.NuGetTargets)]        = ThisAssembly.Project.Properties.NuGetTargets;

        var result = Build(projectOrSolution, target, buildProps, loggers);

        if (OpenBuildLogAttribute.IsActive)
        {
            Process.Start(scenarioName + ".binlog");
        }

        return(new TargetResult(projectOrSolution, result, target, logger));
    }
 public TargetResult(string projectOrSolutionFile, BuildResult result, string target, TestOutputLogger logger)
 {
     ProjectOrSolutionFile = projectOrSolutionFile;
     BuildResult           = result;
     Target = target;
     Logger = logger;
 }
Esempio n. 30
0
 public MessagePackMessageSerializerTest(ITestOutputHelper testOutputHelper)
 {
     TestOutputLogger.Configure(testOutputHelper);
 }
Esempio n. 31
0
 public SettingsSerializerTest(ITestOutputHelper testOutputHelper)
 {
     _testFileManager = new TestFileManager(testOutputHelper);
     TestOutputLogger.Configure(testOutputHelper);
 }
Esempio n. 32
0
 public GitHubUpdateServiceTest(ITestOutputHelper testOutputHelper)
 {
     TestOutputLogger.Configure(testOutputHelper);
 }