From a8543d4a8876e190fae2841494164b7565b17edd Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Tue, 28 May 2024 11:59:19 +0200 Subject: [PATCH] Zipmerge: port tests from internal repo --- .github/workflows/zipmerge-test.yml | 23 +++ MODULE.bazel | 1 + misc/bazel/internal/zipmerge/BUILD.bazel | 13 +- .../zipmerge/test-files/CPython-partial.zip | Bin 0 -> 3909 bytes .../internal/zipmerge/test-files/CPython.zip | Bin 0 -> 9481 bytes .../zipmerge/test-files/almost-minimal.zip | Bin 0 -> 163 bytes .../internal/zipmerge/test-files/empty.zip | Bin 0 -> 22 bytes .../zipmerge/test-files/minimal-x3.zip | Bin 0 -> 414 bytes .../internal/zipmerge/test-files/minimal.zip | Bin 0 -> 150 bytes .../slf4j-api-classes-with-footers.jar | Bin 0 -> 341 bytes .../slf4j-api-classes-without-footers.jar | Bin 0 -> 309 bytes .../bazel/internal/zipmerge/zipmerge_test.cpp | 155 ++++++++++++++++++ 12 files changed, 188 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/zipmerge-test.yml create mode 100644 misc/bazel/internal/zipmerge/test-files/CPython-partial.zip create mode 100644 misc/bazel/internal/zipmerge/test-files/CPython.zip create mode 100644 misc/bazel/internal/zipmerge/test-files/almost-minimal.zip create mode 100644 misc/bazel/internal/zipmerge/test-files/empty.zip create mode 100644 misc/bazel/internal/zipmerge/test-files/minimal-x3.zip create mode 100644 misc/bazel/internal/zipmerge/test-files/minimal.zip create mode 100644 misc/bazel/internal/zipmerge/test-files/slf4j-api-classes-with-footers.jar create mode 100644 misc/bazel/internal/zipmerge/test-files/slf4j-api-classes-without-footers.jar create mode 100644 misc/bazel/internal/zipmerge/zipmerge_test.cpp diff --git a/.github/workflows/zipmerge-test.yml b/.github/workflows/zipmerge-test.yml new file mode 100644 index 00000000000..8492b045c04 --- /dev/null +++ b/.github/workflows/zipmerge-test.yml @@ -0,0 +1,23 @@ +name: "Test zipmerge code" + +on: + pull_request: + paths: + - "misc/bazel/internal/zipmerge/**" + - "MODULE.bazel" + - ".bazelrc*" + branches: + - main + - "rc/*" + +permissions: + contents: read + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - run: | + bazel test //misc/bazel/internal/zipmerge:test diff --git a/MODULE.bazel b/MODULE.bazel index f9ffd739b46..dff694ce0d8 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -24,6 +24,7 @@ bazel_dep(name = "nlohmann_json", version = "3.11.3", repo_name = "json") bazel_dep(name = "fmt", version = "10.0.0") bazel_dep(name = "gazelle", version = "0.36.0") bazel_dep(name = "rules_dotnet", version = "0.15.1") +bazel_dep(name = "googletest", version = "1.14.0.bcr.1") bazel_dep(name = "buildifier_prebuilt", version = "6.4.0", dev_dependency = True) diff --git a/misc/bazel/internal/zipmerge/BUILD.bazel b/misc/bazel/internal/zipmerge/BUILD.bazel index 332d74ecab5..bb944cc0343 100644 --- a/misc/bazel/internal/zipmerge/BUILD.bazel +++ b/misc/bazel/internal/zipmerge/BUILD.bazel @@ -4,9 +4,6 @@ cc_library( "zipmerge.cpp", ], hdrs = ["zipmerge.h"], - visibility = ["//visibility:public"], - # this is to make internal repo be able to keep on testing this code - # before we fully port tests here ) cc_binary( @@ -20,4 +17,12 @@ cc_binary( ], ) -#TODO port tests from internal repo +cc_test( + name = "test", + size = "small", + deps = [ + ":lib", + "@bazel_tools//tools/cpp/runfiles", + "@googletest//:gtest_main", + ], +) diff --git a/misc/bazel/internal/zipmerge/test-files/CPython-partial.zip b/misc/bazel/internal/zipmerge/test-files/CPython-partial.zip new file mode 100644 index 0000000000000000000000000000000000000000..a5a30ec3f90b6ba00898f0b123b7d14592da00e4 GIT binary patch literal 3909 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 literal 0 HcmV?d00001 diff --git a/misc/bazel/internal/zipmerge/test-files/CPython.zip b/misc/bazel/internal/zipmerge/test-files/CPython.zip new file mode 100644 index 0000000000000000000000000000000000000000..2cc0dd85e3986f4f1dd524c3916e2c098437af5b GIT binary patch literal 9481 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 literal 0 HcmV?d00001 diff --git a/misc/bazel/internal/zipmerge/test-files/almost-minimal.zip b/misc/bazel/internal/zipmerge/test-files/almost-minimal.zip new file mode 100644 index 0000000000000000000000000000000000000000..44541199b782c45c8679e4f33065b0c5ddf09b1e GIT binary patch literal 163 zcmWIWW@h1H0D(holU${aJhR{hvO$;wh|@B2QuRtIN-|P&a`F|*^NVs)c)0?+8JX-E zaA{HjY6AfUFo`gN3o63MAi=Qw>OafJQWqE}@9;E3rUSfL*+AMDfiMb48-vXN05Pv3 AN&o-= literal 0 HcmV?d00001 diff --git a/misc/bazel/internal/zipmerge/test-files/empty.zip b/misc/bazel/internal/zipmerge/test-files/empty.zip new file mode 100644 index 0000000000000000000000000000000000000000..15cb0ecb3e219d1701294bfdf0fe3f5cb5d208e7 GIT binary patch literal 22 NcmWIWW@Tf*000g10H*)| literal 0 HcmV?d00001 diff --git a/misc/bazel/internal/zipmerge/test-files/minimal-x3.zip b/misc/bazel/internal/zipmerge/test-files/minimal-x3.zip new file mode 100644 index 0000000000000000000000000000000000000000..a9854656fb0414e710db62782e18ea4931b75855 GIT binary patch literal 414 zcmWIWW@h1H0D;x5lU%_JC;<{p(of6GN!2TN<|ABAso5M1$nFjRnho=|&WQ-SJGfYLBsTnrEqMg|E6 duJ~N$M^YCU(dhthRyL3}Mj(s=(rO?M0{|`L6|VpQ literal 0 HcmV?d00001 diff --git a/misc/bazel/internal/zipmerge/test-files/slf4j-api-classes-with-footers.jar b/misc/bazel/internal/zipmerge/test-files/slf4j-api-classes-with-footers.jar new file mode 100644 index 0000000000000000000000000000000000000000..b3723a437c2289aa05c0000facb0615aa7791d59 GIT binary patch literal 341 zcmWIWW@Zs#;Nak3Sdl!(jR6U8GO#fCx`sIFdiuHP|2xINz|0Wf&CUT*!30$nfK#&w zPz7AGucM!*n`>~0p0C?y-!rFuymj?1@_OrPojY@WbCAIm;|EWR^t^m^Jbf>gu43Vg zcp-UY_6)6zAL6QN&zERfJQo*zBCa}(VQTiLqK`$4U`MPxc0tM+XoU+92Y53wi7=r0 u0p>uEA5a0@Q6L|oYehB|84f!vFyKEk!c` literal 0 HcmV?d00001 diff --git a/misc/bazel/internal/zipmerge/test-files/slf4j-api-classes-without-footers.jar b/misc/bazel/internal/zipmerge/test-files/slf4j-api-classes-without-footers.jar new file mode 100644 index 0000000000000000000000000000000000000000..498cc8966326fa7e0539d8b31381bf44a0f81274 GIT binary patch literal 309 zcmWIWW@Zs#VBp|jSdl!(jR6RlKm-tQGO#fCx`sIFdiuHP|2xINz|0VUqIl)83sTNN zg)Tr0Gyj@-BlPJ4nQ*O0?ho*0Wdo^V0>WA#y$Hl%004TLLyrIe literal 0 HcmV?d00001 diff --git a/misc/bazel/internal/zipmerge/zipmerge_test.cpp b/misc/bazel/internal/zipmerge/zipmerge_test.cpp new file mode 100644 index 00000000000..4ac907d60d2 --- /dev/null +++ b/misc/bazel/internal/zipmerge/zipmerge_test.cpp @@ -0,0 +1,155 @@ +#include "misc/bazel/internal/zipmerge/zipmerge.h" + +#include +#include +#include +#include + +#include +#include +#include "tools/cpp/runfiles/runfiles.h" + +using bazel::tools::cpp::runfiles::Runfiles; +using namespace std::string_literals; + +namespace codeql_testing { + +TEST(Zipmerge, ReadAndWrite) { + char buf[7] = {0}; + write2(buf + 1, 0xF2F1U); + write4(buf + 3, 0xF6F5F4F3UL); + EXPECT_STREQ(buf, "\x00\xF1\xF2\xF3\xF4\xF5\xF6"); + EXPECT_EQ(read2(buf + 1), 0xF2F1U); + EXPECT_EQ(read4(buf + 3), 0xF6F5F4F3UL); +} + +TEST(Zipmerge, AppendCd) { + output_cd.length = 0; + append_cd((const uint8_t*)"a", 1); + append_cd((const uint8_t*)"bcd", 3); + append_cd((const uint8_t*)"efghijklmno", 11); + EXPECT_EQ(output_cd.length, 15); + std::string_view bytes{reinterpret_cast(output_cd.bytes), 15}; + EXPECT_EQ(bytes, "abcdefghijklmno"); +} + +TEST(Zipmerge, ShouldIncludeFilenameNow) { + EXPECT_TRUE(should_include_filename_now((const uint8_t*)"x", 1)); + EXPECT_FALSE(should_include_filename_now((const uint8_t*)"x", 1)); + EXPECT_TRUE(should_include_filename_now((const uint8_t*)"y", 1)); + EXPECT_TRUE(should_include_filename_now((const uint8_t*)"yy", 2)); + EXPECT_FALSE(should_include_filename_now((const uint8_t*)"x", 1)); + EXPECT_FALSE(should_include_filename_now((const uint8_t*)"yy", 2)); +} + +TEST(Zipmerge, FindEocd) { + uint8_t buf[500] = {0}; + auto i = 0u; + for (auto& b : buf) { + b = i % 256; + } + memcpy(buf + 17, eocd_signature.data(), eocd_signature.size()); + memcpy(buf + 101, eocd_signature.data(), eocd_signature.size()); + EXPECT_EQ(find_eocd(buf, sizeof(buf)), buf + 101); +} + +const size_t num_hash_bytes = 128 / 8; +const size_t num_hash_uint64s = 2; + +std::string read_file(std::string_view filename) { + std::ifstream f(filename, std::ios::binary); + EXPECT_TRUE(f) << "Could not open '" << filename << "' (" << std::strerror(errno) << ")"; + if (!f) { + return 0; + } + std::stringstream contents; + contents << f.rdbuf(); + return contents.str(); +} + +std::string get_file(const char* name) { + static auto runfiles = []{ +std::string error; + auto ret = Runfiles::CreateForTest(&error); + EXPECT_TRUE(ret) << error; +return ret; +}(); + return runfiles->Rlocation("_main/misc/bazel/internal/zipmerge/test-files/"s + name); +} + +void expect_same_file(const char* actual, const char* expected) { + auto expected_file = get_file(expected); + auto actual_contents = read_file(actual); + unlink(actual); // If tests start failing, you might want to comment out this unlink in order to + // inspect the output. + ASSERT_EQ(actual_contents, read_file(expected_file)) + << "contents of " << actual << " do not match contents of " << expected_file; +} + +template +const char* zipmerge(Args*... inputs) { + reset(); + const char* output = nullptr; + std::vector args{"self"}; + std::array flags{{inputs...}}; + auto i = 0u; + for (; i < flags.size() && std::string_view{flags[i]}.starts_with("-"); ++i) { + args.push_back(flags[i]); + } + output = flags[i]; + args.push_back(output); + ++i; + for (; i < flags.size(); ++i) { + args.push_back(std::string_view{flags[i]}.starts_with("-") ? flags[i] : get_file(flags[i])); + } + EXPECT_EQ(zipmerge_main(args.size(), args.data()), 0); + return output; +} + +TEST(Zipmerge, Identity) { + expect_same_file(zipmerge("out.zip", "CPython.zip"), "CPython.zip"); +} + +TEST(Zipmerge, Idempotent) { + expect_same_file(zipmerge("out.zip", "CPython.zip", "CPython.zip", "CPython.zip"), "CPython.zip"); +} + +TEST(Zipmerge, RemoveEverything) { + expect_same_file(zipmerge("--remove=CPython", "out.zip", "CPython.zip"), "empty.zip"); +} + +TEST(Zipmerge, RemoveEverythingWildcard) { + expect_same_file(zipmerge("--remove=*on", "out.zip", "CPython.zip"), "empty.zip"); +} + +TEST(Zipmerge, RemovePrefixedPaths) { + expect_same_file(zipmerge("--remove=My/CPython", "out.zip", "--prefix=My", "CPython.zip"), + "empty.zip"); +} +TEST(Zipmerge, RemoveSome) { + expect_same_file(zipmerge("--remove=CPython/Extensions.qll", "--remove=CPython/ReturnTypeTrap.ql", + "out.zip", "CPython.zip"), + "CPython-partial.zip"); +} + +TEST(Zipmerge, RemoveSomeWildcard) { + expect_same_file(zipmerge("--remove=CPython/E*.qll", "--remove=CPython/R*", "--remove=CP*l", + "out.zip", "CPython.zip"), + "CPython-partial.zip"); +} + +TEST(Zipmerge, Prefix) { + expect_same_file( + zipmerge("out.zip", "minimal.zip", "--prefix=a", "minimal.zip", "--prefix=b", "minimal.zip"), + "minimal-x3.zip"); +} + +TEST(Zipmerge, InputFileOrder) { + expect_same_file(zipmerge("out.zip", "minimal.zip", "almost-minimal.zip"), "almost-minimal.zip"); +} + +TEST(Zipmerge, LocalFileFooters) { + expect_same_file(zipmerge("out.jar", "slf4j-api-classes-with-footers.jar"), + "slf4j-api-classes-without-footers.jar"); +} +} // namespace codeql_testing