// Copyright 2016 The Bazel Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /* * Check processing jar with preamble. * * A jar/zip file may contain a preambleL: an arbitrary data before * the actual entries, and the decompressors (e.g., unzip) can handle * this. This feature can be used to create "self-extracting" * archives: use 'cat' command to prepend a binary implementing the * extractor to a zip archive, and then run 'zip -A' on the result to * adjust the entry offsets stored in the zip archive. Actually, some * of the archive reading code works even if 'zip -A' wasn't run. */ #include #include #include #include #include "src/main/cpp/util/file.h" #include "src/main/cpp/util/port.h" #include "src/main/cpp/util/strings.h" #include "src/tools/singlejar/input_jar.h" #include "src/tools/singlejar/test_util.h" #include "googletest/include/gtest/gtest.h" using singlejar_test_util::OutputFilePath; using singlejar_test_util::AllocateFile; using singlejar_test_util::RunCommand; namespace { #if !defined(DATA_DIR_TOP) #define DATA_DIR_TOP #endif const char kEmptyJar[] = DATA_DIR_TOP "src/tools/singlejar/data/empty.zip"; void VerifyEmpty(const std::string &jar_path) { InputJar input_jar; ASSERT_TRUE(input_jar.Open(jar_path)); const LH *lh; const CDH *cdh; while ((cdh = input_jar.NextEntry(&lh))) { ADD_FAILURE() << "There should not be any entries in " << jar_path; } input_jar.Close(); } // Check that empty zip file (i.e., a valid zip file with no entries) is // handled correctly. TEST(InputJarBadjarTest, EmptyZipFile) { VerifyEmpty(kEmptyJar); } // Preambled empty zip. TEST(InputJarPreambledTest, Empty) { std::string out_path = OutputFilePath("empty.jwp"); std::string exe_path = OutputFilePath("exe"); ASSERT_TRUE(AllocateFile(exe_path, 100)); ASSERT_EQ(0, RunCommand("cat", exe_path.c_str(), kEmptyJar, ">", out_path.c_str(), nullptr)); VerifyEmpty(out_path); } } // namespace