[#69] Fix for Patch and uint types
Signed-off-by: Pavel Gross <p.gross@yadro.com>
This commit is contained in:
parent
eebba7665b
commit
0816be732a
20 changed files with 212 additions and 153 deletions
|
@ -77,7 +77,7 @@ public class ContainerTests : SmokeTestsBase
|
|||
Assert.Empty(container.PlacementPolicy.Value.Filters);
|
||||
|
||||
Assert.Single(container.PlacementPolicy.Value.Replicas);
|
||||
Assert.Equal(3, container.PlacementPolicy.Value.Replicas[0].Count);
|
||||
Assert.Equal(3u, container.PlacementPolicy.Value.Replicas[0].Count);
|
||||
Assert.Equal(0u, container.PlacementPolicy.Value.Replicas[0].EcParityCount);
|
||||
Assert.Equal(0u, container.PlacementPolicy.Value.Replicas[0].EcDataCount);
|
||||
Assert.Equal("", container.PlacementPolicy.Value.Replicas[0].Selector);
|
||||
|
@ -191,7 +191,7 @@ public class ContainerTests : SmokeTestsBase
|
|||
Assert.Empty(subFilter.Filters);
|
||||
|
||||
Assert.Single(container.PlacementPolicy.Value.Replicas);
|
||||
Assert.Equal(1, container.PlacementPolicy.Value.Replicas[0].Count);
|
||||
Assert.Equal(1u, container.PlacementPolicy.Value.Replicas[0].Count);
|
||||
Assert.Equal(0u, container.PlacementPolicy.Value.Replicas[0].EcParityCount);
|
||||
Assert.Equal(0u, container.PlacementPolicy.Value.Replicas[0].EcDataCount);
|
||||
Assert.Equal("", container.PlacementPolicy.Value.Replicas[0].Selector);
|
||||
|
|
|
@ -29,8 +29,8 @@ public class InterceptorTests() : SmokeTestsBase
|
|||
Assert.True(callbackInvoked);
|
||||
Assert.True(interceptorInvoked);
|
||||
|
||||
Assert.Equal(2, result.Version.Major);
|
||||
Assert.Equal(13, result.Version.Minor);
|
||||
Assert.Equal(2u, result.Version.Major);
|
||||
Assert.Equal(13u, result.Version.Minor);
|
||||
Assert.Equal(NodeState.Online, result.State);
|
||||
Assert.Equal(33, result.PublicKey.Length);
|
||||
Assert.NotNull(result.Addresses);
|
||||
|
|
|
@ -28,8 +28,8 @@ public class SmokeClientTests : SmokeTestsBase
|
|||
|
||||
var result = await client.GetNodeInfoAsync(default);
|
||||
|
||||
Assert.Equal(2, result.Version.Major);
|
||||
Assert.Equal(13, result.Version.Minor);
|
||||
Assert.Equal(2u, result.Version.Major);
|
||||
Assert.Equal(13u, result.Version.Minor);
|
||||
Assert.Equal(NodeState.Online, result.State);
|
||||
Assert.Equal(33, result.PublicKey.Length);
|
||||
Assert.Single(result.Addresses);
|
||||
|
@ -103,8 +103,8 @@ public class SmokeClientTests : SmokeTestsBase
|
|||
Assert.True(callbackInvoked);
|
||||
Assert.True(interceptorInvoked);
|
||||
|
||||
Assert.Equal(2, result.Version.Major);
|
||||
Assert.Equal(13, result.Version.Minor);
|
||||
Assert.Equal(2u, result.Version.Major);
|
||||
Assert.Equal(13u, result.Version.Minor);
|
||||
Assert.Equal(NodeState.Online, result.State);
|
||||
Assert.Equal(33, result.PublicKey.Length);
|
||||
Assert.NotNull(result.Addresses);
|
||||
|
|
|
@ -26,7 +26,7 @@ public class ObjectTests(ITestOutputHelper testOutputHelper) : SmokeTestsBase
|
|||
[InlineData(false, 2, 3)]
|
||||
[InlineData(true, 2, 1)]
|
||||
[InlineData(false, 2, 1)]
|
||||
public async void FullScenario(bool unique, uint backupFactor, int replicas)
|
||||
public async void FullScenario(bool unique, uint backupFactor, uint replicas)
|
||||
{
|
||||
var client = FrostFSClient.GetInstance(ClientOptions, GrpcChannel);
|
||||
_testOutputHelper.WriteLine("client created");
|
||||
|
@ -121,9 +121,16 @@ public class ObjectTests(ITestOutputHelper testOutputHelper) : SmokeTestsBase
|
|||
await ValidateFilters(client, containerId, objectId, null, (ulong)bytes.Length);
|
||||
_testOutputHelper.WriteLine($"\tfilters validated");
|
||||
|
||||
if (type != clientCut)
|
||||
if (type != clientCut && bytes.Length > 1024 + 64 && bytes.Length < 20 * 1024 * 1024)
|
||||
{
|
||||
await ValidatePatch(client, containerId, bytes, objectId);
|
||||
// patch payload only
|
||||
await ValidatePatch(client, containerId, bytes, true, objectId, [], false);
|
||||
|
||||
// patch attributes only
|
||||
await ValidatePatch(client, containerId, bytes, false, objectId, [new("a1", "v1"), new("a2", "v2")], false);
|
||||
|
||||
// patch payload and attributes
|
||||
await ValidatePatch(client, containerId, bytes, true, objectId, [new("a3", "v3"), new("a4", "v4")], true);
|
||||
_testOutputHelper.WriteLine($"\tpatch validated");
|
||||
}
|
||||
|
||||
|
@ -199,51 +206,73 @@ public class ObjectTests(ITestOutputHelper testOutputHelper) : SmokeTestsBase
|
|||
_testOutputHelper.WriteLine($"\t\trange {range.Offset};{range.Length} validated");
|
||||
}
|
||||
|
||||
private static async Task ValidatePatch(IFrostFSClient client, FrostFsContainerId containerId, byte[] bytes, FrostFsObjectId objectId)
|
||||
private static async Task ValidatePatch(
|
||||
IFrostFSClient client,
|
||||
FrostFsContainerId containerId,
|
||||
byte[] bytes,
|
||||
bool patchPayload,
|
||||
FrostFsObjectId objectId,
|
||||
FrostFsAttributePair[] attributes,
|
||||
bool replaceAttributes)
|
||||
{
|
||||
if (bytes.Length < 1024 + 64 || bytes.Length > 5900)
|
||||
return;
|
||||
|
||||
var patch = new byte[1024];
|
||||
for (int i = 0; i < patch.Length; i++)
|
||||
byte[]? patch = null;
|
||||
FrostFsRange range = new();
|
||||
if (patchPayload)
|
||||
{
|
||||
patch[i] = 32;
|
||||
}
|
||||
patch = new byte[1024];
|
||||
for (int i = 0; i < patch.Length; i++)
|
||||
{
|
||||
patch[i] = 32;
|
||||
}
|
||||
|
||||
var range = new FrostFsRange(64, (ulong)patch.Length);
|
||||
range = new FrostFsRange(64, (ulong)patch.Length);
|
||||
}
|
||||
|
||||
var patchParams = new PrmObjectPatch(
|
||||
new FrostFsAddress(containerId, objectId),
|
||||
payload: new MemoryStream(patch),
|
||||
payload: new MemoryStream(patch ?? []),
|
||||
maxChunkLength: 1024,
|
||||
range: range);
|
||||
range: range,
|
||||
replaceAttributes: replaceAttributes,
|
||||
newAttributes: attributes);
|
||||
|
||||
var newIbjId = await client.PatchObjectAsync(patchParams, default);
|
||||
|
||||
var @object = await client.GetObjectAsync(new PrmObjectGet(containerId, newIbjId), default);
|
||||
|
||||
var downloadedBytes = new byte[@object.Header.PayloadLength];
|
||||
MemoryStream ms = new(downloadedBytes);
|
||||
|
||||
ReadOnlyMemory<byte>? chunk;
|
||||
while ((chunk = await @object.ObjectReader!.ReadChunk()) != null)
|
||||
if (patchPayload)
|
||||
{
|
||||
ms.Write(chunk.Value.Span);
|
||||
var downloadedBytes = new byte[@object.Header.PayloadLength];
|
||||
MemoryStream ms = new(downloadedBytes);
|
||||
|
||||
ReadOnlyMemory<byte>? chunk;
|
||||
while ((chunk = await @object.ObjectReader!.ReadChunk()) != null)
|
||||
{
|
||||
ms.Write(chunk.Value.Span);
|
||||
}
|
||||
|
||||
for (int i = 0; i < (int)range.Offset; i++)
|
||||
Assert.Equal(downloadedBytes[i], bytes[i]);
|
||||
|
||||
var rangeEnd = range.Offset + range.Length;
|
||||
|
||||
for (int i = (int)range.Offset; i < (int)rangeEnd; i++)
|
||||
Assert.Equal(downloadedBytes[i], patch[i - (int)range.Offset]);
|
||||
|
||||
for (int i = (int)rangeEnd; i < bytes.Length; i++)
|
||||
Assert.Equal(downloadedBytes[i], bytes[i]);
|
||||
}
|
||||
|
||||
for (int i = 0; i < (int)range.Offset; i++)
|
||||
Assert.Equal(downloadedBytes[i], bytes[i]);
|
||||
|
||||
var rangeEnd = range.Offset + range.Length;
|
||||
|
||||
for (int i = (int)range.Offset; i < (int)rangeEnd; i++)
|
||||
Assert.Equal(downloadedBytes[i], patch[i - (int)range.Offset]);
|
||||
|
||||
for (int i = (int)rangeEnd; i < bytes.Length; i++)
|
||||
Assert.Equal(downloadedBytes[i], bytes[i]);
|
||||
if (attributes != null && attributes.Length > 0)
|
||||
{
|
||||
foreach (var newAttr in attributes)
|
||||
{
|
||||
var i = @object!.Header!.Attributes!.Count(p => p.Key == newAttr.Key && p.Value == newAttr.Value);
|
||||
Assert.Equal(1, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private async Task ValidateFilters(IFrostFSClient client, FrostFsContainerId containerId, FrostFsObjectId objectId, SplitId? splitId, ulong length)
|
||||
{
|
||||
var ecdsaKey = keyString.LoadWif();
|
||||
|
@ -318,7 +347,7 @@ public class ObjectTests(ITestOutputHelper testOutputHelper) : SmokeTestsBase
|
|||
Assert.NotNull(objHeader);
|
||||
|
||||
Assert.Equal(containerId.GetValue(), objHeader.ContainerId.GetValue());
|
||||
|
||||
|
||||
Assert.Equal(expected.HeaderInfo!.OwnerId!.Value, objHeader.OwnerId!.Value);
|
||||
Assert.Equal(expected.HeaderInfo.Version!.Major, objHeader.Version!.Major);
|
||||
Assert.Equal(expected.HeaderInfo.Version!.Minor, objHeader.Version!.Minor);
|
||||
|
@ -338,7 +367,6 @@ public class ObjectTests(ITestOutputHelper testOutputHelper) : SmokeTestsBase
|
|||
Assert.Null(objHeader.Split);
|
||||
}
|
||||
|
||||
|
||||
private static async Task<FrostFsObjectId> CreateObjectServerCut(IFrostFSClient client, FrostFsContainerId containerId, byte[] bytes)
|
||||
{
|
||||
var header = new FrostFsObjectHeader(
|
||||
|
|
|
@ -14,7 +14,7 @@ public class ContainerTest : ContainerTestsBase
|
|||
[Theory]
|
||||
[InlineData(1, "test", 0, 0)]
|
||||
|
||||
public void ReplicaToMessagelTest(int count, string selector, uint ecDataCount, uint ecParityCount)
|
||||
public void ReplicaToMessagelTest(uint count, string selector, uint ecDataCount, uint ecParityCount)
|
||||
{
|
||||
FrostFsReplica replica = new()
|
||||
{
|
||||
|
@ -26,7 +26,7 @@ public class ContainerTest : ContainerTestsBase
|
|||
|
||||
Replica message = replica.ToMessage();
|
||||
|
||||
Assert.Equal((uint)count, message.Count);
|
||||
Assert.Equal(count, message.Count);
|
||||
Assert.Equal(selector, message.Selector);
|
||||
Assert.Equal(ecDataCount, message.EcDataCount);
|
||||
Assert.Equal(ecParityCount, message.EcParityCount);
|
||||
|
|
|
@ -69,13 +69,13 @@ public class PlacementPolicyTests : NetworkTestsBase
|
|||
var rep0 = result.Replicas[0];
|
||||
Assert.Equal(2u, rep0.EcDataCount);
|
||||
Assert.Equal(3u, rep0.EcParityCount);
|
||||
Assert.Equal(4, rep0.Count);
|
||||
Assert.Equal(4u, rep0.Count);
|
||||
Assert.Equal("selector1", rep0.Selector);
|
||||
|
||||
var rep1 = result.Replicas[1];
|
||||
Assert.Equal(5u, rep1.EcDataCount);
|
||||
Assert.Equal(6u, rep1.EcParityCount);
|
||||
Assert.Equal(7, rep1.Count);
|
||||
Assert.Equal(7u, rep1.Count);
|
||||
Assert.Equal("selector2", rep1.Selector);
|
||||
|
||||
var f0 = result.Filters[0];
|
||||
|
@ -126,7 +126,7 @@ public class PlacementPolicyTests : NetworkTestsBase
|
|||
|
||||
FrostFsReplica model = replica.ToModel();
|
||||
|
||||
Assert.Equal(count, (uint)model.Count);
|
||||
Assert.Equal(count, model.Count);
|
||||
Assert.Equal(selector, model.Selector);
|
||||
Assert.Equal(ecDataCount, model.EcDataCount);
|
||||
Assert.Equal(ecParityCount, model.EcParityCount);
|
||||
|
@ -140,7 +140,7 @@ public class PlacementPolicyTests : NetworkTestsBase
|
|||
[InlineData(1, " ", 2, 3)]
|
||||
[InlineData(10, "!", 0, 0)]
|
||||
[InlineData(1, "123", 0, 0)]
|
||||
public void ReplicaToMessagelTest(int count, string selector, uint ecDataCount, uint ecParityCount)
|
||||
public void ReplicaToMessagelTest(uint count, string selector, uint ecDataCount, uint ecParityCount)
|
||||
{
|
||||
FrostFsReplica replica = new ()
|
||||
{
|
||||
|
@ -152,7 +152,7 @@ public class PlacementPolicyTests : NetworkTestsBase
|
|||
|
||||
Replica message = replica.ToMessage();
|
||||
|
||||
Assert.Equal((uint)count, message.Count);
|
||||
Assert.Equal(count, message.Count);
|
||||
Assert.Equal(selector, message.Selector);
|
||||
Assert.Equal(ecDataCount, message.EcDataCount);
|
||||
Assert.Equal(ecParityCount, message.EcParityCount);
|
||||
|
@ -235,11 +235,11 @@ public class PlacementPolicyTests : NetworkTestsBase
|
|||
|
||||
Assert.Single(message.Filters);
|
||||
|
||||
var subfilter = message.Filters[0];
|
||||
Assert.Equal(name, subfilter.Name);
|
||||
Assert.Equal(key, subfilter.Key);
|
||||
Assert.Equal(operation, (int)subfilter.Op);
|
||||
Assert.Equal(value, subfilter.Value);
|
||||
var grpcFilter = message.Filters[0];
|
||||
Assert.Equal(name, grpcFilter.Name);
|
||||
Assert.Equal(key, grpcFilter.Key);
|
||||
Assert.Equal(operation, (int)grpcFilter.Op);
|
||||
Assert.Equal(value, grpcFilter.Value);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
@ -265,11 +265,11 @@ public class PlacementPolicyTests : NetworkTestsBase
|
|||
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
var subfilter = message.Filters[i];
|
||||
Assert.Equal(names[i], subfilter.Name);
|
||||
Assert.Equal(keys[i], subfilter.Key);
|
||||
Assert.Equal(operations[i], (int)subfilter.Op);
|
||||
Assert.Equal(values[i], subfilter.Value);
|
||||
var grpcFilter = message.Filters[i];
|
||||
Assert.Equal(names[i], grpcFilter.Name);
|
||||
Assert.Equal(keys[i], grpcFilter.Key);
|
||||
Assert.Equal(operations[i], (int)grpcFilter.Op);
|
||||
Assert.Equal(values[i], grpcFilter.Value);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -248,12 +248,12 @@ public class FilterDto
|
|||
Key ?? string.Empty,
|
||||
(int)Op,
|
||||
Value ?? string.Empty,
|
||||
Filters != null ? Filters.Select(f => f.Filter).ToArray() : []);
|
||||
Filters != null ? [.. Filters.Select(f => f.Filter)] : []);
|
||||
}
|
||||
|
||||
public class ReplicaDto
|
||||
{
|
||||
public int Count { get; set; }
|
||||
public uint Count { get; set; }
|
||||
|
||||
public string? Selector { get; set; }
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue