// Copyright 2018 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 "init/usermode-helper.h"

#include <gtest/gtest.h>

#include <initializer_list>
#include <vector>

namespace {
// Convenience function.
bool ValidateProgramArgs(std::initializer_list<const char*> argv) {
  std::vector<const char*> vargv(argv);
  return usermode_helper::ValidateProgramArgs(argv.size(), vargv.data());
}
}  // namespace

TEST(ValidateProgramArgs, UnknownPrograms) {
  EXPECT_FALSE(ValidateProgramArgs({"/sbin/crash_reporter "}));
  EXPECT_FALSE(ValidateProgramArgs({"crash_reporter"}));
  EXPECT_FALSE(ValidateProgramArgs({"/bin/crash_reporter"}));
}

TEST(ValidateProgramArgs, GoodCrashReporter) {
  EXPECT_TRUE(ValidateProgramArgs({"/sbin/crash_reporter", "--user=foo"}));
  EXPECT_TRUE(ValidateProgramArgs(
      {"/sbin/crash_reporter", "--early", "--log_to_stderr", "--user=foo"}));
  EXPECT_TRUE(ValidateProgramArgs(
      {"/sbin/crash_reporter", "--user=foo", "--filter_in=blah"}));
  EXPECT_TRUE(ValidateProgramArgs({"/sbin/crash_reporter", "--user=foo",
                                   "--core2md_failure", "--filter_in=blah"}));
  EXPECT_TRUE(ValidateProgramArgs({"/sbin/crash_reporter", "--user=foo",
                                   "--filter_in=blah", "--core2md_failure"}));
  EXPECT_TRUE(ValidateProgramArgs({"/sbin/crash_reporter", "--user=foo",
                                   "--directory_failure", "--filter_in=blah"}));
  EXPECT_TRUE(ValidateProgramArgs(
      {"/sbin/crash_reporter", "--user=foo", "--crash_test"}));

  // crrev.comc/c/2043542 applies the verbose logging flag.
  // TODO(crbug.com/1043801) Remove this after finishing investigation.
  EXPECT_TRUE(ValidateProgramArgs(
      {"/sbin/crash_reporter", "--user=foo", "--filter_in=blah", "-v=2"}));
}

TEST(ValidateProgramArgs, BadCrashReporter) {
  EXPECT_FALSE(ValidateProgramArgs({"/sbin/crash_reporter"}));
  EXPECT_FALSE(ValidateProgramArgs({"/sbin/crash_reporter", "--init"}));
}

TEST(ValidateProgramArgs, GoodModprobe) {
  EXPECT_TRUE(ValidateProgramArgs({"/sbin/modprobe", "-q", "--", "mod"}));
}

TEST(ValidateProgramArgs, BadModprobe) {
  EXPECT_FALSE(ValidateProgramArgs({"/sbin/modprobe"}));
  EXPECT_FALSE(ValidateProgramArgs({"/sbin/modprobe", "mod"}));
  EXPECT_FALSE(ValidateProgramArgs({"/sbin/modprobe", "-q"}));
  EXPECT_FALSE(ValidateProgramArgs({"/sbin/modprobe", "-q", "mod"}));
  EXPECT_FALSE(ValidateProgramArgs({"/sbin/modprobe", "-q", "--"}));
  EXPECT_FALSE(ValidateProgramArgs({"/sbin/modprobe", "--"}));
  EXPECT_FALSE(ValidateProgramArgs({"/sbin/modprobe", "--", "mod"}));
  EXPECT_FALSE(ValidateProgramArgs({"/sbin/modprobe", "-a", "mod1", "mod2"}));
  EXPECT_FALSE(ValidateProgramArgs({"/sbin/modprobe", "-r", "mod"}));
}

TEST(ValidateProgramArgs, GoodPoweroff) {
  EXPECT_TRUE(ValidateProgramArgs({"/sbin/poweroff"}));
}

TEST(ValidateProgramArgs, BadPoweroff) {
  EXPECT_FALSE(ValidateProgramArgs({"/sbin/poweroff", "-f"}));
}

TEST(ValidateProgramArgs, GoodReboot) {
  EXPECT_TRUE(ValidateProgramArgs({"/sbin/reboot"}));
}

TEST(ValidateProgramArgs, BadReboot) {
  EXPECT_FALSE(ValidateProgramArgs({"/sbin/reboot", "-f"}));
}

TEST(ValidateProgramArgs, GoodRequestKey) {
  EXPECT_TRUE(
      ValidateProgramArgs({"/sbin/request-key", "<op>", "<key>", "<uid>",
                           "<gid>", "<keyring>", "<keyring>", "<keyring>"}));
}

TEST(ValidateProgramArgs, RequestKey) {
  EXPECT_FALSE(
      ValidateProgramArgs({"/sbin/request-key", "<op>", "<key>", "<uid>",
                           "<gid>", "<keyring>", "<keyring>", "--option"}));
  EXPECT_FALSE(
      ValidateProgramArgs({"/sbin/request-key", "<op>", "<key>", "<uid>",
                           "<gid>", "<keyring>", "<keyring>"}));
  EXPECT_FALSE(ValidateProgramArgs({"/sbin/request-key", "<op>", "<key>",
                                    "<uid>", "<gid>", "<keyring>", "<keyring>",
                                    "<keyring>", "toomany"}));
}

TEST(ValidateProgramArgs, BridgeStp) {
  EXPECT_TRUE(ValidateProgramArgs({"/sbin/bridge-stp", "br-lan", "start"}));
  EXPECT_TRUE(ValidateProgramArgs({"/sbin/bridge-stp", "br-lan", "stop"}));
  EXPECT_FALSE(ValidateProgramArgs({"/sbin/bridge-stp", "br-lan"}));
  EXPECT_FALSE(
      ValidateProgramArgs({"/sbin/bridge-stp", "br-lan", "start", "toomany"}));
  EXPECT_FALSE(ValidateProgramArgs({"/sbin/bridge-stp", "start", "br-lan"}));
}
