1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/services/gcm/fake_gcm_profile_service.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/bind.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/message_loop/message_loop.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/gcm_driver/fake_gcm_client_factory.h"
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/gcm_driver/fake_gcm_driver.h"
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/gcm_driver/gcm_driver.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/browser_context.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace gcm {
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class CustomFakeGCMDriver : public FakeGCMDriver {
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  explicit CustomFakeGCMDriver(FakeGCMProfileService* service);
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual ~CustomFakeGCMDriver();
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void OnRegisterFinished(const std::string& app_id,
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                          const std::string& registration_id,
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                          GCMClient::Result result);
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void OnUnregisterFinished(const std::string& app_id,
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                            GCMClient::Result result);
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void OnSendFinished(const std::string& app_id,
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                      const std::string& message_id,
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                      GCMClient::Result result);
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) protected:
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // FakeGCMDriver overrides:
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void RegisterImpl(
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const std::string& app_id,
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const std::vector<std::string>& sender_ids) OVERRIDE;
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void UnregisterImpl(const std::string& app_id) OVERRIDE;
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void SendImpl(const std::string& app_id,
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        const std::string& receiver_id,
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        const GCMClient::OutgoingMessage& message) OVERRIDE;
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FakeGCMProfileService* service_;
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CustomFakeGCMDriver);
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)CustomFakeGCMDriver::CustomFakeGCMDriver(FakeGCMProfileService* service)
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : service_(service) {
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)CustomFakeGCMDriver::~CustomFakeGCMDriver() {
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void CustomFakeGCMDriver::RegisterImpl(
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const std::string& app_id,
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const std::vector<std::string>& sender_ids) {
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      FROM_HERE,
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&FakeGCMProfileService::RegisterFinished,
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 base::Unretained(service_),
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 app_id,
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 sender_ids));
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void CustomFakeGCMDriver::UnregisterImpl(const std::string& app_id) {
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::MessageLoop::current()->PostTask(
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      FROM_HERE, base::Bind(
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          &FakeGCMProfileService::UnregisterFinished,
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          base::Unretained(service_),
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          app_id));
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void CustomFakeGCMDriver::SendImpl(const std::string& app_id,
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                   const std::string& receiver_id,
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                   const GCMClient::OutgoingMessage& message) {
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::MessageLoop::current()->PostTask(
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      FROM_HERE,
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Bind(&FakeGCMProfileService::SendFinished,
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 base::Unretained(service_),
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 app_id,
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 receiver_id,
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 message));
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void CustomFakeGCMDriver::OnRegisterFinished(
8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const std::string& app_id,
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const std::string& registration_id,
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    GCMClient::Result result) {
9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  RegisterFinished(app_id, registration_id, result);
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void CustomFakeGCMDriver::OnUnregisterFinished(const std::string& app_id,
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                               GCMClient::Result result) {
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  UnregisterFinished(app_id, result);
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void CustomFakeGCMDriver::OnSendFinished(const std::string& app_id,
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                         const std::string& message_id,
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                         GCMClient::Result result) {
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SendFinished(app_id, message_id, result);
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)KeyedService* FakeGCMProfileService::Build(content::BrowserContext* context) {
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Profile* profile = static_cast<Profile*>(context);
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FakeGCMProfileService* service = new FakeGCMProfileService(profile);
11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  service->SetDriverForTesting(new CustomFakeGCMDriver(service));
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return service;
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)FakeGCMProfileService::FakeGCMProfileService(Profile* profile)
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : collect_(false) {}
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)FakeGCMProfileService::~FakeGCMProfileService() {}
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void FakeGCMProfileService::RegisterFinished(
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& app_id,
12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const std::vector<std::string>& sender_ids) {
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (collect_) {
123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    last_registered_app_id_ = app_id;
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    last_registered_sender_ids_ = sender_ids;
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CustomFakeGCMDriver* custom_driver =
12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      static_cast<CustomFakeGCMDriver*>(driver());
12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  custom_driver->OnRegisterFinished(app_id,
13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                           base::UintToString(sender_ids.size()),
13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                           GCMClient::SUCCESS);
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void FakeGCMProfileService::UnregisterFinished(const std::string& app_id) {
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GCMClient::Result result = GCMClient::SUCCESS;
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!unregister_responses_.empty()) {
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    result = unregister_responses_.front();
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    unregister_responses_.pop_front();
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
14023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CustomFakeGCMDriver* custom_driver =
14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      static_cast<CustomFakeGCMDriver*>(driver());
14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  custom_driver->OnUnregisterFinished(app_id, result);
144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void FakeGCMProfileService::SendFinished(
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& app_id,
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& receiver_id,
14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const GCMClient::OutgoingMessage& message) {
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (collect_) {
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    last_sent_message_ = message;
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    last_receiver_id_ = receiver_id;
153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CustomFakeGCMDriver* custom_driver =
15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      static_cast<CustomFakeGCMDriver*>(driver());
15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  custom_driver->OnSendFinished(app_id, message.id, GCMClient::SUCCESS);
158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
16023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void FakeGCMProfileService::AddExpectedUnregisterResponse(
16123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    GCMClient::Result result) {
16223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  unregister_responses_.push_back(result);
16323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
16423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace gcm
166