Skip to content

Commit

Permalink
Merge pull request #27 from JetBrains/issue-26
Browse files Browse the repository at this point in the history
#25 Support test metadata
  • Loading branch information
NikolayPianikov authored Dec 11, 2018
2 parents bea0fea + aff53e5 commit 38a0c69
Show file tree
Hide file tree
Showing 18 changed files with 385 additions and 25 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,4 @@ _ReSharper.Caches
.vs/
*.user
IntegrationTests/global.json
.idea/
2 changes: 1 addition & 1 deletion TeamCity.VSTest.TestLogger.Tests/Helpers/Root.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public ITeamCityWriter OpenCompilationBlock(string compilerName)

public void PublishArtifact(string rules)
{
throw new NotImplementedException();
_lines.Add($"# publish {rules}");
}

public void WriteBuildNumber(string buildNumber)
Expand Down
25 changes: 25 additions & 0 deletions TeamCity.VSTest.TestLogger.Tests/Helpers/Test.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,5 +65,30 @@ public void WriteDuration(TimeSpan duration)
{
_lines.Add($"# test {_testName} duration {duration}");
}

public void WriteImage(string teamCityArtifactUri, string description = "")
{
_lines.Add($"# test {_testName} image {teamCityArtifactUri} as {description}");
}

public void WriteFile(string teamCityArtifactUri, string description = "")
{
_lines.Add($"# test {_testName} artifact {teamCityArtifactUri} as {description}");
}

public void WriteValue(double value, string name)
{
_lines.Add($"# test {_testName} value {value}");
}

public void WriteValue(string value, string name)
{
_lines.Add($"# test {_testName} value \"{value}\"");
}

public void WriteLink(string linkUri, string name)
{
_lines.Add($"# test {_testName} link {linkUri}");
}
}
}
115 changes: 108 additions & 7 deletions TeamCity.VSTest.TestLogger.Tests/MessageHandlerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,13 @@
[SuppressMessage("ReSharper", "ImplicitlyCapturedClosure")]
public class MessageHandlerTests
{
private readonly List<string> _lines = new List<string>();
private readonly IMessageHandler _events;
private readonly Mock<ITestCaseFilter> _testCaseFilter;
private readonly Mock<ISuiteNameProvider> _suiteNameProvider;
private readonly Mock<IOptions> _options;
private readonly Mock<IIdGenerator> _idGenerator;

public MessageHandlerTests()
{
_lines.Clear();
Expand All @@ -24,17 +31,13 @@ public MessageHandlerTests()
_suiteNameProvider = new Mock<ISuiteNameProvider>();
_suiteNameProvider.Setup(i => i.GetSuiteName(It.IsAny<string>(), It.IsAny<string>())).Returns<string, string>((baseDir, source) => source);

var options = new Mock<IOptions>();
_idGenerator = new Mock<IIdGenerator>();
_options = new Mock<IOptions>();

var root = new Root(_lines);
_events = new MessageHandler(root, _testCaseFilter.Object, _suiteNameProvider.Object, options.Object);
_events = new MessageHandler(root, _testCaseFilter.Object, _suiteNameProvider.Object, _idGenerator.Object, _options.Object);
}

private readonly List<string> _lines = new List<string>();
private readonly IMessageHandler _events;
private readonly Mock<ITestCaseFilter> _testCaseFilter;
private readonly Mock<ISuiteNameProvider> _suiteNameProvider;

private static TestResultEventArgs CreateTestResult(
TestOutcome outcome = TestOutcome.Passed,
string fullyQualifiedName = "test1",
Expand Down Expand Up @@ -320,5 +323,103 @@ public void ShouldUseSuiteNameProvider()
_suiteNameProvider.Verify(i => i.GetSuiteName(null, "assembly.dll"), Times.Once);
_suiteNameProvider.Verify(i => i.Reset(), Times.Once);
}

[Theory]
[InlineData("file:///Images/My.jpg", "My image", "# test assembly.dll/test1 message Attachment \"My image\": \"file:///Images/My.jpg\"")]
[InlineData("file:///Images/My.txt", "My file", "# test assembly.dll/test1 message Attachment \"My file\": \"file:///Images/My.txt\"")]
public void ShouldNotPublishAttachedFilesAsTestMetadataWhenNotAllowExperimental(string uri, string description, string expectedMessage)
{
// Given
var testResult = CreateTestResult();
var attachmentSet = new AttachmentSet(new Uri("file:///abc"), "attachments");
attachmentSet.Attachments.Add(new UriDataAttachment(new Uri(uri), description));
testResult.Result.Attachments.Add(attachmentSet);

// When
_options.SetupGet(i => i.AllowExperimental).Returns(false);
_events.OnTestResult(testResult);
_events.OnTestRunComplete();

// Then
_lines.ShouldBe(new[]
{
"+ root"
, "+ suite assembly.dll"
, "+ test assembly.dll/test1"
, "# test assembly.dll/test1 duration 00:00:01"
, expectedMessage
, "- test assembly.dll/test1"
, "- suite assembly.dll"
, "- root"
});
}

[Theory]
[InlineData("file:///Images/My.jpg", "My image", "# test assembly.dll/test1 message Attachment \"My image\": \"file:///Images/My.jpg\"")]
[InlineData("file:///Images/My.txt", "My file", "# test assembly.dll/test1 message Attachment \"My file\": \"file:///Images/My.txt\"")]
public void ShouldNotPublishAttachedFilesAsTestMetadataWhenTeamCityVersionIsLessThen2018_2(string uri, string description, string expectedMessage)
{
// Given
var testResult = CreateTestResult();
var attachmentSet = new AttachmentSet(new Uri("file:///abc"), "attachments");
attachmentSet.Attachments.Add(new UriDataAttachment(new Uri(uri), description));
testResult.Result.Attachments.Add(attachmentSet);

// When
_options.SetupGet(i => i.AllowExperimental).Returns(true);
_options.SetupGet(i => i.TestMetadataSupportVersion).Returns(new TeamCityVersion("2018.2"));
_options.SetupGet(i => i.Version).Returns(new TeamCityVersion("2018.1"));
_events.OnTestResult(testResult);
_events.OnTestRunComplete();

// Then
_lines.ShouldBe(new[]
{
"+ root"
, "+ suite assembly.dll"
, "+ test assembly.dll/test1"
, "# test assembly.dll/test1 duration 00:00:01"
, expectedMessage
, "- test assembly.dll/test1"
, "- suite assembly.dll"
, "- root"
});
}

[Theory]
[InlineData("file:///Images/My.jpg", "My image", "# publish /Images/My.jpg => .teamcity/VSTest/test1/id", "# test assembly.dll/test1 image .teamcity/VSTest/test1/id/My.jpg as My image")]
[InlineData("file:///Data/My.txt", "My data", "# publish /Data/My.txt => .teamcity/VSTest/test1/id", "# test assembly.dll/test1 artifact .teamcity/VSTest/test1/id/My.txt as My data")]
[InlineData("file:///Images/My.jpg", "/Images/My.jpg", "# publish /Images/My.jpg => .teamcity/VSTest/test1/id", "# test assembly.dll/test1 image .teamcity/VSTest/test1/id/My.jpg as ")]
[InlineData("file:///c:/Images/My.jpg", "c:\\Images\\My.jpg", "# publish c:\\Images\\My.jpg => .teamcity/VSTest/test1/id", "# test assembly.dll/test1 image .teamcity/VSTest/test1/id/My.jpg as ")]
public void ShouldPublishAttachedFilesAsTestMetadataWhenAllowsExperimental(string uri, string description, string expectedPublishMessage, string expectedMetadataMessage)
{
// Given
var testResult = CreateTestResult();
var attachmentSet = new AttachmentSet(new Uri("file:///abc"), "attachments");
attachmentSet.Attachments.Add(new UriDataAttachment(new Uri(uri), description));
testResult.Result.Attachments.Add(attachmentSet);
_idGenerator.Setup(i => i.NewId()).Returns("id");

// When
_options.SetupGet(i => i.AllowExperimental).Returns(true);
_options.SetupGet(i => i.TestMetadataSupportVersion).Returns(new TeamCityVersion("2018.2"));
_options.SetupGet(i => i.Version).Returns(new TeamCityVersion("2018.3"));
_events.OnTestResult(testResult);
_events.OnTestRunComplete();

// Then
_lines.ShouldBe(new[]
{
"+ root"
, "+ suite assembly.dll"
, "+ test assembly.dll/test1"
, "# test assembly.dll/test1 duration 00:00:01"
, expectedPublishMessage
, expectedMetadataMessage
, "- test assembly.dll/test1"
, "- suite assembly.dll"
, "- root"
});
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,14 @@

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
<PackageReference Include="Moq" Version="4.10.0" />
<PackageReference Include="Shouldly" Version="3.0.1" />
<PackageReference Include="TeamCity.ServiceMessages" Version="3.0.10" />
<PackageReference Include="xunit" Version="2.3.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
<PackageReference Include="Moq" Version="4.10.1" />
<PackageReference Include="Shouldly" Version="3.0.2" />
<PackageReference Include="TeamCity.ServiceMessages" Version="3.0.11" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
</ItemGroup>

<ItemGroup>
Expand Down
42 changes: 42 additions & 0 deletions TeamCity.VSTest.TestLogger.Tests/TeamCityVersionTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
namespace TeamCity.VSTest.TestLogger.Tests
{
using Shouldly;
using Xunit;

public class TeamCityVersionTest
{
[Theory]
[InlineData("2018.1", "2018.2", -1)]
[InlineData("2018.1", "2018.2 (build SNAPSHOT)", -1)]
[InlineData("2018.2", "2018.2 (build SNAPSHOT)", 0)]
[InlineData("2018.2 (build SNAPSHOT)", "2018.2 (build SNAPSHOT)", 0)]
[InlineData("2018.2 (build SNAPSHOT)", "2018.2 (build SNAPSHOT 2)", 0)]
[InlineData("2018.2 (build SNAPSHOT)", "2018.1", 1)]
[InlineData("", "2018.2 (build SNAPSHOT)", -1)]
[InlineData("2018.2 (build SNAPSHOT)", "", 1)]
[InlineData("2018.2", "2018.2", 0)]
[InlineData("2018.2.1", "2018.2", 0)]
[InlineData(null, "2018.2", -1)]
[InlineData("", "", 0)]
[InlineData(null, "", 0)]
[InlineData(null, null, 0)]
[InlineData("", "abc", 0)]
[InlineData(".32323", "abc", 0)]
[InlineData("2018", "2018", 0)]
[InlineData("2018", "2018.1", -1)]
[InlineData("10", "11", -1)]
[InlineData("12", "11", 1)]
public void ShouldCompareTeamCityVersions(string version1, string version2, int expectedCompareResult)
{
// Given
var v1 = new TeamCityVersion(version1);
var v2 = new TeamCityVersion(version2);

// When
var actualCompareResult = v1.CompareTo(v2);

// Then
actualCompareResult.ShouldBe(expectedCompareResult);
}
}
}
9 changes: 8 additions & 1 deletion TeamCity.VSTest.TestLogger/FlowIdGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,13 @@

internal class FlowIdGenerator : IFlowIdGenerator
{
public string NewFlowId() => Guid.NewGuid().ToString().Replace("-", string.Empty);
private readonly IIdGenerator _idGenerator;

public FlowIdGenerator(IIdGenerator idGenerator)
{
_idGenerator = idGenerator ?? throw new ArgumentNullException(nameof(idGenerator));
}

public string NewFlowId() => _idGenerator.NewId();
}
}
7 changes: 7 additions & 0 deletions TeamCity.VSTest.TestLogger/IIdGenerator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace TeamCity.VSTest.TestLogger
{
internal interface IIdGenerator
{
string NewId();
}
}
8 changes: 8 additions & 0 deletions TeamCity.VSTest.TestLogger/IOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,13 @@
internal interface IOptions
{
[CanBeNull] string TestRunDirectory { get; set; }

TeamCityVersion Version { get; }

string RootFlowId { get; }

bool AllowExperimental { get; }

TeamCityVersion TestMetadataSupportVersion { get; }
}
}
10 changes: 10 additions & 0 deletions TeamCity.VSTest.TestLogger/IdGenerator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace TeamCity.VSTest.TestLogger
{
using System;
using System.Linq;

internal class IdGenerator : IIdGenerator
{
public string NewId() => new string(Guid.NewGuid().ToString().Where(c => c != '-').ToArray());
}
}
1 change: 1 addition & 0 deletions TeamCity.VSTest.TestLogger/IoCConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public IEnumerable<IDisposable> Apply(IContainer container)
yield return container.Bind<ITeamCityServiceMessages>().To<TeamCityServiceMessages>();
yield return container.Bind<IServiceMessageFormatter>().To<ServiceMessageFormatter>();
yield return container.Bind<IFlowIdGenerator>().To<FlowIdGenerator>();
yield return container.Bind<IIdGenerator>().To<IdGenerator>();
yield return container.Bind<IServiceMessageUpdater>().To(ctx => new TimestampUpdater(() => DateTime.Now));
yield return container.Bind<ITeamCityWriter>().To(ctx => ctx.Container.Inject<ITeamCityServiceMessages>().CreateWriter(Console.WriteLine));
}
Expand Down
Loading

0 comments on commit 38a0c69

Please sign in to comment.