aspnetcore/test/Microsoft.AspNetCore.Crypto.../WeakReferenceHelpersTests.cs

85 lines
3.0 KiB
C#

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Xunit;
namespace Microsoft.AspNetCore.Cryptography
{
public class WeakReferenceHelpersTests
{
[Fact]
public void GetSharedInstance_ExistingWeakRefHasBeenGCed_CreatesNew()
{
// Arrange
WeakReference<MyDisposable> wrOriginal = new WeakReference<MyDisposable>(null);
WeakReference<MyDisposable> wr = wrOriginal;
MyDisposable newInstance = new MyDisposable();
// Act
var retVal = WeakReferenceHelpers.GetSharedInstance(ref wr, () => newInstance);
// Assert
Assert.NotNull(wr);
Assert.NotSame(wrOriginal, wr);
Assert.True(wr.TryGetTarget(out var target));
Assert.Same(newInstance, target);
Assert.Same(newInstance, retVal);
Assert.False(newInstance.HasBeenDisposed);
}
[Fact]
public void GetSharedInstance_ExistingWeakRefIsNull_CreatesNew()
{
// Arrange
WeakReference<MyDisposable> wr = null;
MyDisposable newInstance = new MyDisposable();
// Act
var retVal = WeakReferenceHelpers.GetSharedInstance(ref wr, () => newInstance);
// Assert
Assert.NotNull(wr);
Assert.True(wr.TryGetTarget(out var target));
Assert.Same(newInstance, target);
Assert.Same(newInstance, retVal);
Assert.False(newInstance.HasBeenDisposed);
}
[Fact]
public void GetSharedInstance_ExistingWeakRefIsNull_AnotherThreadCreatesInstanceWhileOurFactoryRuns_ReturnsExistingInstanceAndDisposesNewInstance()
{
// Arrange
WeakReference<MyDisposable> wr = null;
MyDisposable instanceThatWillBeCreatedFirst = new MyDisposable();
MyDisposable instanceThatWillBeCreatedSecond = new MyDisposable();
// Act
var retVal = WeakReferenceHelpers.GetSharedInstance(ref wr, () =>
{
// mimic another thread creating the instance while our factory is being invoked
WeakReferenceHelpers.GetSharedInstance(ref wr, () => instanceThatWillBeCreatedFirst);
return instanceThatWillBeCreatedSecond;
});
// Assert
Assert.NotNull(wr);
Assert.True(wr.TryGetTarget(out var target));
Assert.Same(instanceThatWillBeCreatedFirst, target);
Assert.Same(instanceThatWillBeCreatedFirst, retVal);
Assert.False(instanceThatWillBeCreatedFirst.HasBeenDisposed);
Assert.True(instanceThatWillBeCreatedSecond.HasBeenDisposed);
}
private sealed class MyDisposable : IDisposable
{
public bool HasBeenDisposed { get; private set; }
public void Dispose()
{
HasBeenDisposed = true;
}
}
}
}