aboutsummaryrefslogtreecommitdiff
path: root/src/zenserver-test/cache-tests.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/zenserver-test/cache-tests.cpp')
-rw-r--r--src/zenserver-test/cache-tests.cpp182
1 files changed, 182 insertions, 0 deletions
diff --git a/src/zenserver-test/cache-tests.cpp b/src/zenserver-test/cache-tests.cpp
index 1ce5f3be4..ef801833e 100644
--- a/src/zenserver-test/cache-tests.cpp
+++ b/src/zenserver-test/cache-tests.cpp
@@ -2361,6 +2361,188 @@ TEST_CASE("zcache.rpc.allpolicies")
}
}
+TEST_CASE("zcache.GetChunksRanges")
+{
+ using namespace std::literals;
+ using namespace utils;
+
+ std::string_view TestBucket = "allpoliciestest"sv;
+ std::string_view TestNamespace = "ue4.ddc"sv;
+
+ ZenConfig UpstreamCfg = ZenConfig::New(TestEnv.GetNewPortNumber());
+ ZenServerInstance UpstreamServer(TestEnv);
+ SpawnServer(UpstreamServer, UpstreamCfg);
+
+ ZenConfig LocalCfg = ZenConfig::NewWithUpstream(TestEnv.GetNewPortNumber(), UpstreamCfg.Port);
+ ZenServerInstance LocalServer(TestEnv);
+ SpawnServer(LocalServer, LocalCfg);
+
+ const auto BaseUri = fmt::format("http://localhost:{}/z$", LocalServer.GetBasePort());
+ HttpClient Http{BaseUri};
+
+ const uint64_t BlobSize = 500u * 1024u;
+ IoHash RawHash;
+ uint64_t BlockSize = 0;
+
+ {
+ cacherequests::PutCacheValuesRequest PutRequest = {.AcceptMagic = kCbPkgMagic,
+ .DefaultPolicy = CachePolicy::Default,
+ .Namespace = std::string(TestNamespace)};
+ CompressedBuffer CompressedBlob = CreateSemiRandomBlob(BlobSize);
+ RawHash = CompressedBlob.DecodeRawHash();
+ OodleCompressor Compressor;
+ OodleCompressionLevel CompressionLevel;
+ CHECK(CompressedBlob.TryGetCompressParameters(Compressor, CompressionLevel, BlockSize));
+ CHECK(BlockSize > 0);
+
+ PutRequest.Requests.push_back(
+ cacherequests::PutCacheValueRequest{.Key = {.Bucket = std::string(TestBucket), .Hash = RawHash}, .Body = CompressedBlob});
+
+ CbPackage Package;
+ CHECK(PutRequest.Format(Package));
+
+ IoBuffer Body = FormatPackageBody(Package);
+ HttpClient::Response Result = Http.Post("/$rpc", Body, {{"Accept", "application/x-ue-cbpkg"}});
+ CHECK_MESSAGE(Result.StatusCode == HttpResponseCode::OK, "PutCacheValues unexpectedly failed.");
+ }
+
+ // GetCacheChunks full
+ {
+ cacherequests::GetCacheChunksRequest GetCacheChunksRequest = {
+ .AcceptMagic = kCbPkgMagic,
+ .AcceptOptions = (uint16_t)(RpcAcceptOptions::kAllowPartialCacheChunks),
+ .DefaultPolicy = CachePolicy::Default,
+ .Namespace = std::string(TestNamespace)};
+
+ GetCacheChunksRequest.Requests.push_back({.Key = {.Bucket = std::string(TestBucket), .Hash = RawHash},
+ //.ValueId = OutOfRangeRequest.ValueId,
+ .ChunkId = RawHash});
+
+ CbPackage Package;
+ CHECK(GetCacheChunksRequest.Format(Package));
+
+ IoBuffer Body = FormatPackageBody(Package);
+ HttpClient::Response Result = Http.Post("/$rpc", Body, {{"Accept", "application/x-ue-cbpkg"}});
+ CHECK_MESSAGE(Result.StatusCode == HttpResponseCode::OK, "GetCacheChunks unexpectedly failed.");
+ CbPackage Response = ParsePackageMessage(Result.ResponsePayload);
+ bool Loaded = !Response.IsNull();
+ CHECK_MESSAGE(Loaded, "GetCacheChunks response failed to load.");
+ cacherequests::GetCacheChunksResult GetCacheChunksResult;
+ CHECK(GetCacheChunksResult.Parse(Response));
+ CHECK_MESSAGE(GetCacheChunksResult.Results.size() == 1, "GetCacheChunks response count did not match request count.");
+ CHECK_EQ(GetCacheChunksResult.Results[0].RawHash, RawHash);
+ CHECK_EQ(GetCacheChunksResult.Results[0].FragmentHash, IoHash::Zero);
+ CHECK_EQ(GetCacheChunksResult.Results[0].FragmentOffset, 0u);
+ }
+
+ // GetCacheChunks in range
+ {
+ cacherequests::GetCacheChunksRequest GetCacheChunksRequest = {
+ .AcceptMagic = kCbPkgMagic,
+ .AcceptOptions = (uint16_t)(RpcAcceptOptions::kAllowPartialCacheChunks),
+ .DefaultPolicy = CachePolicy::Default,
+ .Namespace = std::string(TestNamespace)};
+
+ const uint64_t RawOffset = BlobSize / 4u;
+ const uint64_t RawSize = BlobSize / 8u;
+
+ GetCacheChunksRequest.Requests.push_back({.Key = {.Bucket = std::string(TestBucket), .Hash = RawHash},
+ //.ValueId = OutOfRangeRequest.ValueId,
+ .ChunkId = RawHash,
+ .RawOffset = RawOffset,
+ .RawSize = RawSize});
+
+ CbPackage Package;
+ CHECK(GetCacheChunksRequest.Format(Package));
+
+ IoBuffer Body = FormatPackageBody(Package);
+ HttpClient::Response Result = Http.Post("/$rpc", Body, {{"Accept", "application/x-ue-cbpkg"}});
+ CHECK_MESSAGE(Result.StatusCode == HttpResponseCode::OK, "GetCacheChunks unexpectedly failed.");
+ CbPackage Response = ParsePackageMessage(Result.ResponsePayload);
+ bool Loaded = !Response.IsNull();
+ CHECK_MESSAGE(Loaded, "GetCacheChunks response failed to load.");
+ cacherequests::GetCacheChunksResult GetCacheChunksResult;
+ CHECK(GetCacheChunksResult.Parse(Response));
+ CHECK_MESSAGE(GetCacheChunksResult.Results.size() == 1, "GetCacheChunks response count did not match request count.");
+ CHECK_EQ(GetCacheChunksResult.Results[0].RawHash, RawHash);
+ CHECK_NE(GetCacheChunksResult.Results[0].FragmentHash, IoHash::Zero);
+ CHECK_NE(GetCacheChunksResult.Results[0].FragmentHash, RawHash);
+ const uint64_t ExpectedRawOffset = (RawOffset / BlockSize) * BlockSize;
+ const uint64_t ExpectedRawSize = RoundUp(RawSize, BlockSize);
+ CHECK_EQ(GetCacheChunksResult.Results[0].FragmentOffset, ExpectedRawOffset);
+ CHECK_EQ(GetCacheChunksResult.Results[0].Body.DecodeRawSize(), ExpectedRawSize);
+ }
+
+ // GetCacheChunks partially out of bounds
+ {
+ cacherequests::GetCacheChunksRequest GetCacheChunksRequest = {
+ .AcceptMagic = kCbPkgMagic,
+ .AcceptOptions = (uint16_t)(RpcAcceptOptions::kAllowPartialCacheChunks),
+ .DefaultPolicy = CachePolicy::Default,
+ .Namespace = std::string(TestNamespace)};
+ const uint64_t RawOffset = BlobSize - 512u;
+ const uint64_t RawSize = 1u * 1024u;
+ GetCacheChunksRequest.Requests.push_back({.Key = {.Bucket = std::string(TestBucket), .Hash = RawHash},
+ //.ValueId = OutOfRangeRequest.ValueId,
+ .ChunkId = RawHash,
+ .RawOffset = RawOffset,
+ .RawSize = RawSize});
+
+ CbPackage Package;
+ CHECK(GetCacheChunksRequest.Format(Package));
+
+ IoBuffer Body = FormatPackageBody(Package);
+ HttpClient::Response Result = Http.Post("/$rpc", Body, {{"Accept", "application/x-ue-cbpkg"}});
+ CHECK_MESSAGE(Result.StatusCode == HttpResponseCode::OK, "GetCacheChunks unexpectedly failed.");
+ CbPackage Response = ParsePackageMessage(Result.ResponsePayload);
+ bool Loaded = !Response.IsNull();
+ CHECK_MESSAGE(Loaded, "GetCacheChunks response failed to load.");
+ cacherequests::GetCacheChunksResult GetCacheChunksResult;
+ CHECK(GetCacheChunksResult.Parse(Response));
+ CHECK_MESSAGE(GetCacheChunksResult.Results.size() == 1, "GetCacheChunks response count did not match request count.");
+ CHECK_EQ(GetCacheChunksResult.Results[0].RawHash, RawHash);
+ CHECK_NE(GetCacheChunksResult.Results[0].FragmentHash, IoHash::Zero);
+ CHECK_NE(GetCacheChunksResult.Results[0].FragmentHash, RawHash);
+ const uint64_t ExpectedRawOffset = (RawOffset / BlockSize) * BlockSize;
+ const uint64_t ExpectedRawSize = BlobSize - ExpectedRawOffset;
+ CHECK_EQ(GetCacheChunksResult.Results[0].FragmentOffset, ExpectedRawOffset);
+ CHECK_EQ(GetCacheChunksResult.Results[0].Body.DecodeRawSize(), ExpectedRawSize);
+ }
+
+ // GetCacheChunks out of bounds
+ {
+ cacherequests::GetCacheChunksRequest GetCacheChunksRequest = {
+ .AcceptMagic = kCbPkgMagic,
+ .AcceptOptions = (uint16_t)(RpcAcceptOptions::kAllowPartialCacheChunks),
+ .DefaultPolicy = CachePolicy::Default,
+ .Namespace = std::string(TestNamespace)};
+
+ GetCacheChunksRequest.Requests.push_back({.Key = {.Bucket = std::string(TestBucket), .Hash = RawHash},
+ //.ValueId = OutOfRangeRequest.ValueId,
+ .ChunkId = RawHash,
+ .RawOffset = BlobSize,
+ .RawSize = 1u * 1024u});
+
+ CbPackage Package;
+ CHECK(GetCacheChunksRequest.Format(Package));
+
+ IoBuffer Body = FormatPackageBody(Package);
+ HttpClient::Response Result = Http.Post("/$rpc", Body, {{"Accept", "application/x-ue-cbpkg"}});
+ CHECK_MESSAGE(Result.StatusCode == HttpResponseCode::OK, "GetCacheChunks unexpectedly failed.");
+ CbPackage Response = ParsePackageMessage(Result.ResponsePayload);
+ bool Loaded = !Response.IsNull();
+ CHECK_MESSAGE(Loaded, "GetCacheChunks response failed to load.");
+ cacherequests::GetCacheChunksResult GetCacheChunksResult;
+ CHECK(GetCacheChunksResult.Parse(Response));
+ CHECK_MESSAGE(GetCacheChunksResult.Results.size() == 1, "GetCacheChunks response count did not match request count.");
+ CHECK_EQ(GetCacheChunksResult.Results[0].RawHash, RawHash);
+ CHECK_EQ(GetCacheChunksResult.Results[0].RawSize, 0u);
+ CHECK_EQ(!!GetCacheChunksResult.Results[0].Body, false);
+ CHECK_EQ(GetCacheChunksResult.Results[0].FragmentHash, IoHash::Zero);
+ CHECK_EQ(GetCacheChunksResult.Results[0].FragmentOffset, 0u);
+ }
+}
+
} // namespace zen::tests
#endif