diff options
| author | Per Larsson <[email protected]> | 2021-10-29 11:14:12 +0200 |
|---|---|---|
| committer | Per Larsson <[email protected]> | 2021-10-29 11:14:12 +0200 |
| commit | eadca136e5db2895379dda0f1a66f019d3914a82 (patch) | |
| tree | 3602079f557a811ee373648600c9beb8aa10a10a /zenserver-test/zenserver-test.cpp | |
| parent | Fixed crash at startup when updating manifest. (diff) | |
| download | zen-eadca136e5db2895379dda0f1a66f019d3914a82.tar.xz zen-eadca136e5db2895379dda0f1a66f019d3914a82.zip | |
First pass batch request.
Diffstat (limited to 'zenserver-test/zenserver-test.cpp')
| -rw-r--r-- | zenserver-test/zenserver-test.cpp | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/zenserver-test/zenserver-test.cpp b/zenserver-test/zenserver-test.cpp index 23be9f729..639f40689 100644 --- a/zenserver-test/zenserver-test.cpp +++ b/zenserver-test/zenserver-test.cpp @@ -1880,6 +1880,109 @@ TEST_CASE("zcache.policy") } } +TEST_CASE("zcache.batch") +{ + using namespace std::literals; + + auto CreateCacheKey = [](uint32_t Id) -> zen::IoHash { return zen::IoHash::HashBuffer(&Id, sizeof(uint32_t)); }; + + auto CreateCacheRecord = [](uint32_t Key, size_t PayloadSize) -> zen::CbPackage { + std::vector<uint8_t> Data; + Data.resize(PayloadSize); + for (size_t Idx = 0; Idx < PayloadSize; ++Idx) + { + Data[Idx] = Idx % 255; + } + + auto Compressed = zen::CompressedBuffer::Compress(SharedBuffer::MakeView(Data.data(), Data.size())); + zen::CbAttachment Attachment(Compressed); + + zen::CbObjectWriter CacheRecord; + CacheRecord << "key" << Key << "data" << Attachment; + + zen::CbPackage Package; + Package.SetObject(CacheRecord.Save()); + Package.AddAttachment(Attachment); + + return Package; + }; + + auto ToIoBuffer = [](zen::CbPackage Package) -> zen::IoBuffer { + zen::BinaryWriter MemStream; + Package.Save(MemStream); + return zen::IoBuffer(zen::IoBuffer::Clone, MemStream.Data(), MemStream.Size()); + }; + + SUBCASE("get cache records") + { + std::filesystem::path TestDir = TestEnv.CreateNewTestDir(); + const uint16_t PortNumber = 13337; + const auto BaseUri = "http://localhost:{}/z$"_format(PortNumber); + + ZenServerInstance Inst(TestEnv); + Inst.SetTestDir(TestDir); + Inst.SpawnServer(PortNumber); + Inst.WaitUntilReady(); + + const std::string_view Bucket = "mybucket"sv; + const uint32_t BatchCount = 128; + + // Create cachereords + { + for (uint32_t Key = 1; Key <= BatchCount; ++Key) + { + const IoHash CacheKey = CreateCacheKey(Key); + CbPackage CacheRecord = CreateCacheRecord(Key, 4096); + IoBuffer Payload = ToIoBuffer(CacheRecord); + + cpr::Response Result = cpr::Put(cpr::Url{"{}/{}/{}"_format(BaseUri, Bucket, CacheKey)}, + cpr::Body{(const char*)Payload.Data(), Payload.Size()}, + cpr::Header{{"Content-Type", "application/x-ue-cbpkg"}}); + + CHECK(Result.status_code == 201); + } + } + + // Get all as a batch + { + CbObjectWriter BatchQuery; + + BatchQuery.BeginArray("records"sv); + for (uint32_t Key = 1; Key <= BatchCount; ++Key) + { + const IoHash CacheKey = CreateCacheKey(Key); + BatchQuery.BeginObject(); + BatchQuery << "bucket"sv << Bucket << "key" << CacheKey; + BatchQuery.EndObject(); + } + BatchQuery.EndArray(); + + zen::BinaryWriter Payload; + BatchQuery.Save(Payload); + + cpr::Response Result = cpr::Get(cpr::Url{"{}/$batch"_format(BaseUri)}, + cpr::Header{{"Content-Type", "application/x-ue-cb"}, {"Accept", "application/x-ue-cbpkg"}}, + cpr::Body{(const char*)Payload.GetData(), Payload.GetSize()}); + + CHECK(Result.status_code == 200); + + zen::IoBuffer Response(zen::IoBuffer::Wrap, Result.text.data(), Result.text.size()); + zen::CbPackage Package; + const bool Ok = Package.TryLoad(Response); + + CbObjectView BatchResponse = Package.GetObject(); + for (uint32_t ExpectedKey = 1; CbFieldView ResponseView : BatchResponse["records"]) + { + CbObjectView Response = ResponseView.AsObjectView(); + const uint32_t Key = Response["key"sv].AsUInt32(); + const IoHash Attachment = Response["data"sv].AsHash(); + CHECK(Key == ExpectedKey); + ExpectedKey++; + } + } + } +} + struct RemoteExecutionRequest { RemoteExecutionRequest(std::string_view Host, int Port, std::filesystem::path& TreePath) |