From c86e750281480fd960d3b5a47d9df11a4969d3b0 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Mon, 19 Sep 2016 17:01:13 -0500 Subject: [PATCH 1/7] Add OpenCover coverage testing for Windows builds. --- build.cake | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/build.cake b/build.cake index d97d17218c..6192e0f88d 100644 --- a/build.cake +++ b/build.cake @@ -10,6 +10,7 @@ /////////////////////////////////////////////////////////////////////////////// #tool "nuget:?package=xunit.runner.console&version=2.1.0" +#tool "nuget:?package=OpenCover" /////////////////////////////////////////////////////////////////////////////// // USINGS @@ -670,18 +671,35 @@ Task("Run-Unit-Tests") "./tools/xunit.runner.console/tools/xunit.console.x86.exe" : "./tools/xunit.runner.console/tools/xunit.console.exe"; - var settings = new XUnit2Settings + var xUnitSettings = new XUnit2Settings { ToolPath = toolPath, - Parallelism = ParallelismOption.None + Parallelism = ParallelismOption.None, + ShadowCopy = false }; - settings.NoAppDomain = !isRunningOnWindows; + xUnitSettings.NoAppDomain = !isRunningOnWindows; + + var openCoverOutput = artifactsDir.GetFilePath(new FilePath("./result.xml")); + var openCoverSettings = new OpenCoverSettings + { + ArgumentCustomization = openCoverArgs => openCoverArgs.AppendSwitch("-mergeoutput", "") + } + .WithFilter("+[Avalonia.*]* -[*Test*]*");; foreach (var file in unitTests) { Information("Running test " + file.GetFilenameWithoutExtension()); - XUnit2(file.FullPath, settings); + if(isRunningOnWindows) + { + OpenCover(context => { + context.XUnit2(file.FullPath, xUnitSettings); + }, openCoverOutput, openCoverSettings); + } + else + { + XUnit2(file.FullPath, xUnitSettings); + } } }); From 5edb20fdfed4db6f1fff2b5708cb505c60a74d14 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Wed, 21 Sep 2016 11:48:48 -0500 Subject: [PATCH 2/7] Added CodeCov uploading. --- appveyor.yml | 5 +++++ build.cake | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 2909da65b7..db7d129dd1 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -20,6 +20,11 @@ build_script: - ps: .\build.ps1 -Target "AppVeyor" -Platform "$env:platform" -Configuration "$env:configuration" after_build: - .\packages\JetBrains.dotMemoryUnit.2.1.20150828.125449\tools\dotMemoryUnit.exe -targetExecutable="%xunit20%\xunit.console.x86.exe" -returnTargetExitCode --"tests\Avalonia.LeakTests\bin\Release\Avalonia.LeakTests.dll" + +- "SET PATH=C:\\Python34;C:\\Python34\\Scripts;%PATH%" +- pip install codecov +- codecov -f "./artifacts/coverage.xml" + test: off artifacts: - path: artifacts\nuget\*.nupkg diff --git a/build.cake b/build.cake index 6192e0f88d..2e63e83d61 100644 --- a/build.cake +++ b/build.cake @@ -680,7 +680,7 @@ Task("Run-Unit-Tests") xUnitSettings.NoAppDomain = !isRunningOnWindows; - var openCoverOutput = artifactsDir.GetFilePath(new FilePath("./result.xml")); + var openCoverOutput = artifactsDir.GetFilePath(new FilePath("./coverage.xml")); var openCoverSettings = new OpenCoverSettings { ArgumentCustomization = openCoverArgs => openCoverArgs.AppendSwitch("-mergeoutput", "") From b6e062ed8aaff7e6b06db99a71d6bacaaa240819 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Thu, 22 Sep 2016 23:14:23 -0500 Subject: [PATCH 3/7] Add initial Coveralls.io publishing --- build.cake | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/build.cake b/build.cake index 2e63e83d61..0315a36df2 100644 --- a/build.cake +++ b/build.cake @@ -4,6 +4,7 @@ #addin "nuget:?package=Polly&version=4.2.0" #addin "nuget:?package=NuGet.Core&version=2.12.0" +#addin Cake.Coveralls /////////////////////////////////////////////////////////////////////////////// // TOOLS @@ -11,6 +12,7 @@ #tool "nuget:?package=xunit.runner.console&version=2.1.0" #tool "nuget:?package=OpenCover" +#tool coveralls.net /////////////////////////////////////////////////////////////////////////////// // USINGS @@ -800,6 +802,14 @@ Task("Publish-NuGet") Information("Publish-NuGet Task failed, but continuing with next Task..."); }); +Task("Publish-Coverage") + .IsDependentOn("Run-Unit-Tests") + .WithCriteria(() => isRunningOnAppVeyor) + .Does(() => +{ + CoverallsNet(artifactsDir.GetFilePath(new FilePath("./coverage.xml")), CoverallsNetReportType.OpenCover); +}); + /////////////////////////////////////////////////////////////////////////////// // TARGETS /////////////////////////////////////////////////////////////////////////////// @@ -813,7 +823,8 @@ Task("Default") Task("AppVeyor") .IsDependentOn("Zip-Files") .IsDependentOn("Publish-MyGet") - .IsDependentOn("Publish-NuGet"); + .IsDependentOn("Publish-NuGet") + .IsDependentOn("Publish-Coverage"); Task("Travis") .IsDependentOn("Run-Unit-Tests"); From 57750c8cfe726587cc04b4225e074885f8b8accb Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Thu, 22 Sep 2016 23:26:50 -0500 Subject: [PATCH 4/7] Added Coveralls credentials and settings --- build.cake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.cake b/build.cake index 0315a36df2..d735489d5c 100644 --- a/build.cake +++ b/build.cake @@ -807,7 +807,8 @@ Task("Publish-Coverage") .WithCriteria(() => isRunningOnAppVeyor) .Does(() => { - CoverallsNet(artifactsDir.GetFilePath(new FilePath("./coverage.xml")), CoverallsNetReportType.OpenCover); + CoverallsNet(artifactsDir.GetFilePath(new FilePath("./coverage.xml")), CoverallsNetReportType.OpenCover, + new CoverallsNetSettings {RepoToken = "jKaVvndtCVJ2y7pNwQtYeHPn2jAxUpuyh", UseRelativePaths = true, ServiceName = "AppVeyor"}); }); /////////////////////////////////////////////////////////////////////////////// From 22b89ed8971924d9e24a1383fc39fbba1ce341c0 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Sun, 2 Oct 2016 16:14:51 -0500 Subject: [PATCH 5/7] Copy all tests to a test directory under artifacts to prevent collecting coverage for multiple copies of the same assembly in multiple different areas. (Massively shrinks the coverage.xml file). --- build.cake | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/build.cake b/build.cake index d735489d5c..269b17271e 100644 --- a/build.cake +++ b/build.cake @@ -95,6 +95,7 @@ var artifactsDir = (DirectoryPath)Directory("./artifacts"); var nugetRoot = artifactsDir.Combine("nuget"); var zipRoot = artifactsDir.Combine("zip"); var binRoot = artifactsDir.Combine("bin"); +var testsRoot = artifactsDir.Combine("tests"); var dirSuffix = configuration; var dirSuffixSkia = (isPlatformAnyCPU ? "x86" : platform) + "/" + configuration; @@ -588,6 +589,7 @@ Task("Clean") CleanDirectory(nugetRoot); CleanDirectory(zipRoot); CleanDirectory(binRoot); + CleanDirectory(testsRoot); }); Task("Restore-NuGet-Packages") @@ -683,25 +685,25 @@ Task("Run-Unit-Tests") xUnitSettings.NoAppDomain = !isRunningOnWindows; var openCoverOutput = artifactsDir.GetFilePath(new FilePath("./coverage.xml")); - var openCoverSettings = new OpenCoverSettings - { - ArgumentCustomization = openCoverArgs => openCoverArgs.AppendSwitch("-mergeoutput", "") - } - .WithFilter("+[Avalonia.*]* -[*Test*]*");; + var openCoverSettings = new OpenCoverSettings() + .WithFilter("+[Avalonia.*]* -[*Test*]* -[ControlCatalog*]*") + .WithFilter("-[Avalonia.*]OmniXaml.* -[Avalonia.*]Glass.*") + .WithFilter("-[Avalonia.HtmlRenderer]TheArtOfDev.HtmlRenderer.* +[Avalonia.HtmlRenderer]TheArtOfDev.HtmlRenderer.Avalonia.* -[Avalonia.ReactiveUI]*"); + + foreach(var test in unitTests) + { + CopyDirectory(test.GetDirectory(), testsRoot); + } - foreach (var file in unitTests) + if(isRunningOnWindows) { - Information("Running test " + file.GetFilenameWithoutExtension()); - if(isRunningOnWindows) - { - OpenCover(context => { - context.XUnit2(file.FullPath, xUnitSettings); - }, openCoverOutput, openCoverSettings); - } - else - { - XUnit2(file.FullPath, xUnitSettings); - } + OpenCover(context => { + context.XUnit2(unitTests.Select(test => testsRoot.GetFilePath(test).FullPath), xUnitSettings); + }, openCoverOutput, openCoverSettings); + } + else + { + XUnit2(unitTests.Select(test => test.FullPath), xUnitSettings); } }); From 33df423ef531501ca6b92562e59cc92ab8a09f10 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Wed, 2 Nov 2016 15:16:00 -0500 Subject: [PATCH 6/7] Remove Coveralls.io coverage support since we are using CodeCov instead. --- build.cake | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/build.cake b/build.cake index 269b17271e..82fa0b83f3 100644 --- a/build.cake +++ b/build.cake @@ -4,7 +4,6 @@ #addin "nuget:?package=Polly&version=4.2.0" #addin "nuget:?package=NuGet.Core&version=2.12.0" -#addin Cake.Coveralls /////////////////////////////////////////////////////////////////////////////// // TOOLS @@ -12,7 +11,6 @@ #tool "nuget:?package=xunit.runner.console&version=2.1.0" #tool "nuget:?package=OpenCover" -#tool coveralls.net /////////////////////////////////////////////////////////////////////////////// // USINGS @@ -804,15 +802,6 @@ Task("Publish-NuGet") Information("Publish-NuGet Task failed, but continuing with next Task..."); }); -Task("Publish-Coverage") - .IsDependentOn("Run-Unit-Tests") - .WithCriteria(() => isRunningOnAppVeyor) - .Does(() => -{ - CoverallsNet(artifactsDir.GetFilePath(new FilePath("./coverage.xml")), CoverallsNetReportType.OpenCover, - new CoverallsNetSettings {RepoToken = "jKaVvndtCVJ2y7pNwQtYeHPn2jAxUpuyh", UseRelativePaths = true, ServiceName = "AppVeyor"}); -}); - /////////////////////////////////////////////////////////////////////////////// // TARGETS /////////////////////////////////////////////////////////////////////////////// @@ -826,8 +815,7 @@ Task("Default") Task("AppVeyor") .IsDependentOn("Zip-Files") .IsDependentOn("Publish-MyGet") - .IsDependentOn("Publish-NuGet") - .IsDependentOn("Publish-Coverage"); + .IsDependentOn("Publish-NuGet"); Task("Travis") .IsDependentOn("Run-Unit-Tests"); From 26e60f9935511fbd46db63a92e746d504d59248d Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Wed, 2 Nov 2016 15:35:39 -0500 Subject: [PATCH 7/7] Moved failing test into LeakTests because it depends on runtime implementation details to pass. --- .../Avalonia.LeakTests.csproj | 1 + .../Avalonia.LeakTests/MemberSelectorTests.cs | 47 +++++++++++++++++++ .../Templates/MemberSelectorTests.cs | 26 ---------- 3 files changed, 48 insertions(+), 26 deletions(-) create mode 100644 tests/Avalonia.LeakTests/MemberSelectorTests.cs diff --git a/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj b/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj index 9aef304beb..7fed908927 100644 --- a/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj +++ b/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj @@ -99,6 +99,7 @@ + diff --git a/tests/Avalonia.LeakTests/MemberSelectorTests.cs b/tests/Avalonia.LeakTests/MemberSelectorTests.cs new file mode 100644 index 0000000000..d794e788fd --- /dev/null +++ b/tests/Avalonia.LeakTests/MemberSelectorTests.cs @@ -0,0 +1,47 @@ +using Avalonia.Markup.Xaml.Templates; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace Avalonia.LeakTests +{ + public class MemberSelectorTests + { + [Fact] + public void Should_Not_Hold_Reference_To_Object() + { + WeakReference dataRef = null; + + var selector = new MemberSelector() { MemberName = "Child.StringValue" }; + + Action run = () => + { + var data = new Item() + { + Child = new Item() { StringValue = "Value1" } + }; + + Assert.Same("Value1", selector.Select(data)); + + dataRef = new WeakReference(data); + }; + + run(); + + GC.Collect(); + + Assert.False(dataRef.IsAlive); + } + + private class Item + { + public Item Child { get; set; } + public int IntValue { get; set; } + + public string StringValue { get; set; } + } + } +} diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Templates/MemberSelectorTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Templates/MemberSelectorTests.cs index 7082863c0d..49a88e8fae 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Templates/MemberSelectorTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Templates/MemberSelectorTests.cs @@ -9,32 +9,6 @@ namespace Avalonia.Markup.Xaml.UnitTests.Templates { public class MemberSelectorTests { - [Fact] - public void Should_Not_Hold_Reference_To_Object() - { - WeakReference dataRef = null; - - var selector = new MemberSelector() { MemberName = "Child.StringValue" }; - - Action run = () => - { - var data = new Item() - { - Child = new Item() { StringValue = "Value1" } - }; - - Assert.Same("Value1", selector.Select(data)); - - dataRef = new WeakReference(data); - }; - - run(); - - GC.Collect(); - - Assert.False(dataRef.IsAlive); - } - [Fact] public void Should_Select_Child_Property_Value() {