Skip to content

Commit

Permalink
add cancellation test on save to cache
Browse files Browse the repository at this point in the history
  • Loading branch information
adamhathcock committed Jan 27, 2025
1 parent 1b9463a commit b916330
Show file tree
Hide file tree
Showing 11 changed files with 60 additions and 66 deletions.
2 changes: 1 addition & 1 deletion Speckle.Sdk.Testing/Framework/DummySqLiteSendManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public class DummySqLiteSendManager : ISqLiteJsonCacheManager

public void UpdateObject(string id, string json) => throw new NotImplementedException();

public void SaveObjects(IEnumerable<(string id, string json)> items) => throw new NotImplementedException();
public virtual void SaveObjects(IEnumerable<(string id, string json)> items) => throw new NotImplementedException();

public bool HasObject(string objectId) => throw new NotImplementedException();

Expand Down
4 changes: 3 additions & 1 deletion src/Speckle.Sdk.Dependencies/Collections.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ public static class Collections
{
public static IReadOnlyCollection<T> Freeze<T>(this IEnumerable<T> source) => source.ToFrozenSet();

public static IReadOnlyDictionary<TKey, TValue> Freeze<TKey, TValue>(this IEnumerable<KeyValuePair<TKey, TValue>> source)
public static IReadOnlyDictionary<TKey, TValue> Freeze<TKey, TValue>(
this IEnumerable<KeyValuePair<TKey, TValue>> source
)
where TKey : notnull => source.ToFrozenDictionary();
}

Expand Down
19 changes: 8 additions & 11 deletions src/Speckle.Sdk/Serialisation/V2/Send/BaseSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,20 @@
using Speckle.Sdk.SQLite;
using Closures = System.Collections.Generic.Dictionary<Speckle.Sdk.Serialisation.Id, int>;


namespace Speckle.Sdk.Serialisation.V2.Send;

[GenerateAutoInterface]
public class BaseSerializer(
ISqLiteJsonCacheManager sqLiteJsonCacheManager,
IObjectSerializerFactory objectSerializerFactory) : IBaseSerializer
IObjectSerializerFactory objectSerializerFactory
) : IBaseSerializer
{
private readonly Pool<List<(Id, Json, Closures)>> _pool = Pools.CreateListPool<(Id, Json, Closures)>();

private readonly ConcurrentDictionary<Id, ObjectReference> _objectReferences = new();

public IReadOnlyDictionary<Id, ObjectReference> ObjectReferences => _objectReferences;

//leave this sync
public IEnumerable<BaseItem> Serialise(
Base obj,
Expand Down Expand Up @@ -49,22 +49,19 @@ CancellationToken cancellationToken
}

var (id, json, closures) = items.First();
yield return CheckCache(id, json, closures,skipCacheRead);
yield return CheckCache(id, json, closures, skipCacheRead);
foreach (var (cid, cJson, cClosures) in items.Skip(1))
{
yield return CheckCache(cid, cJson, cClosures,skipCacheRead);
yield return CheckCache(cid, cJson, cClosures, skipCacheRead);
}
}
finally
{
_pool.Return(items);
}
}


private BaseItem CheckCache(Id id, Json json, Dictionary<Id, int> closures,

bool skipCacheRead)

private BaseItem CheckCache(Id id, Json json, Dictionary<Id, int> closures, bool skipCacheRead)
{
if (!skipCacheRead)
{
Expand Down
3 changes: 1 addition & 2 deletions src/Speckle.Sdk/Serialisation/V2/Send/SerializeProcess.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ public async Task<SerializeProcessResults> Serialize(Base root)
DoneTraversing();
await Task.WhenAll(findTotalObjectsTask, channelTask).ConfigureAwait(true);
await DoneSaving().ConfigureAwait(true);
cancellationToken.ThrowIfCancellationRequested();
return new(root.id.NotNull(), baseSerializer.ObjectReferences.Freeze());
}

Expand Down Expand Up @@ -162,8 +163,6 @@ private async Task<Dictionary<Id, NodeInfo>> Traverse(Base obj, CancellationToke
return currentClosures;
}



public override async Task SendToServer(Batch<BaseItem> batch, CancellationToken cancellationToken)
{
try
Expand Down
7 changes: 4 additions & 3 deletions tests/Speckle.Sdk.Serialization.Testing/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,13 @@

var factory = new SerializeProcessFactory(
new BaseChildFinder(new BasePropertyGatherer()),
new ObjectDeserializerFactory(),
new ObjectDeserializerFactory(),
serviceProvider.GetRequiredService<ISqLiteJsonCacheManagerFactory>(),
serviceProvider.GetRequiredService<IServerObjectManagerFactory>(),
new BaseSerializer(
serviceProvider.GetRequiredService<ISqLiteJsonCacheManager>(),new ObjectSerializerFactory(new BasePropertyGatherer())),

serviceProvider.GetRequiredService<ISqLiteJsonCacheManager>(),
new ObjectSerializerFactory(new BasePropertyGatherer())
),
new NullLoggerFactory()
);
var process = factory.CreateDeserializeProcess(new Uri(url), streamId, token, progress, default, new(skipCacheReceive));
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@

{
"Type": "System.OperationCanceledException",
"Message": "The operation was canceled.",
"Source": "System.Private.CoreLib"
}
46 changes: 24 additions & 22 deletions tests/Speckle.Sdk.Serialization.Tests/CancellationTests.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Logging.Abstractions;
using Speckle.Objects.Geometry;
using Speckle.Sdk.Host;
using Speckle.Sdk.Models;
Expand All @@ -7,9 +7,13 @@

namespace Speckle.Sdk.Serialization.Tests;

public class CancellationSqLiteSendManager : DummySqLiteSendManager
public class CancellationSqLiteSendManager(CancellationTokenSource cancellationTokenSource) : DummySqLiteSendManager
{

public override void SaveObjects(IEnumerable<(string id, string json)> items)
{
cancellationTokenSource.Cancel();
cancellationTokenSource.Token.ThrowIfCancellationRequested();
}
}

public class CancellationTests
Expand All @@ -19,51 +23,49 @@ public CancellationTests()
TypeLoader.Reset();
TypeLoader.Initialize(typeof(Base).Assembly, typeof(DetachedTests).Assembly, typeof(Polyline).Assembly);
}

[Fact]
public async Task Cancellation_Serialize()
public async Task Cancellation_Serialize()
{
var testClass = new TestClass() { RegularProperty = "Hello" };

using var cancellationSource = new CancellationTokenSource();
using var serializeProcess = new SerializeProcess(
null,
new DummySqLiteSendManager(),
new DummyServerObjectManager(),
new BaseChildFinder(new BasePropertyGatherer()), new BaseSerializer(

new DummySqLiteSendManager(),new ObjectSerializerFactory(new BasePropertyGatherer())),

new BaseChildFinder(new BasePropertyGatherer()),
new BaseSerializer(new DummySqLiteSendManager(), new ObjectSerializerFactory(new BasePropertyGatherer())),
new NullLoggerFactory(),
cancellationSource.Token,
new SerializeProcessOptions(true, true, false, true)
);
await cancellationSource.CancelAsync();
var ex = await Assert.ThrowsAsync<OperationCanceledException>(async () => await serializeProcess.Serialize(testClass));
var ex = await Assert.ThrowsAsync<OperationCanceledException>(
async () => await serializeProcess.Serialize(testClass)
);
await Verify(ex);

}

[Fact]
public async Task Cancellation_Save_Sqlite()
{
var testClass = new TestClass() { RegularProperty = "Hello" };

using var cancellationSource = new CancellationTokenSource();
using var serializeProcess = new SerializeProcess(
null,
new CancellationSqLiteSendManager(),
new CancellationSqLiteSendManager(cancellationSource),
new DummyServerObjectManager(),
new BaseChildFinder(new BasePropertyGatherer()), new BaseSerializer(

new DummySqLiteSendManager(),new ObjectSerializerFactory(new BasePropertyGatherer())),

new BaseChildFinder(new BasePropertyGatherer()),
new BaseSerializer(new DummySqLiteSendManager(), new ObjectSerializerFactory(new BasePropertyGatherer())),
new NullLoggerFactory(),
cancellationSource.Token,
new SerializeProcessOptions(true, true, false, true)
new SerializeProcessOptions(true, false, false, true)
);
var ex = await Assert.ThrowsAsync<OperationCanceledException>(
async () => await serializeProcess.Serialize(testClass)
);
await cancellationSource.CancelAsync();
var ex = await Assert.ThrowsAsync<OperationCanceledException>(async () => await serializeProcess.Serialize(testClass));
await Verify(ex);

}
}
20 changes: 8 additions & 12 deletions tests/Speckle.Sdk.Serialization.Tests/DetachedTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,8 @@ public async Task CanSerialize_New_Detached()
null,
new DummySendCacheManager(objects),
new DummyServerObjectManager(),
new BaseChildFinder(new BasePropertyGatherer()), new BaseSerializer(
new DummySendCacheManager(objects),new ObjectSerializerFactory(new BasePropertyGatherer())),

new BaseChildFinder(new BasePropertyGatherer()),
new BaseSerializer(new DummySendCacheManager(objects), new ObjectSerializerFactory(new BasePropertyGatherer())),
new NullLoggerFactory(),
default,
new SerializeProcessOptions(false, false, true, true)
Expand Down Expand Up @@ -122,9 +121,8 @@ public async Task CanSerialize_New_Detached2()
null,
new DummySendCacheManager(objects),
new DummyServerObjectManager(),
new BaseChildFinder(new BasePropertyGatherer()), new BaseSerializer(
new DummySendCacheManager(objects),new ObjectSerializerFactory(new BasePropertyGatherer())),

new BaseChildFinder(new BasePropertyGatherer()),
new BaseSerializer(new DummySendCacheManager(objects), new ObjectSerializerFactory(new BasePropertyGatherer())),
new NullLoggerFactory(),
default,
new SerializeProcessOptions(false, false, true, true)
Expand Down Expand Up @@ -193,9 +191,8 @@ public async Task CanSerialize_New_Detached_With_DataChunks()
null,
new DummySendCacheManager(objects),
new DummyServerObjectManager(),
new BaseChildFinder(new BasePropertyGatherer()), new BaseSerializer(
new DummySendCacheManager(objects),new ObjectSerializerFactory(new BasePropertyGatherer())),

new BaseChildFinder(new BasePropertyGatherer()),
new BaseSerializer(new DummySendCacheManager(objects), new ObjectSerializerFactory(new BasePropertyGatherer())),
new NullLoggerFactory(),
default,
new SerializeProcessOptions(false, false, true, true)
Expand Down Expand Up @@ -229,9 +226,8 @@ public async Task CanSerialize_New_Detached_With_DataChunks2()
null,
new DummySendCacheManager(objects),
new DummyServerObjectManager(),
new BaseChildFinder(new BasePropertyGatherer()), new BaseSerializer(
new DummySendCacheManager(objects),new ObjectSerializerFactory(new BasePropertyGatherer())),

new BaseChildFinder(new BasePropertyGatherer()),
new BaseSerializer(new DummySendCacheManager(objects), new ObjectSerializerFactory(new BasePropertyGatherer())),
new NullLoggerFactory(),
default,
new SerializeProcessOptions(false, false, true, true)
Expand Down
8 changes: 3 additions & 5 deletions tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ public async Task Test_Exceptions_Upload()
new DummySendCacheManager(objects),
new ExceptionServerObjectManager(),
new BaseChildFinder(new BasePropertyGatherer()),
new BaseSerializer(
new DummySendCacheManager(objects),new ObjectSerializerFactory(new BasePropertyGatherer())),
new BaseSerializer(new DummySendCacheManager(objects), new ObjectSerializerFactory(new BasePropertyGatherer())),
new NullLoggerFactory(),
default,
new SerializeProcessOptions(false, false, false, true)
Expand All @@ -50,9 +49,8 @@ public async Task Test_Exceptions_Cache()
null,
new ExceptionSendCacheManager(),
new DummyServerObjectManager(),
new BaseChildFinder(new BasePropertyGatherer()), new BaseSerializer(
new ExceptionSendCacheManager(),new ObjectSerializerFactory(new BasePropertyGatherer())),

new BaseChildFinder(new BasePropertyGatherer()),
new BaseSerializer(new ExceptionSendCacheManager(), new ObjectSerializerFactory(new BasePropertyGatherer())),
new NullLoggerFactory(),
default,
new SerializeProcessOptions(false, false, false, true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,7 @@ public async Task Test_Json()
new DummySendCacheManager(objects),
new DummyServerObjectManager(),
new BaseChildFinder(new BasePropertyGatherer()),
new BaseSerializer(

new DummySendCacheManager(objects),new ObjectSerializerFactory(new BasePropertyGatherer())),

new BaseSerializer(new DummySendCacheManager(objects), new ObjectSerializerFactory(new BasePropertyGatherer())),
new NullLoggerFactory(),
default,
new SerializeProcessOptions(false, false, true, true)
Expand Down
6 changes: 2 additions & 4 deletions tests/Speckle.Sdk.Serialization.Tests/SerializationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -224,10 +224,8 @@ public async Task Roundtrip_Test_New(string fileName, string rootId, int oldCoun
null,
new DummySqLiteSendManager(),
new DummySendServerObjectManager(newIdToJson),
new BaseChildFinder(new BasePropertyGatherer()), new BaseSerializer(

new DummySqLiteSendManager(),new ObjectSerializerFactory(new BasePropertyGatherer())),

new BaseChildFinder(new BasePropertyGatherer()),
new BaseSerializer(new DummySqLiteSendManager(), new ObjectSerializerFactory(new BasePropertyGatherer())),
new NullLoggerFactory(),
default,
new SerializeProcessOptions(true, true, false, true)
Expand Down

0 comments on commit b916330

Please sign in to comment.