Ejemplo n.º 1
0
        public void RaiseDiscoveredTestsShouldInvokeRegisteredEventHandler()
        {
            bool discoveredTestsReceived = false;
            DiscoveredTestsEventArgs receivedEventArgs = null;
            EventWaitHandle          waitHandle        = new AutoResetEvent(false);

            List <TestCase> testCases = new List <TestCase> {
                new TestCase("This is a string.", new Uri("some://uri"), "DummySourceFileName")
            };
            DiscoveredTestsEventArgs discoveredTestsEventArgs = new DiscoveredTestsEventArgs(testCases);

            // Register for the discovered tests event.
            loggerEvents.DiscoveredTests += (sender, e) =>
            {
                discoveredTestsReceived = true;
                receivedEventArgs       = e;
                waitHandle.Set();
            };

            loggerEvents.EnableEvents();
            // Send the discovered tests event.
            loggerEvents.RaiseDiscoveredTests(discoveredTestsEventArgs);

            var waitSuccess = waitHandle.WaitOne(500);

            Assert.IsTrue(waitSuccess, "Event must be raised within timeout.");
            Assert.IsTrue(discoveredTestsReceived);
            Assert.IsNotNull(receivedEventArgs);
            Assert.AreEqual(receivedEventArgs, discoveredTestsEventArgs);
        }
Ejemplo n.º 2
0
            private void discoveryRequest_OnDiscoveredTests(Object sender, DiscoveredTestsEventArgs args)
            {
                if (args == null)
                {
                    throw new TestPlatformException("DiscoveredTestsEventArgs cannot be null.");
                }

                // Initializing the test case filter here because the filter value is read late.
                this.testCasefilter.Initialize(this.options.TestCaseFilterValue);
                var discoveredTests = args.DiscoveredTestCases.ToList();
                var filteredTests   = this.testCasefilter.FilterTests(discoveredTests).ToList();

                // remove any duplicate tests
                filteredTests = filteredTests.Select(test => test.FullyQualifiedName)
                                .Distinct()
                                .Select(fqdn => filteredTests.First(test => test.FullyQualifiedName == fqdn))
                                .ToList();
                this.discoveredTests.AddRange(filteredTests.Select(test => test.FullyQualifiedName));

                if (this.ObjectWriter != null)
                {
                    foreach (var test in discoveredTests)
                    {
                        this.ObjectWriter.SendObject(test);
                    }
                }
            }
Ejemplo n.º 3
0
        /// <inheritdoc/>
        public void HandleDiscoveredTests(IEnumerable <TestCase> discoveredTestCases)
        {
            if (EqtTrace.IsVerboseEnabled)
            {
                EqtTrace.Verbose("DiscoveryRequest.SendDiscoveredTests: Starting.");
            }

            lock (this.syncObject)
            {
                if (this.disposed)
                {
                    if (EqtTrace.IsWarningEnabled)
                    {
                        EqtTrace.Warning("DiscoveryRequest.SendDiscoveredTests: Ignoring as the object is disposed.");
                    }

                    return;
                }

                var discoveredTestsEvent = new DiscoveredTestsEventArgs(discoveredTestCases);
                this.LoggerManager.HandleDiscoveredTests(discoveredTestsEvent);
                this.OnDiscoveredTests.SafeInvoke(this, discoveredTestsEvent, "DiscoveryRequest.OnDiscoveredTests");
            }

            if (EqtTrace.IsInfoEnabled)
            {
                EqtTrace.Info("DiscoveryRequest.SendDiscoveredTests: Completed.");
            }
        }
        /// <summary>
        /// Raises discovered tests event to the enabled loggers.
        /// </summary>
        /// <param name="args"> Arguments to be raised. </param>
        internal void RaiseDiscoveredTests(DiscoveredTestsEventArgs args)
        {
            ValidateArg.NotNull <DiscoveredTestsEventArgs>(args, "args");

            CheckDisposed();

            SafeInvokeAsync(() => this.DiscoveredTests, args, 0, "InternalTestLoggerEvents.SendDiscoveredTests");
        }
        private void Events_DiscoveredTests(object sender, DiscoveredTestsEventArgs e)
        {
            TestCaseInfos = TestCaseInfos.Concat(e.DiscoveredTestCases.Select(testCase =>
            {
                string name = testCase.DisplayName;

                string[] categories;

                try
                {
                    categories = testCase.GetPropertyValue <string[]>(TestProperty.Find("MSTestDiscoverer.TestCategory"), new string[] { });
                }
                catch
                {
                    categories = new string[] { };
                }

                string description;

                try
                {
                    description = testCase.GetPropertyValue <string>(TestProperty.Find("Description"), String.Empty);
                }
                catch
                {
                    description = String.Empty;
                }

                var testcaseToolTipBuilder = new StringBuilder();

                testcaseToolTipBuilder.Append(name);

                if (categories.Length > 0)
                {
                    testcaseToolTipBuilder.Append(Environment.NewLine + "Category:");

                    foreach (var category in categories)
                    {
                        testcaseToolTipBuilder.Append(Environment.NewLine + "  " + category);
                    }
                }
                if (!string.IsNullOrEmpty(description))
                {
                    testcaseToolTipBuilder.Append(Environment.NewLine + "Description:");

                    testcaseToolTipBuilder.Append(Environment.NewLine + "  " + description);
                }

                return(new TestCaseInfo
                {
                    Category = categories,
                    Description = description,
                    FullName = testCase.FullyQualifiedName,
                    Name = testCase.DisplayName,
                    ToolTipOnUI = testcaseToolTipBuilder.ToString(),
                });
            }));
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Handle discovered tests.
        /// </summary>
        /// <param name="e">DiscoveredTests event args.</param>
        public void HandleDiscoveredTests(DiscoveredTestsEventArgs e)
        {
            if (this.isDisposed)
            {
                EqtTrace.Warning("TestLoggerManager.HandleDiscoveredTests: Ignoring as the object is disposed.");
                return;
            }

            this.loggerEvents.RaiseDiscoveredTests(e);
        }
Ejemplo n.º 7
0
 private void discoveryRequest_OnDiscoveredTests(Object sender, DiscoveredTestsEventArgs args)
 {
     // List out each of the tests.
     foreach (var test in args.DiscoveredTestCases)
     {
         this.output.WriteLine(String.Format(CultureInfo.CurrentUICulture,
                                             CommandLineResources.AvailableTestsFormat,
                                             test.DisplayName),
                               OutputLevel.Information);
     }
 }
Ejemplo n.º 8
0
        public void RaiseDiscoveredTestsShouldThrowExceptionIfAlreadyDisposed()
        {
            var             loggerEvents = GetDisposedLoggerEvents();
            List <TestCase> testCases    = new List <TestCase> {
                new TestCase("This is a string.", new Uri("some://uri"), "DummySourceFileName")
            };
            DiscoveredTestsEventArgs discoveredTestsEventArgs = new DiscoveredTestsEventArgs(testCases);

            Assert.ThrowsException <ObjectDisposedException>(() =>
            {
                loggerEvents.RaiseDiscoveredTests(discoveredTestsEventArgs);
            });
        }
Ejemplo n.º 9
0
        /// <summary>
        /// Handles LoggerManager's DiscoveryComplete.
        /// </summary>
        /// <param name="discoveryCompletePayload">Discovery complete payload.</param>
        private void HandleLoggerManagerDiscoveryComplete(DiscoveryCompletePayload discoveryCompletePayload)
        {
            if (this.LoggerManager.LoggersInitialized && discoveryCompletePayload != null)
            {
                // Send last chunk to logger manager.
                if (discoveryCompletePayload.LastDiscoveredTests != null)
                {
                    var discoveredTestsEventArgs = new DiscoveredTestsEventArgs(discoveryCompletePayload.LastDiscoveredTests);
                    this.LoggerManager.HandleDiscoveredTests(discoveredTestsEventArgs);
                }

                // Send discovery complete to logger manager.
                var discoveryCompleteEventArgs = new DiscoveryCompleteEventArgs(discoveryCompletePayload.TotalTests, discoveryCompletePayload.IsAborted);
                discoveryCompleteEventArgs.Metrics = discoveryCompletePayload.Metrics;
                this.LoggerManager.HandleDiscoveryComplete(discoveryCompleteEventArgs);
            }
        }
        /// <summary>
        /// Filter discovered tests and find matching tests from given search strings.
        /// Any name of the test that can match multiple strings will be added only once.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void discoveryRequest_OnDiscoveredTests(object sender, DiscoveredTestsEventArgs args)
        {
            this.discoveredTestCount += args.DiscoveredTestCases.Count();
            foreach (var testCase in args.DiscoveredTestCases)
            {
                foreach (var nameCriteria in this.selectedTestNames)
                {
                    if (testCase.FullyQualifiedName.IndexOf(nameCriteria, StringComparison.OrdinalIgnoreCase) != -1)
                    {
                        this.selectedTestCases.Add(testCase);

                        // If a testcase matched then a filter matched - so remove the filter from not found list
                        this.undiscoveredFilters.Remove(nameCriteria);
                        break;
                    }
                }
            }
        }
Ejemplo n.º 11
0
        public void DiscoveryRequestRaiseShouldInvokeDiscoveredTestsHandlerOfLoggersOnlyIfRegistered()
        {
            counter = 0;
            waitHandle.Reset();

            List <TestCase> testCases = new List <TestCase> {
                new TestCase("This is a string.", new Uri("some://uri"), "DummySourceFileName")
            };
            DiscoveredTestsEventArgs discoveredTestsEventArgs = new DiscoveredTestsEventArgs(testCases);

            // mock for IDiscoveryRequest
            var discoveryRequest = new Mock <IDiscoveryRequest>();

            // setup TestLogger
            TestLoggerManager.Instance.AddLogger(new Uri(loggerUri), new Dictionary <string, string>());
            TestLoggerManager.Instance.EnableLogging();

            // Register DiscoveryRequest object
            TestLoggerManager.Instance.RegisterDiscoveryEvents(discoveryRequest.Object);

            //Raise an event on mock object
            discoveryRequest.Raise(
                m => m.OnDiscoveredTests += null,
                discoveredTestsEventArgs);

            // Assertions when discovery events registered
            waitHandle.WaitOne();
            Assert.AreEqual(counter, 1);

            // Unregister DiscoveryRequest object
            TestLoggerManager.Instance.UnregisterDiscoveryEvents(discoveryRequest.Object);

            //Raise an event on mock object
            discoveryRequest.Raise(
                m => m.OnDiscoveredTests += null,
                discoveredTestsEventArgs);

            // Assertions when discovery events unregistered
            Assert.AreEqual(counter, 1);
        }
Ejemplo n.º 12
0
        public void HandleDiscoveryComplete_Otherwise_RaisesTestCasesDiscoveredWithLastChunkAsDiscoveredTestCases(int testCaseCount)
        {
            var vstest = Substitute.For <IVsTestConsoleWrapper>();

            var uut = new TestCaseDiscoveryManager(vstest);

            uut.DiscoverTestCasesAsync(Enumerable.Empty <string>()).Wait();
            DiscoveredTestsEventArgs args = null;
            var handler = Substitute.For <EventHandler <DiscoveredTestsEventArgs> >();

            handler.When(x => x.Invoke(Arg.Any <object>(), Arg.Any <DiscoveredTestsEventArgs>())).Do(x => args = (DiscoveredTestsEventArgs)x[1]);
            uut.TestCasesDiscovered += handler;
            var lastChunk = Enumerable.Repeat(1, testCaseCount).Select(x => new TestCase()
            {
                Id = Guid.NewGuid()
            }).ToArray();

            uut.HandleDiscoveryComplete(0, lastChunk, false);

            handler.Received(1).Invoke(uut, Arg.Any <DiscoveredTestsEventArgs>());
            CollectionAssert.AreEquivalent(lastChunk, args.DiscoveredTestCases);
        }
        /**********************************************************************/
        #region Event Handlers

        private void OnTestCasesDiscovered(object sender, DiscoveredTestsEventArgs e)
        {
            if (e == null)
            {
                throw new ArgumentNullException(nameof(e));
            }

            var addedTestResults    = new List <ITestResult>(e.DiscoveredTestCases.Count());
            var modifiedTestResults = new List <ITestResult>(_testResultsByTestCaseId.Count);

            foreach (var testCase in e.DiscoveredTestCases)
            {
                if (_testResultsByTestCaseId.ContainsKey(testCase.Id))
                {
                    var oldTestResult = _testResultsByTestCaseId[testCase.Id];
                    var newTestResult = _testObjectFactory.CloneTestResult(oldTestResult, testCase);
                    _testResultsByTestCaseId[testCase.Id] = newTestResult;
                    modifiedTestResults.Add(newTestResult);
                }
                else
                {
                    var newTestResult = _testObjectFactory.CreateTestResult(testCase);
                    _testResultsByTestCaseId.Add(testCase.Id, newTestResult);
                    addedTestResults.Add(newTestResult);
                }

                _discoverySessionTestResultTestCaseIds.Add(testCase.Id);
            }

            if (addedTestResults.Count > 0)
            {
                RaiseTestResultsAdded(addedTestResults);
            }
            if (modifiedTestResults.Count > 0)
            {
                RaiseTestResultsModified(modifiedTestResults);
            }
        }
Ejemplo n.º 14
0
        /// <inheritdoc/>
        public void HandleDiscoveryComplete(DiscoveryCompleteEventArgs discoveryCompleteEventArgs, IEnumerable <TestCase> lastChunk)
        {
            if (EqtTrace.IsVerboseEnabled)
            {
                EqtTrace.Verbose("DiscoveryRequest.DiscoveryComplete: Starting. Aborted:{0}, TotalTests:{1}", discoveryCompleteEventArgs.IsAborted, discoveryCompleteEventArgs.TotalCount);
            }

            lock (this.syncObject)
            {
                if (this.disposed)
                {
                    if (EqtTrace.IsWarningEnabled)
                    {
                        EqtTrace.Warning("DiscoveryRequest.DiscoveryComplete: Ignoring as the object is disposed.");
                    }

                    return;
                }

                // If discovery event is already raised, ignore current one.
                if (this.discoveryCompleted.WaitOne(0))
                {
                    if (EqtTrace.IsVerboseEnabled)
                    {
                        EqtTrace.Verbose("DiscoveryRequest.DiscoveryComplete:Ignoring duplicate DiscoveryComplete. Aborted:{0}, TotalTests:{1}", discoveryCompleteEventArgs.IsAborted, discoveryCompleteEventArgs.TotalCount);
                    }

                    return;
                }

                // Close the discovery session and terminate any test host processes. This operation should never
                // throw.
                this.DiscoveryManager?.Close();

                try
                {
                    // Raise onDiscoveredTests event if there are some tests in the last chunk.
                    // (We don't want to send the tests in the discovery complete event so that programming on top of
                    // RS client is easier i.e. user does not have to listen on discovery complete event.)
                    if (lastChunk != null && lastChunk.Any())
                    {
                        var discoveredTestsEvent = new DiscoveredTestsEventArgs(lastChunk);
                        this.LoggerManager.HandleDiscoveredTests(discoveredTestsEvent);
                        this.OnDiscoveredTests.SafeInvoke(this, discoveredTestsEvent, "DiscoveryRequest.DiscoveryComplete");
                    }

                    this.LoggerManager.HandleDiscoveryComplete(discoveryCompleteEventArgs);
                    this.OnDiscoveryComplete.SafeInvoke(this, discoveryCompleteEventArgs, "DiscoveryRequest.DiscoveryComplete");
                }
                finally
                {
                    // Notify the waiting handle that discovery is complete
                    if (this.discoveryCompleted != null)
                    {
                        this.discoveryCompleted.Set();
                        if (EqtTrace.IsVerboseEnabled)
                        {
                            EqtTrace.Verbose("DiscoveryRequest.DiscoveryComplete: Notified the discovery complete event.");
                        }
                    }
                    else
                    {
                        if (EqtTrace.IsWarningEnabled)
                        {
                            EqtTrace.Warning("DiscoveryRequest.DiscoveryComplete: Discovery complete event was null.");
                        }
                    }

                    this.discoveryInProgress = false;
                    var discoveryFinalTimeTaken = DateTime.UtcNow - this.discoveryStartTime;

                    // Fill in the Metrics From Test Host Process
                    var metrics = discoveryCompleteEventArgs.Metrics;
                    if (metrics != null && metrics.Count != 0)
                    {
                        foreach (var metric in metrics)
                        {
                            this.requestData.MetricsCollection.Add(metric.Key, metric.Value);
                        }
                    }

                    // Collecting Total Time Taken
                    this.requestData.MetricsCollection.Add(
                        TelemetryDataConstants.TimeTakenInSecForDiscovery, discoveryFinalTimeTaken.TotalSeconds);
                }
            }

            if (EqtTrace.IsInfoEnabled)
            {
                EqtTrace.Info("DiscoveryRequest.DiscoveryComplete: Completed.");
            }
        }
Ejemplo n.º 15
0
 private void DiscoveredTestsHandler(object sender, DiscoveredTestsEventArgs e)
 {
     TestLoggerManagerTests.counter++;
     TestLoggerManagerTests.waitHandle.Set();
 }
Ejemplo n.º 16
0
 /// <summary>
 /// Send discovered tests to all registered listeners.
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void DiscoveredTestsHandler(object sender, DiscoveredTestsEventArgs e)
 {
     this.loggerEvents.RaiseDiscoveredTests(e);
 }
Ejemplo n.º 17
0
 public void OnDiscoveredTests(DiscoveredTestsEventArgs e) => DiscoveredTests?.Invoke(this, e);