// Copyright 2014 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 <brillo/osrelease_reader.h>

#include <base/files/file_util.h>
#include <base/files/scoped_temp_dir.h>
#include <gtest/gtest.h>

using std::string;

namespace brillo {

class OsReleaseReaderTest : public ::testing::Test {
 public:
  void SetUp() override {
    CHECK(temp_dir_.CreateUniqueTempDir());
    osreleased_ = temp_dir_.GetPath().Append("etc").Append("os-release.d");
    osrelease_ = temp_dir_.GetPath().Append("etc").Append("os-release");
    base::CreateDirectory(osreleased_);
  }

 protected:
  base::FilePath temp_file_, osrelease_, osreleased_;
  base::ScopedTempDir temp_dir_;
  OsReleaseReader store_;  // reader under test.
};

TEST_F(OsReleaseReaderTest, MissingOsReleaseTest) {
  store_.LoadTestingOnly(temp_dir_.GetPath());
}

TEST_F(OsReleaseReaderTest, MissingOsReleaseDTest) {
  base::DeletePathRecursively(osreleased_);
  store_.LoadTestingOnly(temp_dir_.GetPath());
}

TEST_F(OsReleaseReaderTest, CompleteTest) {
  string hello = "hello";
  string ola = "ola";
  string bob = "bob";
  string osreleasecontent = "TEST_KEY=bonjour\nNAME=bob\n";

  base::WriteFile(osreleased_.Append("TEST_KEY"), hello.data(), hello.size());
  base::WriteFile(osreleased_.Append("GREETINGS"), ola.data(), ola.size());
  base::WriteFile(osrelease_, osreleasecontent.data(), osreleasecontent.size());

  store_.LoadTestingOnly(temp_dir_.GetPath());

  string test_key_value;
  ASSERT_TRUE(store_.GetString("TEST_KEY", &test_key_value));

  string greetings_value;
  ASSERT_TRUE(store_.GetString("GREETINGS", &greetings_value));

  string name_value;
  ASSERT_TRUE(store_.GetString("NAME", &name_value));

  string nonexistent_value;
  // Getting the string should fail if the key does not exist.
  ASSERT_FALSE(store_.GetString("DOES_NOT_EXIST", &nonexistent_value));

  // hello in chosen (from os-release.d) instead of bonjour from os-release.
  ASSERT_EQ(hello, test_key_value);

  // greetings is set to ola.
  ASSERT_EQ(ola, greetings_value);

  // Name from os-release is set.
  ASSERT_EQ(bob, name_value);
}

TEST_F(OsReleaseReaderTest, NoNewLine) {
  // New lines should be stripped from os-release.d files.
  string hello = "hello\n";
  string bonjour = "bonjour\ngarbage";

  base::WriteFile(osreleased_.Append("HELLO"), hello.data(), hello.size());
  base::WriteFile(osreleased_.Append("BONJOUR"), bonjour.data(),
                  bonjour.size());

  store_.LoadTestingOnly(temp_dir_.GetPath());

  string hello_value;
  string bonjour_value;

  ASSERT_TRUE(store_.GetString("HELLO", &hello_value));
  ASSERT_TRUE(store_.GetString("BONJOUR", &bonjour_value));

  ASSERT_EQ("hello", hello_value);
  ASSERT_EQ("bonjour", bonjour_value);
}

}  // namespace brillo
