// 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 <errno.h>
#include <unistd.h>
#include <memory>
#include <string>

#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 "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
