aboutsummaryrefslogtreecommitdiff
path: root/src/zenserver-test/zenserver-test.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2024-11-25 23:59:25 +0100
committerGitHub Enterprise <[email protected]>2024-11-25 23:59:25 +0100
commit220078251f4ac334df6542c7e29b78a2db0caec6 (patch)
treea96666fd48d074d6f7d43b1e8b9962e3f2ee8e2b /src/zenserver-test/zenserver-test.cpp
parent5.5.14-pre0 (diff)
downloadzen-220078251f4ac334df6542c7e29b78a2db0caec6.tar.xz
zen-220078251f4ac334df6542c7e29b78a2db0caec6.zip
snapshot crash (#234)
* snapshot test * use proper IoBuffer constructor to take handle ownership
Diffstat (limited to 'src/zenserver-test/zenserver-test.cpp')
-rw-r--r--src/zenserver-test/zenserver-test.cpp97
1 files changed, 96 insertions, 1 deletions
diff --git a/src/zenserver-test/zenserver-test.cpp b/src/zenserver-test/zenserver-test.cpp
index 382c9a095..1eba769d2 100644
--- a/src/zenserver-test/zenserver-test.cpp
+++ b/src/zenserver-test/zenserver-test.cpp
@@ -137,6 +137,16 @@ main(int argc, char** argv)
namespace zen::tests {
+IoBuffer
+MakeCbObjectPayload(std::function<void(CbObjectWriter& Writer)> WriteCB)
+{
+ CbObjectWriter Writer;
+ WriteCB(Writer);
+ IoBuffer Payload = Writer.Save().GetBuffer().AsIoBuffer();
+ Payload.SetContentType(ZenContentType::kCbObject);
+ return Payload;
+};
+
TEST_CASE("default.single")
{
std::filesystem::path TestDir = TestEnv.CreateNewTestDir();
@@ -412,7 +422,92 @@ TEST_CASE("project.basic")
ZEN_INFO("+++++++");
}
- SUBCASE("build store op commit") { ZEN_INFO("-------"); }
+
+ SUBCASE("snapshot")
+ {
+ zen::CbObjectWriter OpWriter;
+ OpWriter << "key"
+ << "foo";
+
+ const std::string_view ChunkId{
+ "00000000"
+ "00000000"
+ "00010000"};
+ auto FileOid = zen::Oid::FromHexString(ChunkId);
+
+ OpWriter.BeginArray("files");
+ OpWriter.BeginObject();
+ OpWriter << "id" << FileOid;
+ OpWriter << "clientpath"
+ << "/{engine}/client/side/path";
+ OpWriter << "serverpath" << BinPath.c_str();
+ OpWriter.EndObject();
+ OpWriter.EndArray();
+
+ zen::CbObject Op = OpWriter.Save();
+
+ zen::CbPackage OpPackage(Op);
+
+ zen::BinaryWriter MemOut;
+ legacy::SaveCbPackage(OpPackage, MemOut);
+
+ {
+ zen::StringBuilder<64> PostUri;
+ PostUri << BaseUri << "/new";
+ auto Response = cpr::Post(cpr::Url{PostUri.c_str()}, cpr::Body{(const char*)MemOut.Data(), MemOut.Size()});
+
+ REQUIRE(!Response.error);
+ CHECK(Response.status_code == 201);
+ }
+
+ // Read file data, it is raw and uncompressed
+ {
+ zen::StringBuilder<128> ChunkGetUri;
+ ChunkGetUri << BaseUri << "/" << ChunkId;
+ auto Response = cpr::Get(cpr::Url{ChunkGetUri.c_str()});
+
+ REQUIRE(!Response.error);
+ CHECK(Response.status_code == 200);
+ IoBuffer Data(IoBuffer::Wrap, Response.text.data(), Response.text.length());
+ IoBuffer ReferenceData = IoBufferBuilder::MakeFromFile(RootPath / BinPath);
+ CHECK(ReferenceData.GetSize() == Data.GetSize());
+ CHECK(ReferenceData.GetView().EqualBytes(Data.GetView()));
+ }
+
+ {
+ IoBuffer Payload = MakeCbObjectPayload([&](CbObjectWriter& Writer) { Writer.AddString("method"sv, "snapshot"sv); });
+ zen::StringBuilder<64> PostUri;
+ PostUri << BaseUri << "/rpc";
+ auto Response = cpr::Post(cpr::Url{PostUri.c_str()},
+ cpr::Body{(const char*)Payload.Data(), Payload.Size()},
+ cpr::Header{{"Content-Type", "application/x-ue-cb"}});
+ REQUIRE(!Response.error);
+ CHECK(Response.status_code == 200);
+ }
+
+ // Read chunk data, it is now compressed
+ {
+ zen::StringBuilder<128> ChunkGetUri;
+ ChunkGetUri << BaseUri << "/" << ChunkId;
+ auto Response = cpr::Get(cpr::Url{ChunkGetUri.c_str()}, cpr::Header{{"Accept-Type", "application/x-ue-comp"}});
+
+ REQUIRE(!Response.error);
+ CHECK(Response.status_code == 200);
+ IoBuffer Data(IoBuffer::Wrap, Response.text.data(), Response.text.length());
+ IoHash RawHash;
+ uint64_t RawSize;
+ CompressedBuffer Compressed = CompressedBuffer::FromCompressed(SharedBuffer(Data), RawHash, RawSize);
+ CHECK(Compressed);
+ IoBuffer DataDecompressed = Compressed.Decompress().AsIoBuffer();
+ IoBuffer ReferenceData = IoBufferBuilder::MakeFromFile(RootPath / BinPath);
+ CHECK(RawSize == ReferenceData.GetSize());
+ CHECK(ReferenceData.GetSize() == DataDecompressed.GetSize());
+ CHECK(ReferenceData.GetView().EqualBytes(DataDecompressed.GetView()));
+ }
+
+ ZEN_INFO("+++++++");
+ }
+
SUBCASE("test chunk not found error")
{
for (size_t I = 0; I < 65; I++)