From 4a386d1b84e879bec43f89c084b2ed073c4f4484 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 14 May 2019 14:36:59 +0200 Subject: [PATCH] Added skipped failing leak test for transitions. It's leaking on master too, so address this separately. --- .../Properties/AssemblyInfo.cs | 5 +- tests/Avalonia.LeakTests/TransitionTests.cs | 60 +++++++++++++++++++ tests/Avalonia.UnitTests/MockGlobalClock.cs | 10 ++++ tests/Avalonia.UnitTests/TestServices.cs | 6 ++ .../Avalonia.UnitTests/UnitTestApplication.cs | 2 + 5 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 tests/Avalonia.LeakTests/TransitionTests.cs create mode 100644 tests/Avalonia.UnitTests/MockGlobalClock.cs diff --git a/src/Avalonia.Animation/Properties/AssemblyInfo.cs b/src/Avalonia.Animation/Properties/AssemblyInfo.cs index 985a8e5bfe..eb38a66a84 100644 --- a/src/Avalonia.Animation/Properties/AssemblyInfo.cs +++ b/src/Avalonia.Animation/Properties/AssemblyInfo.cs @@ -3,7 +3,10 @@ using Avalonia.Metadata; using System.Reflection; +using System.Runtime.CompilerServices; [assembly: XmlnsDefinition("https://github.com/avaloniaui", "Avalonia.Animation")] [assembly: XmlnsDefinition("https://github.com/avaloniaui", "Avalonia.Animation.Easings")] -[assembly: XmlnsDefinition("https://github.com/avaloniaui", "Avalonia.Animation.Animators")] \ No newline at end of file +[assembly: XmlnsDefinition("https://github.com/avaloniaui", "Avalonia.Animation.Animators")] + +[assembly: InternalsVisibleTo("Avalonia.LeakTests")] diff --git a/tests/Avalonia.LeakTests/TransitionTests.cs b/tests/Avalonia.LeakTests/TransitionTests.cs new file mode 100644 index 0000000000..c7add1fe11 --- /dev/null +++ b/tests/Avalonia.LeakTests/TransitionTests.cs @@ -0,0 +1,60 @@ +using System; +using Avalonia.Animation; +using Avalonia.Controls; +using Avalonia.UnitTests; +using JetBrains.dotMemoryUnit; +using Xunit; +using Xunit.Abstractions; + +namespace Avalonia.LeakTests +{ + [DotMemoryUnit(FailIfRunWithoutSupport = false)] + public class TransitionTests + { + public TransitionTests(ITestOutputHelper atr) + { + DotMemoryUnitTestOutput.SetOutputMethod(atr.WriteLine); + } + + [Fact(Skip = "TODO: Fix this leak")] + public void Transition_On_StyledProperty_Is_Freed() + { + var clock = new MockGlobalClock(); + + using (UnitTestApplication.Start(new TestServices(globalClock: clock))) + { + Func run = () => + { + var border = new Border + { + Transitions = + { + new DoubleTransition + { + Duration = TimeSpan.FromSeconds(1), + Property = Border.OpacityProperty, + } + } + }; + + border.Opacity = 0; + + clock.Pulse(TimeSpan.FromSeconds(0)); + clock.Pulse(TimeSpan.FromSeconds(0.5)); + + Assert.Equal(0.5, border.Opacity); + + clock.Pulse(TimeSpan.FromSeconds(1)); + + Assert.Equal(0, border.Opacity); + return border; + }; + + var result = run(); + + dotMemory.Check(memory => + Assert.Equal(0, memory.GetObjects(where => where.Type.Is()).ObjectsCount)); + } + } + } +} diff --git a/tests/Avalonia.UnitTests/MockGlobalClock.cs b/tests/Avalonia.UnitTests/MockGlobalClock.cs new file mode 100644 index 0000000000..b53e5acc01 --- /dev/null +++ b/tests/Avalonia.UnitTests/MockGlobalClock.cs @@ -0,0 +1,10 @@ +using System; +using Avalonia.Animation; + +namespace Avalonia.UnitTests +{ + public class MockGlobalClock : ClockBase, IGlobalClock + { + public new void Pulse(TimeSpan systemTime) => base.Pulse(systemTime); + } +} diff --git a/tests/Avalonia.UnitTests/TestServices.cs b/tests/Avalonia.UnitTests/TestServices.cs index d68f1d167a..f7a878feba 100644 --- a/tests/Avalonia.UnitTests/TestServices.cs +++ b/tests/Avalonia.UnitTests/TestServices.cs @@ -16,6 +16,7 @@ using System.Reactive.Concurrency; using System.Collections.Generic; using Avalonia.Controls; using System.Reflection; +using Avalonia.Animation; namespace Avalonia.UnitTests { @@ -58,6 +59,7 @@ namespace Avalonia.UnitTests public TestServices( IAssetLoader assetLoader = null, IFocusManager focusManager = null, + IGlobalClock globalClock = null, IInputManager inputManager = null, Func keyboardDevice = null, IKeyboardNavigationHandler keyboardNavigation = null, @@ -75,6 +77,7 @@ namespace Avalonia.UnitTests { AssetLoader = assetLoader; FocusManager = focusManager; + GlobalClock = globalClock; InputManager = inputManager; KeyboardDevice = keyboardDevice; KeyboardNavigation = keyboardNavigation; @@ -93,6 +96,7 @@ namespace Avalonia.UnitTests public IAssetLoader AssetLoader { get; } public IInputManager InputManager { get; } public IFocusManager FocusManager { get; } + public IGlobalClock GlobalClock { get; } public Func KeyboardDevice { get; } public IKeyboardNavigationHandler KeyboardNavigation { get; } public Func MouseDevice { get; } @@ -109,6 +113,7 @@ namespace Avalonia.UnitTests public TestServices With( IAssetLoader assetLoader = null, IFocusManager focusManager = null, + IGlobalClock globalClock = null, IInputManager inputManager = null, Func keyboardDevice = null, IKeyboardNavigationHandler keyboardNavigation = null, @@ -127,6 +132,7 @@ namespace Avalonia.UnitTests return new TestServices( assetLoader: assetLoader ?? AssetLoader, focusManager: focusManager ?? FocusManager, + globalClock: globalClock ?? GlobalClock, inputManager: inputManager ?? InputManager, keyboardDevice: keyboardDevice ?? KeyboardDevice, keyboardNavigation: keyboardNavigation ?? KeyboardNavigation, diff --git a/tests/Avalonia.UnitTests/UnitTestApplication.cs b/tests/Avalonia.UnitTests/UnitTestApplication.cs index 4802278c1e..3578471397 100644 --- a/tests/Avalonia.UnitTests/UnitTestApplication.cs +++ b/tests/Avalonia.UnitTests/UnitTestApplication.cs @@ -12,6 +12,7 @@ using Avalonia.Threading; using System.Reactive.Disposables; using System.Reactive.Concurrency; using Avalonia.Input.Platform; +using Avalonia.Animation; namespace Avalonia.UnitTests { @@ -52,6 +53,7 @@ namespace Avalonia.UnitTests AvaloniaLocator.CurrentMutable .Bind().ToConstant(Services.AssetLoader) .Bind().ToConstant(Services.FocusManager) + .Bind().ToConstant(Services.GlobalClock) .BindToSelf(this) .Bind().ToConstant(Services.InputManager) .Bind().ToConstant(Services.KeyboardDevice?.Invoke())