diff options
Diffstat (limited to 'src/test/cpp')
-rw-r--r-- | src/test/cpp/BUILD | 2 | ||||
-rw-r--r-- | src/test/cpp/option_processor_test.cc | 168 | ||||
-rw-r--r-- | src/test/cpp/startup_options_test.cc | 73 |
3 files changed, 239 insertions, 4 deletions
diff --git a/src/test/cpp/BUILD b/src/test/cpp/BUILD index 20c36d552e..500974501d 100644 --- a/src/test/cpp/BUILD +++ b/src/test/cpp/BUILD @@ -37,12 +37,14 @@ cc_test( name = "option_processor_test", size = "small", srcs = ["option_processor_test.cc"], + tags = ["requires_internet"], deps = [ "//src/main/cpp:blaze_util", "//src/main/cpp:option_processor", "//src/main/cpp:workspace_layout", "//src/main/cpp/util", "//third_party:gtest", + "@com_googlesource_code_re2//:re2", ], ) diff --git a/src/test/cpp/option_processor_test.cc b/src/test/cpp/option_processor_test.cc index ab8ea59847..88fb52f42c 100644 --- a/src/test/cpp/option_processor_test.cc +++ b/src/test/cpp/option_processor_test.cc @@ -17,10 +17,11 @@ #include "src/main/cpp/blaze_util.h" #include "src/main/cpp/blaze_util_platform.h" #include "src/main/cpp/option_processor-internal.h" -#include "src/main/cpp/workspace_layout.h" #include "src/main/cpp/util/file.h" #include "src/main/cpp/util/file_platform.h" +#include "src/main/cpp/workspace_layout.h" #include "gtest/gtest.h" +#include "re2/re2.h" namespace blaze { @@ -167,8 +168,7 @@ TEST_F(OptionProcessorTest, CanParseDifferentStartupArgs) { option_processor_->GetExplicitCommandArguments()); } - -TEST_F(OptionProcessorTest, CommandLineBlazercTest) { +TEST_F(OptionProcessorTest, CommandLineBazelrcTest) { const std::string cmdline_rc_path = blaze_util::JoinPath(workspace_, "mybazelrc"); ASSERT_TRUE(blaze_util::MakeDirectories( @@ -185,9 +185,25 @@ TEST_F(OptionProcessorTest, CommandLineBlazercTest) { option_processor_->ParseOptions(args, workspace_, cwd_, &error)) << error; ASSERT_EQ(expected_error, error); + + // Check that the startup option option provenance message prints the correct + // information for the incorrect flag, and does not print the command-line + // provided startup flags. + testing::internal::CaptureStderr(); + option_processor_->PrintStartupOptionsProvenanceMessage(); + const std::string& output = testing::internal::GetCapturedStderr(); + + EXPECT_PRED1( + [](std::string actualOutput) { + return RE2::FullMatch( + actualOutput, + "INFO: Reading 'startup' options from .*mybazelrc: " + "--foo\n"); + }, + output); } -TEST_F(OptionProcessorTest, NoMasterBlazercAndBlazercWorkTogetherCorrectly) { +TEST_F(OptionProcessorTest, NoMasterBazelrcAndBazelrcWorkTogetherCorrectly) { const std::string cmdline_rc_path = blaze_util::JoinPath(workspace_, "mybazelrc"); ASSERT_TRUE(blaze_util::MakeDirectories( @@ -211,6 +227,150 @@ TEST_F(OptionProcessorTest, NoMasterBlazercAndBlazercWorkTogetherCorrectly) { << error; EXPECT_EQ(123, option_processor_->GetParsedStartupOptions()->max_idle_secs); + + // Check that the startup option option provenance message prints the correct + // information for the provided rc, and prints nothing for the master bazelrc. + testing::internal::CaptureStderr(); + option_processor_->PrintStartupOptionsProvenanceMessage(); + const std::string& output = testing::internal::GetCapturedStderr(); + + EXPECT_PRED1( + [](std::string actualOutput) { + return RE2::FullMatch( + actualOutput, + "INFO: Reading 'startup' options from .*mybazelrc: " + "--max_idle_secs=123\n"); + }, + output); +} + +TEST_F(OptionProcessorTest, MultipleStartupArgsInMasterBazelrcWorksCorrectly) { + // Add startup flags to the master bazelrc. + const std::string master_rc_path = + blaze_util::JoinPath(workspace_, "tools/bazel.rc"); + ASSERT_TRUE( + blaze_util::MakeDirectories(blaze_util::Dirname(master_rc_path), 0755)); + ASSERT_TRUE(blaze_util::WriteFile( + "startup --max_idle_secs=42\nstartup --io_nice_level=6", master_rc_path, + 0755)); + + const std::vector<std::string> args = {"bazel", "build"}; + std::string error; + ASSERT_EQ(blaze_exit_code::SUCCESS, + option_processor_->ParseOptions(args, workspace_, cwd_, &error)) + << error; + + EXPECT_EQ(42, option_processor_->GetParsedStartupOptions()->max_idle_secs); + EXPECT_EQ(6, option_processor_->GetParsedStartupOptions()->io_nice_level); + + // Check that the startup options get grouped together properly in the output + // message. + testing::internal::CaptureStderr(); + option_processor_->PrintStartupOptionsProvenanceMessage(); + const std::string& output = testing::internal::GetCapturedStderr(); + + EXPECT_PRED1( + [](std::string actualOutput) { + return RE2::FullMatch( + actualOutput, + "INFO: Reading 'startup' options from .*tools.*bazel.rc: " + "--max_idle_secs=42 --io_nice_level=6\n"); + }, + output); +} + +TEST_F(OptionProcessorTest, CustomBazelrcOverridesMasterBazelrc) { + // Add startup flags to the master bazelrc. + const std::string master_rc_path = + blaze_util::JoinPath(workspace_, "tools/bazel.rc"); + ASSERT_TRUE( + blaze_util::MakeDirectories(blaze_util::Dirname(master_rc_path), 0755)); + ASSERT_TRUE(blaze_util::WriteFile( + "startup --max_idle_secs=42\nstartup --io_nice_level=6", master_rc_path, + 0755)); + + // Override one of the master bazelrc's flags in the custom bazelrc. + const std::string cmdline_rc_path = + blaze_util::JoinPath(workspace_, "mybazelrc"); + ASSERT_TRUE( + blaze_util::MakeDirectories(blaze_util::Dirname(cmdline_rc_path), 0755)); + ASSERT_TRUE(blaze_util::WriteFile("startup --max_idle_secs=123", + cmdline_rc_path, 0755)); + const std::vector<std::string> args = { + "bazel", "--bazelrc=" + cmdline_rc_path, "build"}; + std::string error; + ASSERT_EQ(blaze_exit_code::SUCCESS, + option_processor_->ParseOptions(args, workspace_, cwd_, &error)) + << error; + + EXPECT_EQ(123, option_processor_->GetParsedStartupOptions()->max_idle_secs); + EXPECT_EQ(6, option_processor_->GetParsedStartupOptions()->io_nice_level); + + // Check that the options are reported in the correct order in the provenance + // message. + testing::internal::CaptureStderr(); + option_processor_->PrintStartupOptionsProvenanceMessage(); + const std::string& output = testing::internal::GetCapturedStderr(); + + EXPECT_PRED1( + [](std::string actualOutput) { + return RE2::FullMatch( + actualOutput, + "INFO: Reading 'startup' options from .*tools.*bazel.rc: " + "--max_idle_secs=42 --io_nice_level=6\n" + "INFO: Reading 'startup' options from .*mybazelrc: " + "--max_idle_secs=123\n"); + }, + output); +} + +TEST_F(OptionProcessorTest, BazelRcImportsMaintainsFlagOrdering) { + // Override one of the master bazelrc's flags in the custom bazelrc. + const std::string imported_rc_path = + blaze_util::JoinPath(workspace_, "myimportedbazelrc"); + ASSERT_TRUE( + blaze_util::MakeDirectories(blaze_util::Dirname(imported_rc_path), 0755)); + ASSERT_TRUE(blaze_util::WriteFile( + "startup --max_idle_secs=123\nstartup --io_nice_level=4", + imported_rc_path, 0755)); + + // Add startup flags the imported bazelrc. + const std::string master_rc_path = + blaze_util::JoinPath(workspace_, "tools/bazel.rc"); + ASSERT_TRUE( + blaze_util::MakeDirectories(blaze_util::Dirname(master_rc_path), 0755)); + ASSERT_TRUE(blaze_util::WriteFile("startup --max_idle_secs=42\nimport " + + imported_rc_path + + "\nstartup --io_nice_level=6", + master_rc_path, 0755)); + + const std::vector<std::string> args = {"bazel", "build"}; + std::string error; + ASSERT_EQ(blaze_exit_code::SUCCESS, + option_processor_->ParseOptions(args, workspace_, cwd_, &error)) + << error; + + EXPECT_EQ(123, option_processor_->GetParsedStartupOptions()->max_idle_secs); + EXPECT_EQ(6, option_processor_->GetParsedStartupOptions()->io_nice_level); + + // Check that the options are reported in the correct order in the provenance + // message, the imported file between the two master flags + testing::internal::CaptureStderr(); + option_processor_->PrintStartupOptionsProvenanceMessage(); + const std::string& output = testing::internal::GetCapturedStderr(); + + EXPECT_PRED1( + [](std::string actualOutput) { + return RE2::FullMatch( + actualOutput, + "INFO: Reading 'startup' options from .*tools.*bazel.rc: " + "--max_idle_secs=42\n" + "INFO: Reading 'startup' options from .*myimportedbazelrc: " + "--max_idle_secs=123 --io_nice_level=4\n" + "INFO: Reading 'startup' options from .*tools.*bazel.rc: " + "--io_nice_level=6\n"); + }, + output); } TEST_F(OptionProcessorTest, SplitCommandLineWithEmptyArgs) { diff --git a/src/test/cpp/startup_options_test.cc b/src/test/cpp/startup_options_test.cc index 164bdc3c90..a4c52a2621 100644 --- a/src/test/cpp/startup_options_test.cc +++ b/src/test/cpp/startup_options_test.cc @@ -155,4 +155,77 @@ TEST_F(StartupOptionsTest, ValidStartupFlagsTest) { SuccessfulIsUnaryTest("output_user_root"); } +TEST_F(StartupOptionsTest, ProcessSpaceSeparatedArgsTest) { + std::string error; + const std::vector<RcStartupFlag> flags{ + RcStartupFlag("somewhere", "--max_idle_secs"), + RcStartupFlag("somewhere", "42")}; + + const blaze_exit_code::ExitCode ec = + startup_options_->ProcessArgs(flags, &error); + ASSERT_EQ(blaze_exit_code::SUCCESS, ec) + << "ProcessArgs failed with error " << error; + EXPECT_EQ(42, startup_options_->max_idle_secs); + + EXPECT_EQ("somewhere", startup_options_->original_startup_options_[0].source); + EXPECT_EQ("--max_idle_secs=42", + startup_options_->original_startup_options_[0].value); +} + +TEST_F(StartupOptionsTest, ProcessEqualsSeparatedArgsTest) { + std::string error; + const std::vector<RcStartupFlag> flags{ + RcStartupFlag("somewhere", "--max_idle_secs=36")}; + + const blaze_exit_code::ExitCode ec = + startup_options_->ProcessArgs(flags, &error); + ASSERT_EQ(ec, blaze_exit_code::SUCCESS) + << "ProcessArgs failed with error " << error; + EXPECT_EQ(36, startup_options_->max_idle_secs); + + EXPECT_EQ("somewhere", startup_options_->original_startup_options_[0].source); + EXPECT_EQ("--max_idle_secs=36", + startup_options_->original_startup_options_[0].value); +} + +TEST_F(StartupOptionsTest, ProcessIncorrectArgValueTest) { + std::string error; + const std::vector<RcStartupFlag> flags{ + RcStartupFlag("somewhere", "--max_idle_secs=notANumber")}; + + const blaze_exit_code::ExitCode ec = + startup_options_->ProcessArgs(flags, &error); + ASSERT_EQ(blaze_exit_code::BAD_ARGV, ec) + << "ProcessArgs failed with the wrong error " << error; + + // Even for a failing args processing step, expect the original value + // to be stored. + EXPECT_EQ("somewhere", startup_options_->original_startup_options_[0].source); + EXPECT_EQ("--max_idle_secs=notANumber", + startup_options_->original_startup_options_[0].value); +} + +TEST_F(StartupOptionsTest, ProcessArgsWithMultipleArgstest) { + const std::vector<RcStartupFlag> flags{ + RcStartupFlag("somewhere", "--max_idle_secs=36"), + RcStartupFlag("somewhereElse", "--nowrite_command_log")}; + + std::string error; + const blaze_exit_code::ExitCode ec = + startup_options_->ProcessArgs(flags, &error); + ASSERT_EQ(ec, blaze_exit_code::SUCCESS) + << "ProcessArgs failed with error " << error; + EXPECT_EQ(36, startup_options_->max_idle_secs); + EXPECT_FALSE(startup_options_->write_command_log); + + EXPECT_EQ("somewhere", startup_options_->original_startup_options_[0].source); + EXPECT_EQ("--max_idle_secs=36", + startup_options_->original_startup_options_[0].value); + + EXPECT_EQ("somewhereElse", + startup_options_->original_startup_options_[1].source); + EXPECT_EQ("--nowrite_command_log", + startup_options_->original_startup_options_[1].value); +} + } // namespace blaze |