Skip to content

Commit b0c5aa2

Browse files
committed
Async unit test and invalidation
1 parent 7b04696 commit b0c5aa2

File tree

2 files changed

+57
-16
lines changed

2 files changed

+57
-16
lines changed

src/NHibernate.Test/Async/SecondLevelCacheTest/InvalidationTests.cs

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,16 @@
1111
using System.Collections;
1212
using System.Collections.Generic;
1313
using System.Linq;
14-
using System.Text;
15-
using System.Threading.Tasks;
1614
using NHibernate.Cache;
1715
using NHibernate.Cfg;
1816
using NHibernate.Impl;
1917
using NHibernate.Test.SecondLevelCacheTests;
2018
using NSubstitute;
2119
using NUnit.Framework;
22-
using Environment = System.Environment;
2320

2421
namespace NHibernate.Test.SecondLevelCacheTest
2522
{
23+
using System.Threading.Tasks;
2624
using System.Threading;
2725
[TestFixture]
2826
public class InvalidationTestsAsync : TestCase
@@ -34,26 +32,40 @@ public class InvalidationTestsAsync : TestCase
3432
protected override void Configure(Configuration configuration)
3533
{
3634
base.Configure(configuration);
37-
configuration.Properties[Cfg.Environment.CacheProvider] = typeof(HashtableCacheProvider).AssemblyQualifiedName;
38-
configuration.Properties[Cfg.Environment.UseQueryCache] = "true";
35+
configuration.Properties[Environment.CacheProvider] = typeof(HashtableCacheProvider).AssemblyQualifiedName;
36+
configuration.Properties[Environment.UseQueryCache] = "true";
3937
}
4038

4139
[Test]
4240
public async Task InvalidatesEntitiesAsync()
4341
{
4442
var cache = Substitute.For<UpdateTimestampsCache>(Sfi.Settings, new Dictionary<string, string>());
45-
((SessionFactoryImpl) (Sfi as DebugSessionFactory).ActualFactory).SetPropertyUsingReflection(x => x.UpdateTimestampsCache, cache);
43+
((SessionFactoryImpl) (Sfi as DebugSessionFactory).ActualFactory).SetPropertyUsingReflection(
44+
x => x.UpdateTimestampsCache,
45+
cache);
46+
47+
//"Received" assertions can not be used since the collection is reused and cleared between calls.
48+
//The received args are cloned and stored
49+
var preInvalidations = new List<IReadOnlyCollection<string>>();
50+
var invalidations = new List<IReadOnlyCollection<string>>();
51+
52+
cache
53+
.When(x=>x.PreInvalidate(Arg.Any<IReadOnlyCollection<string>>()))
54+
.Do(x=>preInvalidations.Add(((IReadOnlyCollection<string>) x[0]).ToList()));
55+
cache
56+
.When(x => x.Invalidate(Arg.Any<IReadOnlyCollection<string>>()))
57+
.Do(x => invalidations.Add(((IReadOnlyCollection<string>) x[0]).ToList()));
4658

47-
var items = new List<Item>();
4859
using (ISession session = OpenSession())
4960
{
5061
using (ITransaction tx = session.BeginTransaction())
5162
{
5263
foreach (var i in Enumerable.Range(1, 10))
5364
{
54-
var item = new Item { Id = i };
65+
var item = new Item {Id = i};
5566
await (session.SaveAsync(item));
5667
}
68+
5769
await (tx.CommitAsync());
5870
}
5971

@@ -64,6 +76,7 @@ public async Task InvalidatesEntitiesAsync()
6476
var item = await (session.GetAsync<Item>(i));
6577
item.Name = item.Id.ToString();
6678
}
79+
6780
await (tx.CommitAsync());
6881
}
6982

@@ -74,15 +87,25 @@ public async Task InvalidatesEntitiesAsync()
7487
var item = await (session.GetAsync<Item>(i));
7588
await (session.DeleteAsync(item));
7689
}
90+
7791
await (tx.CommitAsync());
7892
}
7993
}
94+
8095
//Should receive one preinvalidation and one invalidation per commit
81-
await (cache.Received(3).PreInvalidateAsync(Arg.Is<object[]>(x => x.Length==1 && (string)x[0] == "Item"), CancellationToken.None));
82-
await (cache.Received(3).InvalidateAsync(Arg.Is<object[]>(x => x.Length == 1 && (string) x[0] == "Item"), CancellationToken.None));
96+
Assert.That(preInvalidations.Count,Is.EqualTo(3));
97+
Assert.That(preInvalidations.All(x => x.Count == 1 && x.First() == "Item"), Is.True);
98+
99+
Assert.That(invalidations.Count, Is.EqualTo(3));
100+
Assert.That(invalidations.All(x => x.Count == 1 && x.First() == "Item"), Is.True);
83101

84102
}
85103

104+
private bool IsRight(HashSet<string> x)
105+
{
106+
return x.Count == 1 && x.First() == "Item";
107+
}
108+
86109
public async Task CleanUpAsync(CancellationToken cancellationToken = default(CancellationToken))
87110
{
88111
using (ISession s = OpenSession())

src/NHibernate/Async/Cache/UpdateTimestampsCache.cs

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
using System;
1212
using System.Collections.Generic;
13+
using System.Linq;
1314
using System.Runtime.CompilerServices;
1415

1516
using NHibernate.Cfg;
@@ -33,17 +34,26 @@ public Task ClearAsync(CancellationToken cancellationToken)
3334
return updateTimestamps.ClearAsync(cancellationToken);
3435
}
3536

36-
public virtual Task PreInvalidateAsync(object[] spaces, CancellationToken cancellationToken)
37+
//TODO: Make obsolete
38+
public Task PreInvalidateAsync(object[] spaces, CancellationToken cancellationToken)
3739
{
3840
if (cancellationToken.IsCancellationRequested)
3941
{
4042
return Task.FromCanceled<object>(cancellationToken);
4143
}
42-
return PreInvalidateAsync((IReadOnlyList<object>) spaces, cancellationToken);
44+
try
45+
{
46+
//Only for backwards compatibility.
47+
return PreInvalidateAsync(spaces.OfType<string>().ToList(), cancellationToken);
48+
}
49+
catch (Exception ex)
50+
{
51+
return Task.FromException<object>(ex);
52+
}
4353
}
4454

4555
[MethodImpl()]
46-
public virtual async Task PreInvalidateAsync(IReadOnlyCollection<object> spaces, CancellationToken cancellationToken)
56+
public virtual async Task PreInvalidateAsync(IReadOnlyCollection<string> spaces, CancellationToken cancellationToken)
4757
{
4858
cancellationToken.ThrowIfCancellationRequested();
4959
using (await _preInvalidate.LockAsync())
@@ -61,18 +71,26 @@ public virtual async Task PreInvalidateAsync(IReadOnlyCollection<object> spaces,
6171
//TODO: return new Lock(ts);
6272
}
6373

64-
/// <summary></summary>
74+
//TODO: Make obsolete
6575
public Task InvalidateAsync(object[] spaces, CancellationToken cancellationToken)
6676
{
6777
if (cancellationToken.IsCancellationRequested)
6878
{
6979
return Task.FromCanceled<object>(cancellationToken);
7080
}
71-
return InvalidateAsync((IReadOnlyList<object>) spaces, cancellationToken);
81+
try
82+
{
83+
//Only for backwards compatibility.
84+
return InvalidateAsync(spaces.OfType<string>().ToList(), cancellationToken);
85+
}
86+
catch (Exception ex)
87+
{
88+
return Task.FromException<object>(ex);
89+
}
7290
}
7391

7492
[MethodImpl()]
75-
public virtual async Task InvalidateAsync(IReadOnlyCollection<object> spaces, CancellationToken cancellationToken)
93+
public virtual async Task InvalidateAsync(IReadOnlyCollection<string> spaces, CancellationToken cancellationToken)
7694
{
7795
cancellationToken.ThrowIfCancellationRequested();
7896
using (await _invalidate.LockAsync())

0 commit comments

Comments
 (0)