blob: ab4e96edcb4cc929e49beeaec550e806dab8aef4 [file] [log] [blame]
// Copyright 2020 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 <cstdlib>
#include <iostream>
#include <string>
void basic_part1_test(std::string current_dir_arg) {
if (current_dir_arg != "--current-dir") {
std::cerr << "error: argument \"--current-dir\" not found.\n";
std::exit(1);
}
}
void basic_part2_test(std::string current_dir, const char* envp[]) {
if (current_dir != "${pwd}") {
std::cerr << "error: unsubsituted ${pwd} not found.\n";
std::exit(1);
}
const std::string current_dir_env = "CURRENT_DIR=${pwd}/test_path";
bool found = false;
for (int i = 0; envp[i] != nullptr; ++i) {
if (current_dir_env == envp[i]) {
found = true;
break;
}
}
if (!found) {
std::cerr << "unsubsituted CURRENT_DIR not found.\n";
std::exit(1);
}
}
void subst_pwd_test(std::string current_dir, const char* envp[]) {
if (current_dir.find("${pwd}") != std::string::npos) {
std::cerr << "error: argument ${pwd} substitution failed.\n";
std::exit(1);
}
bool found = false;
for (int i = 0; envp[i] != nullptr; ++i) {
const std::string env = envp[i];
if (env.rfind("CURRENT_DIR", 0) == 0) {
found = true;
if (env.find("${pwd}") != std::string::npos) {
std::cerr
<< "error: environment variable ${pwd} substitution failed.\n";
std::exit(1);
}
break;
}
}
if (!found) {
std::cerr << "CURRENT_DIR not found.\n";
std::exit(1);
}
}
void env_files_test(const char* envp[]) {
const std::string must_exist[] = {
"FOO=BAR",
"FOOBAR=BARFOO",
"BAR=FOO",
"ENV_ESCAPE=with\nnew line",
"ENV_NO_ESCAPE=with no new line\\",
"ENV_ESCAPE_WITH_BACKSLASH=new line\\\nhere",
};
for (const std::string& env : must_exist) {
bool found = false;
for (int i = 0; envp[i] != nullptr; ++i) {
if (env == envp[i]) {
found = true;
break;
}
}
if (!found) {
std::cerr << "error: environment variable \"" << env << "\" not found.\n";
std::exit(1);
}
}
}
void arg_files_test(int argc, const char* argv[]) {
const std::string must_exist[] = {
"--arg1=foo",
"--arg2",
"foo bar",
"--arg2=bar",
"--arg3",
"foobar",
"arg with\nnew line",
"arg with\\",
"no new line",
"arg with\\\nnew line and a trailing backslash",
};
for (const std::string& arg : must_exist) {
bool found = false;
for (int i = 0; i < argc; ++i) {
if (arg == argv[i]) {
found = true;
break;
}
}
if (!found) {
std::cerr << "error: argument \"" << arg << "\" not found.\n";
std::exit(1);
}
}
}
void test_stdout() {
for (int i = 0; i < 10000; ++i) {
// On windows writing LF to any stream in text mode gets changed to CRLF
// Since the test file is saved using CRLF, we are forcing the same on
// non windows systems
#if defined(_WIN32)
std::cout << "Child process to stdout : " << i << "\n";
#else
std::cout << "Child process to stdout : " << i << "\r\n";
#endif // defined(_WIN32)
}
}
void test_stderr() { std::cerr << "This is the stderr output"; }
int main(int argc, const char* argv[], const char* envp[]) {
if (argc < 4) {
std::cerr << "error: Invalid number of args exected at least 4 got " << argc
<< ".\n";
return 1;
}
std::string test_config = argv[1];
bool combined = test_config == "combined";
if (combined || test_config == "basic") {
basic_part1_test(argv[2]);
}
if (combined || test_config == "subst-pwd") {
subst_pwd_test(argv[3], envp);
} else if (test_config == "basic") {
basic_part2_test(argv[3], envp);
}
if (combined || test_config == "env-files") {
env_files_test(envp);
}
if (combined || test_config == "arg-files") {
arg_files_test(argc, argv);
}
if (combined || test_config == "stdout") {
test_stdout();
}
if (combined || test_config == "stderr") {
test_stderr();
}
}