// 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.

// Unit tests for Credentials.

#include "cryptohome/credentials.h"

#include <string.h>  // For memset(), memcpy(), memcmp().

#include <base/strings/string_number_conversions.h>
#include <brillo/secure_blob.h>
#include <gtest/gtest.h>
#include <string>

using brillo::SecureBlob;

namespace cryptohome {

const char kFakeUser[] = "fakeuser";
const char kFakePasskey[] = "176c1e698b521373d77ce655d2e56a1d";

// salt must have even number of characters.
const char kFakeSystemSalt[] = "01234567890123456789";

class CredentialsTest : public ::testing::Test {
 public:
  CredentialsTest() {}
  virtual ~CredentialsTest() {}

 private:
  DISALLOW_COPY_AND_ASSIGN(CredentialsTest);
};

TEST(CredentialsTest, UsernameTest) {
  char username[80];
  snprintf(username, sizeof(username), "%s%s", kFakeUser, "@gmail.com");
  Credentials credentials(username, SecureBlob(kFakePasskey));
  std::string full_username = credentials.username();
  EXPECT_EQ(0, strcmp(username, full_username.c_str()));
}

TEST(CredentialsTest, GetObfuscatedUsernameTest) {
  Credentials credentials(kFakeUser, SecureBlob(kFakePasskey));

  brillo::SecureBlob fake_salt;
  EXPECT_TRUE(
      brillo::SecureBlob::HexStringToSecureBlob(kFakeSystemSalt, &fake_salt));

  EXPECT_EQ("bb0ae3fcd181eefb861b4f0ee147a316e51d9f04",
            credentials.GetObfuscatedUsername(fake_salt));
}

TEST(CredentialsTest, GetPasskeyTest) {
  Credentials credentials(kFakeUser, SecureBlob(kFakePasskey));
  SecureBlob passkey;
  credentials.GetPasskey(&passkey);
  EXPECT_EQ(strlen(kFakePasskey), passkey.size());
  EXPECT_EQ(0, memcmp(kFakePasskey, passkey.data(), passkey.size()));
}

}  // namespace cryptohome
