// Copyright (c) 2011 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 "content/browser/geolocation/fake_access_token_store.h"

#include "base/bind.h"
#include "base/location.h"
#include "base/logging.h"
#include "base/message_loop/message_loop_proxy.h"

using base::MessageLoopProxy;
using testing::_;
using testing::Invoke;

namespace content {

FakeAccessTokenStore::FakeAccessTokenStore()
    : originating_message_loop_(NULL) {
  ON_CALL(*this, LoadAccessTokens(_))
      .WillByDefault(Invoke(this,
                            &FakeAccessTokenStore::DefaultLoadAccessTokens));
  ON_CALL(*this, SaveAccessToken(_, _))
      .WillByDefault(Invoke(this,
                            &FakeAccessTokenStore::DefaultSaveAccessToken));
}

void FakeAccessTokenStore::NotifyDelegateTokensLoaded() {
  DCHECK(originating_message_loop_);
  if (!originating_message_loop_->BelongsToCurrentThread()) {
    originating_message_loop_->PostTask(
        FROM_HERE,
        base::Bind(&FakeAccessTokenStore::NotifyDelegateTokensLoaded, this));
    return;
  }

  net::URLRequestContextGetter* context_getter = NULL;
  callback_.Run(access_token_set_, context_getter);
}

void FakeAccessTokenStore::DefaultLoadAccessTokens(
    const LoadAccessTokensCallbackType& callback) {
  originating_message_loop_ = MessageLoopProxy::current().get();
  callback_ = callback;
}

void FakeAccessTokenStore::DefaultSaveAccessToken(
    const GURL& server_url, const string16& access_token) {
  DCHECK(server_url.is_valid());
  access_token_set_[server_url] = access_token;
}

FakeAccessTokenStore::~FakeAccessTokenStore() {}

}  // namespace content
