aboutsummaryrefslogtreecommitdiff
path: root/zenserver-test/zenserver-test.cpp
diff options
context:
space:
mode:
authorPer Larsson <[email protected]>2021-10-29 11:14:12 +0200
committerPer Larsson <[email protected]>2021-10-29 11:14:12 +0200
commiteadca136e5db2895379dda0f1a66f019d3914a82 (patch)
tree3602079f557a811ee373648600c9beb8aa10a10a /zenserver-test/zenserver-test.cpp
parentFixed crash at startup when updating manifest. (diff)
downloadzen-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.cpp103
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)