예제 #1
0
        public void SetupChannelShouldCallSetupClientIfRunnerIsClient()
        {
            var connectionInfo = new TestHostConnectionInfo
            {
                Endpoint  = IPAddress.Loopback + ":0",
                Role      = ConnectionRole.Host,
                Transport = Transport.Sockets
            };
            ProtocolConfig protocolConfig = new ProtocolConfig {
                Version = 2
            };
            var mockCommunicationManager = new Mock <ICommunicationManager>();

            mockCommunicationManager.Setup(mc => mc.SetupClientAsync(new IPEndPoint(IPAddress.Loopback, 0)));
            mockCommunicationManager.Setup(mc => mc.WaitForServerConnection(It.IsAny <int>())).Returns(true);
            var mockDataSerializer = new Mock <IDataSerializer>();
            var testRequestSender  = new TestRequestSender(mockCommunicationManager.Object, connectionInfo, mockDataSerializer.Object, new ProtocolConfig {
                Version = 2
            });

            this.mockTestHostManager.Setup(thm => thm.GetTestHostConnectionInfo()).Returns(connectionInfo);
            var message = new Message()
            {
                MessageType = MessageType.VersionCheck, Payload = protocolConfig.Version
            };

            mockCommunicationManager.Setup(mc => mc.ReceiveMessage()).Returns(message);
            mockDataSerializer.Setup(ds => ds.DeserializePayload <int>(It.IsAny <Message>())).Returns(protocolConfig.Version);

            var localTestOperationManager = new TestableProxyOperationManager(testRequestSender, this.mockTestHostManager.Object, this.connectionTimeout);

            localTestOperationManager.SetupChannel(Enumerable.Empty <string>(), CancellationToken.None);

            mockCommunicationManager.Verify(s => s.SetupClientAsync(It.IsAny <IPEndPoint>()), Times.Once);
        }
예제 #2
0
        /// <summary>
        /// Fetches the ExecutionManager for this engine. This manager would provide all functionality required for execution.
        /// </summary>
        /// <param name="testHostManager">Test host manager.</param>
        /// <param name="testRunCriteria">Test run criterion.</param>
        /// <param name="config">Protocol related information</param>
        /// <returns>
        /// ITestExecutionManager object that can do execution
        /// </returns>
        public IProxyExecutionManager GetExecutionManager(ITestRuntimeProvider testHostManager, TestRunCriteria testRunCriteria, ProtocolConfig config)
        {
            var distinctSources = GetDistinctNumberOfSources(testRunCriteria);
            var parallelLevel   = this.VerifyParallelSettingAndCalculateParallelLevel(distinctSources, testRunCriteria.TestRunSettings);

            var isDataCollectorEnabled = XmlRunSettingsUtilities.IsDataCollectionEnabled(testRunCriteria.TestRunSettings);

            // SetupChannel ProxyExecutionManager with data collection if data collectors are specififed in run settings.
            Func <IProxyExecutionManager> proxyExecutionManagerCreator = delegate
            {
                // Create a new HostManager, to be associated with individual ProxyExecutionManager(&POM)
                var hostManager = this.testHostProviderManager.GetTestHostManagerByRunConfiguration(testRunCriteria.TestRunSettings);
                hostManager?.Initialize(TestSessionMessageLogger.Instance, testRunCriteria.TestRunSettings);

                if (testRunCriteria.TestHostLauncher != null)
                {
                    hostManager.SetCustomLauncher(testRunCriteria.TestHostLauncher);
                }

                var requestSender = new TestRequestSender(config);

                return(isDataCollectorEnabled ? new ProxyExecutionManagerWithDataCollection(requestSender, hostManager, new ProxyDataCollectionManager(testRunCriteria.TestRunSettings))
                                                : new ProxyExecutionManager(requestSender, hostManager));
            };

            // parallelLevel = 1 for desktop should go via else route.
            if (parallelLevel > 1 || !testHostManager.Shared)
            {
                return(new ParallelProxyExecutionManager(proxyExecutionManagerCreator, parallelLevel, sharedHosts: testHostManager.Shared));
            }
            else
            {
                return(proxyExecutionManagerCreator());
            }
        }
예제 #3
0
        public void SetupChannelShouldCallSetupClientIfRunnerIsClient()
        {
            var connectionInfo = new TestHostConnectionInfo
            {
                Endpoint  = IPAddress.Loopback + ":124",
                Role      = ConnectionRole.Host,
                Transport = Transport.Sockets
            };
            ProtocolConfig protocolConfig = new ProtocolConfig {
                Version = 2
            };
            var mockCommunicationEndpoint = new Mock <ICommunicationEndPoint>();

            mockCommunicationEndpoint.Setup(mc => mc.Start(connectionInfo.Endpoint)).Returns(connectionInfo.Endpoint).Callback(() =>
            {
                mockCommunicationEndpoint.Raise(
                    s => s.Connected += null,
                    mockCommunicationEndpoint.Object,
                    new ConnectedEventArgs(this.mockChannel.Object));
            });

            this.SetupChannelMessage(MessageType.VersionCheck, MessageType.VersionCheck, protocolConfig.Version);
            var testRequestSender = new TestRequestSender(mockCommunicationEndpoint.Object, connectionInfo, mockDataSerializer.Object, new ProtocolConfig {
                Version = 2
            }, CLIENTPROCESSEXITWAIT);

            this.mockTestHostManager.Setup(thm => thm.GetTestHostConnectionInfo()).Returns(connectionInfo);

            var localTestOperationManager = new TestableProxyOperationManager(this.mockRequestData.Object, testRequestSender, this.mockTestHostManager.Object);

            localTestOperationManager.SetupChannel(Enumerable.Empty <string>());

            mockCommunicationEndpoint.Verify(s => s.Start(It.IsAny <string>()), Times.Once);
        }
예제 #4
0
        /// <inheritdoc/>
        public IProxyTestSessionManager GetTestSessionManager(
            IRequestData requestData,
            ITestRuntimeProvider testHostManager,
            StartTestSessionCriteria testSessionCriteria)
        {
            var parallelLevel = this.VerifyParallelSettingAndCalculateParallelLevel(
                testSessionCriteria.Sources.Count,
                testSessionCriteria.RunSettings);

            requestData.MetricsCollection.Add(
                TelemetryDataConstants.ParallelEnabledDuringStartTestSession,
                parallelLevel > 1 ? "True" : "False");

            var isDataCollectorEnabled       = XmlRunSettingsUtilities.IsDataCollectionEnabled(testSessionCriteria.RunSettings);
            var isInProcDataCollectorEnabled = XmlRunSettingsUtilities.IsInProcDataCollectionEnabled(testSessionCriteria.RunSettings);

            if (this.ShouldRunInNoIsolation(
                    testSessionCriteria.RunSettings,
                    parallelLevel > 1,
                    isDataCollectorEnabled || isInProcDataCollectorEnabled))
            {
                // This condition is the equivalent of the in-process proxy execution manager case.
                // In this case all tests will be run in the vstest.console process, so there's no
                // test host to be started. As a consequence there'll be no session info.
                return(null);
            }

            Func <ProxyOperationManager> proxyCreator = () =>
            {
                var hostManager = this.testHostProviderManager.GetTestHostManagerByRunConfiguration(testSessionCriteria.RunSettings);
                hostManager?.Initialize(TestSessionMessageLogger.Instance, testSessionCriteria.RunSettings);

                if (testSessionCriteria.TestHostLauncher != null)
                {
                    hostManager.SetCustomLauncher(testSessionCriteria.TestHostLauncher);
                }

                var requestSender = new TestRequestSender(requestData.ProtocolConfig, hostManager);

                return(isDataCollectorEnabled
                    ? new ProxyOperationManagerWithDataCollection(
                           requestData,
                           requestSender,
                           hostManager,
                           new ProxyDataCollectionManager(
                               requestData,
                               testSessionCriteria.RunSettings,
                               testSessionCriteria.Sources))
                    : new ProxyOperationManager(
                           requestData,
                           requestSender,
                           hostManager));
            };

            return(new ProxyTestSessionManager(parallelLevel, proxyCreator));
        }
예제 #5
0
        /// <summary>
        /// Fetches the ExecutionManager for this engine. This manager would provide all functionality required for execution.
        /// </summary>
        /// <param name="requestData">The request data for providing execution services and data</param>
        /// <param name="testHostManager">Test host manager.</param>
        /// <param name="testRunCriteria">Test run criterion.</param>
        /// <returns>
        /// ITestExecutionManager object that can do execution
        /// </returns>
        public IProxyExecutionManager GetExecutionManager(IRequestData requestData, ITestRuntimeProvider testHostManager, TestRunCriteria testRunCriteria)
        {
            var distinctSources = GetDistinctNumberOfSources(testRunCriteria);
            var parallelLevel   = this.VerifyParallelSettingAndCalculateParallelLevel(distinctSources, testRunCriteria.TestRunSettings);

            // Collecting IsParallel Enabled
            requestData.MetricsCollection.Add(TelemetryDataConstants.ParallelEnabledDuringExecution, parallelLevel > 1 ? "True" : "False");

            var isDataCollectorEnabled = XmlRunSettingsUtilities.IsDataCollectionEnabled(testRunCriteria.TestRunSettings);

            // Collecting IsDataCollector Enabled
            requestData.MetricsCollection.Add(TelemetryDataConstants.DataCollectorsEnabled, isDataCollectorEnabled.ToString());

            var isInProcDataCollectorEnabled = XmlRunSettingsUtilities.IsInProcDataCollectionEnabled(testRunCriteria.TestRunSettings);

            if (this.ShouldRunInNoIsolation(testRunCriteria.TestRunSettings, parallelLevel > 1, isDataCollectorEnabled || isInProcDataCollectorEnabled))
            {
                var isTelemetryOptedIn = requestData.IsTelemetryOptedIn;
                var newRequestData     = this.GetRequestData(isTelemetryOptedIn);
                return(new InProcessProxyExecutionManager(testHostManager, new TestHostManagerFactory(newRequestData)));
            }

            // SetupChannel ProxyExecutionManager with data collection if data collectors are specififed in run settings.
            Func <IProxyExecutionManager> proxyExecutionManagerCreator = delegate
            {
                // Create a new HostManager, to be associated with individual ProxyExecutionManager(&POM)
                var hostManager = this.testHostProviderManager.GetTestHostManagerByRunConfiguration(testRunCriteria.TestRunSettings);
                hostManager?.Initialize(TestSessionMessageLogger.Instance, testRunCriteria.TestRunSettings);

                if (testRunCriteria.TestHostLauncher != null)
                {
                    hostManager.SetCustomLauncher(testRunCriteria.TestHostLauncher);
                }

                var requestSender = new TestRequestSender(requestData.ProtocolConfig, hostManager.GetTestHostConnectionInfo());

                return(isDataCollectorEnabled ? new ProxyExecutionManagerWithDataCollection(requestData, requestSender, hostManager, new ProxyDataCollectionManager(testRunCriteria.TestRunSettings))
                                                : new ProxyExecutionManager(requestData, requestSender, hostManager));
            };

            // parallelLevel = 1 for desktop should go via else route.
            if (parallelLevel > 1 || !testHostManager.Shared)
            {
                return(new ParallelProxyExecutionManager(requestData, proxyExecutionManagerCreator, parallelLevel, sharedHosts: testHostManager.Shared));
            }
            else
            {
                return(proxyExecutionManagerCreator());
            }
        }
예제 #6
0
        public void VersionCheckWithTestHostShouldBeAbleToReceiveProtocolErrorAndThrowException()
        {
            var mockCommunicationManager = new Mock <ICommunicationManager>();
            var message = new Message()
            {
                MessageType = MessageType.ProtocolError, Payload = null
            };

            mockCommunicationManager.Setup(mc => mc.ReceiveMessage()).Returns(message);
            var testRequestSender = new TestRequestSender(mockCommunicationManager.Object, this.mockDataSerializer.Object, this.protocolConfig);

            var ex = Assert.ThrowsException <TestPlatformException>(() => testRequestSender.CheckVersionWithTestHost());

            Assert.AreEqual("Protocol version check failed. Make sure test runner and host are compatible.", ex.Message);
        }
예제 #7
0
        public void VersionCheckWithTestHostShouldCheckVersionIfVersionCheckPassesReturnTrue()
        {
            var mockCommunicationManager = new Mock <ICommunicationManager>();
            var message = new Message()
            {
                MessageType = MessageType.VersionCheck, Payload = this.protocolConfig.Version
            };

            mockCommunicationManager.Setup(mc => mc.ReceiveMessage()).Returns(message);
            var testRequestSender = new TestRequestSender(mockCommunicationManager.Object, this.mockDataSerializer.Object, this.protocolConfig);

            testRequestSender.CheckVersionWithTestHost();

            mockCommunicationManager.Verify(mc => mc.SendMessage(MessageType.VersionCheck, this.protocolConfig.Version), Times.Once);
        }
예제 #8
0
        public void VersionCheckWithTestHostForInvalidMessageShouldThrowException()
        {
            var mockCommunicationManager = new Mock <ICommunicationManager>();
            var message = new Message()
            {
                MessageType = MessageType.TestCasesFound, Payload = null
            };

            mockCommunicationManager.Setup(mc => mc.ReceiveMessage()).Returns(message);
            var testRequestSender = new TestRequestSender(mockCommunicationManager.Object, this.mockDataSerializer.Object, this.protocolConfig);

            var ex = Assert.ThrowsException <TestPlatformException>(() => testRequestSender.CheckVersionWithTestHost());

            Assert.AreEqual("Unexpected message received. Expected MessageType : ProtocolVersion Actual MessageType: TestDiscovery.TestFound", ex.Message);
        }
예제 #9
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ProxyDiscoveryManager"/> class.
 /// </summary>
 /// <param name="testRequestSender">Test request sender instance.</param>
 /// <param name="testHostManager">Test host manager instance.</param>
 public ProxyDiscoveryManager(TestRequestSender testRequestSender, ITestRuntimeProvider testHostManager)
     : this(testRequestSender, testHostManager, CrossPlatEngine.Constants.ClientConnectionTimeout)
 {
     this.testHostManager = testHostManager;
 }
예제 #10
0
        /// <inheritdoc/>
        public IProxyExecutionManager GetExecutionManager(
            IRequestData requestData,
            ITestRuntimeProvider testHostManager,
            TestRunCriteria testRunCriteria)
        {
            var distinctSources = GetDistinctNumberOfSources(testRunCriteria);
            var parallelLevel   = this.VerifyParallelSettingAndCalculateParallelLevel(
                distinctSources,
                testRunCriteria.TestRunSettings);

            // Collecting IsParallel enabled.
            requestData.MetricsCollection.Add(
                TelemetryDataConstants.ParallelEnabledDuringExecution,
                parallelLevel > 1 ? "True" : "False");

            var isDataCollectorEnabled       = XmlRunSettingsUtilities.IsDataCollectionEnabled(testRunCriteria.TestRunSettings);
            var isInProcDataCollectorEnabled = XmlRunSettingsUtilities.IsInProcDataCollectionEnabled(testRunCriteria.TestRunSettings);

            if (this.ShouldRunInNoIsolation(
                    testRunCriteria.TestRunSettings,
                    parallelLevel > 1,
                    isDataCollectorEnabled || isInProcDataCollectorEnabled))
            {
                var isTelemetryOptedIn = requestData.IsTelemetryOptedIn;
                var newRequestData     = this.GetRequestData(isTelemetryOptedIn);
                return(new InProcessProxyExecutionManager(
                           testHostManager,
                           new TestHostManagerFactory(newRequestData)));
            }

            // SetupChannel ProxyExecutionManager with data collection if data collectors are
            // specififed in run settings.
            Func <IProxyExecutionManager> proxyExecutionManagerCreator = () =>
            {
                if (testRunCriteria.TestSessionInfo != null)
                {
                    try
                    {
                        // In case we have an active test session, data collection needs were
                        // already taken care of when first creating the session. As a consequence
                        // we always return this proxy instead of choosing between the vanilla
                        // execution proxy and the one with data collection enabled.
                        return(new ProxyExecutionManager(
                                   testRunCriteria.TestSessionInfo,
                                   testRunCriteria.DebugEnabledForTestSession));
                    }
                    catch (InvalidOperationException ex)
                    {
                        // If the proxy creation process based on test session info failed, then
                        // we'll proceed with the normal creation process as if no test session
                        // info was passed in in the first place.
                        //
                        // WARNING: This should not normally happen and it raises questions
                        // regarding the test session pool operation and consistency.
                        EqtTrace.Warning("ProxyExecutionManager failed: {0}", ex.ToString());
                    }
                }

                // Create a new host manager, to be associated with individual
                // ProxyExecutionManager(&POM)
                var hostManager = this.testHostProviderManager.GetTestHostManagerByRunConfiguration(testRunCriteria.TestRunSettings);
                hostManager?.Initialize(TestSessionMessageLogger.Instance, testRunCriteria.TestRunSettings);

                if (testRunCriteria.TestHostLauncher != null)
                {
                    hostManager.SetCustomLauncher(testRunCriteria.TestHostLauncher);
                }

                var requestSender = new TestRequestSender(requestData.ProtocolConfig, hostManager);

                return(isDataCollectorEnabled
                    ? new ProxyExecutionManagerWithDataCollection(
                           requestData,
                           requestSender,
                           hostManager,
                           new ProxyDataCollectionManager(
                               requestData,
                               testRunCriteria.TestRunSettings,
                               GetSourcesFromTestRunCriteria(testRunCriteria)))
                    : new ProxyExecutionManager(
                           requestData,
                           requestSender,
                           hostManager));
            };

            // parallelLevel = 1 for desktop should go via else route.
            return((parallelLevel > 1 || !testHostManager.Shared)
                ? new ParallelProxyExecutionManager(
                       requestData,
                       proxyExecutionManagerCreator,
                       parallelLevel,
                       sharedHosts: testHostManager.Shared)
                : proxyExecutionManagerCreator());
        }