From e0f1512f1b98463e1ec8d2ec94ca1619a647ec6f Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 4 Aug 2016 23:14:50 +0200 Subject: [PATCH 1/9] Try passing -parallel none option to xunit. --- .travis.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 69bbab471b..9ba37a8625 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,12 +14,12 @@ install: - mono .nuget/nuget.exe install xunit.runner.console -Version 2.1.0 -OutputDirectory testrunner script: - xbuild /p:Configuration=Release Avalonia.travis-mono.sln - - mono ./testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe ./tests/Avalonia.Base.UnitTests/bin/Release/Avalonia.Base.UnitTests.dll - - mono ./testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe ./tests/Avalonia.Input.UnitTests/bin/Release/Avalonia.Input.UnitTests.dll - - mono ./testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe ./tests/Avalonia.Interactivity.UnitTests/bin/Release/Avalonia.Interactivity.UnitTests.dll - - mono ./testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe ./tests/Avalonia.Layout.UnitTests/bin/Release/Avalonia.Layout.UnitTests.dll - - mono ./testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe ./tests/Avalonia.Markup.UnitTests/bin/Release/Avalonia.Markup.UnitTests.dll - - mono ./testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe ./tests/Avalonia.Styling.UnitTests/bin/Release/Avalonia.Styling.UnitTests.dll + - mono ./testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe ./tests/Avalonia.Base.UnitTests/bin/Release/Avalonia.Base.UnitTests.dll -parallel none + - mono ./testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe ./tests/Avalonia.Input.UnitTests/bin/Release/Avalonia.Input.UnitTests.dll -parallel none + - mono ./testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe ./tests/Avalonia.Interactivity.UnitTests/bin/Release/Avalonia.Interactivity.UnitTests.dll -parallel none + - mono ./testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe ./tests/Avalonia.Layout.UnitTests/bin/Release/Avalonia.Layout.UnitTests.dll -parallel none + - mono ./testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe ./tests/Avalonia.Markup.UnitTests/bin/Release/Avalonia.Markup.UnitTests.dll -parallel none + - mono ./testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe ./tests/Avalonia.Styling.UnitTests/bin/Release/Avalonia.Styling.UnitTests.dll -parallel none notifications: email: false webhooks: From 018e70cac5fc66cce0bd19c01586fae4e5236618 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 4 Aug 2016 23:53:14 +0200 Subject: [PATCH 2/9] Added bash script for running tests. --- .travis.yml | 7 +------ tests/run-tests.sh | 9 +++++++++ 2 files changed, 10 insertions(+), 6 deletions(-) create mode 100755 tests/run-tests.sh diff --git a/.travis.yml b/.travis.yml index 9ba37a8625..7b5af500cf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,12 +14,7 @@ install: - mono .nuget/nuget.exe install xunit.runner.console -Version 2.1.0 -OutputDirectory testrunner script: - xbuild /p:Configuration=Release Avalonia.travis-mono.sln - - mono ./testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe ./tests/Avalonia.Base.UnitTests/bin/Release/Avalonia.Base.UnitTests.dll -parallel none - - mono ./testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe ./tests/Avalonia.Input.UnitTests/bin/Release/Avalonia.Input.UnitTests.dll -parallel none - - mono ./testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe ./tests/Avalonia.Interactivity.UnitTests/bin/Release/Avalonia.Interactivity.UnitTests.dll -parallel none - - mono ./testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe ./tests/Avalonia.Layout.UnitTests/bin/Release/Avalonia.Layout.UnitTests.dll -parallel none - - mono ./testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe ./tests/Avalonia.Markup.UnitTests/bin/Release/Avalonia.Markup.UnitTests.dll -parallel none - - mono ./testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe ./tests/Avalonia.Styling.UnitTests/bin/Release/Avalonia.Styling.UnitTests.dll -parallel none + - ./tests/run-tests.sh notifications: email: false webhooks: diff --git a/tests/run-tests.sh b/tests/run-tests.sh new file mode 100755 index 0000000000..5d10445ec1 --- /dev/null +++ b/tests/run-tests.sh @@ -0,0 +1,9 @@ +# !/bin/bash + +cd "$(dirname "$0")" + +tests=(Avalonia.*.UnitTests/) + +for test in "${tests[@]}"; do + mono ../testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe ${test}bin/Release/${test%/}.dll -parallel none +done From bc16abc257e0516022aa151b6f1b5fed6e8ca2ac Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 5 Aug 2016 00:20:50 +0200 Subject: [PATCH 3/9] Set return value from run-tests.sh script. --- tests/run-tests.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/run-tests.sh b/tests/run-tests.sh index 5d10445ec1..fb5171097c 100755 --- a/tests/run-tests.sh +++ b/tests/run-tests.sh @@ -3,7 +3,12 @@ cd "$(dirname "$0")" tests=(Avalonia.*.UnitTests/) +result=0 for test in "${tests[@]}"; do mono ../testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe ${test}bin/Release/${test%/}.dll -parallel none + + if [ $? -ne 0 ]; then result=1 ; fi done + +exit $result From 3bee859be6f35125bcd30d996b0a3c2c42d3b700 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 5 Aug 2016 00:53:35 +0200 Subject: [PATCH 4/9] Excluded D2D test from bash test runner. --- tests/run-tests.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/run-tests.sh b/tests/run-tests.sh index fb5171097c..03e8c61137 100755 --- a/tests/run-tests.sh +++ b/tests/run-tests.sh @@ -3,9 +3,15 @@ cd "$(dirname "$0")" tests=(Avalonia.*.UnitTests/) +exclude=("*Direct2D*/") result=0 -for test in "${tests[@]}"; do +for del in ${exclude[@]}; do + tests=(${tests[@]/$del}) +done + +for test in ${tests[@]}; do + echo Running test $test mono ../testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe ${test}bin/Release/${test%/}.dll -parallel none if [ $? -ne 0 ]; then result=1 ; fi From 238f4ca9fad57c77128d82272298af793546e04e Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 5 Aug 2016 01:32:12 +0200 Subject: [PATCH 5/9] Run leak tests. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 7b5af500cf..bd09d26bf7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,6 +15,7 @@ install: script: - xbuild /p:Configuration=Release Avalonia.travis-mono.sln - ./tests/run-tests.sh + - mono ./packages/JetBrains.dotMemoryUnit.2.1.20150828.125449/tools/dotMemoryUnit.exe -targetExecutable="./testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe" -returnTargetExitCode --"tests/Avalonia.LeakTests/bin/Release/Avalonia.LeakTests.dll" notifications: email: false webhooks: From 55b553f5be7c41015893673903b363d1838d9152 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 5 Aug 2016 01:48:58 +0200 Subject: [PATCH 6/9] Revert "Run leak tests." This reverts commit 238f4ca9fad57c77128d82272298af793546e04e. --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index bd09d26bf7..7b5af500cf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,7 +15,6 @@ install: script: - xbuild /p:Configuration=Release Avalonia.travis-mono.sln - ./tests/run-tests.sh - - mono ./packages/JetBrains.dotMemoryUnit.2.1.20150828.125449/tools/dotMemoryUnit.exe -targetExecutable="./testrunner/xunit.runner.console.2.1.0/tools/xunit.console.exe" -returnTargetExitCode --"tests/Avalonia.LeakTests/bin/Release/Avalonia.LeakTests.dll" notifications: email: false webhooks: From 173352d109ccdf66e6f07df25f297b6d01d6a56f Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 5 Aug 2016 01:58:23 +0200 Subject: [PATCH 7/9] Moved AvaloniaObject leak tests. From Avalonia.Base.UnitTests to Avalonia.LeakTests - the test was failing on mono on OSX and I can't work out why. Leak tests don't currently get run on mono CI. --- .../AvaloniaObjectTests_Direct.cs | 45 ----------- .../Avalonia.LeakTests.csproj | 14 ++++ .../Avalonia.LeakTests/AvaloniaObjectTests.cs | 77 +++++++++++++++++++ tests/Avalonia.LeakTests/packages.config | 4 + 4 files changed, 95 insertions(+), 45 deletions(-) create mode 100644 tests/Avalonia.LeakTests/AvaloniaObjectTests.cs diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Direct.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Direct.cs index 12d1b7a5f0..1d8bb80cba 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Direct.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Direct.cs @@ -335,44 +335,6 @@ namespace Avalonia.Base.UnitTests Assert.Equal("second", target.Foo); } - [Fact] - public void Binding_To_Direct_Property_Does_Not_Get_Collected() - { - var target = new Class2(); - - Func setupBinding = () => - { - var source = new Subject(); - var sub = target.Bind((AvaloniaProperty)Class1.FooProperty, source); - source.OnNext("foo"); - return new WeakReference(source); - }; - - var weakSource = setupBinding(); - - GC.Collect(); - - Assert.Equal("foo", target.Foo); - Assert.True(weakSource.IsAlive); - } - - [Fact] - public void Binding_To_Direct_Property_Gets_Collected_When_Completed() - { - var target = new Class2(); - var weakSource = SetupDirectBinding(target); - - Action completeSource = () => - { - ((ISubject)weakSource.Target).OnCompleted(); - }; - - completeSource(); - GC.Collect(); - - Assert.False(weakSource.IsAlive); - } - [Fact] public void Property_Notifies_Initialized() { @@ -447,13 +409,6 @@ namespace Avalonia.Base.UnitTests Assert.True(called); } - private WeakReference SetupDirectBinding(Class2 target) - { - var source = new Subject(); - var sub = target.Bind((AvaloniaProperty)Class1.FooProperty, source); - return new WeakReference(source); - } - private class Class1 : AvaloniaObject { public static readonly DirectProperty FooProperty = diff --git a/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj b/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj index 860a4074e3..0e45e0fcdd 100644 --- a/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj +++ b/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj @@ -59,12 +59,25 @@ ..\..\packages\System.Reactive.Interfaces.3.0.0\lib\net45\System.Reactive.Interfaces.dll True + + ..\..\packages\System.Reactive.Linq.3.0.0\lib\net45\System.Reactive.Linq.dll + True + + + ..\..\packages\System.Reactive.PlatformServices.3.0.0\lib\net45\System.Reactive.PlatformServices.dll + True + + + ..\..\packages\System.Reactive.Windows.Threading.3.0.0\lib\net45\System.Reactive.Windows.Threading.dll + True + + ..\..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll True @@ -83,6 +96,7 @@ + diff --git a/tests/Avalonia.LeakTests/AvaloniaObjectTests.cs b/tests/Avalonia.LeakTests/AvaloniaObjectTests.cs new file mode 100644 index 0000000000..2a3bc83294 --- /dev/null +++ b/tests/Avalonia.LeakTests/AvaloniaObjectTests.cs @@ -0,0 +1,77 @@ +using System; +using System.Reactive.Subjects; +using Xunit; + +namespace Avalonia.LeakTests +{ + public class AvaloniaObjectTests + { + [Fact] + public void Binding_To_Direct_Property_Does_Not_Get_Collected() + { + var target = new Class1(); + + Func setupBinding = () => + { + var source = new Subject(); + var sub = target.Bind((AvaloniaProperty)Class1.FooProperty, source); + source.OnNext("foo"); + return new WeakReference(source); + }; + + var weakSource = setupBinding(); + + GC.Collect(); + + Assert.Equal("foo", target.Foo); + Assert.True(weakSource.IsAlive); + } + + [Fact] + public void Binding_To_Direct_Property_Gets_Collected_When_Completed() + { + var target = new Class1(); + + Func setupBinding = () => + { + var source = new Subject(); + var sub = target.Bind((AvaloniaProperty)Class1.FooProperty, source); + return new WeakReference(source); + }; + + var weakSource = setupBinding(); + + Action completeSource = () => + { + ((ISubject)weakSource.Target).OnCompleted(); + }; + + completeSource(); + GC.Collect(); + + Assert.False(weakSource.IsAlive); + } + + private class Class1 : AvaloniaObject + { + public static readonly DirectProperty FooProperty = + AvaloniaProperty.RegisterDirect( + "Foo", + o => o.Foo, + (o, v) => o.Foo = v, + unsetValue: "unset"); + + private string _foo = "initial2"; + + static Class1() + { + } + + public string Foo + { + get { return _foo; } + set { SetAndRaise(FooProperty, ref _foo, value); } + } + } + } +} diff --git a/tests/Avalonia.LeakTests/packages.config b/tests/Avalonia.LeakTests/packages.config index 939556d0e2..302ccfb214 100644 --- a/tests/Avalonia.LeakTests/packages.config +++ b/tests/Avalonia.LeakTests/packages.config @@ -4,8 +4,12 @@ + + + + From 07ea2692c814b55eeeae688437f3784a27eabcde Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 5 Aug 2016 02:20:01 +0200 Subject: [PATCH 8/9] Don't run leak tests in parallel. --- tests/Avalonia.LeakTests/Properties/AssemblyInfo.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/Avalonia.LeakTests/Properties/AssemblyInfo.cs b/tests/Avalonia.LeakTests/Properties/AssemblyInfo.cs index 10149cf0af..4b66452274 100644 --- a/tests/Avalonia.LeakTests/Properties/AssemblyInfo.cs +++ b/tests/Avalonia.LeakTests/Properties/AssemblyInfo.cs @@ -1,6 +1,7 @@ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using Xunit; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information @@ -34,3 +35,6 @@ using System.Runtime.InteropServices; // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] + +// Don't run tests in parallel. +[assembly: CollectionBehavior(DisableTestParallelization = true)] \ No newline at end of file From 35a8ee113996c1dd0c5ed3a145ab160145c94df1 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 5 Aug 2016 02:29:30 +0200 Subject: [PATCH 9/9] Link dotMemory Unit with xUnit. --- tests/Avalonia.LeakTests/AvaloniaObjectTests.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/Avalonia.LeakTests/AvaloniaObjectTests.cs b/tests/Avalonia.LeakTests/AvaloniaObjectTests.cs index 2a3bc83294..8410c2aa3e 100644 --- a/tests/Avalonia.LeakTests/AvaloniaObjectTests.cs +++ b/tests/Avalonia.LeakTests/AvaloniaObjectTests.cs @@ -1,11 +1,18 @@ using System; using System.Reactive.Subjects; +using JetBrains.dotMemoryUnit; using Xunit; +using Xunit.Abstractions; namespace Avalonia.LeakTests { public class AvaloniaObjectTests { + public AvaloniaObjectTests(ITestOutputHelper atr) + { + DotMemoryUnitTestOutput.SetOutputMethod(atr.WriteLine); + } + [Fact] public void Binding_To_Direct_Property_Does_Not_Get_Collected() {