// 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
