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