// Copyright 2017 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 <unistd.h>

#include <keyutils.h>

#include <memory>
#include <string>

#include <gtest/gtest.h>

#include "base/logging.h"
#include "libpasswordprovider/password.h"
#include "libpasswordprovider/password_provider.h"
#include "libpasswordprovider/password_provider_test_utils.h"

namespace password_provider {

// Tests for the PasswordProvider class.
class PasswordProviderTest : public testing::Test {
 protected:
  void SetUp() override {
    // Before running a test, check if keyrings are supported in the kernel.
    keyrings_supported_ =
        !(keyctl_clear(KEY_SPEC_PROCESS_KEYRING) == -1 && errno == ENOSYS);
  }

  PasswordProvider password_provider_;
  bool keyrings_supported_ = true;
};

// Saving and retrieving password should succeed.
TEST_F(PasswordProviderTest, SaveAndGetPassword) {
  if (!keyrings_supported_) {
    LOG(WARNING)
        << "Skipping test because keyrings are not supported by the kernel.";
    return;
  }

  const std::string kPasswordStr("thepassword");
  auto password = test::CreatePassword(kPasswordStr);

  EXPECT_TRUE(password_provider_.SavePassword(*password.get()));
  std::unique_ptr<Password> retrieved_password =
      password_provider_.GetPassword();
  ASSERT_TRUE(retrieved_password);
  EXPECT_EQ(std::string(retrieved_password->GetRaw()), kPasswordStr);
  EXPECT_EQ(retrieved_password->size(), kPasswordStr.size());
}

// Reading password should fail if password was already discarded.
TEST_F(PasswordProviderTest, DiscardAndGetPassword) {
  if (!keyrings_supported_) {
    LOG(WARNING)
        << "Skipping test because keyrings are not supported by the kernel.";
    return;
  }

  const std::string kPasswordStr("thepassword");
  auto password = test::CreatePassword(kPasswordStr);

  EXPECT_TRUE(password_provider_.SavePassword(*password.get()));
  EXPECT_TRUE(password_provider_.DiscardPassword());
  std::unique_ptr<Password> retrieved_password =
      password_provider_.GetPassword();
  EXPECT_FALSE(retrieved_password);
}

// Retrieving a very long password should succeed.
TEST_F(PasswordProviderTest, GetLongPassword) {
  if (!keyrings_supported_) {
    LOG(WARNING)
        << "Skipping test because keyrings are not supported by the kernel.";
    return;
  }

  // Create a very long password.
  // (page size - 1) is the max size of the Password buffer.
  size_t max_size = sysconf(_SC_PAGESIZE) - 1;
  auto long_password = std::make_unique<char[]>(max_size);
  memset(long_password.get(), 'a', max_size);
  std::string password_str(long_password.get(), max_size);
  auto password = test::CreatePassword(password_str);

  EXPECT_TRUE(password_provider_.SavePassword(*password.get()));
  std::unique_ptr<Password> retrieved_password =
      password_provider_.GetPassword();
  ASSERT_TRUE(retrieved_password);
  EXPECT_EQ(std::string(retrieved_password->GetRaw()), password_str);
}

}  // namespace password_provider
