diff --git a/tests/test_editor_units.cpp b/tests/test_editor_units.cpp index 92fc6518..c37fbf40 100644 --- a/tests/test_editor_units.cpp +++ b/tests/test_editor_units.cpp @@ -220,6 +220,34 @@ TEST_CASE("WCP unpack rejects bad magic", "[wcp]") { fs::remove_all("test_wcp_out"); } +TEST_CASE("WCP unpack rejects truncated file body", "[wcp]") { + namespace fs = std::filesystem; + fs::create_directories("test_wcp_out"); + std::string info = R"({"name":"truncated"})"; + { + // Hand-write a WCP that declares dataSize=1000 but only writes 50. + std::ofstream f("test_wcp_out/short.wcp", std::ios::binary); + f.write(reinterpret_cast(&kWCP_MAGIC), 4); + uint32_t fileCount = 1, infoSize = static_cast(info.size()); + f.write(reinterpret_cast(&fileCount), 4); + f.write(reinterpret_cast(&infoSize), 4); + f.write(info.data(), infoSize); + std::string path = "data.bin"; + uint16_t pathLen = static_cast(path.size()); + f.write(reinterpret_cast(&pathLen), 2); + f.write(path.data(), pathLen); + uint32_t declared = 1000; + f.write(reinterpret_cast(&declared), 4); + std::string actual(50, 'X'); + f.write(actual.data(), actual.size()); + } + REQUIRE_FALSE(ContentPacker::unpackZone("test_wcp_out/short.wcp", + "test_wcp_out/dest")); + // Confirm we did NOT silently write the partial data. + REQUIRE_FALSE(fs::exists("test_wcp_out/dest/truncated/data.bin")); + fs::remove_all("test_wcp_out"); +} + // ============== EditorBrush::getInfluence tests ============== #include "editor_brush.hpp"