Esempio n. 1
0
        /// <inheritdoc />
        public void StartTestRun(TestRunCriteriaWithTests runCriteria, ITestRunEventsHandler eventHandler)
        {
            this.messageEventHandler = eventHandler;
            this.onDisconnected      = (disconnectedEventArgs) =>
            {
                this.OnTestRunAbort(eventHandler, disconnectedEventArgs.Error, true);
            };
            this.onMessageReceived        = (sender, args) => this.OnExecutionMessageReceived(sender, args, eventHandler);
            this.channel.MessageReceived += this.onMessageReceived;

            var message = this.dataSerializer.SerializePayload(
                MessageType.StartTestExecutionWithTests,
                runCriteria,
                this.protocolVersion);

            this.channel.Send(message);
        }
Esempio n. 2
0
        public void StartTestRunWithTestsShouldCallHandleTestRunStatsChange()
        {
            var mockHandler = new Mock <ITestRunEventsHandler>();
            var runCriteria = new TestRunCriteriaWithTests(null, null, null);

            var testRunChangedArgs = new TestRunChangedEventArgs(null, null, null);
            var rawMessage         = "OnTestRunStatsChange";
            var message            = new Message()
            {
                MessageType = MessageType.TestRunStatsChange, Payload = null
            };

            this.SetupReceiveRawMessageAsyncAndDeserializeMessageAndInitialize(rawMessage, message);
            this.mockDataSerializer.Setup(ds => ds.DeserializePayload <TestRunChangedEventArgs>(message)).Returns(testRunChangedArgs);


            var completePayload = new TestRunCompletePayload()
            {
                ExecutorUris        = null,
                LastRunTests        = null,
                RunAttachments      = null,
                TestRunCompleteArgs = null
            };
            var completeMessage = new Message()
            {
                MessageType = MessageType.ExecutionComplete, Payload = null
            };
            var waitHandle = new AutoResetEvent(false);

            mockHandler.Setup(mh => mh.HandleTestRunStatsChange(testRunChangedArgs)).Callback(
                () =>
            {
                this.mockDataSerializer.Setup(ds => ds.DeserializeMessage(It.IsAny <string>())).Returns(completeMessage);
                this.mockDataSerializer.Setup(ds => ds.DeserializePayload <TestRunCompletePayload>(completeMessage)).Returns(completePayload);
                waitHandle.Set();
            });

            this.testRequestSender.StartTestRun(runCriteria, mockHandler.Object);

            waitHandle.WaitOne();
            this.mockCommunicationManager.Verify(mc => mc.SendMessage(MessageType.StartTestExecutionWithTests, runCriteria), Times.Once);
            mockHandler.Verify(mh => mh.HandleTestRunStatsChange(testRunChangedArgs), Times.Once);
            mockHandler.Verify(mh => mh.HandleRawMessage(rawMessage), Times.AtLeastOnce);
        }
Esempio n. 3
0
        /// <inheritdoc />
        public void StartTestRun(TestRunCriteriaWithTests runCriteria, ITestRunEventsHandler eventHandler)
        {
            this.messageEventHandler = eventHandler;
            this.onDisconnected      = (disconnectedEventArgs) =>
            {
                this.OnTestRunAbort(eventHandler, disconnectedEventArgs.Error, true);
            };
            this.onMessageReceived        = (sender, args) => this.OnExecutionMessageReceived(sender, args, eventHandler);
            this.channel.MessageReceived += this.onMessageReceived;

            var message = this.dataSerializer.SerializePayload(
                MessageType.StartTestExecutionWithTests,
                runCriteria,
                this.protocolVersion);

            if (EqtTrace.IsVerboseEnabled)
            {
                EqtTrace.Verbose("TestRequestSender.StartTestRun: Sending test run with message: {0}", message);
            }

            this.channel.Send(message);
        }
Esempio n. 4
0
        public void SendExecutionCompleteShouldSendTestRunCompletePayloadOnChannel()
        {
            var t1        = new TestCase("N.C.M1", new Uri("executor://mstest/v2"), "test1.dll");
            var t2        = new TestCase("N.C.M2", new Uri("executor://mstest/v2"), "test1.dll");
            var testCases = new[] { t1, t2 };
            var testRunCriteriaWithTests = new TestRunCriteriaWithTests(testCases, "runsettings", null, null);
            var message = this.dataSerializer.SerializePayload(MessageType.StartTestExecutionWithTests, testRunCriteriaWithTests);

            this.mockExecutionManager.Setup(em => em.StartTestRun(It.IsAny <IEnumerable <TestCase> >(), It.IsAny <string>(),
                                                                  It.IsAny <string>(),
                                                                  It.IsAny <TestExecutionContext>(), It.IsAny <ITestCaseEventsHandler>(),
                                                                  It.IsAny <ITestRunEventsHandler>())).Callback(() =>
            {
                this.requestHandler.SendExecutionComplete(It.IsAny <TestRunCompleteEventArgs>(), It.IsAny <TestRunChangedEventArgs>(), It.IsAny <ICollection <AttachmentSet> >(), It.IsAny <ICollection <string> >());
            });
            this.SetupChannel();

            this.ProcessRequestsAsync(this.mockTestHostManagerFactory.Object);
            this.mockChannel.Setup(mc => mc.Send(It.Is <string>(d => d.Contains(MessageType.ExecutionComplete))))
            .Callback <string>(
                (d) =>
            {
                var msg     = this.dataSerializer.DeserializeMessage(d);
                var payload = this.dataSerializer.DeserializePayload <TestRunCompletePayload>(msg);
                Assert.IsNotNull(payload);
            });
            this.SendMessageOnChannel(message);
            this.jobQueue.Flush();

            mockExecutionManager.Verify(e =>
                                        e.StartTestRun(
                                            It.Is <IEnumerable <TestCase> >(tcs =>
                                                                            tcs.Any(t => t.FullyQualifiedName.Equals("N.C.M1")) &&
                                                                            tcs.Any(t => t.FullyQualifiedName.Equals("N.C.M2"))), It.IsAny <string>(),
                                            It.IsAny <string>(),
                                            It.IsAny <TestExecutionContext>(), It.IsAny <ITestCaseEventsHandler>(),
                                            It.IsAny <ITestRunEventsHandler>()));
            this.SendSessionEnd();
        }
        public void ProcessRequestsExecutionStartShouldStartExecutionWithGivenTests()
        {
            var t1        = new TestCase("N.C.M1", new Uri("executor://mstest/v2"), "test1.dll");
            var t2        = new TestCase("N.C.M2", new Uri("executor://mstest/v2"), "test1.dll");
            var testCases = new [] { t1, t2 };
            var testRunCriteriaWithTests = new TestRunCriteriaWithTests(testCases, "runsettings", null, null);
            var message = this.dataSerializer.SerializePayload(MessageType.StartTestExecutionWithTests, testRunCriteriaWithTests);

            this.ProcessRequestsAsync(this.mockTestHostManagerFactory.Object);

            this.SendMessageOnChannel(message);
            this.jobQueue.Flush();

            mockExecutionManager.Verify(e =>
                                        e.StartTestRun(
                                            It.Is <IEnumerable <TestCase> >(tcs =>
                                                                            tcs.Any(t => t.FullyQualifiedName.Equals("N.C.M1")) &&
                                                                            tcs.Any(t => t.FullyQualifiedName.Equals("N.C.M2"))), It.IsAny <string>(),
                                            It.IsAny <string>(),
                                            It.IsAny <TestExecutionContext>(), It.IsAny <ITestCaseEventsHandler>(),
                                            It.IsAny <ITestRunEventsHandler>()));
            this.SendSessionEnd();
        }
Esempio n. 6
0
 /// <summary>
 /// Executes the specified tests with the criteria mentioned.
 /// </summary>
 /// <param name="runCriteria">The test run criteria.</param>
 /// <param name="eventHandler">The handler for execution events from the test host.</param>
 public void StartTestRun(TestRunCriteriaWithTests runCriteria, ITestRunEventsHandler eventHandler)
 {
     this.StartTestRunAndListenAndReportTestResults(MessageType.StartTestExecutionWithTests, runCriteria, eventHandler);
 }
Esempio n. 7
0
        /// <summary>
        /// Starts the test run
        /// </summary>
        /// <param name="testRunCriteria"> The settings/options for the test run. </param>
        /// <param name="eventHandler"> EventHandler for handling execution events from Engine. </param>
        /// <returns> The process id of the runner executing tests. </returns>
        public virtual int StartTestRun(TestRunCriteria testRunCriteria, ITestRunEventsHandler eventHandler)
        {
            try
            {
                if (!this.testHostManager.Shared)
                {
                    // Non shared test host requires test source information to launch. Provide the sources
                    // information and create the channel.
                    EqtTrace.Verbose("ProxyExecutionManager: Test host is non shared. Lazy initialize.");
                    var testSources = testRunCriteria.Sources;

                    // If the test execution is with a test filter, group them by sources
                    if (testRunCriteria.HasSpecificTests)
                    {
                        testSources = testRunCriteria.Tests.GroupBy(tc => tc.Source).Select(g => g.Key);
                    }

                    this.InitializeExtensions(testSources);
                }

                this.SetupChannel(testRunCriteria.Sources);

                var executionContext = new TestExecutionContext(
                    testRunCriteria.FrequencyOfRunStatsChangeEvent,
                    testRunCriteria.RunStatsChangeEventTimeout,
                    inIsolation: false,
                    keepAlive: testRunCriteria.KeepAlive,
                    isDataCollectionEnabled: false,
                    areTestCaseLevelEventsRequired: false,
                    hasTestRun: true,
                    isDebug: (testRunCriteria.TestHostLauncher != null && testRunCriteria.TestHostLauncher.IsDebug),
                    testCaseFilter: testRunCriteria.TestCaseFilter);

                if (testRunCriteria.HasSpecificSources)
                {
                    var runRequest = new TestRunCriteriaWithSources(
                        testRunCriteria.AdapterSourceMap,
                        testRunCriteria.TestRunSettings,
                        executionContext);

                    this.RequestSender.StartTestRun(runRequest, eventHandler);
                }
                else
                {
                    var runRequest = new TestRunCriteriaWithTests(
                        testRunCriteria.Tests,
                        testRunCriteria.TestRunSettings,
                        executionContext);

                    this.RequestSender.StartTestRun(runRequest, eventHandler);
                }
            }
            catch (Exception exception)
            {
                EqtTrace.Error("ProxyExecutionManager.StartTestRun: Failed to start test run: {0}", exception);
                var completeArgs = new TestRunCompleteEventArgs(null, false, false, exception, new Collection <AttachmentSet>(), TimeSpan.Zero);
                eventHandler.HandleLogMessage(TestMessageLevel.Error, exception.Message);
                eventHandler.HandleTestRunComplete(completeArgs, null, null, null);
            }

            return(0);
        }
Esempio n. 8
0
        /// <summary>
        /// Starts the test run
        /// </summary>
        /// <param name="testRunCriteria"> The settings/options for the test run. </param>
        /// <param name="eventHandler"> EventHandler for handling execution events from Engine. </param>
        /// <returns> The process id of the runner executing tests. </returns>
        public virtual int StartTestRun(TestRunCriteria testRunCriteria, ITestRunEventsHandler eventHandler)
        {
            try
            {
                EqtTrace.Verbose("ProxyExecutionManager: Test host is always Lazy initialize.");
                var testSources = testRunCriteria.Sources;

                // If the test execution is with a test filter, group them by sources
                if (testRunCriteria.HasSpecificTests)
                {
                    testSources = testRunCriteria.Tests.GroupBy(tc => tc.Source).Select(g => g.Key);
                }

                this.isCommunicationEstablished = this.SetupChannel(testSources, this.cancellationTokenSource.Token);

                if (this.isCommunicationEstablished)
                {
                    if (this.cancellationTokenSource.IsCancellationRequested)
                    {
                        if (EqtTrace.IsVerboseEnabled)
                        {
                            EqtTrace.Verbose("ProxyExecutionManager.StartTestRun: Canceling the current run after getting cancelation request.");
                        }
                        throw new TestPlatformException(Resources.Resources.CancelationRequested);
                    }

                    this.InitializeExtensions(testSources);

                    var executionContext = new TestExecutionContext(
                        testRunCriteria.FrequencyOfRunStatsChangeEvent,
                        testRunCriteria.RunStatsChangeEventTimeout,
                        inIsolation: false,
                        keepAlive: testRunCriteria.KeepAlive,
                        isDataCollectionEnabled: false,
                        areTestCaseLevelEventsRequired: false,
                        hasTestRun: true,
                        isDebug: (testRunCriteria.TestHostLauncher != null && testRunCriteria.TestHostLauncher.IsDebug),
                        testCaseFilter: testRunCriteria.TestCaseFilter);

                    // This is workaround for the bug https://github.com/Microsoft/vstest/issues/970
                    var runsettings = this.RemoveNodesFromRunsettingsIfRequired(testRunCriteria.TestRunSettings, (testMessageLevel, message) => { this.LogMessage(testMessageLevel, message, eventHandler); });
                    if (testRunCriteria.HasSpecificSources)
                    {
                        var runRequest = new TestRunCriteriaWithSources(
                            testRunCriteria.AdapterSourceMap,
                            runsettings,
                            executionContext);

                        this.RequestSender.StartTestRun(runRequest, eventHandler);
                    }
                    else
                    {
                        var runRequest = new TestRunCriteriaWithTests(
                            testRunCriteria.Tests,
                            runsettings,
                            executionContext);

                        this.RequestSender.StartTestRun(runRequest, eventHandler);
                    }
                }
            }
            catch (Exception exception)
            {
                EqtTrace.Error("ProxyExecutionManager.StartTestRun: Failed to start test run: {0}", exception);
                this.LogMessage(TestMessageLevel.Error, exception.Message, eventHandler);

                // Send a run complete to caller. Similar logic is also used in ParallelProxyExecutionManager.StartTestRunOnConcurrentManager
                // Aborted is `true`: in case of parallel run (or non shared host), an aborted message ensures another execution manager
                // created to replace the current one. This will help if the current execution manager is aborted due to irreparable error
                // and the test host is lost as well.
                var completeArgs = new TestRunCompleteEventArgs(null, false, true, exception, new Collection <AttachmentSet>(), TimeSpan.Zero);
                eventHandler.HandleTestRunComplete(completeArgs, null, null, null);
            }

            return(0);
        }