Skip to content

Commit 86150ef

Browse files
committed
added tests for WriteVersionInfoToBuild Task
1 parent 550e80d commit 86150ef

File tree

8 files changed

+234
-47
lines changed

8 files changed

+234
-47
lines changed

src/GitVersionTask.MsBuild/TaskLoggingHelper.cs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,7 @@ public class TaskLoggingHelper
2020
/// <param name="taskInstance">task containing an instance of this class</param>
2121
public TaskLoggingHelper(ITask taskInstance)
2222
{
23-
if (taskInstance == null)
24-
{
25-
throw new ArgumentNullException(nameof(taskInstance));
26-
}
27-
_taskInstance = taskInstance;
23+
_taskInstance = taskInstance ?? throw new ArgumentNullException(nameof(taskInstance));
2824
TaskName = taskInstance.GetType().Name;
2925
}
3026

@@ -51,7 +47,7 @@ protected IBuildEngine BuildEngine
5147
{
5248
get
5349
{
54-
// If the task instance does not equal null then use its build engine because
50+
// If the task instance does not equal null then use its build engine because
5551
// the task instances build engine can be changed for example during tests. This changing of the engine on the same task object is not expected to happen
5652
// during normal operation.
5753
if (_taskInstance != null)
@@ -104,7 +100,7 @@ public void LogMessage(MessageImportance importance, string message, params obje
104100
(
105101
message, // message
106102
null, // help keyword
107-
TaskName, // sender
103+
TaskName, // sender
108104
importance, // importance
109105
DateTime.UtcNow, // timestamp
110106
messageArgs // message arguments
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
using NUnit.Framework;
22

3-
[assembly: Parallelizable(ParallelScope.Fixtures)]
3+
[assembly: Parallelizable(ParallelScope.Default)]

src/GitVersionTask.Tests/GetVersionTaskTests.cs

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using GitVersion.OutputVariables;
77
using GitVersionCore.Tests.Helpers;
88
using GitVersionTask.Tests.Helpers;
9+
using LibGit2Sharp;
910
using Microsoft.Build.Framework;
1011
using NUnit.Framework;
1112
using Shouldly;
@@ -31,7 +32,6 @@ public void OutputsShouldMatchVariableProvider()
3132
[Test]
3233
public void GetVersionTaskShouldReturnVersionOutputVariables()
3334
{
34-
ResetEnvironment();
3535
using var fixture = new EmptyRepositoryFixture();
3636
fixture.MakeATaggedCommit("1.2.3");
3737
fixture.MakeACommit();
@@ -41,29 +41,45 @@ public void GetVersionTaskShouldReturnVersionOutputVariables()
4141
SolutionDirectory = fixture.RepositoryPath,
4242
};
4343

44-
var result = MsBuildHelper.Execute(task);
44+
var msbuildFixture = new MsBuildFixture();
45+
var result = msbuildFixture.Execute(task);
4546

4647
result.Success.ShouldBe(true);
4748
result.Errors.ShouldBe(0);
4849
result.Task.FullSemVer.ShouldBe("1.2.4+1");
4950
}
5051

51-
private static void ResetEnvironment()
52+
[Test]
53+
public void GetVersionTaskShouldReturnVersionOutputVariablesForBuildServer()
5254
{
53-
var environmentalVariables = new Dictionary<string, string>
55+
using var fixture = new RemoteRepositoryFixture();
56+
fixture.Repository.MakeACommit();
57+
fixture.Repository.MakeATaggedCommit("1.0.0");
58+
fixture.Repository.MakeACommit();
59+
fixture.Repository.CreateBranch("develop");
60+
61+
Commands.Fetch((Repository)fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Network.Remotes.First().Name, new string[0], new FetchOptions(), null);
62+
Commands.Checkout(fixture.LocalRepositoryFixture.Repository, fixture.Repository.Head.Tip);
63+
fixture.LocalRepositoryFixture.Repository.Branches.Remove("master");
64+
fixture.InitializeRepo();
65+
66+
var task = new GetVersion
5467
{
55-
{ TeamCity.EnvironmentVariableName, null },
56-
{ AppVeyor.EnvironmentVariableName, null },
57-
{ TravisCi.EnvironmentVariableName, null },
58-
{ Jenkins.EnvironmentVariableName, null },
59-
{ AzurePipelines.EnvironmentVariableName, null },
60-
{ GitHubActions.EnvironmentVariableName, null },
68+
SolutionDirectory = fixture.LocalRepositoryFixture.RepositoryPath,
6169
};
6270

63-
foreach (var variable in environmentalVariables)
71+
var env = new Dictionary<string, string>
6472
{
65-
System.Environment.SetEnvironmentVariable(variable.Key, variable.Value);
66-
}
73+
{ AzurePipelines.EnvironmentVariableName, "true" }
74+
};
75+
76+
var msbuildFixture = new MsBuildFixture();
77+
msbuildFixture.WithEnv(env.ToArray());
78+
var result = msbuildFixture.Execute(task);
79+
80+
result.Success.ShouldBe(true);
81+
result.Errors.ShouldBe(0);
82+
result.Task.FullSemVer.ShouldBe("1.0.1+1");
6783
}
6884
}
6985
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
using System;
2+
using GitTools.Testing;
3+
using GitVersion;
4+
using GitVersion.Extensions;
5+
using GitVersionCore.Tests.Helpers;
6+
using Microsoft.Extensions.DependencyInjection;
7+
using Microsoft.Extensions.Options;
8+
9+
namespace GitVersionTask.Tests.Helpers
10+
{
11+
public static class GitToolsTestingExtensions
12+
{
13+
/// <summary>
14+
/// Simulates running on build server
15+
/// </summary>
16+
public static void InitializeRepo(this RemoteRepositoryFixture fixture)
17+
{
18+
var arguments = new Arguments
19+
{
20+
Authentication = new AuthenticationInfo(),
21+
TargetPath = fixture.LocalRepositoryFixture.RepositoryPath
22+
};
23+
var options = Options.Create(arguments);
24+
25+
var serviceProvider = ConfigureServices(services =>
26+
{
27+
services.AddSingleton(options);
28+
});
29+
30+
var gitPreparer = serviceProvider.GetService<IGitPreparer>() as GitPreparer;
31+
gitPreparer?.PrepareInternal(true, null);
32+
}
33+
34+
private static IServiceProvider ConfigureServices(Action<IServiceCollection> servicesOverrides = null)
35+
{
36+
var services = new ServiceCollection()
37+
.AddModule(new GitVersionCoreTestModule());
38+
39+
servicesOverrides?.Invoke(services);
40+
return services.BuildServiceProvider();
41+
}
42+
}
43+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using GitVersion.BuildServers;
5+
using Microsoft.Build.Framework;
6+
7+
namespace GitVersionTask.Tests.Helpers
8+
{
9+
public class MsBuildFixture
10+
{
11+
private KeyValuePair<string, string>[] environmentVariables;
12+
13+
public void WithEnv(params KeyValuePair<string, string>[] envs)
14+
{
15+
environmentVariables = envs;
16+
}
17+
18+
public MsBuildExecutionResult<T> Execute<T>(T task) where T : ITask
19+
{
20+
return UsingEnv(() =>
21+
{
22+
var buildEngine = new MockEngine();
23+
24+
task.BuildEngine = buildEngine;
25+
26+
var result = task.Execute();
27+
28+
return new MsBuildExecutionResult<T>
29+
{
30+
Success = result,
31+
Task = task,
32+
Errors = buildEngine.Errors,
33+
Warnings = buildEngine.Warnings,
34+
Messages = buildEngine.Messages,
35+
Log = buildEngine.Log,
36+
};
37+
});
38+
}
39+
40+
private T UsingEnv<T>(Func<T> func)
41+
{
42+
ResetEnvironment();
43+
SetEnvironmentVariables(environmentVariables);
44+
45+
try
46+
{
47+
return func();
48+
}
49+
finally
50+
{
51+
ResetEnvironment();
52+
}
53+
}
54+
55+
private static void ResetEnvironment()
56+
{
57+
var environmentalVariables = new Dictionary<string, string>
58+
{
59+
{ TeamCity.EnvironmentVariableName, null },
60+
{ AppVeyor.EnvironmentVariableName, null },
61+
{ TravisCi.EnvironmentVariableName, null },
62+
{ Jenkins.EnvironmentVariableName, null },
63+
{ AzurePipelines.EnvironmentVariableName, null },
64+
{ GitHubActions.EnvironmentVariableName, null },
65+
};
66+
67+
SetEnvironmentVariables(environmentalVariables.ToArray());
68+
}
69+
70+
private static void SetEnvironmentVariables(KeyValuePair<string, string>[] envs)
71+
{
72+
if (envs == null) return;
73+
foreach (var env in envs)
74+
{
75+
Environment.SetEnvironmentVariable(env.Key, env.Value);
76+
}
77+
}
78+
}
79+
}

src/GitVersionTask.Tests/Helpers/MsBuildHelper.cs

Lines changed: 0 additions & 26 deletions
This file was deleted.
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using GitTools.Testing;
4+
using GitVersion.BuildServers;
5+
using GitVersion.MSBuildTask.Tasks;
6+
using GitVersionCore.Tests.Helpers;
7+
using GitVersionTask.Tests.Helpers;
8+
using LibGit2Sharp;
9+
using NUnit.Framework;
10+
using Shouldly;
11+
12+
namespace GitVersion.MSBuildTask.Tests
13+
{
14+
[TestFixture]
15+
public class WriteVersionInfoTest : TestBase
16+
{
17+
[Test]
18+
public void WriteVersionInfoTaskShouldNotLogOutputVariablesToBuildOutputIfNotRunningInBuildServer()
19+
{
20+
using var fixture = new EmptyRepositoryFixture();
21+
fixture.MakeATaggedCommit("1.2.3");
22+
fixture.MakeACommit();
23+
24+
var task = new WriteVersionInfoToBuildLog
25+
{
26+
SolutionDirectory = fixture.RepositoryPath,
27+
};
28+
29+
var msbuildFixture = new MsBuildFixture();
30+
var result = msbuildFixture.Execute(task);
31+
32+
result.Success.ShouldBe(true);
33+
result.Errors.ShouldBe(0);
34+
result.Log.ShouldNotContain("##vso[task.setvariable variable=GitVersion.FullSemVer]");
35+
}
36+
37+
[Test]
38+
public void WriteVersionInfoTaskShouldLogOutputVariablesToBuildOutput()
39+
{
40+
using var fixture = new RemoteRepositoryFixture();
41+
fixture.Repository.MakeACommit();
42+
fixture.Repository.MakeATaggedCommit("1.0.0");
43+
fixture.Repository.MakeACommit();
44+
fixture.Repository.CreateBranch("develop");
45+
46+
Commands.Fetch((Repository)fixture.LocalRepositoryFixture.Repository, fixture.LocalRepositoryFixture.Repository.Network.Remotes.First().Name, new string[0], new FetchOptions(), null);
47+
Commands.Checkout(fixture.LocalRepositoryFixture.Repository, fixture.Repository.Head.Tip);
48+
fixture.LocalRepositoryFixture.Repository.Branches.Remove("master");
49+
fixture.InitializeRepo();
50+
51+
var task = new WriteVersionInfoToBuildLog
52+
{
53+
SolutionDirectory = fixture.LocalRepositoryFixture.RepositoryPath,
54+
};
55+
56+
var env = new Dictionary<string, string>
57+
{
58+
{ AzurePipelines.EnvironmentVariableName, "true" }
59+
};
60+
61+
var msbuildFixture = new MsBuildFixture();
62+
msbuildFixture.WithEnv(env.ToArray());
63+
var result = msbuildFixture.Execute(task);
64+
65+
result.Success.ShouldBe(true);
66+
result.Errors.ShouldBe(0);
67+
68+
result.Log.ShouldContain("##vso[task.setvariable variable=GitVersion.FullSemVer]1.0.1+1");
69+
}
70+
}
71+
}

src/GitVersionTask/GitVersionTasks.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using GitVersion.Extensions;
33
using GitVersion.Logging;
4+
using GitVersion.Model;
45
using GitVersion.MSBuildTask.Tasks;
56
using Microsoft.Extensions.DependencyInjection;
67
using Microsoft.Extensions.Options;
@@ -50,6 +51,11 @@ private static void Configure(IServiceProvider sp, GitVersionTaskBase task)
5051

5152
log.AddLogAppender(new MsBuildAppender(task.Log));
5253
var buildServer = buildServerResolver.Resolve();
54+
55+
if (buildServer != null)
56+
{
57+
arguments.Output.Add(OutputType.BuildServer);
58+
}
5359
arguments.NoFetch = arguments.NoFetch || buildServer != null && buildServer.PreventFetch();
5460
}
5561

@@ -65,6 +71,8 @@ private static IServiceProvider BuildServiceProvider(GitVersionTaskBase task)
6571
NoNormalize = task.NoNormalize
6672
};
6773

74+
arguments.Output.Add(OutputType.BuildServer);
75+
6876
services.AddSingleton(Options.Create(arguments));
6977
services.AddSingleton<IGitVersionTaskExecutor, GitVersionTaskExecutor>();
7078
services.AddModule(new GitVersionCoreModule());

0 commit comments

Comments
 (0)