Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,5 +16,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestDataSource.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestDeployment.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestSourceHost.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTraceListener.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTraceListenerManager.cs" />
</ItemGroup>
</Project>
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ public void Load(XmlReader reader)
// if we have to read any thing from runsettings special for this platform service then we have to implement it.
}

public IDictionary<string, object> GetProperties()
public IDictionary<string, object> GetProperties(string source)
{
return new Dictionary<string, object>();
}
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
// Copyright (c) Microsoft. All rights reserved.

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.IO;
using System;

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
/// <summary>
/// Internal implementation of TraceListener exposed to the user.
/// </summary>
/// <remarks>
/// The virtual operations of the TraceListener are implemented here
/// like Close(), Dispose() etc.
/// </remarks>
public class TraceListenerWrapper : ITraceListener
{

/// <summary>
/// Initializes a new instance of an object using the specified writer as recipient of the
/// tracing or debugging output.
/// </summary>
public TraceListenerWrapper(TextWriter textWriter)
{
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Close()
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Dispose()
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public TextWriter GetWriter()
{
return null;
}
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
// Copyright (c) Microsoft. All rights reserved.

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
using System;
using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.IO;

/// <summary>
/// Internal implementation of TraceListenerManager exposed to the user.
/// Responsible for performing Add(), Remove(), Close(), Dispose() operations on traceListener object.
/// </summary>
public class TraceListenerManager : ITraceListenerManager
{
/// <summary>
/// Initializes a new instance of a TraceListenerManager object.
/// </summary>
public TraceListenerManager(TextWriter outputWriter, TextWriter errorWriter)
{
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Add(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Close(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Dispose(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Remove(ITraceListener traceListner)
{
return;
}
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,7 +73,7 @@ private string GetTargetFrameworkStringFromAssembly(Assembly assembly)
if (declaringType != null)
{
string attributeName = declaringType.FullName;
if (string.Equals(attributeName, Constants.TargetFrameworkAttributeFullName, StringComparison.OrdinalIgnoreCase))
if (string.Equals(attributeName, PlatformServices.Constants.TargetFrameworkAttributeFullName, StringComparison.OrdinalIgnoreCase))
{
dotNetVersion = data.ConstructorArguments[0].Value.ToString();
break;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -57,6 +57,8 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RecursiveDirectoryPath.cs" />
<Compile Include="Services\DesktopTestContextImplementation.cs" />
<Compile Include="Services\DesktopTraceListener.cs" />
<Compile Include="Services\DesktopTraceListenerManager.cs" />
<Compile Include="Utilities\AppDomainUtilities.cs" />
<Compile Include="Utilities\AssemblyUtility.cs" />
<Compile Include="Utilities\DeploymentItemUtility.cs" />
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,6 @@ namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using Microsoft.VisualStudio.TestPlatform.ObjectModel;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Navigation;

/// <summary>
/// This service is responsible for any file based operations.
Expand DownExpand Up@@ -46,7 +45,7 @@ public bool DoesFileExist(string assemblyFileName)
public object CreateNavigationSession(string source)
{
var messageFormatOnException =
string.Join("MSTestDiscoverer:DiaSession: Could not create diaSession for source:", source, ". Reason:{1}");
string.Join("MSTestDiscoverer:DiaSession: Could not create diaSession for source:", source, ". Reason:{0}");
return SafeInvoke<DiaSession>(() => new DiaSession(source), messageFormatOnException) as DiaSession;
}

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -59,9 +59,9 @@ public void Load(XmlReader reader)
settings = MSTestAdapterSettings.ToSettings(reader);
}

public IDictionary<string, object> GetProperties()
public IDictionary<string, object> GetProperties(string source)
{
return TestDeployment.GetDeploymentInformation();
return TestDeployment.GetDeploymentInformation(source);
}

public const string SettingsName = "MSTestV2";
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,7 @@ namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;

Expand DownExpand Up@@ -113,16 +114,29 @@ public bool Deploy(IEnumerable<TestCase> tests, IRunContext runContext, IFramewo
{
Debug.Assert(tests != null, "tests");

//Reset runDirectories before doing deployment, so that older values of runDirectories is not picked
//even if test host is kept alive.
RunDirectories = null;

this.adapterSettings = MSTestSettingsProvider.Settings;
bool canDeploy = this.CanDeploy();
var hasDeploymentItems = tests.Any(test => this.deploymentItemUtility.HasDeploymentItems(test));

if (!canDeploy || (canDeploy && !hasDeploymentItems))
// deployment directories should not be created in this case,simply return
if (!canDeploy && hasDeploymentItems)
{
return false;
}

RunDirectories = this.deploymentUtility.CreateDeploymentDirectories(runContext);

//Deployment directories are created but deployment will not happen.
//This is added just to keep consistency with MSTestv1 behaviour.
if (!hasDeploymentItems)
{
return false;
}

var isDeploymentDone = false;

using (new SuspendCodeCoverage())
Expand All@@ -146,16 +160,17 @@ group test by test.Source into testGroup
return true;
}

internal static IDictionary<string, object> GetDeploymentInformation()
internal static IDictionary<string, object> GetDeploymentInformation(string source)
{
var properties = new Dictionary<string, object>();

var applicationBaseDirectory = string.Empty;

// Run directories can be null in win8.
if (RunDirectories == null)
if (RunDirectories == null && !string.IsNullOrEmpty(source))
{
applicationBaseDirectory = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
// applicationBaseDirectory is set at source level
applicationBaseDirectory = Path.GetDirectoryName(source);
}

properties[TestContextPropertyStrings.TestRunDirectory] = RunDirectories != null
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
// Copyright (c) Microsoft. All rights reserved.

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.Diagnostics;
using System;
using System.IO;

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
/// <summary>
/// Internal implementation of TraceListener exposed to the user.
/// The virtual operations of the TraceListener are implemented here
/// like Close(), Dispose() etc.
/// </summary>
public class TraceListenerWrapper : TextWriterTraceListener, ITraceListener
{
// Summary:
// Initializes a new instance of an object that derives from System.Diagnostics.TextWriterTraceListener
// Class and initializes TextWriterTraceListener object using the specified writer as recipient of the
// tracing or debugging output.
public TraceListenerWrapper(TextWriter textWriter):base(textWriter)
{
}

// Summary:
// Wrapper over Close() of System.Diagnostics.TextWriterTraceListener.Writer
public override void Close()
{
base.Close();
}

// Summary:
// Wrapper over Dispose() of System.Diagnostics.TextWriterTraceListener object
public new void Dispose()
{
base.Dispose();
}

// Summary:
// Gets the text writer of System.Diagnostics.TextWriterTraceListener.Writer
// that receives the tracing or debugging output.
public TextWriter GetWriter()
{
return base.Writer;
}
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
// Copyright (c) Microsoft. All rights reserved.

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
using System;
using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.Diagnostics;
using System.IO;
using System.Globalization;

/// <summary>
/// Internal implementation of TraceListenerManager exposed to the user.
/// Responsible for performing Add(), Remove(), Close(), Dispose() operations on traceListener object.
/// </summary>
public class TraceListenerManager : ITraceListenerManager
{
/// <summary>
/// Original output stream
/// </summary>
private TextWriter origStdOut;

/// <summary>
/// Original error stream
/// </summary>
private TextWriter origStdErr;

/// <summary>
/// Initializes a new instance of a TraceListenerManager object.
/// Also, updates the output/error streams with redirected outputWriter and errorWriter
/// </summary>
public TraceListenerManager(TextWriter outputWriter, TextWriter errorWriter)
{
origStdOut = Console.Out;
origStdErr = Console.Error;

// Update the output/error streams with redirected streams
Console.SetOut(outputWriter);
Console.SetError(errorWriter);
}

/// <summary>
/// Adds the arguement traceListener object to System.Diagnostics.TraceListenerCollection.
/// </summary>
public void Add(ITraceListener traceListener)
{
try
{
Trace.Listeners.Add(traceListener as TextWriterTraceListener);
}
catch (Exception ex)
{
// Catch exceptions if the configuration file is invalid and allow a stack
// trace to show the error on the test method instead of here.
if (!(ex.InnerException is System.Configuration.ConfigurationErrorsException))
{
throw;
}
}
}

/// <summary>
/// Removes the arguement traceListener object from System.Diagnostics.TraceListenerCollection.
/// </summary>
public void Remove(ITraceListener traceListner)
{
Trace.Listeners.Remove(traceListner as TextWriterTraceListener);
}

/// <summary>
/// Wrapper over Close() of ITraceListener.
/// </summary>
public void Close(ITraceListener traceListener)
{
traceListener.Close();
}

/// <summary>
/// Wrapper over Dispose() of ITraceListener.
/// Also resets the standard output/error streams.
/// </summary>
public void Dispose(ITraceListener traceListener)
{
traceListener.Dispose();
Console.SetOut(origStdOut);
Console.SetError(origStdErr);

}
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,7 +37,7 @@ internal static void SetAppDomainFrameworkVersionBasedOnTestSource(AppDomainSetu
string assemblyVersionString = GetTargetFrameworkVersionString(testSource);
if (GetTargetFrameworkVersionFromVersionString(assemblyVersionString).CompareTo(version45) > 0)
{
PropertyInfo pInfo = typeof(AppDomainSetup).GetProperty(Constants.TargetFrameworkName);
PropertyInfo pInfo = typeof(AppDomainSetup).GetProperty(PlatformServices.Constants.TargetFrameworkName);
if (pInfo != null)
{
pInfo.SetValue(setup, assemblyVersionString, null);
Expand DownExpand Up@@ -121,9 +121,9 @@ internal static string GetTargetFrameworkVersionString(string path)
/// <returns>Framework Version</returns>
internal static Version GetTargetFrameworkVersionFromVersionString(string version)
{
if (version.Length > Constants.DotNetFrameWorkStringPrefix.Length + 1)
if (version.Length > PlatformServices.Constants.DotNetFrameWorkStringPrefix.Length + 1)
{
string versionPart = version.Substring(Constants.DotNetFrameWorkStringPrefix.Length + 1);
string versionPart = version.Substring(PlatformServices.Constants.DotNetFrameWorkStringPrefix.Length + 1);
return new Version(versionPart);
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,5 +16,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestDataSource.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestDeployment.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestSourceHost.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTraceListener.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTraceListenerManager.cs" />
</ItemGroup>
</Project>
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ public void Load(XmlReader reader)
// if we have to read any thing from runsettings special for this platform service then we have to implement it.
}

public IDictionary<string, object> GetProperties()
public IDictionary<string, object> GetProperties(string source)
{
return new Dictionary<string, object>();
}
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
// Copyright (c) Microsoft. All rights reserved.

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.IO;
using System;

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
/// <summary>
/// Internal implementation of TraceListener exposed to the user.
/// </summary>
/// <remarks>
/// The virtual operations of the TraceListener are implemented here
/// like Close(), Dispose() etc.
/// </remarks>
public class TraceListenerWrapper : ITraceListener
{

/// <summary>
/// Initializes a new instance of an object using the specified writer as recipient of the
/// tracing or debugging output.
/// </summary>
public TraceListenerWrapper(TextWriter textWriter)
{
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Close()
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Dispose()
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public TextWriter GetWriter()
{
return null;
}
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
// Copyright (c) Microsoft. All rights reserved.

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
using System;
using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.IO;

/// <summary>
/// Internal implementation of TraceListenerManager exposed to the user.
/// Responsible for performing Add(), Remove(), Close(), Dispose() operations on traceListener object.
/// </summary>
public class TraceListenerManager : ITraceListenerManager
{
/// <summary>
/// Initializes a new instance of a TraceListenerManager object.
/// </summary>
public TraceListenerManager(TextWriter outputWriter, TextWriter errorWriter)
{
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Add(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Close(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Dispose(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Remove(ITraceListener traceListner)
{
return;
}
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,7 +73,7 @@ private string GetTargetFrameworkStringFromAssembly(Assembly assembly)
if (declaringType != null)
{
string attributeName = declaringType.FullName;
if (string.Equals(attributeName, Constants.TargetFrameworkAttributeFullName, StringComparison.OrdinalIgnoreCase))
if (string.Equals(attributeName, PlatformServices.Constants.TargetFrameworkAttributeFullName, StringComparison.OrdinalIgnoreCase))
{
dotNetVersion = data.ConstructorArguments[0].Value.ToString();
break;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -57,6 +57,8 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RecursiveDirectoryPath.cs" />
<Compile Include="Services\DesktopTestContextImplementation.cs" />
<Compile Include="Services\DesktopTraceListener.cs" />
<Compile Include="Services\DesktopTraceListenerManager.cs" />
<Compile Include="Utilities\AppDomainUtilities.cs" />
<Compile Include="Utilities\AssemblyUtility.cs" />
<Compile Include="Utilities\DeploymentItemUtility.cs" />
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,6 @@ namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using Microsoft.VisualStudio.TestPlatform.ObjectModel;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Navigation;

/// <summary>
/// This service is responsible for any file based operations.
Expand DownExpand Up@@ -46,7 +45,7 @@ public bool DoesFileExist(string assemblyFileName)
public object CreateNavigationSession(string source)
{
var messageFormatOnException =
string.Join("MSTestDiscoverer:DiaSession: Could not create diaSession for source:", source, ". Reason:{1}");
string.Join("MSTestDiscoverer:DiaSession: Could not create diaSession for source:", source, ". Reason:{0}");
return SafeInvoke<DiaSession>(() => new DiaSession(source), messageFormatOnException) as DiaSession;
}

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -59,9 +59,9 @@ public void Load(XmlReader reader)
settings = MSTestAdapterSettings.ToSettings(reader);
}

public IDictionary<string, object> GetProperties()
public IDictionary<string, object> GetProperties(string source)
{
return TestDeployment.GetDeploymentInformation();
return TestDeployment.GetDeploymentInformation(source);
}

public const string SettingsName = "MSTestV2";
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,7 @@ namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;

Expand DownExpand Up@@ -113,16 +114,29 @@ public bool Deploy(IEnumerable<TestCase> tests, IRunContext runContext, IFramewo
{
Debug.Assert(tests != null, "tests");

//Reset runDirectories before doing deployment, so that older values of runDirectories is not picked
//even if test host is kept alive.
RunDirectories = null;

this.adapterSettings = MSTestSettingsProvider.Settings;
bool canDeploy = this.CanDeploy();
var hasDeploymentItems = tests.Any(test => this.deploymentItemUtility.HasDeploymentItems(test));

if (!canDeploy || (canDeploy && !hasDeploymentItems))
// deployment directories should not be created in this case,simply return
if (!canDeploy && hasDeploymentItems)
{
return false;
}

RunDirectories = this.deploymentUtility.CreateDeploymentDirectories(runContext);

//Deployment directories are created but deployment will not happen.
//This is added just to keep consistency with MSTestv1 behaviour.
if (!hasDeploymentItems)
{
return false;
}

var isDeploymentDone = false;

using (new SuspendCodeCoverage())
Expand All@@ -146,16 +160,17 @@ group test by test.Source into testGroup
return true;
}

internal static IDictionary<string, object> GetDeploymentInformation()
internal static IDictionary<string, object> GetDeploymentInformation(string source)
{
var properties = new Dictionary<string, object>();

var applicationBaseDirectory = string.Empty;

// Run directories can be null in win8.
if (RunDirectories == null)
if (RunDirectories == null && !string.IsNullOrEmpty(source))
{
applicationBaseDirectory = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
// applicationBaseDirectory is set at source level
applicationBaseDirectory = Path.GetDirectoryName(source);
}

properties[TestContextPropertyStrings.TestRunDirectory] = RunDirectories != null
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
// Copyright (c) Microsoft. All rights reserved.

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.Diagnostics;
using System;
using System.IO;

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
/// <summary>
/// Internal implementation of TraceListener exposed to the user.
/// The virtual operations of the TraceListener are implemented here
/// like Close(), Dispose() etc.
/// </summary>
public class TraceListenerWrapper : TextWriterTraceListener, ITraceListener
{
// Summary:
// Initializes a new instance of an object that derives from System.Diagnostics.TextWriterTraceListener
// Class and initializes TextWriterTraceListener object using the specified writer as recipient of the
// tracing or debugging output.
public TraceListenerWrapper(TextWriter textWriter):base(textWriter)
{
}

// Summary:
// Wrapper over Close() of System.Diagnostics.TextWriterTraceListener.Writer
public override void Close()
{
base.Close();
}

// Summary:
// Wrapper over Dispose() of System.Diagnostics.TextWriterTraceListener object
public new void Dispose()
{
base.Dispose();
}

// Summary:
// Gets the text writer of System.Diagnostics.TextWriterTraceListener.Writer
// that receives the tracing or debugging output.
public TextWriter GetWriter()
{
return base.Writer;
}
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
// Copyright (c) Microsoft. All rights reserved.

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
using System;
using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.Diagnostics;
using System.IO;
using System.Globalization;

/// <summary>
/// Internal implementation of TraceListenerManager exposed to the user.
/// Responsible for performing Add(), Remove(), Close(), Dispose() operations on traceListener object.
/// </summary>
public class TraceListenerManager : ITraceListenerManager
{
/// <summary>
/// Original output stream
/// </summary>
private TextWriter origStdOut;

/// <summary>
/// Original error stream
/// </summary>
private TextWriter origStdErr;

/// <summary>
/// Initializes a new instance of a TraceListenerManager object.
/// Also, updates the output/error streams with redirected outputWriter and errorWriter
/// </summary>
public TraceListenerManager(TextWriter outputWriter, TextWriter errorWriter)
{
origStdOut = Console.Out;
origStdErr = Console.Error;

// Update the output/error streams with redirected streams
Console.SetOut(outputWriter);
Console.SetError(errorWriter);
}

/// <summary>
/// Adds the arguement traceListener object to System.Diagnostics.TraceListenerCollection.
/// </summary>
public void Add(ITraceListener traceListener)
{
try
{
Trace.Listeners.Add(traceListener as TextWriterTraceListener);
}
catch (Exception ex)
{
// Catch exceptions if the configuration file is invalid and allow a stack
// trace to show the error on the test method instead of here.
if (!(ex.InnerException is System.Configuration.ConfigurationErrorsException))
{
throw;
}
}
}

/// <summary>
/// Removes the arguement traceListener object from System.Diagnostics.TraceListenerCollection.
/// </summary>
public void Remove(ITraceListener traceListner)
{
Trace.Listeners.Remove(traceListner as TextWriterTraceListener);
}

/// <summary>
/// Wrapper over Close() of ITraceListener.
/// </summary>
public void Close(ITraceListener traceListener)
{
traceListener.Close();
}

/// <summary>
/// Wrapper over Dispose() of ITraceListener.
/// Also resets the standard output/error streams.
/// </summary>
public void Dispose(ITraceListener traceListener)
{
traceListener.Dispose();
Console.SetOut(origStdOut);
Console.SetError(origStdErr);

}
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,7 +37,7 @@ internal static void SetAppDomainFrameworkVersionBasedOnTestSource(AppDomainSetu
string assemblyVersionString = GetTargetFrameworkVersionString(testSource);
if (GetTargetFrameworkVersionFromVersionString(assemblyVersionString).CompareTo(version45) > 0)
{
PropertyInfo pInfo = typeof(AppDomainSetup).GetProperty(Constants.TargetFrameworkName);
PropertyInfo pInfo = typeof(AppDomainSetup).GetProperty(PlatformServices.Constants.TargetFrameworkName);
if (pInfo != null)
{
pInfo.SetValue(setup, assemblyVersionString, null);
Expand DownExpand Up@@ -121,9 +121,9 @@ internal static string GetTargetFrameworkVersionString(string path)
/// <returns>Framework Version</returns>
internal static Version GetTargetFrameworkVersionFromVersionString(string version)
{
if (version.Length > Constants.DotNetFrameWorkStringPrefix.Length + 1)
if (version.Length > PlatformServices.Constants.DotNetFrameWorkStringPrefix.Length + 1)
{
string versionPart = version.Substring(Constants.DotNetFrameWorkStringPrefix.Length + 1);
string versionPart = version.Substring(PlatformServices.Constants.DotNetFrameWorkStringPrefix.Length + 1);
return new Version(versionPart);
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,5 +16,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestDataSource.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestDeployment.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestSourceHost.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTraceListener.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTraceListenerManager.cs" />
</ItemGroup>
</Project>
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ public void Load(XmlReader reader)
// if we have to read any thing from runsettings special for this platform service then we have to implement it.
}

public IDictionary<string, object> GetProperties()
public IDictionary<string, object> GetProperties(string source)
{
return new Dictionary<string, object>();
}
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
// Copyright (c) Microsoft. All rights reserved.

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.IO;
using System;

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
/// <summary>
/// Internal implementation of TraceListener exposed to the user.
/// </summary>
/// <remarks>
/// The virtual operations of the TraceListener are implemented here
/// like Close(), Dispose() etc.
/// </remarks>
public class TraceListenerWrapper : ITraceListener
{

/// <summary>
/// Initializes a new instance of an object using the specified writer as recipient of the
/// tracing or debugging output.
/// </summary>
public TraceListenerWrapper(TextWriter textWriter)
{
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Close()
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Dispose()
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public TextWriter GetWriter()
{
return null;
}
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
// Copyright (c) Microsoft. All rights reserved.

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
using System;
using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.IO;

/// <summary>
/// Internal implementation of TraceListenerManager exposed to the user.
/// Responsible for performing Add(), Remove(), Close(), Dispose() operations on traceListener object.
/// </summary>
public class TraceListenerManager : ITraceListenerManager
{
/// <summary>
/// Initializes a new instance of a TraceListenerManager object.
/// </summary>
public TraceListenerManager(TextWriter outputWriter, TextWriter errorWriter)
{
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Add(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Close(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Dispose(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Remove(ITraceListener traceListner)
{
return;
}
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,7 +73,7 @@ private string GetTargetFrameworkStringFromAssembly(Assembly assembly)
if (declaringType != null)
{
string attributeName = declaringType.FullName;
if (string.Equals(attributeName, Constants.TargetFrameworkAttributeFullName, StringComparison.OrdinalIgnoreCase))
if (string.Equals(attributeName, PlatformServices.Constants.TargetFrameworkAttributeFullName, StringComparison.OrdinalIgnoreCase))
{
dotNetVersion = data.ConstructorArguments[0].Value.ToString();
break;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -57,6 +57,8 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RecursiveDirectoryPath.cs" />
<Compile Include="Services\DesktopTestContextImplementation.cs" />
<Compile Include="Services\DesktopTraceListener.cs" />
<Compile Include="Services\DesktopTraceListenerManager.cs" />
<Compile Include="Utilities\AppDomainUtilities.cs" />
<Compile Include="Utilities\AssemblyUtility.cs" />
<Compile Include="Utilities\DeploymentItemUtility.cs" />
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,6 @@ namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using Microsoft.VisualStudio.TestPlatform.ObjectModel;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Navigation;

/// <summary>
/// This service is responsible for any file based operations.
Expand DownExpand Up@@ -46,7 +45,7 @@ public bool DoesFileExist(string assemblyFileName)
public object CreateNavigationSession(string source)
{
var messageFormatOnException =
string.Join("MSTestDiscoverer:DiaSession: Could not create diaSession for source:", source, ". Reason:{1}");
string.Join("MSTestDiscoverer:DiaSession: Could not create diaSession for source:", source, ". Reason:{0}");
return SafeInvoke<DiaSession>(() => new DiaSession(source), messageFormatOnException) as DiaSession;
}

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -59,9 +59,9 @@ public void Load(XmlReader reader)
settings = MSTestAdapterSettings.ToSettings(reader);
}

public IDictionary<string, object> GetProperties()
public IDictionary<string, object> GetProperties(string source)
{
return TestDeployment.GetDeploymentInformation();
return TestDeployment.GetDeploymentInformation(source);
}

public const string SettingsName = "MSTestV2";
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,7 @@ namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;

Expand DownExpand Up@@ -113,16 +114,29 @@ public bool Deploy(IEnumerable<TestCase> tests, IRunContext runContext, IFramewo
{
Debug.Assert(tests != null, "tests");

//Reset runDirectories before doing deployment, so that older values of runDirectories is not picked
//even if test host is kept alive.
RunDirectories = null;

this.adapterSettings = MSTestSettingsProvider.Settings;
bool canDeploy = this.CanDeploy();
var hasDeploymentItems = tests.Any(test => this.deploymentItemUtility.HasDeploymentItems(test));

if (!canDeploy || (canDeploy && !hasDeploymentItems))
// deployment directories should not be created in this case,simply return
if (!canDeploy && hasDeploymentItems)
{
return false;
}

RunDirectories = this.deploymentUtility.CreateDeploymentDirectories(runContext);

//Deployment directories are created but deployment will not happen.
//This is added just to keep consistency with MSTestv1 behaviour.
if (!hasDeploymentItems)
{
return false;
}

var isDeploymentDone = false;

using (new SuspendCodeCoverage())
Expand All@@ -146,16 +160,17 @@ group test by test.Source into testGroup
return true;
}

internal static IDictionary<string, object> GetDeploymentInformation()
internal static IDictionary<string, object> GetDeploymentInformation(string source)
{
var properties = new Dictionary<string, object>();

var applicationBaseDirectory = string.Empty;

// Run directories can be null in win8.
if (RunDirectories == null)
if (RunDirectories == null && !string.IsNullOrEmpty(source))
{
applicationBaseDirectory = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
// applicationBaseDirectory is set at source level
applicationBaseDirectory = Path.GetDirectoryName(source);
}

properties[TestContextPropertyStrings.TestRunDirectory] = RunDirectories != null
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
// Copyright (c) Microsoft. All rights reserved.

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.Diagnostics;
using System;
using System.IO;

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
/// <summary>
/// Internal implementation of TraceListener exposed to the user.
/// The virtual operations of the TraceListener are implemented here
/// like Close(), Dispose() etc.
/// </summary>
public class TraceListenerWrapper : TextWriterTraceListener, ITraceListener
{
// Summary:
// Initializes a new instance of an object that derives from System.Diagnostics.TextWriterTraceListener
// Class and initializes TextWriterTraceListener object using the specified writer as recipient of the
// tracing or debugging output.
public TraceListenerWrapper(TextWriter textWriter):base(textWriter)
{
}

// Summary:
// Wrapper over Close() of System.Diagnostics.TextWriterTraceListener.Writer
public override void Close()
{
base.Close();
}

// Summary:
// Wrapper over Dispose() of System.Diagnostics.TextWriterTraceListener object
public new void Dispose()
{
base.Dispose();
}

// Summary:
// Gets the text writer of System.Diagnostics.TextWriterTraceListener.Writer
// that receives the tracing or debugging output.
public TextWriter GetWriter()
{
return base.Writer;
}
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
// Copyright (c) Microsoft. All rights reserved.

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
using System;
using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.Diagnostics;
using System.IO;
using System.Globalization;

/// <summary>
/// Internal implementation of TraceListenerManager exposed to the user.
/// Responsible for performing Add(), Remove(), Close(), Dispose() operations on traceListener object.
/// </summary>
public class TraceListenerManager : ITraceListenerManager
{
/// <summary>
/// Original output stream
/// </summary>
private TextWriter origStdOut;

/// <summary>
/// Original error stream
/// </summary>
private TextWriter origStdErr;

/// <summary>
/// Initializes a new instance of a TraceListenerManager object.
/// Also, updates the output/error streams with redirected outputWriter and errorWriter
/// </summary>
public TraceListenerManager(TextWriter outputWriter, TextWriter errorWriter)
{
origStdOut = Console.Out;
origStdErr = Console.Error;

// Update the output/error streams with redirected streams
Console.SetOut(outputWriter);
Console.SetError(errorWriter);
}

/// <summary>
/// Adds the arguement traceListener object to System.Diagnostics.TraceListenerCollection.
/// </summary>
public void Add(ITraceListener traceListener)
{
try
{
Trace.Listeners.Add(traceListener as TextWriterTraceListener);
}
catch (Exception ex)
{
// Catch exceptions if the configuration file is invalid and allow a stack
// trace to show the error on the test method instead of here.
if (!(ex.InnerException is System.Configuration.ConfigurationErrorsException))
{
throw;
}
}
}

/// <summary>
/// Removes the arguement traceListener object from System.Diagnostics.TraceListenerCollection.
/// </summary>
public void Remove(ITraceListener traceListner)
{
Trace.Listeners.Remove(traceListner as TextWriterTraceListener);
}

/// <summary>
/// Wrapper over Close() of ITraceListener.
/// </summary>
public void Close(ITraceListener traceListener)
{
traceListener.Close();
}

/// <summary>
/// Wrapper over Dispose() of ITraceListener.
/// Also resets the standard output/error streams.
/// </summary>
public void Dispose(ITraceListener traceListener)
{
traceListener.Dispose();
Console.SetOut(origStdOut);
Console.SetError(origStdErr);

}
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,7 +37,7 @@ internal static void SetAppDomainFrameworkVersionBasedOnTestSource(AppDomainSetu
string assemblyVersionString = GetTargetFrameworkVersionString(testSource);
if (GetTargetFrameworkVersionFromVersionString(assemblyVersionString).CompareTo(version45) > 0)
{
PropertyInfo pInfo = typeof(AppDomainSetup).GetProperty(Constants.TargetFrameworkName);
PropertyInfo pInfo = typeof(AppDomainSetup).GetProperty(PlatformServices.Constants.TargetFrameworkName);
if (pInfo != null)
{
pInfo.SetValue(setup, assemblyVersionString, null);
Expand DownExpand Up@@ -121,9 +121,9 @@ internal static string GetTargetFrameworkVersionString(string path)
/// <returns>Framework Version</returns>
internal static Version GetTargetFrameworkVersionFromVersionString(string version)
{
if (version.Length > Constants.DotNetFrameWorkStringPrefix.Length + 1)
if (version.Length > PlatformServices.Constants.DotNetFrameWorkStringPrefix.Length + 1)
{
string versionPart = version.Substring(Constants.DotNetFrameWorkStringPrefix.Length + 1);
string versionPart = version.Substring(PlatformServices.Constants.DotNetFrameWorkStringPrefix.Length + 1);
return new Version(versionPart);
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,5 +16,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestDataSource.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestDeployment.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestSourceHost.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTraceListener.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTraceListenerManager.cs" />
</ItemGroup>
</Project>
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ public void Load(XmlReader reader)
// if we have to read any thing from runsettings special for this platform service then we have to implement it.
}

public IDictionary<string, object> GetProperties()
public IDictionary<string, object> GetProperties(string source)
{
return new Dictionary<string, object>();
}
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
// Copyright (c) Microsoft. All rights reserved.

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.IO;
using System;

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
/// <summary>
/// Internal implementation of TraceListener exposed to the user.
/// </summary>
/// <remarks>
/// The virtual operations of the TraceListener are implemented here
/// like Close(), Dispose() etc.
/// </remarks>
public class TraceListenerWrapper : ITraceListener
{

/// <summary>
/// Initializes a new instance of an object using the specified writer as recipient of the
/// tracing or debugging output.
/// </summary>
public TraceListenerWrapper(TextWriter textWriter)
{
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Close()
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Dispose()
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public TextWriter GetWriter()
{
return null;
}
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
// Copyright (c) Microsoft. All rights reserved.

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
using System;
using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.IO;

/// <summary>
/// Internal implementation of TraceListenerManager exposed to the user.
/// Responsible for performing Add(), Remove(), Close(), Dispose() operations on traceListener object.
/// </summary>
public class TraceListenerManager : ITraceListenerManager
{
/// <summary>
/// Initializes a new instance of a TraceListenerManager object.
/// </summary>
public TraceListenerManager(TextWriter outputWriter, TextWriter errorWriter)
{
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Add(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Close(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Dispose(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Remove(ITraceListener traceListner)
{
return;
}
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,7 +73,7 @@ private string GetTargetFrameworkStringFromAssembly(Assembly assembly)
if (declaringType != null)
{
string attributeName = declaringType.FullName;
if (string.Equals(attributeName, Constants.TargetFrameworkAttributeFullName, StringComparison.OrdinalIgnoreCase))
if (string.Equals(attributeName, PlatformServices.Constants.TargetFrameworkAttributeFullName, StringComparison.OrdinalIgnoreCase))
{
dotNetVersion = data.ConstructorArguments[0].Value.ToString();
break;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -57,6 +57,8 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RecursiveDirectoryPath.cs" />
<Compile Include="Services\DesktopTestContextImplementation.cs" />
<Compile Include="Services\DesktopTraceListener.cs" />
<Compile Include="Services\DesktopTraceListenerManager.cs" />
<Compile Include="Utilities\AppDomainUtilities.cs" />
<Compile Include="Utilities\AssemblyUtility.cs" />
<Compile Include="Utilities\DeploymentItemUtility.cs" />
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,6 @@ namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using Microsoft.VisualStudio.TestPlatform.ObjectModel;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Navigation;

/// <summary>
/// This service is responsible for any file based operations.
Expand DownExpand Up@@ -46,7 +45,7 @@ public bool DoesFileExist(string assemblyFileName)
public object CreateNavigationSession(string source)
{
var messageFormatOnException =
string.Join("MSTestDiscoverer:DiaSession: Could not create diaSession for source:", source, ". Reason:{1}");
string.Join("MSTestDiscoverer:DiaSession: Could not create diaSession for source:", source, ". Reason:{0}");
return SafeInvoke<DiaSession>(() => new DiaSession(source), messageFormatOnException) as DiaSession;
}

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -59,9 +59,9 @@ public void Load(XmlReader reader)
settings = MSTestAdapterSettings.ToSettings(reader);
}

public IDictionary<string, object> GetProperties()
public IDictionary<string, object> GetProperties(string source)
{
return TestDeployment.GetDeploymentInformation();
return TestDeployment.GetDeploymentInformation(source);
}

public const string SettingsName = "MSTestV2";
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,7 @@ namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;

Expand DownExpand Up@@ -113,16 +114,29 @@ public bool Deploy(IEnumerable<TestCase> tests, IRunContext runContext, IFramewo
{
Debug.Assert(tests != null, "tests");

//Reset runDirectories before doing deployment, so that older values of runDirectories is not picked
//even if test host is kept alive.
RunDirectories = null;

this.adapterSettings = MSTestSettingsProvider.Settings;
bool canDeploy = this.CanDeploy();
var hasDeploymentItems = tests.Any(test => this.deploymentItemUtility.HasDeploymentItems(test));

if (!canDeploy || (canDeploy && !hasDeploymentItems))
// deployment directories should not be created in this case,simply return
if (!canDeploy && hasDeploymentItems)
{
return false;
}

RunDirectories = this.deploymentUtility.CreateDeploymentDirectories(runContext);

//Deployment directories are created but deployment will not happen.
//This is added just to keep consistency with MSTestv1 behaviour.
if (!hasDeploymentItems)
{
return false;
}

var isDeploymentDone = false;

using (new SuspendCodeCoverage())
Expand All@@ -146,16 +160,17 @@ group test by test.Source into testGroup
return true;
}

internal static IDictionary<string, object> GetDeploymentInformation()
internal static IDictionary<string, object> GetDeploymentInformation(string source)
{
var properties = new Dictionary<string, object>();

var applicationBaseDirectory = string.Empty;

// Run directories can be null in win8.
if (RunDirectories == null)
if (RunDirectories == null && !string.IsNullOrEmpty(source))
{
applicationBaseDirectory = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
// applicationBaseDirectory is set at source level
applicationBaseDirectory = Path.GetDirectoryName(source);
}

properties[TestContextPropertyStrings.TestRunDirectory] = RunDirectories != null
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
// Copyright (c) Microsoft. All rights reserved.

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.Diagnostics;
using System;
using System.IO;

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
/// <summary>
/// Internal implementation of TraceListener exposed to the user.
/// The virtual operations of the TraceListener are implemented here
/// like Close(), Dispose() etc.
/// </summary>
public class TraceListenerWrapper : TextWriterTraceListener, ITraceListener
{
// Summary:
// Initializes a new instance of an object that derives from System.Diagnostics.TextWriterTraceListener
// Class and initializes TextWriterTraceListener object using the specified writer as recipient of the
// tracing or debugging output.
public TraceListenerWrapper(TextWriter textWriter):base(textWriter)
{
}

// Summary:
// Wrapper over Close() of System.Diagnostics.TextWriterTraceListener.Writer
public override void Close()
{
base.Close();
}

// Summary:
// Wrapper over Dispose() of System.Diagnostics.TextWriterTraceListener object
public new void Dispose()
{
base.Dispose();
}

// Summary:
// Gets the text writer of System.Diagnostics.TextWriterTraceListener.Writer
// that receives the tracing or debugging output.
public TextWriter GetWriter()
{
return base.Writer;
}
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
// Copyright (c) Microsoft. All rights reserved.

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
using System;
using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.Diagnostics;
using System.IO;
using System.Globalization;

/// <summary>
/// Internal implementation of TraceListenerManager exposed to the user.
/// Responsible for performing Add(), Remove(), Close(), Dispose() operations on traceListener object.
/// </summary>
public class TraceListenerManager : ITraceListenerManager
{
/// <summary>
/// Original output stream
/// </summary>
private TextWriter origStdOut;

/// <summary>
/// Original error stream
/// </summary>
private TextWriter origStdErr;

/// <summary>
/// Initializes a new instance of a TraceListenerManager object.
/// Also, updates the output/error streams with redirected outputWriter and errorWriter
/// </summary>
public TraceListenerManager(TextWriter outputWriter, TextWriter errorWriter)
{
origStdOut = Console.Out;
origStdErr = Console.Error;

// Update the output/error streams with redirected streams
Console.SetOut(outputWriter);
Console.SetError(errorWriter);
}

/// <summary>
/// Adds the arguement traceListener object to System.Diagnostics.TraceListenerCollection.
/// </summary>
public void Add(ITraceListener traceListener)
{
try
{
Trace.Listeners.Add(traceListener as TextWriterTraceListener);
}
catch (Exception ex)
{
// Catch exceptions if the configuration file is invalid and allow a stack
// trace to show the error on the test method instead of here.
if (!(ex.InnerException is System.Configuration.ConfigurationErrorsException))
{
throw;
}
}
}

/// <summary>
/// Removes the arguement traceListener object from System.Diagnostics.TraceListenerCollection.
/// </summary>
public void Remove(ITraceListener traceListner)
{
Trace.Listeners.Remove(traceListner as TextWriterTraceListener);
}

/// <summary>
/// Wrapper over Close() of ITraceListener.
/// </summary>
public void Close(ITraceListener traceListener)
{
traceListener.Close();
}

/// <summary>
/// Wrapper over Dispose() of ITraceListener.
/// Also resets the standard output/error streams.
/// </summary>
public void Dispose(ITraceListener traceListener)
{
traceListener.Dispose();
Console.SetOut(origStdOut);
Console.SetError(origStdErr);

}
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,7 +37,7 @@ internal static void SetAppDomainFrameworkVersionBasedOnTestSource(AppDomainSetu
string assemblyVersionString = GetTargetFrameworkVersionString(testSource);
if (GetTargetFrameworkVersionFromVersionString(assemblyVersionString).CompareTo(version45) > 0)
{
PropertyInfo pInfo = typeof(AppDomainSetup).GetProperty(Constants.TargetFrameworkName);
PropertyInfo pInfo = typeof(AppDomainSetup).GetProperty(PlatformServices.Constants.TargetFrameworkName);
if (pInfo != null)
{
pInfo.SetValue(setup, assemblyVersionString, null);
Expand DownExpand Up@@ -121,9 +121,9 @@ internal static string GetTargetFrameworkVersionString(string path)
/// <returns>Framework Version</returns>
internal static Version GetTargetFrameworkVersionFromVersionString(string version)
{
if (version.Length > Constants.DotNetFrameWorkStringPrefix.Length + 1)
if (version.Length > PlatformServices.Constants.DotNetFrameWorkStringPrefix.Length + 1)
{
string versionPart = version.Substring(Constants.DotNetFrameWorkStringPrefix.Length + 1);
string versionPart = version.Substring(PlatformServices.Constants.DotNetFrameWorkStringPrefix.Length + 1);
return new Version(versionPart);
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,5 +16,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestDataSource.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestDeployment.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestSourceHost.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTraceListener.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTraceListenerManager.cs" />
</ItemGroup>
</Project>
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ public void Load(XmlReader reader)
// if we have to read any thing from runsettings special for this platform service then we have to implement it.
}

public IDictionary<string, object> GetProperties()
public IDictionary<string, object> GetProperties(string source)
{
return new Dictionary<string, object>();
}
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
// Copyright (c) Microsoft. All rights reserved.

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.IO;
using System;

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
/// <summary>
/// Internal implementation of TraceListener exposed to the user.
/// </summary>
/// <remarks>
/// The virtual operations of the TraceListener are implemented here
/// like Close(), Dispose() etc.
/// </remarks>
public class TraceListenerWrapper : ITraceListener
{

/// <summary>
/// Initializes a new instance of an object using the specified writer as recipient of the
/// tracing or debugging output.
/// </summary>
public TraceListenerWrapper(TextWriter textWriter)
{
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Close()
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Dispose()
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public TextWriter GetWriter()
{
return null;
}
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
// Copyright (c) Microsoft. All rights reserved.

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
using System;
using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.IO;

/// <summary>
/// Internal implementation of TraceListenerManager exposed to the user.
/// Responsible for performing Add(), Remove(), Close(), Dispose() operations on traceListener object.
/// </summary>
public class TraceListenerManager : ITraceListenerManager
{
/// <summary>
/// Initializes a new instance of a TraceListenerManager object.
/// </summary>
public TraceListenerManager(TextWriter outputWriter, TextWriter errorWriter)
{
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Add(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Close(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Dispose(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Remove(ITraceListener traceListner)
{
return;
}
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,7 +73,7 @@ private string GetTargetFrameworkStringFromAssembly(Assembly assembly)
if (declaringType != null)
{
string attributeName = declaringType.FullName;
if (string.Equals(attributeName, Constants.TargetFrameworkAttributeFullName, StringComparison.OrdinalIgnoreCase))
if (string.Equals(attributeName, PlatformServices.Constants.TargetFrameworkAttributeFullName, StringComparison.OrdinalIgnoreCase))
{
dotNetVersion = data.ConstructorArguments[0].Value.ToString();
break;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -57,6 +57,8 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RecursiveDirectoryPath.cs" />
<Compile Include="Services\DesktopTestContextImplementation.cs" />
<Compile Include="Services\DesktopTraceListener.cs" />
<Compile Include="Services\DesktopTraceListenerManager.cs" />
<Compile Include="Utilities\AppDomainUtilities.cs" />
<Compile Include="Utilities\AssemblyUtility.cs" />
<Compile Include="Utilities\DeploymentItemUtility.cs" />
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,6 @@ namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using Microsoft.VisualStudio.TestPlatform.ObjectModel;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Navigation;

/// <summary>
/// This service is responsible for any file based operations.
Expand DownExpand Up@@ -46,7 +45,7 @@ public bool DoesFileExist(string assemblyFileName)
public object CreateNavigationSession(string source)
{
var messageFormatOnException =
string.Join("MSTestDiscoverer:DiaSession: Could not create diaSession for source:", source, ". Reason:{1}");
string.Join("MSTestDiscoverer:DiaSession: Could not create diaSession for source:", source, ". Reason:{0}");
return SafeInvoke<DiaSession>(() => new DiaSession(source), messageFormatOnException) as DiaSession;
}

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -59,9 +59,9 @@ public void Load(XmlReader reader)
settings = MSTestAdapterSettings.ToSettings(reader);
}

public IDictionary<string, object> GetProperties()
public IDictionary<string, object> GetProperties(string source)
{
return TestDeployment.GetDeploymentInformation();
return TestDeployment.GetDeploymentInformation(source);
}

public const string SettingsName = "MSTestV2";
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,7 @@ namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;

Expand DownExpand Up@@ -113,16 +114,29 @@ public bool Deploy(IEnumerable<TestCase> tests, IRunContext runContext, IFramewo
{
Debug.Assert(tests != null, "tests");

//Reset runDirectories before doing deployment, so that older values of runDirectories is not picked
//even if test host is kept alive.
RunDirectories = null;

this.adapterSettings = MSTestSettingsProvider.Settings;
bool canDeploy = this.CanDeploy();
var hasDeploymentItems = tests.Any(test => this.deploymentItemUtility.HasDeploymentItems(test));

if (!canDeploy || (canDeploy && !hasDeploymentItems))
// deployment directories should not be created in this case,simply return
if (!canDeploy && hasDeploymentItems)
{
return false;
}

RunDirectories = this.deploymentUtility.CreateDeploymentDirectories(runContext);

//Deployment directories are created but deployment will not happen.
//This is added just to keep consistency with MSTestv1 behaviour.
if (!hasDeploymentItems)
{
return false;
}

var isDeploymentDone = false;

using (new SuspendCodeCoverage())
Expand All@@ -146,16 +160,17 @@ group test by test.Source into testGroup
return true;
}

internal static IDictionary<string, object> GetDeploymentInformation()
internal static IDictionary<string, object> GetDeploymentInformation(string source)
{
var properties = new Dictionary<string, object>();

var applicationBaseDirectory = string.Empty;

// Run directories can be null in win8.
if (RunDirectories == null)
if (RunDirectories == null && !string.IsNullOrEmpty(source))
{
applicationBaseDirectory = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
// applicationBaseDirectory is set at source level
applicationBaseDirectory = Path.GetDirectoryName(source);
}

properties[TestContextPropertyStrings.TestRunDirectory] = RunDirectories != null
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
// Copyright (c) Microsoft. All rights reserved.

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.Diagnostics;
using System;
using System.IO;

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
/// <summary>
/// Internal implementation of TraceListener exposed to the user.
/// The virtual operations of the TraceListener are implemented here
/// like Close(), Dispose() etc.
/// </summary>
public class TraceListenerWrapper : TextWriterTraceListener, ITraceListener
{
// Summary:
// Initializes a new instance of an object that derives from System.Diagnostics.TextWriterTraceListener
// Class and initializes TextWriterTraceListener object using the specified writer as recipient of the
// tracing or debugging output.
public TraceListenerWrapper(TextWriter textWriter):base(textWriter)
{
}

// Summary:
// Wrapper over Close() of System.Diagnostics.TextWriterTraceListener.Writer
public override void Close()
{
base.Close();
}

// Summary:
// Wrapper over Dispose() of System.Diagnostics.TextWriterTraceListener object
public new void Dispose()
{
base.Dispose();
}

// Summary:
// Gets the text writer of System.Diagnostics.TextWriterTraceListener.Writer
// that receives the tracing or debugging output.
public TextWriter GetWriter()
{
return base.Writer;
}
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
// Copyright (c) Microsoft. All rights reserved.

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
using System;
using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.Diagnostics;
using System.IO;
using System.Globalization;

/// <summary>
/// Internal implementation of TraceListenerManager exposed to the user.
/// Responsible for performing Add(), Remove(), Close(), Dispose() operations on traceListener object.
/// </summary>
public class TraceListenerManager : ITraceListenerManager
{
/// <summary>
/// Original output stream
/// </summary>
private TextWriter origStdOut;

/// <summary>
/// Original error stream
/// </summary>
private TextWriter origStdErr;

/// <summary>
/// Initializes a new instance of a TraceListenerManager object.
/// Also, updates the output/error streams with redirected outputWriter and errorWriter
/// </summary>
public TraceListenerManager(TextWriter outputWriter, TextWriter errorWriter)
{
origStdOut = Console.Out;
origStdErr = Console.Error;

// Update the output/error streams with redirected streams
Console.SetOut(outputWriter);
Console.SetError(errorWriter);
}

/// <summary>
/// Adds the arguement traceListener object to System.Diagnostics.TraceListenerCollection.
/// </summary>
public void Add(ITraceListener traceListener)
{
try
{
Trace.Listeners.Add(traceListener as TextWriterTraceListener);
}
catch (Exception ex)
{
// Catch exceptions if the configuration file is invalid and allow a stack
// trace to show the error on the test method instead of here.
if (!(ex.InnerException is System.Configuration.ConfigurationErrorsException))
{
throw;
}
}
}

/// <summary>
/// Removes the arguement traceListener object from System.Diagnostics.TraceListenerCollection.
/// </summary>
public void Remove(ITraceListener traceListner)
{
Trace.Listeners.Remove(traceListner as TextWriterTraceListener);
}

/// <summary>
/// Wrapper over Close() of ITraceListener.
/// </summary>
public void Close(ITraceListener traceListener)
{
traceListener.Close();
}

/// <summary>
/// Wrapper over Dispose() of ITraceListener.
/// Also resets the standard output/error streams.
/// </summary>
public void Dispose(ITraceListener traceListener)
{
traceListener.Dispose();
Console.SetOut(origStdOut);
Console.SetError(origStdErr);

}
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,7 +37,7 @@ internal static void SetAppDomainFrameworkVersionBasedOnTestSource(AppDomainSetu
string assemblyVersionString = GetTargetFrameworkVersionString(testSource);
if (GetTargetFrameworkVersionFromVersionString(assemblyVersionString).CompareTo(version45) > 0)
{
PropertyInfo pInfo = typeof(AppDomainSetup).GetProperty(Constants.TargetFrameworkName);
PropertyInfo pInfo = typeof(AppDomainSetup).GetProperty(PlatformServices.Constants.TargetFrameworkName);
if (pInfo != null)
{
pInfo.SetValue(setup, assemblyVersionString, null);
Expand DownExpand Up@@ -121,9 +121,9 @@ internal static string GetTargetFrameworkVersionString(string path)
/// <returns>Framework Version</returns>
internal static Version GetTargetFrameworkVersionFromVersionString(string version)
{
if (version.Length > Constants.DotNetFrameWorkStringPrefix.Length + 1)
if (version.Length > PlatformServices.Constants.DotNetFrameWorkStringPrefix.Length + 1)
{
string versionPart = version.Substring(Constants.DotNetFrameWorkStringPrefix.Length + 1);
string versionPart = version.Substring(PlatformServices.Constants.DotNetFrameWorkStringPrefix.Length + 1);
return new Version(versionPart);
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,5 +16,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestDataSource.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestDeployment.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestSourceHost.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTraceListener.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTraceListenerManager.cs" />
</ItemGroup>
</Project>
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ public void Load(XmlReader reader)
// if we have to read any thing from runsettings special for this platform service then we have to implement it.
}

public IDictionary<string, object> GetProperties()
public IDictionary<string, object> GetProperties(string source)
{
return new Dictionary<string, object>();
}
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
// Copyright (c) Microsoft. All rights reserved.

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.IO;
using System;

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
/// <summary>
/// Internal implementation of TraceListener exposed to the user.
/// </summary>
/// <remarks>
/// The virtual operations of the TraceListener are implemented here
/// like Close(), Dispose() etc.
/// </remarks>
public class TraceListenerWrapper : ITraceListener
{

/// <summary>
/// Initializes a new instance of an object using the specified writer as recipient of the
/// tracing or debugging output.
/// </summary>
public TraceListenerWrapper(TextWriter textWriter)
{
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Close()
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Dispose()
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public TextWriter GetWriter()
{
return null;
}
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
// Copyright (c) Microsoft. All rights reserved.

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
using System;
using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.IO;

/// <summary>
/// Internal implementation of TraceListenerManager exposed to the user.
/// Responsible for performing Add(), Remove(), Close(), Dispose() operations on traceListener object.
/// </summary>
public class TraceListenerManager : ITraceListenerManager
{
/// <summary>
/// Initializes a new instance of a TraceListenerManager object.
/// </summary>
public TraceListenerManager(TextWriter outputWriter, TextWriter errorWriter)
{
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Add(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Close(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Dispose(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Remove(ITraceListener traceListner)
{
return;
}
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,7 +73,7 @@ private string GetTargetFrameworkStringFromAssembly(Assembly assembly)
if (declaringType != null)
{
string attributeName = declaringType.FullName;
if (string.Equals(attributeName, Constants.TargetFrameworkAttributeFullName, StringComparison.OrdinalIgnoreCase))
if (string.Equals(attributeName, PlatformServices.Constants.TargetFrameworkAttributeFullName, StringComparison.OrdinalIgnoreCase))
{
dotNetVersion = data.ConstructorArguments[0].Value.ToString();
break;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -57,6 +57,8 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RecursiveDirectoryPath.cs" />
<Compile Include="Services\DesktopTestContextImplementation.cs" />
<Compile Include="Services\DesktopTraceListener.cs" />
<Compile Include="Services\DesktopTraceListenerManager.cs" />
<Compile Include="Utilities\AppDomainUtilities.cs" />
<Compile Include="Utilities\AssemblyUtility.cs" />
<Compile Include="Utilities\DeploymentItemUtility.cs" />
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,6 @@ namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using Microsoft.VisualStudio.TestPlatform.ObjectModel;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Navigation;

/// <summary>
/// This service is responsible for any file based operations.
Expand DownExpand Up@@ -46,7 +45,7 @@ public bool DoesFileExist(string assemblyFileName)
public object CreateNavigationSession(string source)
{
var messageFormatOnException =
string.Join("MSTestDiscoverer:DiaSession: Could not create diaSession for source:", source, ". Reason:{1}");
string.Join("MSTestDiscoverer:DiaSession: Could not create diaSession for source:", source, ". Reason:{0}");
return SafeInvoke<DiaSession>(() => new DiaSession(source), messageFormatOnException) as DiaSession;
}

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -59,9 +59,9 @@ public void Load(XmlReader reader)
settings = MSTestAdapterSettings.ToSettings(reader);
}

public IDictionary<string, object> GetProperties()
public IDictionary<string, object> GetProperties(string source)
{
return TestDeployment.GetDeploymentInformation();
return TestDeployment.GetDeploymentInformation(source);
}

public const string SettingsName = "MSTestV2";
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,7 @@ namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;

Expand DownExpand Up@@ -113,16 +114,29 @@ public bool Deploy(IEnumerable<TestCase> tests, IRunContext runContext, IFramewo
{
Debug.Assert(tests != null, "tests");

//Reset runDirectories before doing deployment, so that older values of runDirectories is not picked
//even if test host is kept alive.
RunDirectories = null;

this.adapterSettings = MSTestSettingsProvider.Settings;
bool canDeploy = this.CanDeploy();
var hasDeploymentItems = tests.Any(test => this.deploymentItemUtility.HasDeploymentItems(test));

if (!canDeploy || (canDeploy && !hasDeploymentItems))
// deployment directories should not be created in this case,simply return
if (!canDeploy && hasDeploymentItems)
{
return false;
}

RunDirectories = this.deploymentUtility.CreateDeploymentDirectories(runContext);

//Deployment directories are created but deployment will not happen.
//This is added just to keep consistency with MSTestv1 behaviour.
if (!hasDeploymentItems)
{
return false;
}

var isDeploymentDone = false;

using (new SuspendCodeCoverage())
Expand All@@ -146,16 +160,17 @@ group test by test.Source into testGroup
return true;
}

internal static IDictionary<string, object> GetDeploymentInformation()
internal static IDictionary<string, object> GetDeploymentInformation(string source)
{
var properties = new Dictionary<string, object>();

var applicationBaseDirectory = string.Empty;

// Run directories can be null in win8.
if (RunDirectories == null)
if (RunDirectories == null && !string.IsNullOrEmpty(source))
{
applicationBaseDirectory = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
// applicationBaseDirectory is set at source level
applicationBaseDirectory = Path.GetDirectoryName(source);
}

properties[TestContextPropertyStrings.TestRunDirectory] = RunDirectories != null
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
// Copyright (c) Microsoft. All rights reserved.

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.Diagnostics;
using System;
using System.IO;

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
/// <summary>
/// Internal implementation of TraceListener exposed to the user.
/// The virtual operations of the TraceListener are implemented here
/// like Close(), Dispose() etc.
/// </summary>
public class TraceListenerWrapper : TextWriterTraceListener, ITraceListener
{
// Summary:
// Initializes a new instance of an object that derives from System.Diagnostics.TextWriterTraceListener
// Class and initializes TextWriterTraceListener object using the specified writer as recipient of the
// tracing or debugging output.
public TraceListenerWrapper(TextWriter textWriter):base(textWriter)
{
}

// Summary:
// Wrapper over Close() of System.Diagnostics.TextWriterTraceListener.Writer
public override void Close()
{
base.Close();
}

// Summary:
// Wrapper over Dispose() of System.Diagnostics.TextWriterTraceListener object
public new void Dispose()
{
base.Dispose();
}

// Summary:
// Gets the text writer of System.Diagnostics.TextWriterTraceListener.Writer
// that receives the tracing or debugging output.
public TextWriter GetWriter()
{
return base.Writer;
}
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
// Copyright (c) Microsoft. All rights reserved.

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
using System;
using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.Diagnostics;
using System.IO;
using System.Globalization;

/// <summary>
/// Internal implementation of TraceListenerManager exposed to the user.
/// Responsible for performing Add(), Remove(), Close(), Dispose() operations on traceListener object.
/// </summary>
public class TraceListenerManager : ITraceListenerManager
{
/// <summary>
/// Original output stream
/// </summary>
private TextWriter origStdOut;

/// <summary>
/// Original error stream
/// </summary>
private TextWriter origStdErr;

/// <summary>
/// Initializes a new instance of a TraceListenerManager object.
/// Also, updates the output/error streams with redirected outputWriter and errorWriter
/// </summary>
public TraceListenerManager(TextWriter outputWriter, TextWriter errorWriter)
{
origStdOut = Console.Out;
origStdErr = Console.Error;

// Update the output/error streams with redirected streams
Console.SetOut(outputWriter);
Console.SetError(errorWriter);
}

/// <summary>
/// Adds the arguement traceListener object to System.Diagnostics.TraceListenerCollection.
/// </summary>
public void Add(ITraceListener traceListener)
{
try
{
Trace.Listeners.Add(traceListener as TextWriterTraceListener);
}
catch (Exception ex)
{
// Catch exceptions if the configuration file is invalid and allow a stack
// trace to show the error on the test method instead of here.
if (!(ex.InnerException is System.Configuration.ConfigurationErrorsException))
{
throw;
}
}
}

/// <summary>
/// Removes the arguement traceListener object from System.Diagnostics.TraceListenerCollection.
/// </summary>
public void Remove(ITraceListener traceListner)
{
Trace.Listeners.Remove(traceListner as TextWriterTraceListener);
}

/// <summary>
/// Wrapper over Close() of ITraceListener.
/// </summary>
public void Close(ITraceListener traceListener)
{
traceListener.Close();
}

/// <summary>
/// Wrapper over Dispose() of ITraceListener.
/// Also resets the standard output/error streams.
/// </summary>
public void Dispose(ITraceListener traceListener)
{
traceListener.Dispose();
Console.SetOut(origStdOut);
Console.SetError(origStdErr);

}
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,7 +37,7 @@ internal static void SetAppDomainFrameworkVersionBasedOnTestSource(AppDomainSetu
string assemblyVersionString = GetTargetFrameworkVersionString(testSource);
if (GetTargetFrameworkVersionFromVersionString(assemblyVersionString).CompareTo(version45) > 0)
{
PropertyInfo pInfo = typeof(AppDomainSetup).GetProperty(Constants.TargetFrameworkName);
PropertyInfo pInfo = typeof(AppDomainSetup).GetProperty(PlatformServices.Constants.TargetFrameworkName);
if (pInfo != null)
{
pInfo.SetValue(setup, assemblyVersionString, null);
Expand DownExpand Up@@ -121,9 +121,9 @@ internal static string GetTargetFrameworkVersionString(string path)
/// <returns>Framework Version</returns>
internal static Version GetTargetFrameworkVersionFromVersionString(string version)
{
if (version.Length > Constants.DotNetFrameWorkStringPrefix.Length + 1)
if (version.Length > PlatformServices.Constants.DotNetFrameWorkStringPrefix.Length + 1)
{
string versionPart = version.Substring(Constants.DotNetFrameWorkStringPrefix.Length + 1);
string versionPart = version.Substring(PlatformServices.Constants.DotNetFrameWorkStringPrefix.Length + 1);
return new Version(versionPart);
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,5 +16,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestDataSource.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestDeployment.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestSourceHost.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTraceListener.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTraceListenerManager.cs" />
</ItemGroup>
</Project>
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ public void Load(XmlReader reader)
// if we have to read any thing from runsettings special for this platform service then we have to implement it.
}

public IDictionary<string, object> GetProperties()
public IDictionary<string, object> GetProperties(string source)
{
return new Dictionary<string, object>();
}
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
// Copyright (c) Microsoft. All rights reserved.

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.IO;
using System;

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
/// <summary>
/// Internal implementation of TraceListener exposed to the user.
/// </summary>
/// <remarks>
/// The virtual operations of the TraceListener are implemented here
/// like Close(), Dispose() etc.
/// </remarks>
public class TraceListenerWrapper : ITraceListener
{

/// <summary>
/// Initializes a new instance of an object using the specified writer as recipient of the
/// tracing or debugging output.
/// </summary>
public TraceListenerWrapper(TextWriter textWriter)
{
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Close()
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Dispose()
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public TextWriter GetWriter()
{
return null;
}
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
// Copyright (c) Microsoft. All rights reserved.

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
using System;
using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.IO;

/// <summary>
/// Internal implementation of TraceListenerManager exposed to the user.
/// Responsible for performing Add(), Remove(), Close(), Dispose() operations on traceListener object.
/// </summary>
public class TraceListenerManager : ITraceListenerManager
{
/// <summary>
/// Initializes a new instance of a TraceListenerManager object.
/// </summary>
public TraceListenerManager(TextWriter outputWriter, TextWriter errorWriter)
{
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Add(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Close(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Dispose(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Remove(ITraceListener traceListner)
{
return;
}
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,7 +73,7 @@ private string GetTargetFrameworkStringFromAssembly(Assembly assembly)
if (declaringType != null)
{
string attributeName = declaringType.FullName;
if (string.Equals(attributeName, Constants.TargetFrameworkAttributeFullName, StringComparison.OrdinalIgnoreCase))
if (string.Equals(attributeName, PlatformServices.Constants.TargetFrameworkAttributeFullName, StringComparison.OrdinalIgnoreCase))
{
dotNetVersion = data.ConstructorArguments[0].Value.ToString();
break;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -57,6 +57,8 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RecursiveDirectoryPath.cs" />
<Compile Include="Services\DesktopTestContextImplementation.cs" />
<Compile Include="Services\DesktopTraceListener.cs" />
<Compile Include="Services\DesktopTraceListenerManager.cs" />
<Compile Include="Utilities\AppDomainUtilities.cs" />
<Compile Include="Utilities\AssemblyUtility.cs" />
<Compile Include="Utilities\DeploymentItemUtility.cs" />
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,6 @@ namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using Microsoft.VisualStudio.TestPlatform.ObjectModel;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Navigation;

/// <summary>
/// This service is responsible for any file based operations.
Expand DownExpand Up@@ -46,7 +45,7 @@ public bool DoesFileExist(string assemblyFileName)
public object CreateNavigationSession(string source)
{
var messageFormatOnException =
string.Join("MSTestDiscoverer:DiaSession: Could not create diaSession for source:", source, ". Reason:{1}");
string.Join("MSTestDiscoverer:DiaSession: Could not create diaSession for source:", source, ". Reason:{0}");
return SafeInvoke<DiaSession>(() => new DiaSession(source), messageFormatOnException) as DiaSession;
}

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -59,9 +59,9 @@ public void Load(XmlReader reader)
settings = MSTestAdapterSettings.ToSettings(reader);
}

public IDictionary<string, object> GetProperties()
public IDictionary<string, object> GetProperties(string source)
{
return TestDeployment.GetDeploymentInformation();
return TestDeployment.GetDeploymentInformation(source);
}

public const string SettingsName = "MSTestV2";
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,7 @@ namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;

Expand DownExpand Up@@ -113,16 +114,29 @@ public bool Deploy(IEnumerable<TestCase> tests, IRunContext runContext, IFramewo
{
Debug.Assert(tests != null, "tests");

//Reset runDirectories before doing deployment, so that older values of runDirectories is not picked
//even if test host is kept alive.
RunDirectories = null;

this.adapterSettings = MSTestSettingsProvider.Settings;
bool canDeploy = this.CanDeploy();
var hasDeploymentItems = tests.Any(test => this.deploymentItemUtility.HasDeploymentItems(test));

if (!canDeploy || (canDeploy && !hasDeploymentItems))
// deployment directories should not be created in this case,simply return
if (!canDeploy && hasDeploymentItems)
{
return false;
}

RunDirectories = this.deploymentUtility.CreateDeploymentDirectories(runContext);

//Deployment directories are created but deployment will not happen.
//This is added just to keep consistency with MSTestv1 behaviour.
if (!hasDeploymentItems)
{
return false;
}

var isDeploymentDone = false;

using (new SuspendCodeCoverage())
Expand All@@ -146,16 +160,17 @@ group test by test.Source into testGroup
return true;
}

internal static IDictionary<string, object> GetDeploymentInformation()
internal static IDictionary<string, object> GetDeploymentInformation(string source)
{
var properties = new Dictionary<string, object>();

var applicationBaseDirectory = string.Empty;

// Run directories can be null in win8.
if (RunDirectories == null)
if (RunDirectories == null && !string.IsNullOrEmpty(source))
{
applicationBaseDirectory = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
// applicationBaseDirectory is set at source level
applicationBaseDirectory = Path.GetDirectoryName(source);
}

properties[TestContextPropertyStrings.TestRunDirectory] = RunDirectories != null
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
// Copyright (c) Microsoft. All rights reserved.

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.Diagnostics;
using System;
using System.IO;

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
/// <summary>
/// Internal implementation of TraceListener exposed to the user.
/// The virtual operations of the TraceListener are implemented here
/// like Close(), Dispose() etc.
/// </summary>
public class TraceListenerWrapper : TextWriterTraceListener, ITraceListener
{
// Summary:
// Initializes a new instance of an object that derives from System.Diagnostics.TextWriterTraceListener
// Class and initializes TextWriterTraceListener object using the specified writer as recipient of the
// tracing or debugging output.
public TraceListenerWrapper(TextWriter textWriter):base(textWriter)
{
}

// Summary:
// Wrapper over Close() of System.Diagnostics.TextWriterTraceListener.Writer
public override void Close()
{
base.Close();
}

// Summary:
// Wrapper over Dispose() of System.Diagnostics.TextWriterTraceListener object
public new void Dispose()
{
base.Dispose();
}

// Summary:
// Gets the text writer of System.Diagnostics.TextWriterTraceListener.Writer
// that receives the tracing or debugging output.
public TextWriter GetWriter()
{
return base.Writer;
}
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
// Copyright (c) Microsoft. All rights reserved.

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
using System;
using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.Diagnostics;
using System.IO;
using System.Globalization;

/// <summary>
/// Internal implementation of TraceListenerManager exposed to the user.
/// Responsible for performing Add(), Remove(), Close(), Dispose() operations on traceListener object.
/// </summary>
public class TraceListenerManager : ITraceListenerManager
{
/// <summary>
/// Original output stream
/// </summary>
private TextWriter origStdOut;

/// <summary>
/// Original error stream
/// </summary>
private TextWriter origStdErr;

/// <summary>
/// Initializes a new instance of a TraceListenerManager object.
/// Also, updates the output/error streams with redirected outputWriter and errorWriter
/// </summary>
public TraceListenerManager(TextWriter outputWriter, TextWriter errorWriter)
{
origStdOut = Console.Out;
origStdErr = Console.Error;

// Update the output/error streams with redirected streams
Console.SetOut(outputWriter);
Console.SetError(errorWriter);
}

/// <summary>
/// Adds the arguement traceListener object to System.Diagnostics.TraceListenerCollection.
/// </summary>
public void Add(ITraceListener traceListener)
{
try
{
Trace.Listeners.Add(traceListener as TextWriterTraceListener);
}
catch (Exception ex)
{
// Catch exceptions if the configuration file is invalid and allow a stack
// trace to show the error on the test method instead of here.
if (!(ex.InnerException is System.Configuration.ConfigurationErrorsException))
{
throw;
}
}
}

/// <summary>
/// Removes the arguement traceListener object from System.Diagnostics.TraceListenerCollection.
/// </summary>
public void Remove(ITraceListener traceListner)
{
Trace.Listeners.Remove(traceListner as TextWriterTraceListener);
}

/// <summary>
/// Wrapper over Close() of ITraceListener.
/// </summary>
public void Close(ITraceListener traceListener)
{
traceListener.Close();
}

/// <summary>
/// Wrapper over Dispose() of ITraceListener.
/// Also resets the standard output/error streams.
/// </summary>
public void Dispose(ITraceListener traceListener)
{
traceListener.Dispose();
Console.SetOut(origStdOut);
Console.SetError(origStdErr);

}
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,7 +37,7 @@ internal static void SetAppDomainFrameworkVersionBasedOnTestSource(AppDomainSetu
string assemblyVersionString = GetTargetFrameworkVersionString(testSource);
if (GetTargetFrameworkVersionFromVersionString(assemblyVersionString).CompareTo(version45) > 0)
{
PropertyInfo pInfo = typeof(AppDomainSetup).GetProperty(Constants.TargetFrameworkName);
PropertyInfo pInfo = typeof(AppDomainSetup).GetProperty(PlatformServices.Constants.TargetFrameworkName);
if (pInfo != null)
{
pInfo.SetValue(setup, assemblyVersionString, null);
Expand DownExpand Up@@ -121,9 +121,9 @@ internal static string GetTargetFrameworkVersionString(string path)
/// <returns>Framework Version</returns>
internal static Version GetTargetFrameworkVersionFromVersionString(string version)
{
if (version.Length > Constants.DotNetFrameWorkStringPrefix.Length + 1)
if (version.Length > PlatformServices.Constants.DotNetFrameWorkStringPrefix.Length + 1)
{
string versionPart = version.Substring(Constants.DotNetFrameWorkStringPrefix.Length + 1);
string versionPart = version.Substring(PlatformServices.Constants.DotNetFrameWorkStringPrefix.Length + 1);
return new Version(versionPart);
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,5 +16,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestDataSource.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestDeployment.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTestSourceHost.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTraceListener.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Services\CoreTraceListenerManager.cs" />
</ItemGroup>
</Project>
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ public void Load(XmlReader reader)
// if we have to read any thing from runsettings special for this platform service then we have to implement it.
}

public IDictionary<string, object> GetProperties()
public IDictionary<string, object> GetProperties(string source)
{
return new Dictionary<string, object>();
}
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
// Copyright (c) Microsoft. All rights reserved.

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.IO;
using System;

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
/// <summary>
/// Internal implementation of TraceListener exposed to the user.
/// </summary>
/// <remarks>
/// The virtual operations of the TraceListener are implemented here
/// like Close(), Dispose() etc.
/// </remarks>
public class TraceListenerWrapper : ITraceListener
{

/// <summary>
/// Initializes a new instance of an object using the specified writer as recipient of the
/// tracing or debugging output.
/// </summary>
public TraceListenerWrapper(TextWriter textWriter)
{
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Close()
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Dispose()
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public TextWriter GetWriter()
{
return null;
}
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
// Copyright (c) Microsoft. All rights reserved.

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
using System;
using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.IO;

/// <summary>
/// Internal implementation of TraceListenerManager exposed to the user.
/// Responsible for performing Add(), Remove(), Close(), Dispose() operations on traceListener object.
/// </summary>
public class TraceListenerManager : ITraceListenerManager
{
/// <summary>
/// Initializes a new instance of a TraceListenerManager object.
/// </summary>
public TraceListenerManager(TextWriter outputWriter, TextWriter errorWriter)
{
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Add(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Close(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Dispose(ITraceListener traceListener)
{
return;
}

/// <summary>
/// Returning as this feature is not supported in ASP .net and UWP
/// </summary>
public void Remove(ITraceListener traceListner)
{
return;
}
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -73,7 +73,7 @@ private string GetTargetFrameworkStringFromAssembly(Assembly assembly)
if (declaringType != null)
{
string attributeName = declaringType.FullName;
if (string.Equals(attributeName, Constants.TargetFrameworkAttributeFullName, StringComparison.OrdinalIgnoreCase))
if (string.Equals(attributeName, PlatformServices.Constants.TargetFrameworkAttributeFullName, StringComparison.OrdinalIgnoreCase))
{
dotNetVersion = data.ConstructorArguments[0].Value.ToString();
break;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -57,6 +57,8 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RecursiveDirectoryPath.cs" />
<Compile Include="Services\DesktopTestContextImplementation.cs" />
<Compile Include="Services\DesktopTraceListener.cs" />
<Compile Include="Services\DesktopTraceListenerManager.cs" />
<Compile Include="Utilities\AppDomainUtilities.cs" />
<Compile Include="Utilities\AssemblyUtility.cs" />
<Compile Include="Utilities\DeploymentItemUtility.cs" />
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,6 @@ namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using Microsoft.VisualStudio.TestPlatform.ObjectModel;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Navigation;

/// <summary>
/// This service is responsible for any file based operations.
Expand DownExpand Up@@ -46,7 +45,7 @@ public bool DoesFileExist(string assemblyFileName)
public object CreateNavigationSession(string source)
{
var messageFormatOnException =
string.Join("MSTestDiscoverer:DiaSession: Could not create diaSession for source:", source, ". Reason:{1}");
string.Join("MSTestDiscoverer:DiaSession: Could not create diaSession for source:", source, ". Reason:{0}");
return SafeInvoke<DiaSession>(() => new DiaSession(source), messageFormatOnException) as DiaSession;
}

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -59,9 +59,9 @@ public void Load(XmlReader reader)
settings = MSTestAdapterSettings.ToSettings(reader);
}

public IDictionary<string, object> GetProperties()
public IDictionary<string, object> GetProperties(string source)
{
return TestDeployment.GetDeploymentInformation();
return TestDeployment.GetDeploymentInformation(source);
}

public const string SettingsName = "MSTestV2";
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,7 @@ namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;

Expand DownExpand Up@@ -113,16 +114,29 @@ public bool Deploy(IEnumerable<TestCase> tests, IRunContext runContext, IFramewo
{
Debug.Assert(tests != null, "tests");

//Reset runDirectories before doing deployment, so that older values of runDirectories is not picked
//even if test host is kept alive.
RunDirectories = null;

this.adapterSettings = MSTestSettingsProvider.Settings;
bool canDeploy = this.CanDeploy();
var hasDeploymentItems = tests.Any(test => this.deploymentItemUtility.HasDeploymentItems(test));

if (!canDeploy || (canDeploy && !hasDeploymentItems))
// deployment directories should not be created in this case,simply return
if (!canDeploy && hasDeploymentItems)
{
return false;
}

RunDirectories = this.deploymentUtility.CreateDeploymentDirectories(runContext);

//Deployment directories are created but deployment will not happen.
//This is added just to keep consistency with MSTestv1 behaviour.
if (!hasDeploymentItems)
{
return false;
}

var isDeploymentDone = false;

using (new SuspendCodeCoverage())
Expand All@@ -146,16 +160,17 @@ group test by test.Source into testGroup
return true;
}

internal static IDictionary<string, object> GetDeploymentInformation()
internal static IDictionary<string, object> GetDeploymentInformation(string source)
{
var properties = new Dictionary<string, object>();

var applicationBaseDirectory = string.Empty;

// Run directories can be null in win8.
if (RunDirectories == null)
if (RunDirectories == null && !string.IsNullOrEmpty(source))
{
applicationBaseDirectory = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
// applicationBaseDirectory is set at source level
applicationBaseDirectory = Path.GetDirectoryName(source);
}

properties[TestContextPropertyStrings.TestRunDirectory] = RunDirectories != null
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
// Copyright (c) Microsoft. All rights reserved.

using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.Diagnostics;
using System;
using System.IO;

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
/// <summary>
/// Internal implementation of TraceListener exposed to the user.
/// The virtual operations of the TraceListener are implemented here
/// like Close(), Dispose() etc.
/// </summary>
public class TraceListenerWrapper : TextWriterTraceListener, ITraceListener
{
// Summary:
// Initializes a new instance of an object that derives from System.Diagnostics.TextWriterTraceListener
// Class and initializes TextWriterTraceListener object using the specified writer as recipient of the
// tracing or debugging output.
public TraceListenerWrapper(TextWriter textWriter):base(textWriter)
{
}

// Summary:
// Wrapper over Close() of System.Diagnostics.TextWriterTraceListener.Writer
public override void Close()
{
base.Close();
}

// Summary:
// Wrapper over Dispose() of System.Diagnostics.TextWriterTraceListener object
public new void Dispose()
{
base.Dispose();
}

// Summary:
// Gets the text writer of System.Diagnostics.TextWriterTraceListener.Writer
// that receives the tracing or debugging output.
public TextWriter GetWriter()
{
return base.Writer;
}
}
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
// Copyright (c) Microsoft. All rights reserved.

namespace Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices
{
using System;
using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface;
using System.Diagnostics;
using System.IO;
using System.Globalization;

/// <summary>
/// Internal implementation of TraceListenerManager exposed to the user.
/// Responsible for performing Add(), Remove(), Close(), Dispose() operations on traceListener object.
/// </summary>
public class TraceListenerManager : ITraceListenerManager
{
/// <summary>
/// Original output stream
/// </summary>
private TextWriter origStdOut;

/// <summary>
/// Original error stream
/// </summary>
private TextWriter origStdErr;

/// <summary>
/// Initializes a new instance of a TraceListenerManager object.
/// Also, updates the output/error streams with redirected outputWriter and errorWriter
/// </summary>
public TraceListenerManager(TextWriter outputWriter, TextWriter errorWriter)
{
origStdOut = Console.Out;
origStdErr = Console.Error;

// Update the output/error streams with redirected streams
Console.SetOut(outputWriter);
Console.SetError(errorWriter);
}

/// <summary>
/// Adds the arguement traceListener object to System.Diagnostics.TraceListenerCollection.
/// </summary>
public void Add(ITraceListener traceListener)
{
try
{
Trace.Listeners.Add(traceListener as TextWriterTraceListener);
}
catch (Exception ex)
{
// Catch exceptions if the configuration file is invalid and allow a stack
// trace to show the error on the test method instead of here.
if (!(ex.InnerException is System.Configuration.ConfigurationErrorsException))
{
throw;
}
}
}

/// <summary>
/// Removes the arguement traceListener object from System.Diagnostics.TraceListenerCollection.
/// </summary>
public void Remove(ITraceListener traceListner)
{
Trace.Listeners.Remove(traceListner as TextWriterTraceListener);
}

/// <summary>
/// Wrapper over Close() of ITraceListener.
/// </summary>
public void Close(ITraceListener traceListener)
{
traceListener.Close();
}

/// <summary>
/// Wrapper over Dispose() of ITraceListener.
/// Also resets the standard output/error streams.
/// </summary>
public void Dispose(ITraceListener traceListener)
{
traceListener.Dispose();
Console.SetOut(origStdOut);
Console.SetError(origStdErr);

}
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,7 +37,7 @@ internal static void SetAppDomainFrameworkVersionBasedOnTestSource(AppDomainSetu
string assemblyVersionString = GetTargetFrameworkVersionString(testSource);
if (GetTargetFrameworkVersionFromVersionString(assemblyVersionString).CompareTo(version45) > 0)
{
PropertyInfo pInfo = typeof(AppDomainSetup).GetProperty(Constants.TargetFrameworkName);
PropertyInfo pInfo = typeof(AppDomainSetup).GetProperty(PlatformServices.Constants.TargetFrameworkName);
if (pInfo != null)
{
pInfo.SetValue(setup, assemblyVersionString, null);
Expand DownExpand Up@@ -121,9 +121,9 @@ internal static string GetTargetFrameworkVersionString(string path)
/// <returns>Framework Version</returns>
internal static Version GetTargetFrameworkVersionFromVersionString(string version)
{
if (version.Length > Constants.DotNetFrameWorkStringPrefix.Length + 1)
if (version.Length > PlatformServices.Constants.DotNetFrameWorkStringPrefix.Length + 1)
{
string versionPart = version.Substring(Constants.DotNetFrameWorkStringPrefix.Length + 1);
string versionPart = version.Substring(PlatformServices.Constants.DotNetFrameWorkStringPrefix.Length + 1);
return new Version(versionPart);
}

Expand Down
Loading