diff options
Diffstat (limited to 'src/zenserver-test/cache-tests.cpp')
| -rw-r--r-- | src/zenserver-test/cache-tests.cpp | 182 |
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 |