Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit ab5dbdd

Browse files
authored
Merge pull request #1451 from github/fixes/1448-SharedDictionaryManager-test
Avoid need to execute SharedDictionaryManager test in app domain
2 parents 004b7c5 + da74b9f commit ab5dbdd

File tree

2 files changed

+36
-37
lines changed

2 files changed

+36
-37
lines changed

src/GitHub.UI/Helpers/SharedDictionaryManager.cs

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class SharedDictionaryManager : ResourceDictionary
1111
CachingFactory factory;
1212
Uri source;
1313

14-
public SharedDictionaryManager() : this(GetCurrentDomainCachingFactory())
14+
public SharedDictionaryManager() : this(CachingFactory.GetInstanceForDomain())
1515
{
1616
}
1717

@@ -41,37 +41,38 @@ public SharedDictionaryManager(CachingFactory factory)
4141
}
4242
}
4343

44-
public static CachingFactory GetCurrentDomainCachingFactory()
45-
{
46-
var dataName = typeof(CachingFactory).FullName;
47-
var data = AppDomain.CurrentDomain.GetData(dataName);
48-
49-
var cachingFactory = data as CachingFactory;
50-
if (cachingFactory != null)
51-
{
52-
return cachingFactory;
53-
}
54-
55-
var disposable = data as IDisposable;
56-
if (disposable != null)
57-
{
58-
disposable.Dispose();
59-
}
60-
61-
cachingFactory = new CachingFactory();
62-
AppDomain.CurrentDomain.SetData(dataName, cachingFactory);
63-
return cachingFactory;
64-
}
65-
6644
public class CachingFactory : IDisposable
6745
{
46+
internal static string DataName = typeof(CachingFactory).FullName;
47+
6848
IDictionary<Uri, ResourceDictionary> sharedDictionaries;
6949
ISet<IDisposable> disposables;
7050

7151
public CachingFactory()
7252
{
7353
sharedDictionaries = new Dictionary<Uri, ResourceDictionary>();
7454
disposables = new HashSet<IDisposable>();
55+
56+
AppDomain.CurrentDomain.SetData(DataName, this);
57+
}
58+
59+
public static CachingFactory GetInstanceForDomain()
60+
{
61+
var data = AppDomain.CurrentDomain.GetData(DataName);
62+
63+
var cachingFactory = data as CachingFactory;
64+
if (cachingFactory != null)
65+
{
66+
return cachingFactory;
67+
}
68+
69+
var disposable = data as IDisposable;
70+
if (disposable != null)
71+
{
72+
disposable.Dispose();
73+
}
74+
75+
return new CachingFactory();
7576
}
7677

7778
public ResourceDictionary GetOrCreateResourceDictionary(ResourceDictionary owner, Uri uri)
@@ -118,6 +119,8 @@ void Dispose(bool disposing)
118119
disposables.Clear();
119120
sharedDictionaries.Clear();
120121
}
122+
123+
AppDomain.CurrentDomain.SetData(DataName, null);
121124
}
122125

123126
public void Dispose()

test/GitHub.UI.UnitTests/Helpers/SharedDictionaryManagerTests.cs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,12 @@ public class TheGetCurrentDomainCachingFactoryMethod
8181
[Test]
8282
public void CalledTwice_DisposeNotCalled()
8383
{
84-
using (var factory = SharedDictionaryManager.GetCurrentDomainCachingFactory())
84+
using (var factory = SharedDictionaryManager.CachingFactory.GetInstanceForDomain())
8585
{
8686
var disposable = Substitute.For<IDisposable>();
8787
factory.TryAddDisposable(disposable);
8888

89-
using (SharedDictionaryManager.GetCurrentDomainCachingFactory())
89+
using (SharedDictionaryManager.CachingFactory.GetInstanceForDomain())
9090
{
9191
disposable.Received(0).Dispose();
9292
}
@@ -96,20 +96,16 @@ public void CalledTwice_DisposeNotCalled()
9696
[Test]
9797
public void InvokeMethodOnNewAssembly_DisposeCalled()
9898
{
99-
// HACK: Why does this need to be in app domain?
100-
AppDomainContext.Invoke(new AppDomainSetup { ApplicationBase = AppDomain.CurrentDomain.BaseDirectory }, () =>
99+
using (var factory = SharedDictionaryManager.CachingFactory.GetInstanceForDomain())
101100
{
102-
using (var factory = SharedDictionaryManager.GetCurrentDomainCachingFactory())
103-
{
104-
var disposable = Substitute.For<IDisposable>();
105-
factory.TryAddDisposable(disposable);
101+
var disposable = Substitute.For<IDisposable>();
102+
factory.TryAddDisposable(disposable);
106103

107-
using (InvokeMethodOnNewAssembly(SharedDictionaryManager.GetCurrentDomainCachingFactory))
108-
{
109-
disposable.Received(1).Dispose();
110-
}
104+
using (InvokeMethodOnNewAssembly(SharedDictionaryManager.CachingFactory.GetInstanceForDomain))
105+
{
106+
disposable.Received(1).Dispose();
111107
}
112-
});
108+
}
113109
}
114110

115111
static IDisposable InvokeMethodOnNewAssembly<T>(Func<T> func)
@@ -144,7 +140,7 @@ public class TheSourceProperty
144140
[TestCase(Urls.Test_SharedDictionary_PackUrl)]
145141
public void IsEqualToSet(string url)
146142
{
147-
using (SharedDictionaryManager.GetCurrentDomainCachingFactory())
143+
using (SharedDictionaryManager.CachingFactory.GetInstanceForDomain())
148144
{
149145
var uri = ResourceDictionaryUtilities.ToPackUri(url);
150146
var target = new SharedDictionaryManager();

0 commit comments

Comments
 (0)