Skip to content

Commit

Permalink
comming changes for microsoft#958 fix
Browse files Browse the repository at this point in the history
  • Loading branch information
DineshChirnanchu committed Sep 5, 2019
1 parent f990416 commit defaf23
Show file tree
Hide file tree
Showing 14 changed files with 136 additions and 17 deletions.
Expand Up @@ -7,12 +7,15 @@ namespace Microsoft.VisualStudio.TestPlatform.Common.ExtensionFramework
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;

using System.Security.Cryptography.X509Certificates;
using Microsoft.VisualStudio.TestPlatform.Common.ExtensionFramework.Utilities;
using Microsoft.VisualStudio.TestPlatform.Common.Logging;
using Microsoft.VisualStudio.TestPlatform.ObjectModel;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging;
using Microsoft.VisualStudio.TestPlatform.Utilities.Helpers;
using Microsoft.VisualStudio.TestPlatform.Utilities.Helpers.Interfaces;

Expand All @@ -22,6 +25,7 @@ namespace Microsoft.VisualStudio.TestPlatform.Common.ExtensionFramework
internal class TestPluginDiscoverer
{
private IFileHelper fileHelper;
private static bool flag = false;

/// <summary>
/// Initializes a new instance of the <see cref="TestPluginDiscoverer"/> class.
Expand Down Expand Up @@ -85,7 +89,6 @@ internal TestPluginDiscoverer(IFileHelper fileHelper)
}

this.GetTestExtensionsFromFiles<TPluginInfo, TExtension>(extensionPaths.ToArray(), pluginInfos);

return pluginInfos;
}

Expand Down Expand Up @@ -138,6 +141,16 @@ private void AddKnownExtensions(ref IEnumerable<string> extensionPaths)
this.GetTestExtensionsFromAssembly<TPluginInfo, TExtension>(assembly, pluginInfos);
}
}
catch (FileLoadException e)
{
if (!flag) {
flag = true;
EqtTrace.Warning("TestPluginDiscoverer: Failed to load extensions from file '{0}'. Skipping test extension scan for this file. Error: {1}", file, e);
string fileLoadErrorMessage = $"TestPluginDiscoverer: Failed to load extensions from file '" + file + "'";
TestSessionMessageLogger.Instance.SendMessage(TestMessageLevel.Error, fileLoadErrorMessage);
}
EqtTrace.Warning("TestPluginDiscoverer: Failed to load extensions from file '{0}'. Skipping test extension scan for this file. Error: {1}", file, e);
}
catch (Exception e)
{
EqtTrace.Warning("TestPluginDiscoverer: Failed to load extensions from file '{0}'. Skipping test extension scan for this file. Error: {1}", file, e);
Expand Down
Expand Up @@ -16,7 +16,7 @@ public interface IDiscoveryManager
/// Initializes the discovery manager.
/// </summary>
/// <param name="pathToAdditionalExtensions"> The path to additional extensions. </param>
void Initialize(IEnumerable<string> pathToAdditionalExtensions);
void Initialize(IEnumerable<string> pathToAdditionalExtensions, ITestDiscoveryEventsHandler2 eventHandler);

/// <summary>
/// Discovers tests
Expand Down
Expand Up @@ -9,6 +9,7 @@ namespace Microsoft.VisualStudio.TestPlatform.ObjectModel.Engine.TesthostProtoco
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Client;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Engine.ClientProtocol;


/// <summary>
/// Orchestrates test execution related functionality for the engine communicating with the test host process.
/// </summary>
Expand All @@ -18,7 +19,8 @@ public interface IExecutionManager
/// Initializes the execution manager.
/// </summary>
/// <param name="pathToAdditionalExtensions"> The path to additional extensions. </param>
void Initialize(IEnumerable<string> pathToAdditionalExtensions);
/// <param name="testExtenstionInitizlizeEventsHandler"> EventHandler for handling execution events from Engine. </param>
void Initialize(IEnumerable<string> pathToAdditionalExtensions, ITestExtenstionInitializeEventsHandler testExtenstionInitizlizeEventsHandler);

/// <summary>
/// Starts the test run with sources.
Expand Down
Expand Up @@ -105,7 +105,7 @@ private void InitializeExtensions(IEnumerable<string> sources)

// We don't need to pass list of extension as we are running inside vstest.console and
// it will use TestPluginCache of vstest.console
discoveryManager.Initialize(Enumerable.Empty<string>());
discoveryManager.Initialize(Enumerable.Empty<string>(), null);
}
}
}
Expand Up @@ -144,7 +144,7 @@ private void InitializeExtensions(IEnumerable<string> sources)

// We don't need to pass list of extension as we are running inside vstest.console and
// it will use TestPluginCache of vstest.console
executionManager.Initialize(Enumerable.Empty<string>());
executionManager.Initialize(Enumerable.Empty<string>(), null);
}
}
}
Expand Up @@ -63,8 +63,9 @@ protected DiscoveryManager(IRequestData requestData, ITestPlatformEventSource te
/// Initializes the discovery manager.
/// </summary>
/// <param name="pathToAdditionalExtensions"> The path to additional extensions. </param>
public void Initialize(IEnumerable<string> pathToAdditionalExtensions)
public void Initialize(IEnumerable<string> pathToAdditionalExtensions, ITestDiscoveryEventsHandler2 eventHandler)
{
this.testDiscoveryEventsHandler = eventHandler;
this.testPlatformEventSource.AdapterSearchStart();

if (pathToAdditionalExtensions != null && pathToAdditionalExtensions.Any())
Expand Down
Expand Up @@ -11,6 +11,7 @@ namespace Microsoft.VisualStudio.TestPlatform.CommunicationUtilities
using Microsoft.VisualStudio.TestPlatform.CommunicationUtilities.Interfaces;
using Microsoft.VisualStudio.TestPlatform.CommunicationUtilities.ObjectModel;
using Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.EventHandlers;
using Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.Execution;
using Microsoft.VisualStudio.TestPlatform.ObjectModel;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Client;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Engine;
Expand Down Expand Up @@ -110,14 +111,12 @@ public void ProcessRequests(ITestHostManagerFactory testHostManagerFactory)
this.testHostManagerFactoryReady.Set();
this.sessionCompleted.Wait();
}

/// <inheritdoc />
public void Dispose()
{
this.communicationEndPoint.Stop();
this.channel?.Dispose();
}

/// <inheritdoc />
public void Close()
{
Expand Down Expand Up @@ -240,10 +239,11 @@ public void OnMessageReceived(object sender, MessageReceivedEventArgs messageRec
{
EqtTrace.Info("Discovery Session Initialize.");
this.testHostManagerFactoryReady.Wait();
var discoveryEventsHandler = new TestDiscoveryEventHandler(this);
var pathToAdditionalExtensions = this.dataSerializer.DeserializePayload<IEnumerable<string>>(message);
jobQueue.QueueJob(
() =>
testHostManagerFactory.GetDiscoveryManager().Initialize(pathToAdditionalExtensions), 0);
testHostManagerFactory.GetDiscoveryManager().Initialize(pathToAdditionalExtensions, discoveryEventsHandler), 0);
break;
}

Expand All @@ -265,10 +265,11 @@ public void OnMessageReceived(object sender, MessageReceivedEventArgs messageRec
{
EqtTrace.Info("Execution Session Initialize.");
this.testHostManagerFactoryReady.Wait();
var testExtenstionInitializeEventsHandler = new TestExtenstionInitializeEventsHandler(this);
var pathToAdditionalExtensions = this.dataSerializer.DeserializePayload<IEnumerable<string>>(message);
jobQueue.QueueJob(
() =>
testHostManagerFactory.GetExecutionManager().Initialize(pathToAdditionalExtensions), 0);
testHostManagerFactory.GetExecutionManager().Initialize(pathToAdditionalExtensions, testExtenstionInitializeEventsHandler), 0);
break;
}

Expand Down
Expand Up @@ -8,6 +8,7 @@ namespace Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.Execution
using System.Linq;

using Microsoft.VisualStudio.TestPlatform.Common.ExtensionFramework;
using Microsoft.VisualStudio.TestPlatform.Common.Logging;
using Microsoft.VisualStudio.TestPlatform.Common.SettingsProvider;
using Microsoft.VisualStudio.TestPlatform.CommunicationUtilities;
using Microsoft.VisualStudio.TestPlatform.CoreUtilities.Tracing;
Expand All @@ -20,6 +21,7 @@ namespace Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.Execution
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Engine;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Engine.ClientProtocol;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Engine.TesthostProtocol;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Utilities;

/// <summary>
Expand Down Expand Up @@ -56,7 +58,8 @@ protected ExecutionManager(ITestPlatformEventSource testPlatformEventSource, IRe
/// Initializes the execution manager.
/// </summary>
/// <param name="pathToAdditionalExtensions"> The path to additional extensions. </param>
public void Initialize(IEnumerable<string> pathToAdditionalExtensions)
/// <param name="runEventsHandler"> EventHandler for handling execution events from Engine. </param>
public void Initialize(IEnumerable<string> pathToAdditionalExtensions, ITestExtenstionInitializeEventsHandler testExtenstionInitializeEventsHandler)
{
this.testPlatformEventSource.AdapterSearchStart();

Expand All @@ -66,8 +69,12 @@ public void Initialize(IEnumerable<string> pathToAdditionalExtensions)
TestPluginCache.Instance.DefaultExtensionPaths = pathToAdditionalExtensions;
}

testExtenstionInitializeEventsHandler?.SubscribetoSessionEvent();

this.LoadExtensions();

testExtenstionInitializeEventsHandler?.UnSubscribetoSessionEvent();

this.testPlatformEventSource.AdapterSearchStop();
}

Expand Down
@@ -0,0 +1,79 @@
using Microsoft.VisualStudio.TestPlatform.Common.Logging;
using Microsoft.VisualStudio.TestPlatform.CommunicationUtilities.Interfaces;
using Microsoft.VisualStudio.TestPlatform.ObjectModel;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Client;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging;
using System;
using System.Collections.Generic;
using System.Text;

namespace Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.Execution
{
public class TestExtenstionInitializeEventsHandler : ITestExtenstionInitializeEventsHandler
{
private ITestRequestHandler requestHandler;

private TestSessionMessageLogger testRunHandler;

/// <summary>
/// Initializes a new instance of the <see cref="TestMessageEventHandler"/> class.
/// </summary>
/// <param name="requestHandler">test request handler</param>
public TestExtenstionInitializeEventsHandler(ITestRequestHandler requestHandler)
{
this.requestHandler = requestHandler;
testRunHandler = TestSessionMessageLogger.Instance;
}

public void SubscribetoSessionEvent()
{
testRunHandler.TestRunMessage += TestRunHandler_TestRunMessage;
}

public void UnSubscribetoSessionEvent()
{
testRunHandler.TestRunMessage -= TestRunHandler_TestRunMessage;
}

private void TestRunHandler_TestRunMessage(object sender, TestRunMessageEventArgs e)
{
HandleLogMessage(e.Level, e.Message);
}

/// <summary>
/// Handles a test run message.
/// </summary>
/// <param name="level"> The level. </param>
/// <param name="message"> The message. </param>
public void HandleLogMessage(TestMessageLevel level, string message)
{
switch ((TestMessageLevel)level)
{
case TestMessageLevel.Informational:
EqtTrace.Info(message);
break;

case TestMessageLevel.Warning:
EqtTrace.Warning(message);
break;

case TestMessageLevel.Error:
EqtTrace.Error(message);
break;

default:
EqtTrace.Info(message);
break;
}

this.requestHandler.SendLog(level, message);
}

public void HandleRawMessage(string rawMessage)
{
// No-Op
// TestHost at this point has no functionality where it requires rawmessage
}

}
}
Expand Up @@ -35,6 +35,22 @@ public interface ITestRunEventsHandler : ITestMessageEventHandler
int LaunchProcessWithDebuggerAttached(TestProcessStartInfo testProcessStartInfo);
}

/// <summary>
/// Interface contract for handling test extenstion initialize events during run operation
/// </summary>
public interface ITestExtenstionInitializeEventsHandler : ITestMessageEventHandler
{
/// <summary>
/// Subscribe to SessionEvent
/// </summary>
void SubscribetoSessionEvent();

/// <summary>
/// UnSubscribe to SessionEvent
/// </summary>
void UnSubscribetoSessionEvent();
}

/// <summary>
/// Interface for handling generic message events during test discovery or execution
/// </summary>
Expand Down
2 changes: 1 addition & 1 deletion src/vstest.console/Processors/RunTestsArgumentProcessor.cs
Expand Up @@ -244,7 +244,7 @@ private void TestRunRequest_OnRunCompletion(object sender, TestRunCompleteEventA
var testsFoundInAnySource = (e.TestRunStatistics == null) ? false : (e.TestRunStatistics.ExecutedTests > 0);

// Indicate the user to use testadapterpath command if there are no tests found
if (!testsFoundInAnySource && string.IsNullOrEmpty(CommandLineOptions.Instance.TestAdapterPath) && this.commandLineOptions.TestCaseFilterValue == null)
if (!testsFoundInAnySource && string.IsNullOrEmpty(CommandLineOptions.Instance.TestAdapterPath) && this.commandLineOptions.TestCaseFilterValue == null)
{
this.output.Warning(false, CommandLineResources.SuggestTestAdapterPathIfNoTestsIsFound);
}
Expand Down
Expand Up @@ -50,7 +50,7 @@ public void StartTestRunShouldCallInitialize()
var testRunCriteria = new TestRunCriteria(new List<string> { "source.dll" }, 10);
this.inProcessProxyExecutionManager.StartTestRun(testRunCriteria, null);

this.mockExecutionManager.Verify(o => o.Initialize(Enumerable.Empty<string>()), Times.Once, "StartTestRun should call Initialize if not already initialized");
this.mockExecutionManager.Verify(o => o.Initialize(Enumerable.Empty<string>(),null), Times.Once, "StartTestRun should call Initialize if not already initialized");
}

[TestMethod]
Expand Down
Expand Up @@ -179,7 +179,7 @@ public void ProcessRequestsDiscoveryInitializeShouldSetExtensionPaths()
this.SendMessageOnChannel(message);
this.jobQueue.Flush();

this.mockDiscoveryManager.Verify(d => d.Initialize(It.Is<IEnumerable<string>>(paths => paths.Any(p => p.Equals("testadapter.dll")))));
this.mockDiscoveryManager.Verify(d => d.Initialize(It.Is<IEnumerable<string>>(paths => paths.Any(p => p.Equals("testadapter.dll"))),null));
this.SendSessionEnd();
}

Expand Down Expand Up @@ -224,7 +224,7 @@ public void ProcessRequestsExecutionInitializeShouldSetExtensionPaths()
this.SendMessageOnChannel(message);
this.jobQueue.Flush();

this.mockExecutionManager.Verify(e => e.Initialize(It.Is<IEnumerable<string>>(paths => paths.Any(p => p.Equals("testadapter.dll")))));
this.mockExecutionManager.Verify(e => e.Initialize(It.Is<IEnumerable<string>>(paths => paths.Any(p => p.Equals("testadapter.dll"))),null));
this.SendSessionEnd();
}

Expand Down
Expand Up @@ -80,7 +80,7 @@ public void InitializeShouldLoadAndInitializeAllExtension()
() => { });


this.executionManager.Initialize(new List<string> { commonAssemblyLocation });
this.executionManager.Initialize(new List<string> { commonAssemblyLocation }, null);

Assert.IsNotNull(TestPluginCache.Instance.TestExtensions);

Expand Down

0 comments on commit defaf23

Please sign in to comment.