text: // 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::DeleteFile(osreleased_, true);
    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
  