[#23] Client: Refactoring to optimize memory usage
All checks were successful
DCO / DCO (pull_request) Successful in 33s
All checks were successful
DCO / DCO (pull_request) Successful in 33s
Signed-off-by: Pavel Gross <p.gross@yando.com>
This commit is contained in:
parent
1a02ac2ae7
commit
6562aa27a5
141 changed files with 1722 additions and 896 deletions
|
@ -1,14 +1,11 @@
|
|||
using FrostFS.SDK.ModelsV2;
|
||||
using FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap;
|
||||
using FrostFS.SDK.ClientV2;
|
||||
using FrostFS.SDK.ClientV2.Mappers.GRPC;
|
||||
using FrostFS.SDK.ClientV2.Interfaces;
|
||||
using FrostFS.SDK.ClientV2;
|
||||
using FrostFS.SDK.Cryptography;
|
||||
|
||||
using Microsoft.Extensions.Options;
|
||||
using FrostFS.SDK.ModelsV2.Netmap;
|
||||
using FrostFS.SDK.ModelsV2.Enums;
|
||||
using Google.Protobuf;
|
||||
using FrostFS.SDK.ClientV2.Interfaces;
|
||||
using FrostFS.SDK.ClientV2.Parameters;
|
||||
|
||||
namespace FrostFS.SDK.Tests;
|
||||
|
||||
|
@ -29,8 +26,8 @@ public abstract class ContainerTestsBase
|
|||
|
||||
Mocker = new ContainerMocker(this.key)
|
||||
{
|
||||
PlacementPolicy = new PlacementPolicy(true, new Replica(1)),
|
||||
Version = new ModelsV2.Version(2, 13),
|
||||
PlacementPolicy = new FrostFsPlacementPolicy(true, new FrostFsReplica(1)),
|
||||
Version = new FrostFsVersion(2, 13),
|
||||
ContainerGuid = Guid.NewGuid()
|
||||
};
|
||||
}
|
||||
|
@ -52,7 +49,7 @@ public class ContainerTest : ContainerTestsBase
|
|||
[Fact]
|
||||
public async void CreateContainerTest()
|
||||
{
|
||||
var param = new PrmContainerCreate(new ModelsV2.Container(BasicAcl.PublicRW, Mocker.PlacementPolicy));
|
||||
var param = new PrmContainerCreate(new FrostFsContainerInfo(BasicAcl.PublicRW, Mocker.PlacementPolicy));
|
||||
|
||||
var result = await GetClient().CreateContainerAsync(param);
|
||||
|
||||
|
@ -64,7 +61,7 @@ public class ContainerTest : ContainerTestsBase
|
|||
[Fact]
|
||||
public async void GetContainerTest()
|
||||
{
|
||||
var cid = new ContainerId(Base58.Encode(Mocker.ContainerGuid.ToBytes()));
|
||||
var cid = new FrostFsContainerId(Base58.Encode(Mocker.ContainerGuid.ToBytes()));
|
||||
|
||||
Mocker.Acl = BasicAcl.PublicRO;
|
||||
|
||||
|
@ -102,7 +99,7 @@ public class ContainerTest : ContainerTestsBase
|
|||
public async void DeleteContainerAsyncTest()
|
||||
{
|
||||
Mocker.ReturnContainerRemoved = true;
|
||||
var cid = new ContainerId(Base58.Encode(Mocker.ContainerGuid.ToBytes()));
|
||||
var cid = new FrostFsContainerId(Base58.Encode(Mocker.ContainerGuid.ToBytes()));
|
||||
|
||||
await GetClient().DeleteContainerAsync(new PrmContainerDelete(cid));
|
||||
|
||||
|
|
39
src/FrostFS.SDK.Tests/MetricsInterceptor.cs
Normal file
39
src/FrostFS.SDK.Tests/MetricsInterceptor.cs
Normal file
|
@ -0,0 +1,39 @@
|
|||
using Grpc.Core;
|
||||
using Grpc.Core.Interceptors;
|
||||
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace FrostFS.SDK.SmokeTests;
|
||||
|
||||
public class MetricsInterceptor() : Interceptor
|
||||
{
|
||||
public override AsyncUnaryCall<TResponse> AsyncUnaryCall<TRequest, TResponse>(
|
||||
TRequest request,
|
||||
ClientInterceptorContext<TRequest, TResponse> context,
|
||||
AsyncUnaryCallContinuation<TRequest, TResponse> continuation)
|
||||
{
|
||||
var call = continuation(request, context);
|
||||
|
||||
return new AsyncUnaryCall<TResponse>(
|
||||
HandleUnaryResponse(call),
|
||||
call.ResponseHeadersAsync,
|
||||
call.GetStatus,
|
||||
call.GetTrailers,
|
||||
call.Dispose);
|
||||
}
|
||||
|
||||
private static async Task<TResponse> HandleUnaryResponse<TResponse>(AsyncUnaryCall<TResponse> call)
|
||||
{
|
||||
var watch = new Stopwatch();
|
||||
watch.Start();
|
||||
|
||||
var response = await call.ResponseAsync;
|
||||
|
||||
watch.Stop();
|
||||
|
||||
// Do something with call info
|
||||
// var elapsed = watch.ElapsedTicks * 1_000_000/Stopwatch.Frequency;
|
||||
|
||||
return response;
|
||||
}
|
||||
}
|
|
@ -1,17 +1,18 @@
|
|||
using System.Security.Cryptography;
|
||||
|
||||
using FrostFS.Object;
|
||||
using FrostFS.Session;
|
||||
using Google.Protobuf;
|
||||
using Grpc.Core;
|
||||
using FrostFS.SDK.ClientV2;
|
||||
using FrostFS.SDK.ModelsV2;
|
||||
using FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap;
|
||||
using FrostFS.SDK.ClientV2.Mappers.GRPC;
|
||||
using FrostFS.SDK.Cryptography;
|
||||
using System.Security.Cryptography;
|
||||
using FrostFS.Session;
|
||||
|
||||
using Google.Protobuf;
|
||||
|
||||
using Grpc.Core;
|
||||
|
||||
namespace FrostFS.SDK.Tests;
|
||||
|
||||
public class AsyncStreamReaderMock(string key, ObjectHeader objectHeader) : ServiceBase(key), IAsyncStreamReader<GetResponse>
|
||||
public class AsyncStreamReaderMock(string key, FrostFsObjectHeader objectHeader) : ServiceBase(key), IAsyncStreamReader<GetResponse>
|
||||
{
|
||||
public GetResponse Current
|
||||
{
|
||||
|
|
|
@ -21,8 +21,9 @@ public class ClientStreamWriter : IClientStreamWriter<IRequest>
|
|||
}
|
||||
|
||||
public Task WriteAsync(IRequest message)
|
||||
{
|
||||
Messages.Add(message);
|
||||
{
|
||||
Object.PutRequest pr = new((Object.PutRequest)message);
|
||||
Messages.Add(pr);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,8 +3,6 @@ using FrostFS.Container;
|
|||
using Moq;
|
||||
|
||||
using FrostFS.SDK.Cryptography;
|
||||
using FrostFS.SDK.ModelsV2.Enums;
|
||||
using FrostFS.SDK.ModelsV2.Netmap;
|
||||
using FrostFS.Session;
|
||||
using Google.Protobuf;
|
||||
|
||||
|
@ -19,18 +17,18 @@ public abstract class ServiceBase(string key)
|
|||
{
|
||||
public string StringKey { get; private set; } = key;
|
||||
public ECDsa Key { get; private set; } = key.LoadWif();
|
||||
public ModelsV2.Version Version { get; set; } = DefaultVersion;
|
||||
public FrostFsVersion Version { get; set; } = DefaultVersion;
|
||||
public BasicAcl Acl { get; set; } = DefaultAcl;
|
||||
public PlacementPolicy PlacementPolicy { get; set; } = DefaultPlacementPolicy;
|
||||
public FrostFsPlacementPolicy PlacementPolicy { get; set; } = DefaultPlacementPolicy;
|
||||
|
||||
public static ModelsV2.Version DefaultVersion { get; } = new(2, 13);
|
||||
public static FrostFsVersion DefaultVersion { get; } = new(2, 13);
|
||||
public static BasicAcl DefaultAcl { get; } = BasicAcl.PublicRW;
|
||||
public static PlacementPolicy DefaultPlacementPolicy { get; } = new PlacementPolicy(true, new Replica(1));
|
||||
public static FrostFsPlacementPolicy DefaultPlacementPolicy { get; } = new FrostFsPlacementPolicy(true, new FrostFsReplica(1));
|
||||
|
||||
public Metadata Metadata { get; protected set; }
|
||||
public DateTime? DateTime { get; protected set; }
|
||||
public CancellationToken CancellationToken { get; protected set; }
|
||||
|
||||
public CancellationToken CancellationToken { get; protected set; }
|
||||
public CancellationTokenSource CancellationTokenSource { get; protected set; } = new CancellationTokenSource();
|
||||
|
||||
public static Metadata ResponseMetaData => [];
|
||||
|
|
|
@ -5,8 +5,7 @@ using Moq;
|
|||
|
||||
using FrostFS.SDK.Cryptography;
|
||||
using FrostFS.SDK.ClientV2;
|
||||
using FrostFS.SDK.ModelsV2.Netmap;
|
||||
using FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap;
|
||||
|
||||
using FrostFS.SDK.ClientV2.Mappers.GRPC;
|
||||
using FrostFS.Session;
|
||||
using FrostFS.Refs;
|
||||
|
|
|
@ -2,7 +2,6 @@ using Google.Protobuf;
|
|||
using Grpc.Core;
|
||||
using Moq;
|
||||
using FrostFS.SDK.ClientV2;
|
||||
using FrostFS.SDK.ModelsV2;
|
||||
using FrostFS.Object;
|
||||
using FrostFS.SDK.ClientV2.Mappers.GRPC;
|
||||
using System.Security.Cryptography;
|
||||
|
@ -184,14 +183,13 @@ public class ObjectMocker(string key) : ObjectServiceBase(key)
|
|||
() => { });
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
return mock;
|
||||
}
|
||||
|
||||
public ObjectId? ObjectId { get; set; }
|
||||
public FrostFsObjectId? ObjectId { get; set; }
|
||||
|
||||
public ObjectHeader? ObjectHeader { get; set; }
|
||||
public FrostFsObjectHeader? ObjectHeader { get; set; }
|
||||
|
||||
public Header? HeadResponse { get; set; }
|
||||
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
using FrostFS.Netmap;
|
||||
using FrostFS.SDK.ClientV2;
|
||||
using FrostFS.SDK.ClientV2.Interfaces;
|
||||
using FrostFS.SDK.ClientV2.Parameters;
|
||||
using FrostFS.SDK.ClientV2;
|
||||
using FrostFS.SDK.Cryptography;
|
||||
using FrostFS.SDK.ModelsV2;
|
||||
using FrostFS.SDK.ModelsV2.Enums;
|
||||
|
||||
using Google.Protobuf;
|
||||
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
using System.Security.Cryptography;
|
||||
|
||||
namespace FrostFS.SDK.Tests;
|
||||
|
@ -17,10 +18,10 @@ public abstract class NetworkTestsBase
|
|||
|
||||
protected IOptions<SingleOwnerClientSettings> Settings { get; set; }
|
||||
|
||||
protected ModelsV2.Version Version { get; set; } = new ModelsV2.Version(2, 13);
|
||||
protected FrostFsVersion Version { get; set; } = new FrostFsVersion(2, 13);
|
||||
|
||||
protected ECDsa ECDsaKey { get; set; }
|
||||
protected OwnerId OwnerId { get; set; }
|
||||
protected FrostFsOwner OwnerId { get; set; }
|
||||
protected NetworkMocker Mocker { get; set; }
|
||||
|
||||
protected NetworkTestsBase()
|
||||
|
@ -32,7 +33,7 @@ public abstract class NetworkTestsBase
|
|||
});
|
||||
|
||||
ECDsaKey = key.LoadWif();
|
||||
OwnerId = OwnerId.FromKey(ECDsaKey);
|
||||
OwnerId = FrostFsOwner.FromKey(ECDsaKey);
|
||||
|
||||
Mocker = new NetworkMocker(this.key);
|
||||
}
|
||||
|
|
|
@ -2,13 +2,13 @@ using FrostFS.Refs;
|
|||
using FrostFS.SDK.ClientV2;
|
||||
using FrostFS.SDK.ClientV2.Interfaces;
|
||||
using FrostFS.SDK.ClientV2.Mappers.GRPC;
|
||||
using FrostFS.SDK.ClientV2.Parameters;
|
||||
using FrostFS.SDK.ClientV2;
|
||||
using FrostFS.SDK.Cryptography;
|
||||
using FrostFS.SDK.ModelsV2;
|
||||
using FrostFS.SDK.ModelsV2.Enums;
|
||||
using FrostFS.SDK.ModelsV2.Netmap;
|
||||
|
||||
using Google.Protobuf;
|
||||
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
|
||||
|
@ -19,7 +19,7 @@ public abstract class ObjectTestsBase
|
|||
protected static readonly string key = "KwHDAJ66o8FoLBjVbjP2sWBmgBMGjt7Vv4boA7xQrBoAYBE397Aq";
|
||||
|
||||
protected IOptions<SingleOwnerClientSettings> Settings { get; set; }
|
||||
protected ContainerId ContainerId { get; set; }
|
||||
protected FrostFsContainerId ContainerId { get; set; }
|
||||
|
||||
protected NetworkMocker NetworkMocker { get; set; } = new NetworkMocker(key);
|
||||
protected SessionMocker SessionMocker { get; set; } = new SessionMocker(key);
|
||||
|
@ -38,18 +38,20 @@ public abstract class ObjectTestsBase
|
|||
|
||||
Mocker = new ObjectMocker(key)
|
||||
{
|
||||
PlacementPolicy = new PlacementPolicy(true, new Replica(1)),
|
||||
Version = new ModelsV2.Version(2, 13),
|
||||
PlacementPolicy = new FrostFsPlacementPolicy(true, new FrostFsReplica(1)),
|
||||
Version = new FrostFsVersion(2, 13),
|
||||
ContainerGuid = Guid.NewGuid()
|
||||
};
|
||||
|
||||
ContainerId = new ContainerId(Base58.Encode(Mocker.ContainerGuid.ToBytes()));
|
||||
ContainerId = new FrostFsContainerId(Base58.Encode(Mocker.ContainerGuid.ToBytes()));
|
||||
|
||||
Mocker.ObjectHeader = new(ContainerId, ModelsV2.Enums.ObjectType.Regular, [new ObjectAttribute("k", "v")])
|
||||
{
|
||||
Version = new ModelsV2.Version(2, 13),
|
||||
OwnerId = OwnerId.FromKey(ecdsaKey)
|
||||
};
|
||||
Mocker.ObjectHeader = new(
|
||||
ContainerId,
|
||||
FrostFsObjectType.Regular,
|
||||
[new FrostFsAttribute("k", "v")],
|
||||
null,
|
||||
FrostFsOwner.FromKey(ecdsaKey),
|
||||
new FrostFsVersion(2, 13));
|
||||
}
|
||||
|
||||
protected IFrostFSClient GetClient()
|
||||
|
@ -75,8 +77,8 @@ public class ObjectTest : ObjectTestsBase
|
|||
|
||||
var ctx = new Context {
|
||||
Key = ecdsaKey,
|
||||
OwnerId = OwnerId.FromKey(ecdsaKey),
|
||||
Version = new ModelsV2.Version(2, 13) };
|
||||
OwnerId = FrostFsOwner.FromKey(ecdsaKey),
|
||||
Version = new FrostFsVersion(2, 13) };
|
||||
|
||||
var objectId = client.CalculateObjectId(Mocker.ObjectHeader!, ctx);
|
||||
|
||||
|
@ -218,7 +220,7 @@ public class ObjectTest : ObjectTestsBase
|
|||
Assert.Equal("k", linkObject.Header.Split.ParentHeader.Attributes[0].Key);
|
||||
Assert.Equal("v", linkObject.Header.Split.ParentHeader.Attributes[0].Value);
|
||||
|
||||
var modelObjId = ObjectId.FromHash(linkObject.Header.Split.Parent.Value.ToByteArray());
|
||||
var modelObjId = FrostFsObjectId.FromHash(linkObject.Header.Split.Parent.Value.ToByteArray());
|
||||
|
||||
Assert.Equal(result.Value, modelObjId.ToString());
|
||||
}
|
||||
|
@ -256,7 +258,7 @@ public class ObjectTest : ObjectTestsBase
|
|||
|
||||
Assert.Equal(Mocker.HeadResponse!.PayloadLength, response.PayloadLength);
|
||||
|
||||
Assert.Equal(ObjectType.Regular, response.ObjectType);
|
||||
Assert.Equal(FrostFsObjectType.Regular, response.ObjectType);
|
||||
|
||||
Assert.Single(response.Attributes);
|
||||
|
||||
|
|
|
@ -1,12 +1,11 @@
|
|||
using FrostFS.SDK.ClientV2;
|
||||
using FrostFS.SDK.ClientV2.Interfaces;
|
||||
using FrostFS.SDK.ClientV2.Mappers.GRPC;
|
||||
using FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap;
|
||||
using FrostFS.SDK.ClientV2.Parameters;
|
||||
using FrostFS.SDK.ClientV2;
|
||||
using FrostFS.SDK.Cryptography;
|
||||
using FrostFS.SDK.ModelsV2;
|
||||
using FrostFS.SDK.ModelsV2.Netmap;
|
||||
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
using System.Security.Cryptography;
|
||||
|
||||
namespace FrostFS.SDK.Tests;
|
||||
|
@ -19,7 +18,7 @@ public abstract class SessionTestsBase
|
|||
|
||||
|
||||
protected ECDsa ECDsaKey { get; set; }
|
||||
protected OwnerId OwnerId { get; set; }
|
||||
protected FrostFsOwner OwnerId { get; set; }
|
||||
protected SessionMocker Mocker { get; set; }
|
||||
|
||||
protected SessionTestsBase()
|
||||
|
@ -31,12 +30,12 @@ public abstract class SessionTestsBase
|
|||
});
|
||||
|
||||
ECDsaKey = key.LoadWif();
|
||||
OwnerId = OwnerId.FromKey(ECDsaKey);
|
||||
OwnerId = FrostFsOwner.FromKey(ECDsaKey);
|
||||
|
||||
Mocker = new SessionMocker(this.key)
|
||||
{
|
||||
PlacementPolicy = new PlacementPolicy(true, new Replica(1)),
|
||||
Version = new ModelsV2.Version(2, 13)
|
||||
PlacementPolicy = new FrostFsPlacementPolicy(true, new FrostFsReplica(1)),
|
||||
Version = new FrostFsVersion(2, 13)
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -1,45 +1,14 @@
|
|||
using System.Security.Cryptography;
|
||||
using FrostFS.SDK.ClientV2;
|
||||
using FrostFS.SDK.ClientV2.Interfaces;
|
||||
using FrostFS.SDK.ModelsV2;
|
||||
using FrostFS.SDK.ModelsV2.Enums;
|
||||
using FrostFS.SDK.ModelsV2.Netmap;
|
||||
using FrostFS.SDK.Cryptography;
|
||||
|
||||
using Grpc.Core;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Grpc.Core.Interceptors;
|
||||
using System.Diagnostics;
|
||||
|
||||
using static FrostFS.Session.SessionToken.Types.Body;
|
||||
using FrostFS.SDK.ClientV2.Parameters;
|
||||
using FrostFS.SDK.Tests;
|
||||
using FrostFS.SDK.ClientV2;
|
||||
|
||||
namespace FrostFS.SDK.SmokeTests;
|
||||
|
||||
public abstract class SmokeTestsBase
|
||||
{
|
||||
protected readonly string key = "KwHDAJ66o8FoLBjVbjP2sWBmgBMGjt7Vv4boA7xQrBoAYBE397Aq";
|
||||
protected readonly string url = "http://172.23.32.4:8080";
|
||||
|
||||
protected ECDsa Key { get; }
|
||||
|
||||
protected OwnerId OwnerId { get; }
|
||||
|
||||
protected ModelsV2.Version Version { get; }
|
||||
|
||||
protected Context Ctx { get; }
|
||||
|
||||
protected SmokeTestsBase()
|
||||
{
|
||||
Key = key.LoadWif();
|
||||
OwnerId = OwnerId.FromKey(Key);
|
||||
Version = new ModelsV2.Version(2, 13);
|
||||
|
||||
Ctx = new Context { Key = Key, OwnerId = OwnerId, Version = Version };
|
||||
}
|
||||
}
|
||||
|
||||
public class SmokeTests : SmokeTestsBase
|
||||
{
|
||||
private static readonly PrmWait lightWait = new (100, 1);
|
||||
|
@ -134,7 +103,7 @@ public class SmokeTests : SmokeTestsBase
|
|||
var token = await client.CreateSessionAsync(new PrmSessionCreate(int.MaxValue));
|
||||
|
||||
var createContainerParam = new PrmContainerCreate(
|
||||
new ModelsV2.Container(BasicAcl.PublicRW, new PlacementPolicy(true, new Replica(1))));
|
||||
new FrostFsContainerInfo(BasicAcl.PublicRW, new FrostFsPlacementPolicy(true, new FrostFsReplica(1))));
|
||||
|
||||
createContainerParam.XHeaders.Add("key1", "value1");
|
||||
|
||||
|
@ -144,10 +113,10 @@ public class SmokeTests : SmokeTestsBase
|
|||
|
||||
var param = new PrmObjectPut
|
||||
{
|
||||
Header = new ObjectHeader(
|
||||
Header = new FrostFsObjectHeader(
|
||||
containerId: containerId,
|
||||
type: ModelsV2.Enums.ObjectType.Regular,
|
||||
new ObjectAttribute("fileName", "test")),
|
||||
type: FrostFsObjectType.Regular,
|
||||
[new FrostFsAttribute("fileName", "test")]),
|
||||
Payload = new MemoryStream(bytes),
|
||||
ClientCut = false,
|
||||
SessionToken = token
|
||||
|
@ -160,10 +129,10 @@ public class SmokeTests : SmokeTestsBase
|
|||
var downloadedBytes = new byte[@object.Header.PayloadLength];
|
||||
MemoryStream ms = new(downloadedBytes);
|
||||
|
||||
byte[]? chunk = null;
|
||||
ReadOnlyMemory<byte>? chunk = null;
|
||||
while ((chunk = await @object.ObjectReader!.ReadChunk()) != null)
|
||||
{
|
||||
ms.Write(chunk);
|
||||
ms.Write(chunk.Value.Span);
|
||||
}
|
||||
|
||||
Assert.Equal(MD5.HashData(bytes), MD5.HashData(downloadedBytes));
|
||||
|
@ -179,7 +148,7 @@ public class SmokeTests : SmokeTestsBase
|
|||
await Cleanup(client);
|
||||
|
||||
var createContainerParam = new PrmContainerCreate(
|
||||
new ModelsV2.Container(BasicAcl.PublicRW, new PlacementPolicy(true, new Replica(1))))
|
||||
new FrostFsContainerInfo(BasicAcl.PublicRW, new FrostFsPlacementPolicy(true, new FrostFsReplica(1))))
|
||||
{
|
||||
WaitParams = lightWait
|
||||
};
|
||||
|
@ -188,22 +157,20 @@ public class SmokeTests : SmokeTestsBase
|
|||
|
||||
var bytes = new byte[] { 1, 2, 3 };
|
||||
|
||||
var ParentHeader = new ObjectHeader(
|
||||
var ParentHeader = new FrostFsObjectHeader(
|
||||
containerId: containerId,
|
||||
type: ModelsV2.Enums.ObjectType.Regular)
|
||||
type: FrostFsObjectType.Regular)
|
||||
{
|
||||
PayloadLength = 3
|
||||
};
|
||||
|
||||
var param = new PrmObjectPut
|
||||
{
|
||||
Header = new ObjectHeader(
|
||||
Header = new FrostFsObjectHeader(
|
||||
containerId: containerId,
|
||||
type: ModelsV2.Enums.ObjectType.Regular,
|
||||
new ObjectAttribute("fileName", "test"))
|
||||
{
|
||||
Split = new Split(),
|
||||
},
|
||||
type: FrostFsObjectType.Regular,
|
||||
[new FrostFsAttribute("fileName", "test")],
|
||||
new FrostFsSplit()),
|
||||
Payload = new MemoryStream(bytes),
|
||||
ClientCut = false
|
||||
};
|
||||
|
@ -216,30 +183,30 @@ public class SmokeTests : SmokeTestsBase
|
|||
|
||||
var networkInfo = await client.GetNetmapSnapshotAsync();
|
||||
|
||||
await CheckFilter(client, containerId, new FilterByContainerId(ObjectMatchType.Equals, containerId));
|
||||
await CheckFilter(client, containerId, new FilterByContainerId(FrostFsObjectMatchType.Equals, containerId));
|
||||
|
||||
await CheckFilter(client, containerId, new FilterByOwnerId(ObjectMatchType.Equals, OwnerId.FromKey(ecdsaKey)));
|
||||
await CheckFilter(client, containerId, new FilterByOwnerId(FrostFsObjectMatchType.Equals, FrostFsOwner.FromKey(ecdsaKey)));
|
||||
|
||||
await CheckFilter(client, containerId, new FilterBySplitId(ObjectMatchType.Equals, param.Header.Split.SplitId));
|
||||
await CheckFilter(client, containerId, new FilterBySplitId(FrostFsObjectMatchType.Equals, param.Header.Split.SplitId));
|
||||
|
||||
await CheckFilter(client, containerId, new FilterByAttribute(ObjectMatchType.Equals, "fileName", "test"));
|
||||
await CheckFilter(client, containerId, new FilterByAttribute(FrostFsObjectMatchType.Equals, "fileName", "test"));
|
||||
|
||||
await CheckFilter(client, containerId, new FilterByObjectId(ObjectMatchType.Equals, objectId));
|
||||
await CheckFilter(client, containerId, new FilterByObjectId(FrostFsObjectMatchType.Equals, objectId));
|
||||
|
||||
await CheckFilter(client, containerId, new FilterByVersion(ObjectMatchType.Equals, networkInfo.NodeInfoCollection[0].Version));
|
||||
await CheckFilter(client, containerId, new FilterByVersion(FrostFsObjectMatchType.Equals, networkInfo.NodeInfoCollection[0].Version));
|
||||
|
||||
await CheckFilter(client, containerId, new FilterByEpoch(ObjectMatchType.Equals, networkInfo.Epoch));
|
||||
await CheckFilter(client, containerId, new FilterByEpoch(FrostFsObjectMatchType.Equals, networkInfo.Epoch));
|
||||
|
||||
await CheckFilter(client, containerId, new FilterByPayloadLength(ObjectMatchType.Equals, 3));
|
||||
await CheckFilter(client, containerId, new FilterByPayloadLength(FrostFsObjectMatchType.Equals, 3));
|
||||
|
||||
var checkSum = CheckSum.CreateCheckSum(bytes);
|
||||
|
||||
await CheckFilter(client, containerId, new FilterByPayloadHash(ObjectMatchType.Equals, checkSum));
|
||||
await CheckFilter(client, containerId, new FilterByPayloadHash(FrostFsObjectMatchType.Equals, checkSum));
|
||||
|
||||
await CheckFilter(client, containerId, new FilterByPhysicallyStored());
|
||||
}
|
||||
|
||||
private static async Task CheckFilter(IFrostFSClient client, ContainerId containerId, IObjectFilter filter)
|
||||
private static async Task CheckFilter(IFrostFSClient client, FrostFsContainerId containerId, IObjectFilter filter)
|
||||
{
|
||||
var resultObjectsCount = 0;
|
||||
|
||||
|
@ -276,14 +243,14 @@ public class SmokeTests : SmokeTestsBase
|
|||
};
|
||||
|
||||
var createContainerParam = new PrmContainerCreate(
|
||||
new ModelsV2.Container(BasicAcl.PublicRW, new PlacementPolicy(true, new Replica(1))))
|
||||
new FrostFsContainerInfo(BasicAcl.PublicRW, new FrostFsPlacementPolicy(true, new FrostFsReplica(1)),[new ("testKey", "testValue")]))
|
||||
{
|
||||
Context = ctx
|
||||
};
|
||||
|
||||
var containerId = await client.CreateContainerAsync(createContainerParam);
|
||||
var createdContainer = await client.CreateContainerAsync(createContainerParam);
|
||||
|
||||
var container = await client.GetContainerAsync(new PrmContainerGet(containerId) { Context = ctx });
|
||||
var container = await client.GetContainerAsync(new PrmContainerGet(createdContainer) { Context = ctx });
|
||||
Assert.NotNull(container);
|
||||
Assert.True(callbackInvoked);
|
||||
|
||||
|
@ -291,10 +258,10 @@ public class SmokeTests : SmokeTestsBase
|
|||
|
||||
var param = new PrmObjectPut
|
||||
{
|
||||
Header = new ObjectHeader(
|
||||
containerId: containerId,
|
||||
type: ModelsV2.Enums.ObjectType.Regular,
|
||||
new ObjectAttribute("fileName", "test")),
|
||||
Header = new FrostFsObjectHeader(
|
||||
containerId: createdContainer,
|
||||
type: FrostFsObjectType.Regular,
|
||||
[new FrostFsAttribute("fileName", "test")]),
|
||||
Payload = new MemoryStream(bytes),
|
||||
ClientCut = false,
|
||||
Context = new Context
|
||||
|
@ -305,14 +272,14 @@ public class SmokeTests : SmokeTestsBase
|
|||
|
||||
var objectId = await client.PutObjectAsync(param);
|
||||
|
||||
var filter = new FilterByAttribute(ObjectMatchType.Equals, "fileName", "test");
|
||||
var filter = new FilterByAttribute(FrostFsObjectMatchType.Equals, "fileName", "test");
|
||||
|
||||
bool hasObject = false;
|
||||
await foreach (var objId in client.SearchObjectsAsync(new PrmObjectSearch(containerId) { Filters = [filter] }))
|
||||
await foreach (var objId in client.SearchObjectsAsync(new PrmObjectSearch(createdContainer) { Filters = [filter] }))
|
||||
{
|
||||
hasObject = true;
|
||||
|
||||
var objHeader = await client.GetObjectHeadAsync(new PrmObjectHeadGet(containerId, objectId));
|
||||
var objHeader = await client.GetObjectHeadAsync(new PrmObjectHeadGet(createdContainer, objectId));
|
||||
Assert.Equal((ulong)bytes.Length, objHeader.PayloadLength);
|
||||
Assert.Single(objHeader.Attributes);
|
||||
Assert.Equal("fileName", objHeader.Attributes.First().Key);
|
||||
|
@ -321,15 +288,15 @@ public class SmokeTests : SmokeTestsBase
|
|||
|
||||
Assert.True(hasObject);
|
||||
|
||||
var @object = await client.GetObjectAsync(new PrmObjectGet(containerId, objectId));
|
||||
var @object = await client.GetObjectAsync(new PrmObjectGet(createdContainer, objectId));
|
||||
|
||||
var downloadedBytes = new byte[@object.Header.PayloadLength];
|
||||
MemoryStream ms = new(downloadedBytes);
|
||||
|
||||
byte[]? chunk = null;
|
||||
ReadOnlyMemory<byte>? chunk = null;
|
||||
while ((chunk = await @object.ObjectReader!.ReadChunk()) != null)
|
||||
{
|
||||
ms.Write(chunk);
|
||||
ms.Write(chunk.Value.Span);
|
||||
}
|
||||
|
||||
Assert.Equal(MD5.HashData(bytes), MD5.HashData(downloadedBytes));
|
||||
|
@ -361,24 +328,24 @@ public class SmokeTests : SmokeTestsBase
|
|||
};
|
||||
|
||||
var createContainerParam = new PrmContainerCreate(
|
||||
new ModelsV2.Container(BasicAcl.PublicRW, new PlacementPolicy(true, new Replica(1))))
|
||||
new FrostFsContainerInfo(BasicAcl.PublicRW, new FrostFsPlacementPolicy(true, new FrostFsReplica(1))))
|
||||
{
|
||||
Context = ctx
|
||||
};
|
||||
|
||||
var containerId = await client.CreateContainerAsync(createContainerParam);
|
||||
var container = await client.CreateContainerAsync(createContainerParam);
|
||||
|
||||
var container = await client.GetContainerAsync(new PrmContainerGet(containerId) { Context = ctx });
|
||||
Assert.NotNull(container);
|
||||
var containerInfo = await client.GetContainerAsync(new PrmContainerGet(container) { Context = ctx });
|
||||
Assert.NotNull(containerInfo);
|
||||
|
||||
var bytes = GetRandomBytes(objectSize);
|
||||
|
||||
var param = new PrmObjectPut
|
||||
{
|
||||
Header = new ObjectHeader(
|
||||
containerId: containerId,
|
||||
type: ModelsV2.Enums.ObjectType.Regular,
|
||||
new ObjectAttribute("fileName", "test")),
|
||||
Header = new FrostFsObjectHeader(
|
||||
containerId: container,
|
||||
type: FrostFsObjectType.Regular,
|
||||
[new FrostFsAttribute("fileName", "test")]),
|
||||
Payload = new MemoryStream(bytes),
|
||||
ClientCut = false,
|
||||
Context = new Context
|
||||
|
@ -390,14 +357,14 @@ public class SmokeTests : SmokeTestsBase
|
|||
|
||||
var objectId = await client.PutObjectAsync(param);
|
||||
|
||||
var filter = new FilterByAttribute(ObjectMatchType.Equals, "fileName", "test");
|
||||
var filter = new FilterByAttribute(FrostFsObjectMatchType.Equals, "fileName", "test");
|
||||
|
||||
bool hasObject = false;
|
||||
await foreach (var objId in client.SearchObjectsAsync(new PrmObjectSearch(containerId) { Filters = [filter], SessionToken = token }))
|
||||
await foreach (var objId in client.SearchObjectsAsync(new PrmObjectSearch(container) { Filters = [filter], SessionToken = token }))
|
||||
{
|
||||
hasObject = true;
|
||||
|
||||
var objHeader = await client.GetObjectHeadAsync(new PrmObjectHeadGet(containerId, objectId) { SessionToken = token });
|
||||
var objHeader = await client.GetObjectHeadAsync(new PrmObjectHeadGet(container, objectId) { SessionToken = token });
|
||||
Assert.Equal((ulong)bytes.Length, objHeader.PayloadLength);
|
||||
Assert.Single(objHeader.Attributes);
|
||||
Assert.Equal("fileName", objHeader.Attributes.First().Key);
|
||||
|
@ -406,15 +373,15 @@ public class SmokeTests : SmokeTestsBase
|
|||
|
||||
Assert.True(hasObject);
|
||||
|
||||
var @object = await client.GetObjectAsync(new PrmObjectGet(containerId, objectId) { SessionToken = token });
|
||||
var @object = await client.GetObjectAsync(new PrmObjectGet(container, objectId) { SessionToken = token });
|
||||
|
||||
var downloadedBytes = new byte[@object.Header.PayloadLength];
|
||||
MemoryStream ms = new(downloadedBytes);
|
||||
|
||||
byte[]? chunk = null;
|
||||
ReadOnlyMemory<byte>? chunk = null;
|
||||
while ((chunk = await @object.ObjectReader!.ReadChunk()) != null)
|
||||
{
|
||||
ms.Write(chunk);
|
||||
ms.Write(chunk.Value.Span);
|
||||
}
|
||||
|
||||
Assert.Equal(MD5.HashData(bytes), MD5.HashData(downloadedBytes));
|
||||
|
@ -440,7 +407,7 @@ public class SmokeTests : SmokeTestsBase
|
|||
|
||||
await Cleanup(client);
|
||||
|
||||
var createContainerParam = new PrmContainerCreate(new ModelsV2.Container(BasicAcl.PublicRW, new PlacementPolicy(true, new Replica(1))))
|
||||
var createContainerParam = new PrmContainerCreate(new FrostFsContainerInfo(BasicAcl.PublicRW, new FrostFsPlacementPolicy(true, new FrostFsReplica(1))))
|
||||
{
|
||||
WaitParams = lightWait
|
||||
};
|
||||
|
@ -461,17 +428,17 @@ public class SmokeTests : SmokeTestsBase
|
|||
|
||||
var param = new PrmObjectPut
|
||||
{
|
||||
Header = new ObjectHeader(
|
||||
Header = new FrostFsObjectHeader(
|
||||
containerId: containerId,
|
||||
type: ModelsV2.Enums.ObjectType.Regular,
|
||||
new ObjectAttribute("fileName", "test")),
|
||||
type: FrostFsObjectType.Regular,
|
||||
[new FrostFsAttribute("fileName", "test")]),
|
||||
Payload = new MemoryStream(bytes),
|
||||
ClientCut = true
|
||||
};
|
||||
|
||||
var objectId = await client.PutObjectAsync(param);
|
||||
|
||||
var filter = new FilterByAttribute(ObjectMatchType.Equals, "fileName", "test");
|
||||
var filter = new FilterByAttribute(FrostFsObjectMatchType.Equals, "fileName", "test");
|
||||
|
||||
bool hasObject = false;
|
||||
await foreach (var objId in client.SearchObjectsAsync(new PrmObjectSearch(containerId, filter)))
|
||||
|
@ -492,10 +459,10 @@ public class SmokeTests : SmokeTestsBase
|
|||
var downloadedBytes = new byte[@object.Header.PayloadLength];
|
||||
MemoryStream ms = new(downloadedBytes);
|
||||
|
||||
byte[]? chunk = null;
|
||||
ReadOnlyMemory<byte>? chunk = null;
|
||||
while ((chunk = await @object.ObjectReader!.ReadChunk()) != null)
|
||||
{
|
||||
ms.Write(chunk);
|
||||
ms.Write(chunk.Value.Span);
|
||||
}
|
||||
|
||||
Assert.Equal(MD5.HashData(bytes), MD5.HashData(downloadedBytes));
|
||||
|
@ -506,7 +473,7 @@ public class SmokeTests : SmokeTestsBase
|
|||
|
||||
var deadline = DateTime.UtcNow.Add(TimeSpan.FromSeconds(5));
|
||||
|
||||
IAsyncEnumerator<ContainerId>? enumerator = null;
|
||||
IAsyncEnumerator<FrostFsContainerId>? enumerator = null;
|
||||
do
|
||||
{
|
||||
if (deadline <= DateTime.UtcNow)
|
||||
|
@ -554,37 +521,3 @@ public class SmokeTests : SmokeTestsBase
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class MetricsInterceptor() : Interceptor
|
||||
{
|
||||
public override AsyncUnaryCall<TResponse> AsyncUnaryCall<TRequest, TResponse>(
|
||||
TRequest request,
|
||||
ClientInterceptorContext<TRequest, TResponse> context,
|
||||
AsyncUnaryCallContinuation<TRequest, TResponse> continuation)
|
||||
{
|
||||
var call = continuation(request, context);
|
||||
|
||||
return new AsyncUnaryCall<TResponse>(
|
||||
HandleUnaryResponse(call),
|
||||
call.ResponseHeadersAsync,
|
||||
call.GetStatus,
|
||||
call.GetTrailers,
|
||||
call.Dispose);
|
||||
}
|
||||
|
||||
private static async Task<TResponse> HandleUnaryResponse<TResponse>(AsyncUnaryCall<TResponse> call)
|
||||
{
|
||||
var watch = new Stopwatch();
|
||||
watch.Start();
|
||||
|
||||
var response = await call.ResponseAsync;
|
||||
|
||||
watch.Stop();
|
||||
|
||||
// Do something with call info
|
||||
// var elapsed = watch.ElapsedTicks * 1_000_000/Stopwatch.Frequency;
|
||||
|
||||
return response;
|
||||
}
|
||||
}
|
||||
|
|
29
src/FrostFS.SDK.Tests/SmokeTestsBase.cs
Normal file
29
src/FrostFS.SDK.Tests/SmokeTestsBase.cs
Normal file
|
@ -0,0 +1,29 @@
|
|||
using System.Security.Cryptography;
|
||||
|
||||
using FrostFS.SDK.ClientV2;
|
||||
using FrostFS.SDK.Cryptography;
|
||||
|
||||
namespace FrostFS.SDK.SmokeTests;
|
||||
|
||||
public abstract class SmokeTestsBase
|
||||
{
|
||||
protected readonly string key = "KwHDAJ66o8FoLBjVbjP2sWBmgBMGjt7Vv4boA7xQrBoAYBE397Aq";
|
||||
protected readonly string url = "http://172.23.32.4:8080";
|
||||
|
||||
protected ECDsa Key { get; }
|
||||
|
||||
protected FrostFsOwner OwnerId { get; }
|
||||
|
||||
protected FrostFsVersion Version { get; }
|
||||
|
||||
protected Context Ctx { get; }
|
||||
|
||||
protected SmokeTestsBase()
|
||||
{
|
||||
Key = key.LoadWif();
|
||||
OwnerId = FrostFsOwner.FromKey(Key);
|
||||
Version = new FrostFsVersion(2, 13);
|
||||
|
||||
Ctx = new Context { Key = Key, OwnerId = OwnerId, Version = Version };
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue