public static async ValueTask FailureInBeforeTestAssemblyFinished_ReportsCleanupFailure_DoesNotIncludeExceptionsFromAfterTestAssemblyStarting()
        {
            var thisAssembly = Assembly.GetExecutingAssembly();
            var messages     = new List <_MessageSinkMessage>();
            var messageSink  = SpyMessageSink.Create(messages: messages);
            var testCases    = new[] { TestCaseForTestCollection() };

            await using var runner = TestableTestAssemblyRunner.Create(messageSink, testCases: testCases);
            var startingException = new DivideByZeroException();
            var finishedException = new InvalidOperationException();

            runner.AfterTestAssemblyStarting_Callback  = aggregator => aggregator.Add(startingException);
            runner.BeforeTestAssemblyFinished_Callback = aggregator => aggregator.Add(finishedException);

            await runner.RunAsync();

            var assemblyStarting = Assert.Single(messages.OfType <_TestAssemblyStarting>());
            var cleanupFailure   = Assert.Single(messages.OfType <_TestAssemblyCleanupFailure>());

#if NETFRAMEWORK
            Assert.Equal(thisAssembly.GetLocalCodeBase(), assemblyStarting.AssemblyPath);
            Assert.Equal(runner.TestAssembly.ConfigFileName, assemblyStarting.ConfigFilePath);
#endif
            Assert.Equal(typeof(InvalidOperationException).FullName, cleanupFailure.ExceptionTypes.Single());
        }
        public static async ValueTask OrdererUsedToOrderTestCollections()
        {
            var collection1 = Mocks.TestCollection(displayName: "AAA", uniqueID: "collection-1");
            var testCase1a  = TestCaseForTestCollection(collection1);
            var testCase1b  = TestCaseForTestCollection(collection1);
            var collection2 = Mocks.TestCollection(displayName: "ZZZZ", uniqueID: "collection-2");
            var testCase2a  = TestCaseForTestCollection(collection2);
            var testCase2b  = TestCaseForTestCollection(collection2);
            var collection3 = Mocks.TestCollection(displayName: "MM", uniqueID: "collection-3");
            var testCase3a  = TestCaseForTestCollection(collection3);
            var testCase3b  = TestCaseForTestCollection(collection3);
            var testCases   = new[] { testCase1a, testCase3a, testCase2a, testCase3b, testCase2b, testCase1b };
            var runner      = TestableTestAssemblyRunner.Create(testCases: testCases, testCollectionOrderer: new DescendingDisplayNameCollectionOrderer());

            await runner.RunAsync();

            Assert.Collection(
                runner.CollectionsRun,
                collection =>
            {
                Assert.Same(collection2, collection.Item1);
                Assert.Equal(new[] { testCase2a, testCase2b }, collection.Item2);
            },
                collection =>
            {
                Assert.Same(collection3, collection.Item1);
                Assert.Equal(new[] { testCase3a, testCase3b }, collection.Item2);
            },
                collection =>
            {
                Assert.Same(collection1, collection.Item1);
                Assert.Equal(new[] { testCase1a, testCase1b }, collection.Item2);
            }
                );
        }
Beispiel #3
0
        public static async void FailureInBeforeTestAssemblyFinished_ReportsCleanupFailure_DoesNotIncludeExceptionsFromAfterTestAssemblyStarting()
        {
            var thisAssembly      = Assembly.GetExecutingAssembly();
            var thisAppDomain     = AppDomain.CurrentDomain;
            var messages          = new List <IMessageSinkMessage>();
            var messageSink       = SpyMessageSink.Create(messages: messages);
            var testCases         = new[] { Mocks.TestCase() };
            var runner            = TestableTestAssemblyRunner.Create(messageSink, testCases: testCases);
            var startingException = new DivideByZeroException();
            var finishedException = new InvalidOperationException();

            runner.AfterTestAssemblyStarting_Callback  = aggregator => aggregator.Add(startingException);
            runner.BeforeTestAssemblyFinished_Callback = aggregator => aggregator.Add(finishedException);

            await runner.RunAsync();

            var cleanupFailure = Assert.Single(messages.OfType <ITestAssemblyCleanupFailure>());

#if NETFRAMEWORK
            Assert.Equal(thisAssembly.GetLocalCodeBase(), cleanupFailure.TestAssembly.Assembly.AssemblyPath);
            Assert.Equal(thisAppDomain.SetupInformation.ConfigurationFile, cleanupFailure.TestAssembly.ConfigFileName);
#endif
            Assert.Equal(testCases, cleanupFailure.TestCases);
            Assert.Equal(typeof(InvalidOperationException).FullName, cleanupFailure.ExceptionTypes.Single());
        }
Beispiel #4
0
        public static async void FailureInQueueOfTestAssemblyStarting_DoesNotQueueTestAssemblyFinished_DoesNotRunTestCollections()
        {
            var messages    = new List <IMessageSinkMessage>();
            var messageSink = Substitute.For <IMessageSink>();

            messageSink.OnMessage(null)
            .ReturnsForAnyArgs(callInfo =>
            {
                var msg = callInfo.Arg <IMessageSinkMessage>();
                messages.Add(msg);

                if (msg is ITestAssemblyStarting)
                {
                    throw new InvalidOperationException();
                }

                return(true);
            });
            var runner = TestableTestAssemblyRunner.Create(messageSink);

            await Assert.ThrowsAsync <InvalidOperationException>(() => runner.RunAsync());

            var starting = Assert.Single(messages);

            Assert.IsAssignableFrom <ITestAssemblyStarting>(starting);
            Assert.Empty(runner.CollectionsRun);
        }
Beispiel #5
0
        public static async void TestsAreGroupedByCollection()
        {
            var collection1 = Mocks.TestCollection(displayName: "1");
            var testCase1a  = Mocks.TestCase(collection1);
            var testCase1b  = Mocks.TestCase(collection1);
            var collection2 = Mocks.TestCollection(displayName: "2");
            var testCase2a  = Mocks.TestCase(collection2);
            var testCase2b  = Mocks.TestCase(collection2);
            var runner      = TestableTestAssemblyRunner.Create(testCases: new[] { testCase1a, testCase2a, testCase2b, testCase1b });

            await runner.RunAsync();

            Assert.Collection(runner.CollectionsRun.OrderBy(c => c.Item1.DisplayName),
                              tuple =>
            {
                Assert.Same(collection1, tuple.Item1);
                Assert.Collection(tuple.Item2,
                                  testCase => Assert.Same(testCase1a, testCase),
                                  testCase => Assert.Same(testCase1b, testCase)
                                  );
            },
                              tuple =>
            {
                Assert.Same(collection2, tuple.Item1);
                Assert.Collection(tuple.Item2,
                                  testCase => Assert.Same(testCase2a, testCase),
                                  testCase => Assert.Same(testCase2b, testCase)
                                  );
            }
                              );
        }
Beispiel #6
0
        public static async void TestCaseOrdererWhichThrowsLogsMessageAndDoesNotReorderTests()
        {
            Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;

            var collection1 = Mocks.TestCollection(displayName: "AAA");
            var testCase1   = Mocks.TestCase(collection1);
            var collection2 = Mocks.TestCollection(displayName: "ZZZZ");
            var testCase2   = Mocks.TestCase(collection2);
            var collection3 = Mocks.TestCollection(displayName: "MM");
            var testCase3   = Mocks.TestCase(collection3);
            var testCases   = new[] { testCase1, testCase2, testCase3 };
            var runner      = TestableTestAssemblyRunner.Create(testCases: testCases);

            runner.TestCollectionOrderer = new ThrowingOrderer();

            await runner.RunAsync();

            Assert.Collection(runner.CollectionsRun,
                              collection => Assert.Same(collection1, collection.Item1),
                              collection => Assert.Same(collection2, collection.Item1),
                              collection => Assert.Same(collection3, collection.Item1)
                              );
            var diagnosticMessage = Assert.Single(runner.DiagnosticMessages.Cast <IDiagnosticMessage>());

            Assert.StartsWith("Test collection orderer 'TestAssemblyRunnerTests+TestCollectionOrderer+ThrowingOrderer' threw 'System.DivideByZeroException' during ordering: Attempted to divide by zero.", diagnosticMessage.Message);
        }
        public static async void TestContextInspection()
        {
            var runner = TestableTestAssemblyRunner.Create();

            await runner.RunAsync();

            Assert.NotNull(runner.AfterTestAssemblyStarting_Context);
            Assert.Equal(TestEngineStatus.Initializing, runner.AfterTestAssemblyStarting_Context.TestAssemblyStatus);
            Assert.Equal(TestPipelineStage.TestAssemblyExecution, runner.AfterTestAssemblyStarting_Context.PipelineStage);
            Assert.Null(runner.AfterTestAssemblyStarting_Context.TestCollectionStatus);
            Assert.Null(runner.AfterTestAssemblyStarting_Context.TestClassStatus);
            Assert.Null(runner.AfterTestAssemblyStarting_Context.TestMethodStatus);
            Assert.Null(runner.AfterTestAssemblyStarting_Context.TestCaseStatus);
            Assert.Null(runner.AfterTestAssemblyStarting_Context.TestStatus);
            Assert.Same(runner.TestAssembly, runner.AfterTestAssemblyStarting_Context.TestAssembly);

            Assert.NotNull(runner.RunTestCollectionAsync_Context);
            Assert.Equal(TestEngineStatus.Running, runner.RunTestCollectionAsync_Context.TestAssemblyStatus);
            Assert.Null(runner.RunTestCollectionAsync_Context.TestCollectionStatus);
            Assert.Null(runner.RunTestCollectionAsync_Context.TestClassStatus);
            Assert.Null(runner.RunTestCollectionAsync_Context.TestMethodStatus);
            Assert.Null(runner.RunTestCollectionAsync_Context.TestCaseStatus);
            Assert.Null(runner.RunTestCollectionAsync_Context.TestStatus);
            Assert.Same(runner.TestAssembly, runner.RunTestCollectionAsync_Context.TestAssembly);

            Assert.NotNull(runner.BeforeTestAssemblyFinished_Context);
            Assert.Equal(TestEngineStatus.CleaningUp, runner.BeforeTestAssemblyFinished_Context.TestAssemblyStatus);
            Assert.Null(runner.BeforeTestAssemblyFinished_Context.TestCollectionStatus);
            Assert.Null(runner.BeforeTestAssemblyFinished_Context.TestClassStatus);
            Assert.Null(runner.BeforeTestAssemblyFinished_Context.TestMethodStatus);
            Assert.Null(runner.BeforeTestAssemblyFinished_Context.TestCaseStatus);
            Assert.Null(runner.BeforeTestAssemblyFinished_Context.TestStatus);
            Assert.Same(runner.TestAssembly, runner.BeforeTestAssemblyFinished_Context.TestAssembly);
        }
        public static async ValueTask TestCaseOrdererWhichThrowsLogsMessageAndDoesNotReorderTests()
        {
            var collection1 = Mocks.TestCollection(displayName: "AAA", uniqueID: "collection-1");
            var testCase1   = TestCaseForTestCollection(collection1);
            var collection2 = Mocks.TestCollection(displayName: "ZZZZ", uniqueID: "collection-2");
            var testCase2   = TestCaseForTestCollection(collection2);
            var collection3 = Mocks.TestCollection(displayName: "MM", uniqueID: "collection-3");
            var testCase3   = TestCaseForTestCollection(collection3);
            var testCases   = new[] { testCase1, testCase2, testCase3 };

            await using var runner       = TestableTestAssemblyRunner.Create(testCases: testCases);
            runner.TestCollectionOrderer = new ThrowingOrderer();

            await runner.RunAsync();

            Assert.Collection(
                runner.CollectionsRun,
                collection => Assert.Same(collection1, collection.Item1),
                collection => Assert.Same(collection2, collection.Item1),
                collection => Assert.Same(collection3, collection.Item1)
                );
            var diagnosticMessage = Assert.Single(runner.DiagnosticMessages.Cast <_DiagnosticMessage>());

            Assert.StartsWith("Test collection orderer 'TestAssemblyRunnerTests+TestCollectionOrderer+ThrowingOrderer' threw 'System.DivideByZeroException' during ordering: Attempted to divide by zero.", diagnosticMessage.Message);
        }
Beispiel #9
0
        public static void DefaultMessageBus()
        {
            var runner = TestableTestAssemblyRunner.Create();

            var messageBus = runner.CreateMessageBus_Public();

            Assert.IsType <MessageBus>(messageBus);
        }
        public static async ValueTask DefaultMessageBus()
        {
            await using var runner = TestableTestAssemblyRunner.Create();

            using var messageBus = runner.CreateMessageBus_Public();

            Assert.IsType <MessageBus>(messageBus);
        }
Beispiel #11
0
        public static void SyncMessageBusOption()
        {
            var runner = TestableTestAssemblyRunner.Create(options: new XunitExecutionOptions {
                SynchronousMessageReporting = true
            });

            var messageBus = runner.CreateMessageBus_Public();

            Assert.IsType <SynchronousMessageBus>(messageBus);
        }
        public static async ValueTask Cancellation_TestAssemblyStarting_DoesNotCallExtensibilityCallbacks()
        {
            var messageSink = SpyMessageSink.Create(msg => !(msg is _TestAssemblyStarting));
            var runner      = TestableTestAssemblyRunner.Create(messageSink);

            await runner.RunAsync();

            Assert.False(runner.AfterTestAssemblyStarting_Called);
            Assert.False(runner.BeforeTestAssemblyFinished_Called);
        }
Beispiel #13
0
        public static async void Cancellation_TestAssemblyFinished_CallsCallExtensibilityCallbacks()
        {
            var messageSink = SpyMessageSink.Create(msg => !(msg is ITestAssemblyFinished));
            var runner      = TestableTestAssemblyRunner.Create(messageSink);

            await runner.RunAsync();

            Assert.True(runner.AfterTestAssemblyStarting_Called);
            Assert.True(runner.BeforeTestAssemblyFinished_Called);
        }
Beispiel #14
0
        public static void SyncMessageBusOption()
        {
            var executionOptions = TestFrameworkOptions.ForExecution();

            executionOptions.SetSynchronousMessageReporting(true);
            var runner = TestableTestAssemblyRunner.Create(executionOptions: executionOptions);

            var messageBus = runner.CreateMessageBus_Public();

            Assert.IsType <SynchronousMessageBus>(messageBus);
        }
Beispiel #15
0
        public static async void SignalingCancellationStopsRunningCollections()
        {
            var collection1 = Mocks.TestCollection();
            var testCase1   = Mocks.TestCase(collection1);
            var collection2 = Mocks.TestCollection();
            var testCase2   = Mocks.TestCase(collection2);
            var runner      = TestableTestAssemblyRunner.Create(testCases: new[] { testCase1, testCase2 }, cancelInRunTestCollectionAsync: true);

            await runner.RunAsync();

            Assert.Single(runner.CollectionsRun);
        }
Beispiel #16
0
        public static async void FailureInAfterTestAssemblyStarting_GivesErroredAggregatorToTestCollectionRunner_NoCleanupFailureMessage()
        {
            var messages    = new List <IMessageSinkMessage>();
            var messageSink = SpyMessageSink.Create(messages: messages);
            var runner      = TestableTestAssemblyRunner.Create(messageSink);
            var ex          = new DivideByZeroException();

            runner.AfterTestAssemblyStarting_Callback = aggregator => aggregator.Add(ex);

            await runner.RunAsync();

            Assert.Same(ex, runner.RunTestCollectionAsync_AggregatorResult);
            Assert.Empty(messages.OfType <ITestAssemblyCleanupFailure>());
        }
        public static async ValueTask Messages()
        {
            var summary = new RunSummary {
                Total = 4, Failed = 2, Skipped = 1, Time = 21.12m
            };
            var messages    = new List <_MessageSinkMessage>();
            var messageSink = SpyMessageSink.Create(messages: messages);

            await using var runner = TestableTestAssemblyRunner.Create(messageSink, summary);
            var thisAssembly = Assembly.GetExecutingAssembly();

            var result = await runner.RunAsync();

            Assert.Equal(4, result.Total);
            Assert.Equal(2, result.Failed);
            Assert.Equal(1, result.Skipped);
            Assert.NotEqual(21.12m, result.Time);              // Uses clock time, not result time
            Assert.Collection(
                messages,
                msg =>
            {
                var starting = Assert.IsAssignableFrom <_TestAssemblyStarting>(msg);
#if NETFRAMEWORK
                Assert.Equal(thisAssembly.GetLocalCodeBase(), starting.AssemblyPath);
                Assert.Equal(runner.TestAssembly.ConfigFileName, starting.ConfigFilePath);
                Assert.Equal(".NETFramework,Version=v4.7.2", starting.TargetFramework);
#else
                Assert.Equal(".NETCoreApp,Version=v2.1", starting.TargetFramework);
#endif
                Assert.InRange(starting.StartTime, DateTime.Now.AddMinutes(-15), DateTime.Now);
                Assert.Equal("The test framework environment", starting.TestEnvironment);
                Assert.Equal("The test framework display name", starting.TestFrameworkDisplayName);
                Assert.Equal("assembly-id", starting.AssemblyUniqueID);
            },
                msg =>
            {
                var finished = Assert.IsAssignableFrom <_TestAssemblyFinished>(msg);
                Assert.Equal("assembly-id", finished.AssemblyUniqueID);
                Assert.Equal(result.Time, finished.ExecutionTime);
                Assert.Equal(2, finished.TestsFailed);
                Assert.Equal(4, finished.TestsRun);
                Assert.Equal(1, finished.TestsSkipped);
            }
                );
        }
Beispiel #18
0
        public static async void Messages()
        {
            var summary = new RunSummary {
                Total = 4, Failed = 2, Skipped = 1, Time = 21.12m
            };
            var messages      = new List <IMessageSinkMessage>();
            var messageSink   = SpyMessageSink.Create(messages: messages);
            var runner        = TestableTestAssemblyRunner.Create(messageSink, summary);
            var thisAssembly  = Assembly.GetExecutingAssembly();
            var thisAppDomain = AppDomain.CurrentDomain;

            var result = await runner.RunAsync();

            Assert.Equal(4, result.Total);
            Assert.Equal(2, result.Failed);
            Assert.Equal(1, result.Skipped);
            Assert.NotEqual(21.12m, result.Time);  // Uses clock time, not result time
            Assert.Collection(messages,
                              msg =>
            {
                var starting = Assert.IsAssignableFrom <ITestAssemblyStarting>(msg);
#if NETFRAMEWORK
                Assert.Equal(thisAssembly.GetLocalCodeBase(), starting.TestAssembly.Assembly.AssemblyPath);
                Assert.Equal(thisAppDomain.SetupInformation.ConfigurationFile, starting.TestAssembly.ConfigFileName);
#endif
                Assert.InRange(starting.StartTime, DateTime.Now.AddMinutes(-15), DateTime.Now);
                Assert.Equal("The test framework environment", starting.TestEnvironment);
                Assert.Equal("The test framework display name", starting.TestFrameworkDisplayName);
            },
                              msg =>
            {
                var finished = Assert.IsAssignableFrom <ITestAssemblyFinished>(msg);
                Assert.Equal(4, finished.TestsRun);
                Assert.Equal(2, finished.TestsFailed);
                Assert.Equal(1, finished.TestsSkipped);
                Assert.Equal(result.Time, finished.ExecutionTime);
            }
                              );
        }
Beispiel #19
0
        public static async void OrdererUsedToOrderTestCases()
        {
            var collection1 = Mocks.TestCollection(displayName: "AAA");
            var testCase1a  = Mocks.TestCase(collection1);
            var testCase1b  = Mocks.TestCase(collection1);
            var collection2 = Mocks.TestCollection(displayName: "ZZZZ");
            var testCase2a  = Mocks.TestCase(collection2);
            var testCase2b  = Mocks.TestCase(collection2);
            var collection3 = Mocks.TestCollection(displayName: "MM");
            var testCase3a  = Mocks.TestCase(collection3);
            var testCase3b  = Mocks.TestCase(collection3);
            var testCases   = new[] { testCase1a, testCase3a, testCase2a, testCase3b, testCase2b, testCase1b };
            var runner      = TestableTestAssemblyRunner.Create(testCases: testCases);

            runner.TestCollectionOrderer = new MyTestCollectionOrderer();

            await runner.RunAsync();

            Assert.Collection(runner.CollectionsRun,
                              collection =>
            {
                Assert.Same(collection2, collection.Item1);
                Assert.Equal(new[] { testCase2a, testCase2b }, collection.Item2);
            },
                              collection =>
            {
                Assert.Same(collection3, collection.Item1);
                Assert.Equal(new[] { testCase3a, testCase3b }, collection.Item2);
            },
                              collection =>
            {
                Assert.Same(collection1, collection.Item1);
                Assert.Equal(new[] { testCase1a, testCase1b }, collection.Item2);
            }
                              );
        }
Beispiel #20
0
        public static void DefaultTestCaseOrderer()
        {
            var runner = TestableTestAssemblyRunner.Create();

            Assert.IsType <DefaultTestCollectionOrderer>(runner.TestCollectionOrderer);
        }
        public static async ValueTask DefaultTestCaseOrderer()
        {
            await using var runner = TestableTestAssemblyRunner.Create();

            Assert.IsType <DefaultTestCollectionOrderer>(runner.TestCollectionOrderer);
        }