// Copyright 2021 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "crash-reporter/vm_support_proper.h"

#include <unistd.h>
#include <string>

#include <base/files/file_path.h>
#include <base/files/scoped_temp_dir.h>
#include <base/strings/stringprintf.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include "crash-reporter/paths.h"
#include "crash-reporter/test_util.h"

namespace {
constexpr pid_t kTestPid = 123;
constexpr char kTestPidExePath[] = "/proc/123/exe";
}  // namespace

class VmSupportProperTest : public testing::Test {
 protected:
  void SetUp() override {
    ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir());
    test_dir_ = scoped_temp_dir_.GetPath();
    paths::SetPrefixForTesting(test_dir_);

    filter_config_ = paths::Get(VmSupportProper::kFilterConfigPath);
    proc_exe_ = paths::Get(kTestPidExePath);

    base::File::Error error = base::File::FILE_OK;
    ASSERT_TRUE(base::CreateDirectoryAndGetError(proc_exe_.DirName(), &error))
        << "directory creation error: " << error;

    config_blocking_home_ =
        base::StringPrintf("filters { blocked_path: \"%s\" }",
                           paths::Get("/home").value().c_str());
  }

  void TearDown() override { paths::SetPrefixForTesting(base::FilePath()); }

  // Forward calls to PassesFilterConfig, to avoid VmSupportProper needing to
  // declare each test case as a friend individually.
  bool PassesFilterConfig(pid_t pid, std::string* out_reason) {
    return vm_support_.PassesFilterConfig(pid, out_reason);
  }

  base::FilePath test_dir_;
  base::ScopedTempDir scoped_temp_dir_;
  VmSupportProper vm_support_;
  std::string reason_;
  base::FilePath filter_config_;
  std::string config_blocking_home_;
  base::FilePath proc_exe_;
};

TEST_F(VmSupportProperTest, FilterConfigNotRequired) {
  EXPECT_TRUE(PassesFilterConfig(kTestPid, &reason_));
  EXPECT_THAT(reason_, testing::HasSubstr("failed to read"));
}

TEST_F(VmSupportProperTest, FilterConfigMayBeInvalid) {
  EXPECT_TRUE(test_util::CreateFile(filter_config_, "junk"));

  EXPECT_TRUE(PassesFilterConfig(kTestPid, &reason_));
  EXPECT_THAT(reason_, testing::HasSubstr("failed to parse"));
}

TEST_F(VmSupportProperTest, EmptyFilterConfigPermitsAll) {
  EXPECT_TRUE(test_util::CreateFile(filter_config_, ""));
  EXPECT_TRUE(
      base::CreateSymbolicLink(paths::Get("/home/chronos/myprog"), proc_exe_));

  EXPECT_TRUE(PassesFilterConfig(kTestPid, &reason_));
}

TEST_F(VmSupportProperTest, EmptyFilterPermitsAll) {
  EXPECT_TRUE(test_util::CreateFile(filter_config_, "filters {}"));
  EXPECT_TRUE(
      base::CreateSymbolicLink(paths::Get("/home/chronos/myprog"), proc_exe_));

  EXPECT_TRUE(PassesFilterConfig(kTestPid, &reason_));
}

TEST_F(VmSupportProperTest, BlockedPathsAreNotPermitted) {
  EXPECT_TRUE(test_util::CreateFile(filter_config_, config_blocking_home_));
  EXPECT_TRUE(
      base::CreateSymbolicLink(paths::Get("/home/chronos/myprog"), proc_exe_));

  EXPECT_FALSE(PassesFilterConfig(kTestPid, &reason_));
  EXPECT_THAT(reason_, testing::HasSubstr("/home are blocked"));
}

TEST_F(VmSupportProperTest, OtherPathsArePermitted) {
  EXPECT_TRUE(test_util::CreateFile(filter_config_, config_blocking_home_));
  EXPECT_TRUE(base::CreateSymbolicLink(paths::Get("/bin/bash"), proc_exe_));

  EXPECT_TRUE(PassesFilterConfig(kTestPid, &reason_));
}
