#ifndef SRC_TOOLS_SINGLEJAR_TEST_UTIL_H_
#define SRC_TOOLS_SINGLEJAR_TEST_UTIL_H_
// 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.

#include <string>

#include "tools/cpp/runfiles/runfiles_src.h"

namespace singlejar_test_util {
  using std::string;

  // Allocate a file with given name and size. The contents is zeroes.
  bool AllocateFile(const string& name, size_t size);

  // Combine the passed arguments to a shell command and run it.
  // E.g. calling RunCommand("cmd", "arg1", "arg2", nullptr) results in
  // running 'cmd arg1 arg2'.
  // Returns command's return code.
  int RunCommand(const char *cmd, ...);

  // List zip file contents.
  void LsZip(const char *zip_name);

  // Return the full path to a file in a temporary directory.
  std::string OutputFilePath(const string& relpath);

  // Verify given archive contents by running 'zip -Tv' on it,
  // returning its exit code (0 means success). Diagnostics goes
  // tp stdout/stderr.
  int VerifyZip(const string& zip_path);

  // Read the contents of the given archive entry and return it as string.
  string GetEntryContents(const string &zip_path, const string& entry_name);

  // Create a file in the output directory with given contents,
  // return file's path.
  string CreateTextFile(const string& file_path, const char *contents);

}  // namespace singlejar_test_util
#endif  //  SRC_TOOLS_SINGLEJAR_TEST_UTIL_H_
