Files
speckle-sharp-sdk/tests/Speckle.Core.Tests.Integration/ServerTransportTests.cs
T
2024-06-21 08:42:42 +01:00

168 lines
5.5 KiB
C#

using System.Collections;
using Speckle.Core.Api;
using Speckle.Core.Credentials;
using Speckle.Core.Helpers;
using Speckle.Core.Models;
using Speckle.Core.Transports;
namespace Speckle.Core.Tests.Integration;
public class ServerTransportTests : IDisposable
{
private string _basePath;
private Account _account;
private Client _client;
private string _streamId;
private ServerTransport _transport;
[OneTimeSetUp]
public async Task InitialSetup()
{
_basePath = Path.Join(Path.GetTempPath(), "speckleTest");
CleanData();
Directory.CreateDirectory(_basePath);
SpecklePathProvider.OverrideApplicationDataPath(_basePath);
_account = await Fixtures.SeedUser();
_client = new Client(_account);
_streamId = await _client.StreamCreate(new StreamCreateInput { description = "Flobber", name = "Blobber" });
}
[SetUp]
public void Setup()
{
CleanData();
// need to recreate the server transport object for each test
// to make sure all folders are properly initialized
_transport = new ServerTransport(_account, _streamId);
}
[TearDown]
public void TearDown()
{
CleanData();
}
private void CleanData()
{
if (Directory.Exists(_basePath))
{
Directory.Delete(_basePath, true);
}
}
[Test]
public async Task SendObject()
{
var myObject = Fixtures.GenerateNestedObject();
var objectId = await Operations.Send(myObject, _transport, false);
Assert.That(objectId, Is.Not.Null);
}
[Test]
public async Task SendAndReceiveObjectWithBlobs()
{
var myObject = Fixtures.GenerateSimpleObject();
myObject["blobs"] = Fixtures.GenerateThreeBlobs();
var sentObjectId = await Operations.Send(myObject, _transport, false);
// NOTE: used to debug diffing
// await Operations.Send(myObject, new List<ITransport> { transport });
var receivedObject = await Operations.Receive(sentObjectId, _transport);
var allFiles = Directory
.GetFiles(_transport.BlobStorageFolder)
.Select(fp => fp.Split(Path.DirectorySeparatorChar).Last())
.ToList();
var blobPaths = allFiles
.Where(fp => fp.Length > Blob.LocalHashPrefixLength) // excludes things like .DS_store
.ToList();
// Check that there are three downloaded blobs!
Assert.That(blobPaths, Has.Count.EqualTo(3));
var blobs = ((IList<object>)receivedObject["blobs"]!).Cast<Blob>().ToList();
// Check that we have three blobs
Assert.That(blobs, Has.Count.EqualTo(3));
// Check that received blobs point to local path (where they were received)
Assert.That(blobs[0].filePath, Contains.Substring(_transport.BlobStorageFolder));
Assert.That(blobs[1].filePath, Contains.Substring(_transport.BlobStorageFolder));
Assert.That(blobs[2].filePath, Contains.Substring(_transport.BlobStorageFolder));
}
[Test]
public async Task SendWithBlobsWithoutSQLiteSendCache()
{
var myObject = Fixtures.GenerateSimpleObject();
myObject["blobs"] = Fixtures.GenerateThreeBlobs();
var memTransport = new MemoryTransport();
var sentObjectId = await Operations.Send(myObject, new List<ITransport> { _transport, memTransport });
var receivedObject = await Operations.Receive(sentObjectId, _transport);
var allFiles = Directory
.GetFiles(_transport.BlobStorageFolder)
.Select(fp => fp.Split(Path.DirectorySeparatorChar).Last())
.ToList();
var blobPaths = allFiles
.Where(fp => fp.Length > Blob.LocalHashPrefixLength) // excludes things like .DS_store
.ToList();
// Check that there are three downloaded blobs!
Assert.That(blobPaths, Has.Count.EqualTo(3));
var blobs = ((IList<object>)receivedObject["blobs"]!).Cast<Blob>().ToList();
// Check that we have three blobs
Assert.That(blobs, Has.Count.EqualTo(3));
// Check that received blobs point to local path (where they were received)
Assert.That(blobs[0].filePath, Contains.Substring(_transport.BlobStorageFolder));
Assert.That(blobs[1].filePath, Contains.Substring(_transport.BlobStorageFolder));
Assert.That(blobs[2].filePath, Contains.Substring(_transport.BlobStorageFolder));
}
[Test]
public async Task SendReceiveWithCleanedMemoryCache()
{
var myObject = Fixtures.GenerateSimpleObject();
myObject["blobs"] = Fixtures.GenerateThreeBlobs();
var memTransport = new MemoryTransport();
var sentObjectId = await Operations.Send(myObject, new ITransport[] { _transport, memTransport });
memTransport = new MemoryTransport();
Base receivedObject = await Operations.Receive(sentObjectId, _transport, memTransport);
Assert.That(receivedObject, Is.Not.Null);
var allFiles = Directory
.GetFiles(_transport.BlobStorageFolder)
.Select(fp => fp.Split(Path.DirectorySeparatorChar).Last())
.ToList();
var blobPaths = allFiles
.Where(fp => fp.Length > Blob.LocalHashPrefixLength) // excludes things like .DS_store
.ToList();
// Check that there are three downloaded blobs!
Assert.That(blobPaths.Count, Is.EqualTo(3));
var blobs = ((IList)receivedObject!["blobs"]!).Cast<Blob>().ToList();
// Check that we have three blobs
Assert.That(blobs, Has.Count.EqualTo(3));
// Check that received blobs point to local path (where they were received)
Assert.That(blobs[0].filePath, Contains.Substring(_transport.BlobStorageFolder));
Assert.That(blobs[1].filePath, Contains.Substring(_transport.BlobStorageFolder));
Assert.That(blobs[2].filePath, Contains.Substring(_transport.BlobStorageFolder));
}
public void Dispose()
{
_client?.Dispose();
_transport?.Dispose();
}
}