diff --git a/build.cake b/build.cake
index faa41f7d..eddaffc0 100644
--- a/build.cake
+++ b/build.cake
@@ -1,6 +1,10 @@
#tool "nuget:?package=GitVersion.CommandLine"
#tool "nuget:?package=GitReleaseNotes"
#addin "nuget:?package=Cake.Json"
+#tool "nuget:?package=OpenCover"
+#tool "nuget:?package=ReportGenerator"
+#tool coveralls.net
+#addin Cake.Coveralls
// compile
var compileConfig = Argument("configuration", "Release");
@@ -12,6 +16,9 @@ var artifactsDir = Directory("artifacts");
// unit testing
var artifactsForUnitTestsDir = artifactsDir + Directory("UnitTests");
var unitTestAssemblies = @"./test/Ocelot.UnitTests/Ocelot.UnitTests.csproj";
+var minCodeCoverage = 75d;
+var coverallsRepoToken = "coveralls-repo-token-ocelot";
+var coverallsRepo = "https://coveralls.io/github/TomPallister/Ocelot";
// acceptance testing
var artifactsForAcceptanceTestsDir = artifactsDir + Directory("AcceptanceTests");
@@ -118,13 +125,70 @@ Task("RunUnitTests")
.IsDependentOn("Compile")
.Does(() =>
{
- var settings = new DotNetCoreTestSettings
+ if (IsRunningOnWindows())
{
- Configuration = compileConfig,
- };
+ var coverageSummaryFile = artifactsForUnitTestsDir + File("coverage.xml");
+
+ EnsureDirectoryExists(artifactsForUnitTestsDir);
+
+ OpenCover(tool =>
+ {
+ tool.DotNetCoreTest(unitTestAssemblies);
+ },
+ new FilePath(coverageSummaryFile),
+ new OpenCoverSettings()
+ {
+ Register="user",
+ ArgumentCustomization=args=>args.Append(@"-oldstyle -returntargetcode")
+ }
+ .WithFilter("+[Ocelot*]*")
+ .WithFilter("-[xunit*]*")
+ .WithFilter("-[Ocelot*Tests]*")
+ );
+
+ ReportGenerator(coverageSummaryFile, artifactsForUnitTestsDir);
+
+ if (AppVeyor.IsRunningOnAppVeyor)
+ {
+ var repoToken = EnvironmentVariable(coverallsRepoToken);
+ if (string.IsNullOrEmpty(repoToken))
+ {
+ throw new Exception(string.Format("Coveralls repo token not found. Set environment variable '{0}'", coverallsRepoToken));
+ }
- EnsureDirectoryExists(artifactsForUnitTestsDir);
- DotNetCoreTest(unitTestAssemblies, settings);
+ Information(string.Format("Uploading test coverage to {0}", coverallsRepo));
+ CoverallsNet(coverageSummaryFile, CoverallsNetReportType.OpenCover, new CoverallsNetSettings()
+ {
+ RepoToken = repoToken
+ });
+ }
+ else
+ {
+ Information("We are not running on the build server so we won't publish the coverage report to coveralls.io");
+ }
+
+ var sequenceCoverage = XmlPeek(coverageSummaryFile, "//CoverageSession/Summary/@sequenceCoverage");
+ var branchCoverage = XmlPeek(coverageSummaryFile, "//CoverageSession/Summary/@branchCoverage");
+
+ Information("Sequence Coverage: " + sequenceCoverage);
+
+ if(double.Parse(sequenceCoverage) < minCodeCoverage)
+ {
+ var whereToCheck = !AppVeyor.IsRunningOnAppVeyor ? coverallsRepo : artifactsForUnitTestsDir;
+ throw new Exception(string.Format("Code coverage fell below the threshold of {0}%. You can find the code coverage report at {1}", minCodeCoverage, whereToCheck));
+ };
+
+ }
+ else
+ {
+ var settings = new DotNetCoreTestSettings
+ {
+ Configuration = compileConfig,
+ };
+
+ EnsureDirectoryExists(artifactsForUnitTestsDir);
+ DotNetCoreTest(unitTestAssemblies, settings);
+ }
});
Task("RunAcceptanceTests")
diff --git a/src/Ocelot/Ocelot.csproj b/src/Ocelot/Ocelot.csproj
index 8fdb917d..d993290e 100644
--- a/src/Ocelot/Ocelot.csproj
+++ b/src/Ocelot/Ocelot.csproj
@@ -20,6 +20,11 @@
Tom Pallister
+
+ full
+ True
+
+
diff --git a/test/Ocelot.AcceptanceTests/Ocelot.AcceptanceTests.csproj b/test/Ocelot.AcceptanceTests/Ocelot.AcceptanceTests.csproj
index 06a30386..4adb231f 100644
--- a/test/Ocelot.AcceptanceTests/Ocelot.AcceptanceTests.csproj
+++ b/test/Ocelot.AcceptanceTests/Ocelot.AcceptanceTests.csproj
@@ -31,7 +31,7 @@
-
+
@@ -51,7 +51,7 @@
-
+
diff --git a/test/Ocelot.IntegrationTests/Ocelot.IntegrationTests.csproj b/test/Ocelot.IntegrationTests/Ocelot.IntegrationTests.csproj
index f2bb5354..18ae6b22 100644
--- a/test/Ocelot.IntegrationTests/Ocelot.IntegrationTests.csproj
+++ b/test/Ocelot.IntegrationTests/Ocelot.IntegrationTests.csproj
@@ -31,7 +31,7 @@
-
+
@@ -42,7 +42,7 @@
-
+
diff --git a/test/Ocelot.UnitTests/Ocelot.UnitTests.csproj b/test/Ocelot.UnitTests/Ocelot.UnitTests.csproj
index d20d9e38..403db47f 100644
--- a/test/Ocelot.UnitTests/Ocelot.UnitTests.csproj
+++ b/test/Ocelot.UnitTests/Ocelot.UnitTests.csproj
@@ -14,6 +14,11 @@
false
+
+ full
+ True
+
+
@@ -24,7 +29,7 @@
-
+
@@ -43,7 +48,7 @@
-
+