diff --git a/src/Microsoft.TestPlatform.Extensions.TrxLogger/TrxLogger.cs b/src/Microsoft.TestPlatform.Extensions.TrxLogger/TrxLogger.cs index e1447038c5..0312340891 100644 --- a/src/Microsoft.TestPlatform.Extensions.TrxLogger/TrxLogger.cs +++ b/src/Microsoft.TestPlatform.Extensions.TrxLogger/TrxLogger.cs @@ -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); + } + } + + /// + /// populate trx file from the xmlelement + /// + /// + /// Trx full path + /// + /// + /// XmlElement. + /// + 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); } } diff --git a/src/Microsoft.TestPlatform.Extensions.TrxLogger/Utility/FilterHelper.cs b/src/Microsoft.TestPlatform.Extensions.TrxLogger/Utility/FileHelper.cs similarity index 100% rename from src/Microsoft.TestPlatform.Extensions.TrxLogger/Utility/FilterHelper.cs rename to src/Microsoft.TestPlatform.Extensions.TrxLogger/Utility/FileHelper.cs diff --git a/test/Microsoft.TestPlatform.Extensions.TrxLogger.UnitTests/Microsoft.TestPlatform.Extensions.TrxLogger.UnitTests.csproj b/test/Microsoft.TestPlatform.Extensions.TrxLogger.UnitTests/Microsoft.TestPlatform.Extensions.TrxLogger.UnitTests.csproj index b37e95ac9f..7d74b09fdc 100644 --- a/test/Microsoft.TestPlatform.Extensions.TrxLogger.UnitTests/Microsoft.TestPlatform.Extensions.TrxLogger.UnitTests.csproj +++ b/test/Microsoft.TestPlatform.Extensions.TrxLogger.UnitTests/Microsoft.TestPlatform.Extensions.TrxLogger.UnitTests.csproj @@ -39,6 +39,7 @@ + diff --git a/test/Microsoft.TestPlatform.Extensions.TrxLogger.UnitTests/TrxLoggerTests.cs b/test/Microsoft.TestPlatform.Extensions.TrxLogger.UnitTests/TrxLoggerTests.cs index 3879355d51..25762f3a0e 100644 --- a/test/Microsoft.TestPlatform.Extensions.TrxLogger.UnitTests/TrxLoggerTests.cs +++ b/test/Microsoft.TestPlatform.Extensions.TrxLogger.UnitTests/TrxLoggerTests.cs @@ -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; @@ -28,15 +30,15 @@ namespace Microsoft.TestPlatform.Extensions.TrxLogger.UnitTests public class TrxLoggerTests { private Mock events; - private TrxLogger trxLogger; + private TestableTrxLogger testableTrxLogger; [TestInitialize] public void Initialize() { this.events = new Mock(); - this.trxLogger = new TrxLogger(); - this.trxLogger.Initialize(this.events.Object, "dummy"); + this.testableTrxLogger = new TestableTrxLogger(); + this.testableTrxLogger.Initialize(this.events.Object, "dummy"); } [TestMethod] @@ -45,7 +47,7 @@ public void InitializeShouldThrowExceptionIfEventsIsNull() Assert.ThrowsException( () => { - this.trxLogger.Initialize(null, "dummy"); + this.testableTrxLogger.Initialize(null, "dummy"); }); } @@ -53,7 +55,7 @@ public void InitializeShouldThrowExceptionIfEventsIsNull() public void InitializeShouldNotThrowExceptionIfEventsIsNotNull() { var events = new Mock(); - this.trxLogger.Initialize(events.Object, "dummy"); + this.testableTrxLogger.Initialize(events.Object, "dummy"); } [TestMethod] @@ -63,7 +65,7 @@ public void InitializeShouldThrowExceptionIfTestRunDirectoryIsEmptyOrNull() () => { var events = new Mock(); - this.trxLogger.Initialize(events.Object, null); + this.testableTrxLogger.Initialize(events.Object, null); }); } @@ -71,7 +73,7 @@ public void InitializeShouldThrowExceptionIfTestRunDirectoryIsEmptyOrNull() public void InitializeShouldNotThrowExceptionIfTestRunDirectoryIsNeitherEmptyNorNull() { var events = new Mock(); - this.trxLogger.Initialize(events.Object, "dummy"); + this.testableTrxLogger.Initialize(events.Object, "dummy"); } [TestMethod] @@ -79,7 +81,7 @@ public void TestMessageHandlerShouldThrowExceptionIfEventArgsIsNull() { Assert.ThrowsException(() => { - this.trxLogger.TestMessageHandler(new object(), default(TestRunMessageEventArgs)); + this.testableTrxLogger.TestMessageHandler(new object(), default(TestRunMessageEventArgs)); }); } @@ -88,9 +90,9 @@ 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] @@ -98,10 +100,10 @@ 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] @@ -109,9 +111,9 @@ 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] @@ -121,11 +123,11 @@ public void TestResultHandlerShouldCaptureStartTimeInSummaryWithTimeStampDuringI ObjectModel.TestResult testResult = new ObjectModel.TestResult(testCase); Mock e = new Mock(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() { @@ -152,14 +154,14 @@ public void TestResultHandlerKeepingTheTrackOfPassedAndFailedTests() Mock skip1 = new Mock(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] @@ -188,13 +190,13 @@ public void TestResultHandlerKeepingTheTrackOfTotalTests() Mock skip1 = new Mock(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] @@ -207,11 +209,11 @@ public void TestResultHandlerLockingAMessageForSkipTest() Mock skip1 = new Mock(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] @@ -229,10 +231,10 @@ public void TestResultHandlerShouldCreateOneTestResultForEachTestCase() Mock resultEventArg1 = new Mock(result1); Mock resultEventArg2 = new Mock(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] @@ -250,10 +252,10 @@ public void TestResultHandlerShouldCreateOneTestEntryForEachTestCase() Mock resultEventArg1 = new Mock(result1); Mock resultEventArg2 = new Mock(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] @@ -270,10 +272,10 @@ public void TestResultHandlerShouldCreateOneUnitTestElementForEachTestCase() Mock resultEventArg1 = new Mock(result1); Mock resultEventArg2 = new Mock(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] @@ -301,24 +303,17 @@ public void OutcomeOfRunWillBeFailIfAnyTestsFails() Mock fail1 = new Mock(failResult1); Mock skip1 = new Mock(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(), 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] @@ -341,23 +336,34 @@ public void OutcomeOfRunWillBeCompletedIfNoTestsFails() Mock pass2 = new Mock(passResult2); Mock skip1 = new Mock(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(), 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 pass = new Mock(passResult); + + this.testableTrxLogger.TestResultHandler(new object(), pass.Object); + + var testRunCompleteEventArgs = new TestRunCompleteEventArgs(null, false, false, null, new Collection(), 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(' '); } /// @@ -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()); } /// @@ -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; + } + } }