// Copyright (c) 2012 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 "install_attributes/libinstallattributes.h"

#include <string>

#include <gtest/gtest.h>

// Allows to override the install attributes path while preserving all the
// functionality of the original class.
class MockInstallAttributesReader : public InstallAttributesReader {
 public:
  void SetPath(const std::string& filename) {
    install_attributes_path_ = base::FilePath(filename);
  }
  size_t GetAttributesCount() const { return attributes_.size(); }
};

TEST(InstallAttributesTest, ReadNonexistingAttributes) {
  MockInstallAttributesReader reader;
  reader.SetPath("non-existing.pb");
  ASSERT_FALSE(reader.IsLocked());
  ASSERT_EQ(0, reader.GetAttributesCount());
}

// corrupt.pb is an invalid proto.
TEST(InstallAttributesTest, ReadCorruptAttributes) {
  MockInstallAttributesReader reader;
  reader.SetPath("install_attributes/tests/corrupt.pb");
  ASSERT_TRUE(reader.IsLocked());
  ASSERT_EQ(0, reader.GetAttributesCount());
}

// consumer.pb is a valid proto containing no attributes.
TEST(InstallAttributesTest, ReadEmptyAttributes) {
  MockInstallAttributesReader reader;
  reader.SetPath("install_attributes/tests/consumer.pb");
  ASSERT_TRUE(reader.IsLocked());
  ASSERT_EQ(0, reader.GetAttributesCount());
}

// managed.pb is a valid proto containing the usual enterprise enrollment
// attributes.
TEST(InstallAttributesTest, ReadManagedAttributes) {
  MockInstallAttributesReader reader;
  reader.SetPath("install_attributes/tests/managed.pb");
  ASSERT_TRUE(reader.IsLocked());
  ASSERT_EQ(std::string(), reader.GetAttribute("non-existing"));
  ASSERT_EQ("enterprise", reader.GetAttribute("enterprise.mode"));
}

// Going from non-existing attributes file to existing attributes file must
// work, i.e. the non-existence of the attributes file must not be cached.
TEST(InstallAttributesTest, ProgressionFromNonExistingToManaged) {
  MockInstallAttributesReader reader;
  reader.SetPath("non-existing.pb");
  ASSERT_FALSE(reader.IsLocked());
  ASSERT_EQ(0, reader.GetAttributesCount());

  reader.SetPath("install_attributes/tests/managed.pb");
  ASSERT_TRUE(reader.IsLocked());
  ASSERT_EQ("enterprise", reader.GetAttribute("enterprise.mode"));
}

// Going from empty attributes file to non-empty attributes file must not work,
// i.e. the non-existence of the attributes must be cached.
TEST(InstallAttributesTest, NoProgressionFromEmptyToManaged) {
  MockInstallAttributesReader reader;
  reader.SetPath("install_attributes/tests/consumer.pb");
  ASSERT_TRUE(reader.IsLocked());
  ASSERT_EQ(0, reader.GetAttributesCount());

  reader.SetPath("install_attributes/tests/managed.pb");
  ASSERT_TRUE(reader.IsLocked());
  ASSERT_EQ(std::string(), reader.GetAttribute("enterprise.mode"));
}
