| // Copyright 2018 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 "src/main/cpp/bazel_startup_options.h" | |
| #include <stdlib.h> | |
| #include <algorithm> | |
| #include <memory> | |
| #include <string> | |
| #include <vector> | |
| #include "src/main/cpp/blaze_util_platform.h" | |
| #include "src/main/cpp/util/exit_code.h" | |
| #include "src/main/cpp/util/file_platform.h" | |
| #include "src/test/cpp/test_util.h" | |
| #include "googletest/include/gtest/gtest.h" | |
| #include "absl/strings/match.h" | |
| #include "absl/time/time.h" | |
| namespace blaze { | |
| class BazelStartupOptionsTest : public ::testing::Test { | |
| protected: | |
| void SetUp() override { | |
| // This knowingly ignores the possibility of these environment variables | |
| // being unset because we expect our test runner to set them in all cases. | |
| // Otherwise, we'll crash here, but this keeps our code simpler. | |
| old_test_tmpdir_ = GetPathEnv("TEST_TMPDIR"); | |
| ReinitStartupOptions(); | |
| } | |
| void TearDown() override { SetEnv("TEST_TMPDIR", old_test_tmpdir_); } | |
| // Recreates startup_options_ after changes to the environment. | |
| void ReinitStartupOptions() { | |
| startup_options_ = std::make_unique<BazelStartupOptions>(); | |
| } | |
| // Calls UpdateConfiguration with some default values. | |
| void UpdateConfiguration() { | |
| startup_options_->UpdateConfiguration("deadbeef", "workspace", false); | |
| } | |
| protected: | |
| std::unique_ptr<BazelStartupOptions> startup_options_; | |
| private: | |
| std::string old_test_tmpdir_; | |
| }; | |
| TEST_F(BazelStartupOptionsTest, ProductName) { | |
| ASSERT_EQ("Bazel", startup_options_->product_name); | |
| } | |
| TEST_F(BazelStartupOptionsTest, JavaLoggingOptions) { | |
| ASSERT_EQ("com.google.devtools.build.lib.util.SingleLineFormatter", | |
| startup_options_->java_logging_formatter); | |
| } | |
| TEST_F(BazelStartupOptionsTest, EmptyFlagsAreInvalid) { | |
| { | |
| bool result; | |
| std::string error; | |
| EXPECT_TRUE(startup_options_->MaybeCheckValidNullary("", &result, &error)); | |
| EXPECT_FALSE(result); | |
| } | |
| { | |
| bool result; | |
| std::string error; | |
| EXPECT_TRUE( | |
| startup_options_->MaybeCheckValidNullary("--", &result, &error)); | |
| EXPECT_FALSE(result); | |
| } | |
| EXPECT_FALSE(startup_options_->IsUnary("")); | |
| EXPECT_FALSE(startup_options_->IsUnary("--")); | |
| } | |
| #if defined(__linux) || defined(__APPLE__) | |
| TEST_F(BazelStartupOptionsTest, UpdateConfigurationOnLinuxOrDarwinWithHome) { | |
| SetEnv("USER", "gandalf"); | |
| SetEnv("HOME", "/nonexistent/home"); | |
| UnsetEnv("TEST_TMPDIR"); | |
| UnsetEnv("XDG_CACHE_HOME"); | |
| ReinitStartupOptions(); | |
| UpdateConfiguration(); | |
| #ifdef __linux | |
| ASSERT_EQ(blaze_util::Path("/nonexistent/home/.cache/bazel/_bazel_gandalf"), | |
| startup_options_->output_user_root); | |
| ASSERT_EQ( | |
| blaze_util::Path( | |
| "/nonexistent/home/.cache/bazel/_bazel_gandalf/install/deadbeef"), | |
| startup_options_->install_base); | |
| ASSERT_EQ(blaze_util::Path("/nonexistent/home/.cache/bazel/_bazel_gandalf/" | |
| "1629dee48cc4e53161f9b2be8614e062"), | |
| startup_options_->output_base); | |
| #elif defined(__APPLE__) | |
| ASSERT_EQ( | |
| blaze_util::Path("/nonexistent/home/Library/Caches/bazel/_bazel_gandalf"), | |
| startup_options_->output_user_root); | |
| ASSERT_EQ(blaze_util::Path("/nonexistent/home/Library/Caches/bazel/" | |
| "_bazel_gandalf/install/deadbeef"), | |
| startup_options_->install_base); | |
| ASSERT_EQ( | |
| blaze_util::Path("/nonexistent/home/Library/Caches/bazel/_bazel_gandalf/" | |
| "1629dee48cc4e53161f9b2be8614e062"), | |
| startup_options_->output_base); | |
| #endif | |
| } | |
| TEST_F(BazelStartupOptionsTest, | |
| UpdateConfigurationOnLinuxOrDarwinWithTestTmpdir) { | |
| SetEnv("USER", "gandalf"); | |
| SetEnv("HOME", "/nonexistent/home"); | |
| SetEnv("XDG_CACHE_HOME", "/nonexistent/cache"); | |
| SetEnv("TEST_TMPDIR", "/nonexistent/tmpdir"); | |
| ReinitStartupOptions(); | |
| UpdateConfiguration(); | |
| ASSERT_EQ(blaze_util::Path("/nonexistent/tmpdir/_bazel_gandalf"), | |
| startup_options_->output_user_root); | |
| ASSERT_EQ( | |
| blaze_util::Path("/nonexistent/tmpdir/_bazel_gandalf/install/deadbeef"), | |
| startup_options_->install_base); | |
| ASSERT_EQ(blaze_util::Path("/nonexistent/tmpdir/_bazel_gandalf/" | |
| "1629dee48cc4e53161f9b2be8614e062"), | |
| startup_options_->output_base); | |
| } | |
| TEST_F(BazelStartupOptionsTest, | |
| UpdateConfigurationOnLinuxOrDarwinWithXdgCacheHome) { | |
| SetEnv("USER", "gandalf"); | |
| SetEnv("HOME", "/nonexistent/home"); | |
| SetEnv("XDG_CACHE_HOME", "/nonexistent/cache"); | |
| UnsetEnv("TEST_TMPDIR"); | |
| ReinitStartupOptions(); | |
| UpdateConfiguration(); | |
| ASSERT_EQ(blaze_util::Path("/nonexistent/cache/bazel/_bazel_gandalf"), | |
| startup_options_->output_user_root); | |
| ASSERT_EQ(blaze_util::Path( | |
| "/nonexistent/cache/bazel/_bazel_gandalf/install/deadbeef"), | |
| startup_options_->install_base); | |
| ASSERT_EQ(blaze_util::Path("/nonexistent/cache/bazel/_bazel_gandalf/" | |
| "1629dee48cc4e53161f9b2be8614e062"), | |
| startup_options_->output_base); | |
| } | |
| TEST_F(BazelStartupOptionsTest, | |
| UpdateConfigurationOnLinuxOrDarwinWithSpecialCharactersInUser) { | |
| SetEnv("USER", "foo/bar\\baz"); | |
| SetEnv("HOME", "/nonexistent/home"); | |
| SetEnv("XDG_CACHE_HOME", "/nonexistent/cache"); | |
| UnsetEnv("TEST_TMPDIR"); | |
| ReinitStartupOptions(); | |
| UpdateConfiguration(); | |
| ASSERT_EQ(blaze_util::Path("/nonexistent/cache/bazel/_bazel_foo_bar_baz"), | |
| startup_options_->output_user_root); | |
| } | |
| TEST_F(BazelStartupOptionsTest, | |
| UpdateConfigurationOnLinuxOrDarwinNoShellExpansion) { | |
| SetEnv("USER", "gandalf"); | |
| SetEnv("TEST_TMPDIR", "~/\"$foo/test\""); | |
| SetEnv("XDG_CACHE_HOME", "~/cache${bar}"); | |
| SetEnv("HOME", "~/home$(echo baz)"); | |
| ReinitStartupOptions(); | |
| UpdateConfiguration(); | |
| ASSERT_EQ(blaze_util::Path(blaze_util::GetCwd() + "/~/\"$foo/test\"" + | |
| "/_bazel_gandalf"), | |
| startup_options_->output_user_root); | |
| UnsetEnv("TEST_TMPDIR"); | |
| ReinitStartupOptions(); | |
| UpdateConfiguration(); | |
| ASSERT_EQ(blaze_util::Path(blaze_util::GetCwd() + | |
| "/~/cache${bar}/bazel/_bazel_gandalf"), | |
| startup_options_->output_user_root); | |
| UnsetEnv("XDG_CACHE_HOME"); | |
| ReinitStartupOptions(); | |
| UpdateConfiguration(); | |
| #ifdef __linux | |
| ASSERT_EQ(blaze_util::Path(blaze_util::GetCwd() + | |
| "/~/home$(echo baz)/.cache/bazel/_bazel_gandalf"), | |
| startup_options_->output_user_root); | |
| #elif defined(__APPLE__) | |
| ASSERT_EQ(blaze_util::Path( | |
| blaze_util::GetCwd() + | |
| "/~/home$(echo baz)/Library/Caches/bazel/_bazel_gandalf"), | |
| startup_options_->output_user_root); | |
| #endif | |
| } | |
| #endif // __linux || __APPLE__ | |
| #if defined(__WIN32__) || defined(__CYGWIN__) | |
| TEST_F(BazelStartupOptionsTest, UpdateConfigurationOnWindowsWithHome) { | |
| SetEnv("USER", "gandalf"); | |
| SetEnv("HOME", "C:\\Users\\gandalf"); | |
| UnsetEnv("TEST_TMPDIR"); | |
| UnsetEnv("XDG_CACHE_HOME"); | |
| ReinitStartupOptions(); | |
| UpdateConfiguration(); | |
| ASSERT_EQ(blaze_util::Path("C:/Users/gandalf/_bazel_gandalf"), | |
| startup_options_->output_user_root); | |
| ASSERT_EQ(blaze_util::Path("C:/Users/gandalf/install/deadbeef"), | |
| startup_options_->install_base); | |
| ASSERT_EQ(blaze_util::Path("C:/Users/gandalf/_bazel_gandalf/" | |
| "1629dee48cc4e53161f9b2be8614e062"), | |
| startup_options_->output_base); | |
| } | |
| TEST_F(BazelStartupOptionsTest, UpdateConfigurationOnWindowsWithUserProfile) { | |
| UnsetEnv("HOME"); | |
| SetEnv("USERPROFILE", "C:\\Users\\gandalf"); | |
| UnsetEnv("TEST_TMPDIR"); | |
| UnsetEnv("XDG_CACHE_HOME"); | |
| ReinitStartupOptions(); | |
| UpdateConfiguration(); | |
| ASSERT_EQ(blaze_util::Path("C:/Users/gandalf/_bazel_gandalf"), | |
| startup_options_->output_user_root); | |
| ASSERT_EQ(blaze_util::Path("C:/Users/gandalf/install/deadbeef"), | |
| startup_options_->install_base); | |
| ASSERT_EQ(blaze_util::Path("C:/Users/gandalf/_bazel_gandalf/" | |
| "1629dee48cc4e53161f9b2be8614e062"), | |
| startup_options_->output_base); | |
| } | |
| TEST_F(BazelStartupOptionsTest, UpdateConfigurationOnWindowsWithTestTmpdir) { | |
| SetEnv("USER", "gandalf"); | |
| SetEnv("HOME", "C:\\Users\\gandalf"); | |
| SetEnv("XDG_CACHE_HOME", "C:\\cache"); | |
| SetEnv("TEST_TMPDIR", "C:\\tmpdir"); | |
| ReinitStartupOptions(); | |
| UpdateConfiguration(); | |
| EXPECT_EQ(blaze_util::Path("C:/tmpdir/_bazel_gandalf"), | |
| startup_options_->output_user_root); | |
| EXPECT_EQ(blaze_util::Path("C:/tmpdir/_bazel_gandalf/install/deadbeef"), | |
| startup_options_->install_base); | |
| EXPECT_EQ(blaze_util::Path("C:/tmpdir/_bazel_gandalf/" | |
| "1629dee48cc4e53161f9b2be8614e062"), | |
| startup_options_->output_base); | |
| } | |
| TEST_F(BazelStartupOptionsTest, UpdateConfigurationOnWindowsWithXdgCacheHome) { | |
| SetEnv("USER", "gandalf"); | |
| SetEnv("HOME", "C:\\Users\\gandalf"); | |
| SetEnv("XDG_CACHE_HOME", "C:\\cache"); | |
| UnsetEnv("TEST_TMPDIR"); | |
| ReinitStartupOptions(); | |
| UpdateConfiguration(); | |
| EXPECT_EQ(blaze_util::Path("C:/cache/bazel/_bazel_gandalf"), | |
| startup_options_->output_user_root); | |
| EXPECT_EQ(blaze_util::Path("C:/cache/bazel/_bazel_gandalf/install/deadbeef"), | |
| startup_options_->install_base); | |
| EXPECT_EQ(blaze_util::Path("C:/cache/bazel/_bazel_gandalf/" | |
| "1629dee48cc4e53161f9b2be8614e062"), | |
| startup_options_->output_base); | |
| } | |
| #endif // __WIN32__ || __CYGWIN__ | |
| // TODO(#4502 related cleanup) This test serves as a catalog of the valid | |
| // options - make this test check that the list is complete, that no options are | |
| // missing. | |
| TEST_F(BazelStartupOptionsTest, ValidStartupFlags) { | |
| // IMPORTANT: Before modifying this test, please contact a Bazel core team | |
| // member that knows the Google-internal procedure for adding/deprecating | |
| // startup flags. | |
| const StartupOptions* options = startup_options_.get(); | |
| ExpectValidNullaryOption(options, "batch"); | |
| ExpectValidNullaryOption(options, "batch_cpu_scheduling"); | |
| ExpectValidNullaryOption(options, "client_debug"); | |
| ExpectValidNullaryOption(options, "experimental_use_compact_object_headers"); | |
| ExpectValidNullaryOption(options, "fatal_event_bus_exceptions"); | |
| ExpectValidNullaryOption(options, "home_rc"); | |
| ExpectValidNullaryOption(options, "host_jvm_debug"); | |
| ExpectValidNullaryOption(options, "autodetect_server_javabase"); | |
| ExpectValidNullaryOption(options, "ignore_all_rc_files"); | |
| ExpectValidNullaryOption(options, "shutdown_on_low_sys_mem"); | |
| ExpectValidNullaryOption(options, "delete_output_base_on_shutdown"); | |
| ExpectValidNullaryOption(options, "system_rc"); | |
| ExpectValidNullaryOption(options, "workspace_rc"); | |
| ExpectValidNullaryOption(options, "write_command_log"); | |
| ExpectIsUnaryOption(options, "bazelrc"); | |
| ExpectIsUnaryOption(options, "command_port"); | |
| ExpectIsUnaryOption(options, "connect_timeout_secs"); | |
| ExpectIsUnaryOption(options, "digest_function"); | |
| ExpectIsUnaryOption(options, "host_jvm_args"); | |
| ExpectIsUnaryOption(options, "install_base"); | |
| ExpectIsUnaryOption(options, "invocation_policy"); | |
| ExpectIsUnaryOption(options, "io_nice_level"); | |
| ExpectIsUnaryOption(options, "local_startup_timeout_secs"); | |
| ExpectIsUnaryOption(options, "macos_qos_class"); | |
| ExpectIsUnaryOption(options, "max_idle_secs"); | |
| ExpectIsUnaryOption(options, "output_base"); | |
| ExpectIsUnaryOption(options, "output_user_root"); | |
| ExpectIsUnaryOption(options, "server_javabase"); | |
| } | |
| TEST_F(BazelStartupOptionsTest, BlockForLock) { | |
| ExpectValidBlockForLockOption(startup_options_.get()); | |
| // Test parsing via ProcessArgs | |
| auto parse_flag = [this](const std::string& arg) { | |
| ReinitStartupOptions(); | |
| std::string err; | |
| return startup_options_->ProcessArgs({RcStartupFlag("somewhere", arg)}, | |
| &err); | |
| }; | |
| EXPECT_EQ(blaze_exit_code::SUCCESS, parse_flag("--block_for_lock=30s")); | |
| EXPECT_EQ(absl::Seconds(30), startup_options_->block_for_lock_timeout); | |
| EXPECT_EQ(blaze_exit_code::SUCCESS, parse_flag("--block_for_lock=1m")); | |
| EXPECT_EQ(absl::Minutes(1), startup_options_->block_for_lock_timeout); | |
| EXPECT_EQ(blaze_exit_code::SUCCESS, parse_flag("--block_for_lock=500ms")); | |
| EXPECT_EQ(absl::Milliseconds(500), startup_options_->block_for_lock_timeout); | |
| EXPECT_EQ(blaze_exit_code::SUCCESS, parse_flag("--block_for_lock=1m30s")); | |
| EXPECT_EQ(absl::Seconds(90), startup_options_->block_for_lock_timeout); | |
| EXPECT_EQ(blaze_exit_code::SUCCESS, parse_flag("--block_for_lock=720h")); | |
| EXPECT_EQ(absl::Hours(720), startup_options_->block_for_lock_timeout); | |
| EXPECT_EQ(blaze_exit_code::SUCCESS, parse_flag("--block_for_lock=true")); | |
| EXPECT_EQ(absl::InfiniteDuration(), startup_options_->block_for_lock_timeout); | |
| EXPECT_EQ(blaze_exit_code::SUCCESS, parse_flag("--block_for_lock=false")); | |
| EXPECT_EQ(absl::ZeroDuration(), startup_options_->block_for_lock_timeout); | |
| EXPECT_EQ(blaze_exit_code::SUCCESS, parse_flag("--block_for_lock=0s")); | |
| EXPECT_EQ(absl::ZeroDuration(), startup_options_->block_for_lock_timeout); | |
| EXPECT_EQ(blaze_exit_code::SUCCESS, parse_flag("--noblock_for_lock")); | |
| EXPECT_EQ(absl::ZeroDuration(), startup_options_->block_for_lock_timeout); | |
| EXPECT_EQ(blaze_exit_code::SUCCESS, parse_flag("--block_for_lock=1500us")); | |
| EXPECT_EQ(absl::Milliseconds(1), startup_options_->block_for_lock_timeout); | |
| EXPECT_EQ(blaze_exit_code::BAD_ARGV, parse_flag("--block_for_lock=500us")); | |
| EXPECT_EQ(blaze_exit_code::BAD_ARGV, parse_flag("--block_for_lock=0")); | |
| EXPECT_EQ(blaze_exit_code::BAD_ARGV, parse_flag("--block_for_lock=1")); | |
| EXPECT_EQ(blaze_exit_code::BAD_ARGV, parse_flag("--block_for_lock=2")); | |
| EXPECT_EQ(blaze_exit_code::BAD_ARGV, parse_flag("--block_for_lock=30")); | |
| EXPECT_EQ(blaze_exit_code::BAD_ARGV, parse_flag("--block_for_lock=invalid")); | |
| } | |
| TEST_F(BazelStartupOptionsTest, MacosQosClassValues) { | |
| for (const std::string qos_class : {"default", "utility", "background"}) { | |
| ReinitStartupOptions(); | |
| std::string error; | |
| const std::vector<RcStartupFlag> flags{ | |
| RcStartupFlag("somewhere", "--macos_qos_class=" + qos_class)}; | |
| EXPECT_EQ(blaze_exit_code::SUCCESS, | |
| startup_options_->ProcessArgs(flags, &error)) | |
| << error; | |
| } | |
| for (const std::string qos_class : {"user-interactive", "user-initiated"}) { | |
| ReinitStartupOptions(); | |
| std::string error; | |
| const std::vector<RcStartupFlag> flags{ | |
| RcStartupFlag("somewhere", "--macos_qos_class=" + qos_class)}; | |
| EXPECT_EQ(blaze_exit_code::BAD_ARGV, | |
| startup_options_->ProcessArgs(flags, &error)); | |
| EXPECT_EQ("Invalid argument to --macos_qos_class: '" + qos_class + "'.", | |
| error); | |
| } | |
| } | |
| TEST_F(BazelStartupOptionsTest, BlazercFlagsAreNotAccepted) { | |
| { | |
| bool result; | |
| std::string error; | |
| EXPECT_TRUE(startup_options_->MaybeCheckValidNullary("--master_blazerc", | |
| &result, &error)); | |
| EXPECT_FALSE(result); | |
| } | |
| EXPECT_FALSE(startup_options_->IsUnary("--master_blazerc")); | |
| { | |
| bool result; | |
| std::string error; | |
| EXPECT_TRUE( | |
| startup_options_->MaybeCheckValidNullary("--blazerc", &result, &error)); | |
| EXPECT_FALSE(result); | |
| } | |
| EXPECT_FALSE(startup_options_->IsUnary("--blazerc")); | |
| } | |
| TEST_F(BazelStartupOptionsTest, IgnoredBazelrcFlagWarns) { | |
| ParseStartupOptionsAndExpectWarning( | |
| startup_options_.get(), {"--bazelrc=somefile", "--ignore_all_rc_files"}, | |
| "WARNING: Value of --bazelrc is ignored, since --ignore_all_rc_files is " | |
| "on.\n"); | |
| } | |
| TEST_F(BazelStartupOptionsTest, IgnoredBazelrcFlagWarnsWhenAfterIgnore) { | |
| ParseStartupOptionsAndExpectWarning( | |
| startup_options_.get(), {"--ignore_all_rc_files", "--bazelrc=somefile"}, | |
| "WARNING: Value of --bazelrc is ignored, since --ignore_all_rc_files is " | |
| "on.\n"); | |
| } | |
| TEST_F(BazelStartupOptionsTest, IgnoredWorkspaceRcFlagWarns) { | |
| ParseStartupOptionsAndExpectWarning( | |
| startup_options_.get(), {"--workspace_rc", "--ignore_all_rc_files"}, | |
| "WARNING: Explicit value of --workspace_rc is ignored, " | |
| "since --ignore_all_rc_files is on.\n"); | |
| } | |
| TEST_F(BazelStartupOptionsTest, IgnoredWorkspaceRcFlagWarnsAfterIgnore) { | |
| ParseStartupOptionsAndExpectWarning( | |
| startup_options_.get(), {"--ignore_all_rc_files", "--workspace_rc"}, | |
| "WARNING: Explicit value of --workspace_rc is ignored, " | |
| "since --ignore_all_rc_files is on.\n"); | |
| } | |
| TEST_F(BazelStartupOptionsTest, MultipleIgnoredRcFlagsWarnOnceEach) { | |
| ParseStartupOptionsAndExpectWarning( | |
| startup_options_.get(), | |
| {"--workspace_rc", "--bazelrc=somefile", "--ignore_all_rc_files", | |
| "--bazelrc=thefinalfile", "--workspace_rc"}, | |
| "WARNING: Value of --bazelrc is ignored, " | |
| "since --ignore_all_rc_files is on.\n" | |
| "WARNING: Explicit value of --workspace_rc is ignored, " | |
| "since --ignore_all_rc_files is on.\n"); | |
| } | |
| TEST_F(BazelStartupOptionsTest, IgnoredNoMasterBazelrcDoesNotWarn) { | |
| // Warning for nomaster would feel pretty spammy - it's redundant, but the | |
| // behavior is as one would expect, so warning is unnecessary. | |
| ParseStartupOptionsAndExpectWarning( | |
| startup_options_.get(), {"--ignore_all_rc_files"}, | |
| ""); | |
| } | |
| TEST_F(BazelStartupOptionsTest, IgnoreOptionDoesNotWarnOnItsOwn) { | |
| ParseStartupOptionsAndExpectWarning(startup_options_.get(), | |
| {"--ignore_all_rc_files"}, ""); | |
| } | |
| TEST_F(BazelStartupOptionsTest, NonIgnoredOptionDoesNotWarn) { | |
| ParseStartupOptionsAndExpectWarning(startup_options_.get(), | |
| {"--bazelrc=somefile"}, ""); | |
| } | |
| TEST_F(BazelStartupOptionsTest, FinalValueOfIgnoreIsUsedForWarning) { | |
| ParseStartupOptionsAndExpectWarning( | |
| startup_options_.get(), | |
| {"--ignore_all_rc_files", "--noignore_all_rc_files"}, | |
| ""); | |
| } | |
| TEST_F(BazelStartupOptionsTest, LockInstallBase) { | |
| EXPECT_TRUE(startup_options_->lock_install_base); | |
| } | |
| TEST_F(BazelStartupOptionsTest, CompactObjectHeadersDefaultTrue) { | |
| EXPECT_TRUE(startup_options_->use_compact_object_headers_); | |
| } | |
| TEST_F(BazelStartupOptionsTest, ProcessNoCompactObjectHeaders) { | |
| std::string error; | |
| const std::vector<RcStartupFlag> flags{RcStartupFlag( | |
| "somewhere", "--noexperimental_use_compact_object_headers")}; | |
| const blaze_exit_code::ExitCode ec = | |
| startup_options_->ProcessArgs(flags, &error); | |
| ASSERT_EQ(blaze_exit_code::SUCCESS, ec) | |
| << "ProcessArgs failed with error " << error; | |
| EXPECT_FALSE(startup_options_->use_compact_object_headers_); | |
| EXPECT_TRUE(startup_options_->option_sources.find( | |
| "experimental_use_compact_object_headers") != | |
| startup_options_->option_sources.end()); | |
| } | |
| TEST_F(BazelStartupOptionsTest, ProcessExplicitCompactObjectHeaders) { | |
| std::string error; | |
| const std::vector<RcStartupFlag> flags{ | |
| RcStartupFlag("somewhere", "--experimental_use_compact_object_headers")}; | |
| const blaze_exit_code::ExitCode ec = | |
| startup_options_->ProcessArgs(flags, &error); | |
| ASSERT_EQ(blaze_exit_code::SUCCESS, ec) | |
| << "ProcessArgs failed with error " << error; | |
| EXPECT_TRUE(startup_options_->use_compact_object_headers_); | |
| EXPECT_TRUE(startup_options_->option_sources.find( | |
| "experimental_use_compact_object_headers") != | |
| startup_options_->option_sources.end()); | |
| } | |
| TEST_F(BazelStartupOptionsTest, AddJVMArgumentsCompactObjectHeadersExplicit) { | |
| std::vector<std::string> result; | |
| std::string error; | |
| blaze_util::Path test_tmpdir(blaze::GetPathEnv("TEST_TMPDIR")); | |
| blaze_util::Path dummy_javabase = test_tmpdir.GetRelative("dummy_javabase"); | |
| startup_options_->use_compact_object_headers_ = true; | |
| startup_options_->option_sources["experimental_use_compact_object_headers"] = | |
| ""; // simulate explicit | |
| startup_options_->output_base = test_tmpdir.GetRelative("output_base"); | |
| blaze_exit_code::ExitCode ec = | |
| startup_options_->AddJVMArguments(dummy_javabase, &result, {}, &error); | |
| ASSERT_EQ(blaze_exit_code::SUCCESS, ec) | |
| << "AddJVMArguments failed with error " << error; | |
| bool has_unlock = | |
| std::find(result.begin(), result.end(), | |
| "-XX:+UnlockExperimentalVMOptions") != result.end(); | |
| bool has_use = std::find(result.begin(), result.end(), | |
| "-XX:+UseCompactObjectHeaders") != result.end(); | |
| EXPECT_TRUE(has_unlock); | |
| EXPECT_TRUE(has_use); | |
| } | |
| TEST_F(BazelStartupOptionsTest, | |
| AddJVMArgumentsCompactObjectHeadersDefaultNotEmbedded) { | |
| std::vector<std::string> result; | |
| std::string error; | |
| blaze_util::Path test_tmpdir(blaze::GetPathEnv("TEST_TMPDIR")); | |
| blaze_util::Path dummy_javabase = test_tmpdir.GetRelative("dummy_javabase"); | |
| // Set explicit_server_javabase_ via ProcessArgs to avoid GetSystemJavabase() | |
| // crash | |
| const std::vector<RcStartupFlag> flags{RcStartupFlag( | |
| "somewhere", | |
| "--server_javabase=" + dummy_javabase.AsCommandLineArgument())}; | |
| const blaze_exit_code::ExitCode ec = | |
| startup_options_->ProcessArgs(flags, &error); | |
| ASSERT_EQ(blaze_exit_code::SUCCESS, ec) | |
| << "ProcessArgs failed with error " << error; | |
| // use_compact_object_headers_ is true by default for Bazel | |
| // option_sources does NOT contain it (simulating default) | |
| // in test environment, it is not embedded | |
| startup_options_->output_base = test_tmpdir.GetRelative("output_base"); | |
| blaze_exit_code::ExitCode ec_add = | |
| startup_options_->AddJVMArguments(dummy_javabase, &result, {}, &error); | |
| ASSERT_EQ(blaze_exit_code::SUCCESS, ec_add) | |
| << "AddJVMArguments failed with error " << error; | |
| bool has_unlock = | |
| std::find(result.begin(), result.end(), | |
| "-XX:+UnlockExperimentalVMOptions") != result.end(); | |
| bool has_use = std::find(result.begin(), result.end(), | |
| "-XX:+UseCompactObjectHeaders") != result.end(); | |
| EXPECT_FALSE(has_unlock); | |
| EXPECT_FALSE(has_use); | |
| EXPECT_EQ( | |
| std::find(result.begin(), result.end(), "-XX:-UseCompactObjectHeaders"), | |
| result.end()); | |
| } | |
| TEST_F(BazelStartupOptionsTest, AddJVMArgumentsCompactObjectHeadersDisabled) { | |
| std::vector<std::string> result; | |
| std::string error; | |
| blaze_util::Path test_tmpdir(blaze::GetPathEnv("TEST_TMPDIR")); | |
| blaze_util::Path dummy_javabase = test_tmpdir.GetRelative("dummy_javabase"); | |
| startup_options_->use_compact_object_headers_ = false; | |
| startup_options_->option_sources["experimental_use_compact_object_headers"] = | |
| ""; // simulate explicit | |
| startup_options_->output_base = test_tmpdir.GetRelative("output_base"); | |
| blaze_exit_code::ExitCode ec = | |
| startup_options_->AddJVMArguments(dummy_javabase, &result, {}, &error); | |
| ASSERT_EQ(blaze_exit_code::SUCCESS, ec) | |
| << "AddJVMArguments failed with error " << error; | |
| bool has_unlock = | |
| std::find(result.begin(), result.end(), | |
| "-XX:+UnlockExperimentalVMOptions") != result.end(); | |
| bool has_use = std::find(result.begin(), result.end(), | |
| "-XX:+UseCompactObjectHeaders") != result.end(); | |
| EXPECT_FALSE(has_unlock); | |
| EXPECT_FALSE(has_use); | |
| EXPECT_NE( | |
| std::find(result.begin(), result.end(), "-XX:-UseCompactObjectHeaders"), | |
| result.end()); | |
| } | |
| TEST_F(BazelStartupOptionsTest, DeleteOutputBaseOnShutdownParsing) { | |
| std::string error; | |
| EXPECT_FALSE(startup_options_->delete_output_base_on_shutdown); | |
| EXPECT_EQ( | |
| blaze_exit_code::SUCCESS, | |
| startup_options_->ProcessArgs( | |
| {RcStartupFlag("somewhere", "--delete_output_base_on_shutdown")}, | |
| &error)); | |
| EXPECT_TRUE(startup_options_->delete_output_base_on_shutdown); | |
| EXPECT_EQ( | |
| blaze_exit_code::SUCCESS, | |
| startup_options_->ProcessArgs( | |
| {RcStartupFlag("somewhere", "--nodelete_output_base_on_shutdown")}, | |
| &error)); | |
| EXPECT_FALSE(startup_options_->delete_output_base_on_shutdown); | |
| } | |
| TEST_F(BazelStartupOptionsTest, AddJVMLoggingArgumentsWritesPropertiesFile) { | |
| UpdateConfiguration(); | |
| blaze_util::MakeDirectories(startup_options_->output_base, 0777); | |
| std::vector<std::string> result; | |
| startup_options_->AddJVMLoggingArguments(&result); | |
| blaze_util::Path prop_file = | |
| startup_options_->output_base.GetRelative("javalog.properties"); | |
| EXPECT_TRUE(blaze_util::PathExists(prop_file)); | |
| std::string content; | |
| EXPECT_TRUE(blaze_util::ReadFile(prop_file, &content)); | |
| EXPECT_FALSE(content.empty()); | |
| bool has_prop_arg = false; | |
| for (const auto& arg : result) { | |
| if (absl::StrContains(arg, "-Djava.util.logging.config.file=")) { | |
| has_prop_arg = true; | |
| break; | |
| } | |
| } | |
| EXPECT_TRUE(has_prop_arg); | |
| } | |
| } // namespace blaze |