[#25] Client: Implement Patch and Range methods
Signed-off-by: Pavel Gross <p.gross@yadro.com>
This commit is contained in:
parent
bff8d67867
commit
003b7fdfdd
51 changed files with 1338 additions and 137 deletions
|
@ -10,6 +10,8 @@ using FrostFS.SDK.Cryptography;
|
|||
|
||||
using Google.Protobuf;
|
||||
|
||||
using static FrostFS.Object.ECInfo.Types;
|
||||
|
||||
namespace FrostFS.SDK.Tests;
|
||||
|
||||
[SuppressMessage("Reliability", "CA2007:Consider calling ConfigureAwait on the awaited task", Justification = "Default Value is correct for tests")]
|
||||
|
@ -223,4 +225,121 @@ public class ObjectTest : ObjectTestsBase
|
|||
|
||||
Assert.Null(response.Split);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async void GetRangeTest()
|
||||
{
|
||||
Mocker.ResultObjectIds!.Add(SHA256.HashData([]));
|
||||
|
||||
Random rnd = new();
|
||||
var bytes = new byte[1024];
|
||||
rnd.NextBytes(bytes);
|
||||
|
||||
Mocker.RangeResponse = bytes;
|
||||
|
||||
Mocker.ObjectId = new ObjectID { Value = ByteString.CopyFrom(SHA256.HashData(Encoding.UTF8.GetBytes("test"))) }.ToModel();
|
||||
|
||||
var param = new PrmRangeGet(ContainerId, Mocker.ObjectId, new FrostFsRange(100, (ulong)Mocker.RangeResponse.Length));
|
||||
|
||||
var result = await GetClient().GetRangeAsync(param);
|
||||
|
||||
Assert.NotNull(Mocker.GetRangeRequest);
|
||||
|
||||
Assert.Equal(param.Range.Offset, Mocker.GetRangeRequest.Body.Range.Offset);
|
||||
Assert.Equal(param.Range.Length, Mocker.GetRangeRequest.Body.Range.Length);
|
||||
|
||||
Assert.NotNull(result);
|
||||
|
||||
var chunk = await result.ReadChunk();
|
||||
|
||||
var chunkBytes = chunk.Value.Span.ToArray();
|
||||
|
||||
Assert.Equal(chunkBytes.Length, Mocker.RangeResponse.Length);
|
||||
|
||||
Assert.Equal(SHA256.HashData(bytes), SHA256.HashData(Mocker.RangeResponse));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async void GetRangeHashTest()
|
||||
{
|
||||
Mocker.ResultObjectIds!.Add(SHA256.HashData([]));
|
||||
|
||||
Random rnd = new();
|
||||
var bytes = new byte[1024];
|
||||
rnd.NextBytes(bytes);
|
||||
|
||||
var salt = new byte[32];
|
||||
rnd.NextBytes(salt);
|
||||
|
||||
var hash = new byte[32];
|
||||
rnd.NextBytes(hash);
|
||||
|
||||
Mocker.RangeResponse = bytes;
|
||||
var len = (ulong)bytes.Length;
|
||||
|
||||
Mocker.RangeHashResponses.Add(ByteString.CopyFrom(hash));
|
||||
|
||||
Mocker.ObjectId = new ObjectID { Value = ByteString.CopyFrom(SHA256.HashData(Encoding.UTF8.GetBytes("test"))) }.ToModel();
|
||||
|
||||
var param = new PrmRangeHashGet(ContainerId, Mocker.ObjectId, [new FrostFsRange(100, len)], salt);
|
||||
|
||||
var result = await GetClient().GetRangeHashAsync(param);
|
||||
|
||||
Assert.NotNull(Mocker.GetRangeHashRequest);
|
||||
|
||||
Assert.Equal(param.Ranges[0].Offset, Mocker.GetRangeHashRequest.Body.Ranges[0].Offset);
|
||||
Assert.Equal(param.Ranges[0].Length, Mocker.GetRangeHashRequest.Body.Ranges[0].Length);
|
||||
|
||||
Assert.NotNull(result);
|
||||
Assert.Single(result);
|
||||
|
||||
Assert.Equal(SHA256.HashData(hash), SHA256.HashData(result.First().ToArray()));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async void PatchTest()
|
||||
{
|
||||
Mocker.ObjectId = new ObjectID { Value = ByteString.CopyFrom(SHA256.HashData(Encoding.UTF8.GetBytes("test"))) }.ToModel();
|
||||
|
||||
var address = new FrostFsAddress(ContainerId, Mocker.ObjectId);
|
||||
|
||||
Mocker.ResultObjectIds!.Add(SHA256.HashData([]));
|
||||
|
||||
Random rnd = new();
|
||||
var patch = new byte[32];
|
||||
rnd.NextBytes(patch);
|
||||
|
||||
var range = new FrostFsRange(8, (ulong)patch.Length);
|
||||
|
||||
var param = new PrmObjectPatch(address)
|
||||
{
|
||||
Payload = new MemoryStream(patch),
|
||||
MaxPayloadPatchChunkLength = 32,
|
||||
Range = range
|
||||
};
|
||||
|
||||
var result = await GetClient().PatchObjectAsync(param);
|
||||
|
||||
Assert.NotNull(result);
|
||||
|
||||
Assert.NotNull(result.Value);
|
||||
|
||||
Assert.NotNull(Mocker.PatchStreamWriter);
|
||||
Assert.Single(Mocker.PatchStreamWriter.Messages);
|
||||
|
||||
var sentMessages = Mocker.PatchStreamWriter!.Messages;
|
||||
|
||||
var body = sentMessages.First().GetBody() as Object.PatchRequest.Types.Body;
|
||||
|
||||
Assert.NotNull(body);
|
||||
|
||||
Assert.True(Mocker.PatchStreamWriter.CompletedTask);
|
||||
|
||||
Assert.Equal(address.ContainerId, body.Address.ContainerId);
|
||||
Assert.Equal(address.ObjectId, body.Address.ObjectId);
|
||||
|
||||
Assert.Equal(32, body.Patch.Chunk.Length);
|
||||
|
||||
Assert.Equal(SHA256.HashData(patch), SHA256.HashData(body.Patch.Chunk.ToArray()));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue