Skip to content

Commit

Permalink
Replace whilespace with underscore in the name of trx file. (#261)
Browse files Browse the repository at this point in the history
* Replace whilespace with underscore in the name of trx file.
Issue: #244

Validation:
1)Added unit test to cover changes.
2) Manually validated on linux and windows machine

* Address PR comment

* Renamed TestableTrxLogger.
  • Loading branch information
Faizan2304 authored and harshjain2 committed Dec 10, 2016
1 parent 3333ba2 commit 6f42bbc
Show file tree
Hide file tree
Showing 4 changed files with 111 additions and 80 deletions.
39 changes: 27 additions & 12 deletions src/Microsoft.TestPlatform.Extensions.TrxLogger/TrxLogger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -366,20 +366,35 @@ internal void TestRunCompleteHandler(object sender, TestRunCompleteEventArgs e)
if (string.IsNullOrEmpty(trxFileName))
{
// save the xml to file in testResultsFolder
trxFileName = this.GetTrxFileName(TrxFileDirectory, this.testRun.RunConfiguration.RunDeploymentRootDirectory);
// [RunDeploymentRootDirectory] Replace white space with underscore from trx file name to make it command line friendly
trxFileName = this.GetTrxFileName(TrxFileDirectory, this.testRun.RunConfiguration.RunDeploymentRootDirectory.Replace(' ', '_'));
}

try
{
FileStream fs = File.OpenWrite(trxFileName);
rootElement.OwnerDocument.Save(fs);
String resultsFileMessage = String.Format(CultureInfo.CurrentCulture, TrxLoggerResources.TrxLoggerResultsFile, trxFileName);
Console.WriteLine(resultsFileMessage);
}
catch (System.UnauthorizedAccessException fileWriteException)
{
Console.WriteLine(fileWriteException.Message);
}
this.PopulateTrxFile(trxFileName, rootElement);
}
}

/// <summary>
/// populate trx file from the xmlelement
/// </summary>
/// <param name="trxFileName">
/// Trx full path
/// </param>
/// <param name="rootElement">
/// XmlElement.
/// </param>
internal virtual void PopulateTrxFile(string trxFileName, XmlElement rootElement)
{
try
{
FileStream fs = File.OpenWrite(trxFileName);
rootElement.OwnerDocument.Save(fs);
String resultsFileMessage = String.Format(CultureInfo.CurrentCulture, TrxLoggerResources.TrxLoggerResultsFile, trxFileName);
Console.WriteLine(resultsFileMessage);
}
catch (System.UnauthorizedAccessException fileWriteException)
{
Console.WriteLine(fileWriteException.Message);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
<Reference Include="System.Runtime" />
<Reference Include="System" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Service Include="{82a7f48d-3b50-4b1e-b82e-3ada8210c358}" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ namespace Microsoft.TestPlatform.Extensions.TrxLogger.UnitTests
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Xml;

using Microsoft.VisualStudio.TestPlatform.Extensions.TrxLogger;
using Microsoft.VisualStudio.TestTools.UnitTesting;
Expand All @@ -28,15 +30,15 @@ namespace Microsoft.TestPlatform.Extensions.TrxLogger.UnitTests
public class TrxLoggerTests
{
private Mock<TestLoggerEvents> events;
private TrxLogger trxLogger;
private TestableTrxLogger testableTrxLogger;

[TestInitialize]
public void Initialize()
{
this.events = new Mock<TestLoggerEvents>();

this.trxLogger = new TrxLogger();
this.trxLogger.Initialize(this.events.Object, "dummy");
this.testableTrxLogger = new TestableTrxLogger();
this.testableTrxLogger.Initialize(this.events.Object, "dummy");
}

[TestMethod]
Expand All @@ -45,15 +47,15 @@ public void InitializeShouldThrowExceptionIfEventsIsNull()
Assert.ThrowsException<ArgumentNullException>(
() =>
{
this.trxLogger.Initialize(null, "dummy");
this.testableTrxLogger.Initialize(null, "dummy");
});
}

[TestMethod]
public void InitializeShouldNotThrowExceptionIfEventsIsNotNull()
{
var events = new Mock<TestLoggerEvents>();
this.trxLogger.Initialize(events.Object, "dummy");
this.testableTrxLogger.Initialize(events.Object, "dummy");
}

[TestMethod]
Expand All @@ -63,23 +65,23 @@ public void InitializeShouldThrowExceptionIfTestRunDirectoryIsEmptyOrNull()
() =>
{
var events = new Mock<TestLoggerEvents>();
this.trxLogger.Initialize(events.Object, null);
this.testableTrxLogger.Initialize(events.Object, null);
});
}

[TestMethod]
public void InitializeShouldNotThrowExceptionIfTestRunDirectoryIsNeitherEmptyNorNull()
{
var events = new Mock<TestLoggerEvents>();
this.trxLogger.Initialize(events.Object, "dummy");
this.testableTrxLogger.Initialize(events.Object, "dummy");
}

[TestMethod]
public void TestMessageHandlerShouldThrowExceptionIfEventArgsIsNull()
{
Assert.ThrowsException<ArgumentNullException>(() =>
{
this.trxLogger.TestMessageHandler(new object(), default(TestRunMessageEventArgs));
this.testableTrxLogger.TestMessageHandler(new object(), default(TestRunMessageEventArgs));
});
}

Expand All @@ -88,30 +90,30 @@ public void TestMessageHandlerShouldAddMessageWhenItIsInformation()
{
string message = "The information to test";
TestRunMessageEventArgs trme = new TestRunMessageEventArgs(TestMessageLevel.Informational, message);
this.trxLogger.TestMessageHandler(new object(), trme);
this.testableTrxLogger.TestMessageHandler(new object(), trme);

Assert.IsTrue(this.trxLogger.GetRunLevelInformationalMessage().Contains(message));
Assert.IsTrue(this.testableTrxLogger.GetRunLevelInformationalMessage().Contains(message));
}

[TestMethod]
public void TestMessageHandlerShouldAddMessageInListIfItIsWarning()
{
string message = "The information to test";
TestRunMessageEventArgs trme = new TestRunMessageEventArgs(TestMessageLevel.Warning, message);
this.trxLogger.TestMessageHandler(new object(), trme);
this.trxLogger.TestMessageHandler(new object(), trme);
this.testableTrxLogger.TestMessageHandler(new object(), trme);
this.testableTrxLogger.TestMessageHandler(new object(), trme);

Assert.AreEqual(this.trxLogger.GetRunLevelErrorsAndWarnings().Count, 2);
Assert.AreEqual(this.testableTrxLogger.GetRunLevelErrorsAndWarnings().Count, 2);
}

[TestMethod]
public void TestMessageHandlerShouldAddMessageInListIfItIsError()
{
string message = "The information to test";
TestRunMessageEventArgs trme = new TestRunMessageEventArgs(TestMessageLevel.Error, message);
this.trxLogger.TestMessageHandler(new object(), trme);
this.testableTrxLogger.TestMessageHandler(new object(), trme);

Assert.AreEqual(this.trxLogger.GetRunLevelErrorsAndWarnings().Count, 1);
Assert.AreEqual(this.testableTrxLogger.GetRunLevelErrorsAndWarnings().Count, 1);
}

[TestMethod]
Expand All @@ -121,11 +123,11 @@ public void TestResultHandlerShouldCaptureStartTimeInSummaryWithTimeStampDuringI
ObjectModel.TestResult testResult = new ObjectModel.TestResult(testCase);
Mock<TestResultEventArgs> e = new Mock<TestResultEventArgs>(testResult);

trxLogger.TestResultHandler(new object(), e.Object);
this.testableTrxLogger.TestResultHandler(new object(), e.Object);

Assert.AreEqual(this.trxLogger.TestRunStartTime, this.trxLogger.LoggerTestRun.Started);
Assert.AreEqual(this.testableTrxLogger.TestRunStartTime, this.testableTrxLogger.LoggerTestRun.Started);
}

[TestMethod]
public void TestResultHandlerKeepingTheTrackOfPassedAndFailedTests()
{
Expand All @@ -152,14 +154,14 @@ public void TestResultHandlerKeepingTheTrackOfPassedAndFailedTests()
Mock<TestResultEventArgs> skip1 = new Mock<TestResultEventArgs>(skipResult1);


this.trxLogger.TestResultHandler(new object(), pass1.Object);
this.trxLogger.TestResultHandler(new object(), pass2.Object);
this.trxLogger.TestResultHandler(new object(), fail1.Object);
this.trxLogger.TestResultHandler(new object(), skip1.Object);
this.testableTrxLogger.TestResultHandler(new object(), pass1.Object);
this.testableTrxLogger.TestResultHandler(new object(), pass2.Object);
this.testableTrxLogger.TestResultHandler(new object(), fail1.Object);
this.testableTrxLogger.TestResultHandler(new object(), skip1.Object);


Assert.AreEqual(this.trxLogger.PassedTestCount, 2, "Passed Tests");
Assert.AreEqual(this.trxLogger.FailedTestCount, 1, "Failed Tests");
Assert.AreEqual(this.testableTrxLogger.PassedTestCount, 2, "Passed Tests");
Assert.AreEqual(this.testableTrxLogger.FailedTestCount, 1, "Failed Tests");
}

[TestMethod]
Expand Down Expand Up @@ -188,13 +190,13 @@ public void TestResultHandlerKeepingTheTrackOfTotalTests()
Mock<TestResultEventArgs> skip1 = new Mock<TestResultEventArgs>(skipResult1);


this.trxLogger.TestResultHandler(new object(), pass1.Object);
this.trxLogger.TestResultHandler(new object(), pass2.Object);
this.trxLogger.TestResultHandler(new object(), fail1.Object);
this.trxLogger.TestResultHandler(new object(), skip1.Object);
this.testableTrxLogger.TestResultHandler(new object(), pass1.Object);
this.testableTrxLogger.TestResultHandler(new object(), pass2.Object);
this.testableTrxLogger.TestResultHandler(new object(), fail1.Object);
this.testableTrxLogger.TestResultHandler(new object(), skip1.Object);


Assert.AreEqual(this.trxLogger.TotalTestCount, 4, "Passed Tests");
Assert.AreEqual(this.testableTrxLogger.TotalTestCount, 4, "Passed Tests");
}

[TestMethod]
Expand All @@ -207,11 +209,11 @@ public void TestResultHandlerLockingAMessageForSkipTest()

Mock<TestResultEventArgs> skip1 = new Mock<TestResultEventArgs>(skipResult1);

this.trxLogger.TestResultHandler(new object(), skip1.Object);
this.testableTrxLogger.TestResultHandler(new object(), skip1.Object);

string expectedMessage = String.Format(CultureInfo.CurrentCulture, TrxLoggerResources.MessageForSkippedTests, "Skip1");

Assert.AreEqual(String.Compare(this.trxLogger.GetRunLevelInformationalMessage(), expectedMessage, true), 0);
Assert.AreEqual(String.Compare(this.testableTrxLogger.GetRunLevelInformationalMessage(), expectedMessage, true), 0);
}

[TestMethod]
Expand All @@ -229,10 +231,10 @@ public void TestResultHandlerShouldCreateOneTestResultForEachTestCase()
Mock<TestResultEventArgs> resultEventArg1 = new Mock<TestResultEventArgs>(result1);
Mock<TestResultEventArgs> resultEventArg2 = new Mock<TestResultEventArgs>(result2);

this.trxLogger.TestResultHandler(new object(), resultEventArg1.Object);
this.trxLogger.TestResultHandler(new object(), resultEventArg2.Object);
this.testableTrxLogger.TestResultHandler(new object(), resultEventArg1.Object);
this.testableTrxLogger.TestResultHandler(new object(), resultEventArg2.Object);

Assert.AreEqual(this.trxLogger.TestResultCount, 2, "TestResultHandler is not creating test result entry for each test case");
Assert.AreEqual(this.testableTrxLogger.TestResultCount, 2, "TestResultHandler is not creating test result entry for each test case");
}

[TestMethod]
Expand All @@ -250,10 +252,10 @@ public void TestResultHandlerShouldCreateOneTestEntryForEachTestCase()
Mock<TestResultEventArgs> resultEventArg1 = new Mock<TestResultEventArgs>(result1);
Mock<TestResultEventArgs> resultEventArg2 = new Mock<TestResultEventArgs>(result2);

this.trxLogger.TestResultHandler(new object(), resultEventArg1.Object);
this.trxLogger.TestResultHandler(new object(), resultEventArg2.Object);
this.testableTrxLogger.TestResultHandler(new object(), resultEventArg1.Object);
this.testableTrxLogger.TestResultHandler(new object(), resultEventArg2.Object);

Assert.AreEqual(this.trxLogger.TestEntryCount, 2, "TestResultHandler is not creating test result entry for each test case");
Assert.AreEqual(this.testableTrxLogger.TestEntryCount, 2, "TestResultHandler is not creating test result entry for each test case");
}

[TestMethod]
Expand All @@ -270,10 +272,10 @@ public void TestResultHandlerShouldCreateOneUnitTestElementForEachTestCase()
Mock<TestResultEventArgs> resultEventArg1 = new Mock<TestResultEventArgs>(result1);
Mock<TestResultEventArgs> resultEventArg2 = new Mock<TestResultEventArgs>(result2);

this.trxLogger.TestResultHandler(new object(), resultEventArg1.Object);
this.trxLogger.TestResultHandler(new object(), resultEventArg2.Object);
this.testableTrxLogger.TestResultHandler(new object(), resultEventArg1.Object);
this.testableTrxLogger.TestResultHandler(new object(), resultEventArg2.Object);

Assert.AreEqual(this.trxLogger.UnitTestElementCount, 2, "TestResultHandler is not creating test result entry for each test case");
Assert.AreEqual(this.testableTrxLogger.UnitTestElementCount, 2, "TestResultHandler is not creating test result entry for each test case");
}

[TestMethod]
Expand Down Expand Up @@ -301,24 +303,17 @@ public void OutcomeOfRunWillBeFailIfAnyTestsFails()
Mock<TestResultEventArgs> fail1 = new Mock<TestResultEventArgs>(failResult1);
Mock<TestResultEventArgs> skip1 = new Mock<TestResultEventArgs>(skipResult1);

this.trxLogger.TestResultHandler(new object(), pass1.Object);
this.trxLogger.TestResultHandler(new object(), pass2.Object);
this.trxLogger.TestResultHandler(new object(), fail1.Object);
this.trxLogger.TestResultHandler(new object(), skip1.Object);
this.testableTrxLogger.TestResultHandler(new object(), pass1.Object);
this.testableTrxLogger.TestResultHandler(new object(), pass2.Object);
this.testableTrxLogger.TestResultHandler(new object(), fail1.Object);
this.testableTrxLogger.TestResultHandler(new object(), skip1.Object);

var testRunCompleteEventArgs = new TestRunCompleteEventArgs(null, false, false, null, new Collection<AttachmentSet>(), new TimeSpan(1, 0, 0, 0));

try
{
// Intentionally making it null so that it will not create actual trx file
TrxLogger.TrxFileDirectory = null;
this.trxLogger.TestRunCompleteHandler(new object(), testRunCompleteEventArgs);
}
catch (ArgumentNullException)
{
}
TestableTrxLogger.TrxFileDirectory = Directory.GetCurrentDirectory();
this.testableTrxLogger.TestRunCompleteHandler(new object(), testRunCompleteEventArgs);

Assert.AreEqual(TrxLoggerObjectModel.TestOutcome.Failed, this.trxLogger.TestResultOutcome);
Assert.AreEqual(TrxLoggerObjectModel.TestOutcome.Failed, this.testableTrxLogger.TestResultOutcome);
}

[TestMethod]
Expand All @@ -341,23 +336,34 @@ public void OutcomeOfRunWillBeCompletedIfNoTestsFails()
Mock<TestResultEventArgs> pass2 = new Mock<TestResultEventArgs>(passResult2);
Mock<TestResultEventArgs> skip1 = new Mock<TestResultEventArgs>(skipResult1);

this.trxLogger.TestResultHandler(new object(), pass1.Object);
this.trxLogger.TestResultHandler(new object(), pass2.Object);
this.trxLogger.TestResultHandler(new object(), skip1.Object);
this.testableTrxLogger.TestResultHandler(new object(), pass1.Object);
this.testableTrxLogger.TestResultHandler(new object(), pass2.Object);
this.testableTrxLogger.TestResultHandler(new object(), skip1.Object);

var testRunCompleteEventArgs = new TestRunCompleteEventArgs(null, false, false, null, new Collection<AttachmentSet>(), new TimeSpan(1, 0, 0, 0));

try
{
// Intentionally making it null so that it will not create actual trx file
TrxLogger.TrxFileDirectory = null;
this.trxLogger.TestRunCompleteHandler(new object(), testRunCompleteEventArgs);
}
catch (ArgumentNullException)
{
}
TestableTrxLogger.TrxFileDirectory = Directory.GetCurrentDirectory();
this.testableTrxLogger.TestRunCompleteHandler(new object(), testRunCompleteEventArgs);


Assert.AreEqual(TrxLoggerObjectModel.TestOutcome.Completed, this.testableTrxLogger.TestResultOutcome);
}

[TestMethod]
public void TheDefaultTrxFileNameShouldNotHaveWhiteSpace()
{
ObjectModel.TestCase passTestCase = new ObjectModel.TestCase("Pass1", new Uri("some://uri"), "DummySourceFileName");
ObjectModel.TestResult passResult = new ObjectModel.TestResult(passTestCase);
Mock<TestResultEventArgs> pass = new Mock<TestResultEventArgs>(passResult);

this.testableTrxLogger.TestResultHandler(new object(), pass.Object);

var testRunCompleteEventArgs = new TestRunCompleteEventArgs(null, false, false, null, new Collection<AttachmentSet>(), new TimeSpan(1, 0, 0, 0));

TestableTrxLogger.TrxFileDirectory = Directory.GetCurrentDirectory();
this.testableTrxLogger.TestRunCompleteHandler(new object(), testRunCompleteEventArgs);

Assert.AreEqual(TrxLoggerObjectModel.TestOutcome.Completed, this.trxLogger.TestResultOutcome);
bool trxFileName = Path.GetFileName(this.testableTrxLogger.trxFile).Contains(' ');
}

/// <summary>
Expand Down Expand Up @@ -396,7 +402,7 @@ public void GetQToolsTestElementFromTestCaseShouldAssignTestCategoryOfUnitTestEl

object[] expected = new[] { "MethodLevel", "ClassLevel", "AsmLevel" };

CollectionAssert.AreEqual(expected, unitTestElement.TestCategories.ToArray().OrderByDescending(x =>x.ToString()).ToArray());
CollectionAssert.AreEqual(expected, unitTestElement.TestCategories.ToArray().OrderByDescending(x => x.ToString()).ToArray());
}

/// <summary>
Expand All @@ -415,4 +421,13 @@ public void GetQToolsTestElementFromTestCaseShouldNotFailWhenThereIsNoTestCatego
CollectionAssert.AreEqual(expected, unitTestElement.TestCategories.ToArray());
}
}

internal class TestableTrxLogger : TrxLogger
{
public string trxFile;
internal override void PopulateTrxFile(string trxFileName, XmlElement rootElement)
{
this.trxFile = trxFileName;
}
}
}

0 comments on commit 6f42bbc

Please sign in to comment.