// Copyright (c) 2009-2010 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.

// Creates credential stores for testing

#include "make_tests.h"

#include <base/file_path.h>
#include <base/file_util.h>
#include <base/logging.h>
#include <base/string_util.h>
#include <chromeos/utility.h>

#include "crypto.h"
#include "mock_platform.h"
#include "mock_tpm.h"
#include "mount.h"
#include "secure_blob.h"
#include "username_passkey.h"
#include "vault_keyset.h"

namespace cryptohome {
using ::testing::NiceMock;

// struct TestUserInfo {
//   const char* username;
//   const char* password;
//   bool create;
//   bool use_old_format;
// };

const TestUserInfo kDefaultUsers[] = {
  {"testuser0@invalid.domain", "zero", true, false},
  {"testuser1@invalid.domain", "one", true, false},
  {"testuser2@invalid.domain", "two", true, false},
  {"testuser3@invalid.domain", "three", true, false},
  {"testuser4@invalid.domain", "four", true, false},
  {"testuser5@invalid.domain", "five", false, false},
  {"testuser6@invalid.domain", "six", true, false},
  {"testuser7@invalid.domain", "seven", true, true},
  {"testuser8@invalid.domain", "eight", true, false},
  {"testuser9@invalid.domain", "nine", true, false},
  {"testuser10@invalid.domain", "ten", true, false},
  {"testuser11@invalid.domain", "eleven", true, false},
  {"testuser12@invalid.domain", "twelve", false, false},
};
const size_t kDefaultUserCount = arraysize(kDefaultUsers);

// Used for tracking directories clean-up tests.
const TestUserInfo kAlternateUsers[] = {
  {"altuser0@invalid.domain", "zero", true, false},
  {"altuser1@invalid.domain", "odin", true, false},
  {"altuser2@invalid.domain", "dwaa", true, false},
};
const size_t kAlternateUserCount = arraysize(kAlternateUsers);

MakeTests::MakeTests() {
}

void MakeTests::InitTestData(const std::string& image_dir,
                             const TestUserInfo* test_users,
                             size_t test_user_count) {
  if (file_util::PathExists(FilePath(image_dir))) {
    file_util::Delete(FilePath(image_dir), true);
  }

  file_util::CreateDirectory(FilePath(image_dir));

  std::string skeleton_path = StringPrintf("%s/skel/sub_path",
                                           image_dir.c_str());
  file_util::CreateDirectory(FilePath(skeleton_path));
  std::string skeleton_file = StringPrintf("%s/.testfile",
                                           skeleton_path.c_str());
  file_util::WriteFile(FilePath(skeleton_file), "test", 4);

  Crypto crypto;
  SecureBlob salt;
  FilePath salt_path(StringPrintf("%s/salt", image_dir.c_str()));
  crypto.GetOrCreateSalt(salt_path, 16, true, &salt);

  // Create the user credentials
  for (unsigned int i = 0; i < test_user_count; i++) {
    if (test_users[i].create) {
      Mount mount;
      NiceMock<MockPlatform> platform;
      mount.set_platform(&platform);
      NiceMock<MockTpm> tpm;
      mount.get_crypto()->set_tpm(&tpm);
      mount.set_shadow_root(image_dir);
      mount.set_skel_source(StringPrintf("%s/skel", image_dir.c_str()));

      mount.set_use_tpm(false);
      mount.set_fallback_to_scrypt(false);
      mount.Init();

      cryptohome::SecureBlob passkey;
      cryptohome::Crypto::PasswordToPasskey(test_users[i].password,
                                            salt,
                                            &passkey);
      UsernamePasskey up(test_users[i].username, passkey);
      bool created;
      Mount::MountArgs mount_args;
      mount.EnsureCryptohome(up, mount_args, &created);

      if (test_users[i].use_old_format) {
        VaultKeyset vault_keyset;
        SerializedVaultKeyset serialized;
        cryptohome::Mount::MountError error;
        if (mount.DecryptVaultKeyset(up, false, &vault_keyset, &serialized,
                                     &error)) {
          mount.RemoveOldFiles(up);
          mount.SaveVaultKeysetOld(up, vault_keyset);
        }
      }
    }
  }
}

} // namespace cryptohome
