// Copyright 2013 The Chromium 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 "chrome/browser/ui/webui/identity_internals_ui_browsertest.h"

#include "base/strings/string_number_conversions.h"
#include "base/time/time.h"
#include "chrome/browser/extensions/api/identity/extension_token_key.h"
#include "chrome/browser/extensions/api/identity/identity_api.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"

namespace {

const char kChromeWebStoreId[] = "ahfgeienlihckogmohjhadlkjgocpleb";
const int kOneHour = 3600;
} // namespace

IdentityInternalsUIBrowserTest::IdentityInternalsUIBrowserTest() {}

IdentityInternalsUIBrowserTest::~IdentityInternalsUIBrowserTest() {}

void IdentityInternalsUIBrowserTest::SetupTokenCache(int number_of_tokens) {
  for (int number = 0; number < number_of_tokens; ++number) {
    const std::string token_number = base::IntToString(number);
    std::string token_id("token");
    token_id += token_number;
    std::string extension_id("extension");
    extension_id += token_number;
    std::vector<std::string> scopes;
    scopes.push_back(std::string("scope_1_") + token_number);
    scopes.push_back(std::string("scope_2_") + token_number);
    AddTokenToCache(token_id, extension_id, scopes, kOneHour);
  }
}

void IdentityInternalsUIBrowserTest::SetupTokenCacheWithStoreApp() {
  std::vector<std::string> scopes;
  scopes.push_back(std::string("store_scope1"));
  scopes.push_back(std::string("store_scope2"));
  AddTokenToCache("store_token", kChromeWebStoreId, scopes, kOneHour);
}

void IdentityInternalsUIBrowserTest::AddTokenToCache(
    const std::string token_id,
    const std::string extension_id,
    const std::vector<std::string>& scopes,
    int time_to_live) {
  extensions::IdentityTokenCacheValue token_cache_value =
      extensions::IdentityTokenCacheValue(token_id,
          base::TimeDelta::FromSeconds(time_to_live));
  extensions::ExtensionTokenKey key(
      extension_id,
      "test@example.com",
      std::set<std::string>(scopes.begin(), scopes.end()));
  extensions::IdentityAPI::GetFactoryInstance()
      ->Get(browser()->profile())
      ->SetCachedToken(key, token_cache_value);
}
