// Copyright 2020 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 "croslog/config.h"

#include <base/files/file_path.h>
#include <gtest/gtest.h>

namespace croslog {

class ConfigTest : public ::testing::Test {
 public:
  ConfigTest() = default;
  ~ConfigTest() override = default;

 private:
  DISALLOW_COPY_AND_ASSIGN(ConfigTest);
};

TEST_F(ConfigTest, ParseCommandLineSourceMode) {
  base::FilePath kCrosLogProgramPath("croslog");

  {
    Config config;
    base::CommandLine command_line_without_source(kCrosLogProgramPath);
    EXPECT_TRUE(config.ParseCommandLineArgs(&command_line_without_source));
    EXPECT_EQ(SourceMode::JOURNAL_LOG, config.source);
  }

  {
    Config config;
    base::CommandLine command_line_with_journal_log(kCrosLogProgramPath);
    command_line_with_journal_log.AppendSwitchASCII("source", "journal");
    EXPECT_TRUE(config.ParseCommandLineArgs(&command_line_with_journal_log));
    EXPECT_EQ(SourceMode::JOURNAL_LOG, config.source);
  }

  {
    Config config;
    base::CommandLine command_line_with_plaintext_log(kCrosLogProgramPath);
    command_line_with_plaintext_log.AppendSwitchASCII("source", "plaintext");
    EXPECT_TRUE(config.ParseCommandLineArgs(&command_line_with_plaintext_log));
    EXPECT_EQ(SourceMode::PLAINTEXT_LOG, config.source);
  }

  {
    Config config;
    base::CommandLine command_line_with_invalid_source(kCrosLogProgramPath);
    command_line_with_invalid_source.AppendSwitchASCII("source", "invalid");
    EXPECT_FALSE(
        config.ParseCommandLineArgs(&command_line_with_invalid_source));
    EXPECT_EQ(SourceMode::JOURNAL_LOG, config.source);
  }
}

}  // namespace croslog
