extension_gcm_app_handler_unittest.cc revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// found in the LICENSE file. 4c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/extensions/extension_gcm_app_handler.h" 65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include <vector> 85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/bind.h" 105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/bind_helpers.h" 11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/command_line.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/file_util.h" 135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/files/file_path.h" 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/files/scoped_temp_dir.h" 155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/location.h" 165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/logging.h" 175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/memory/ref_counted.h" 185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/message_loop/message_loop.h" 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/path_service.h" 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/prefs/pref_service.h" 215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/run_loop.h" 225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/values.h" 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/chrome_notification_types.h" 246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/extensions/api/gcm/gcm_api.h" 255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/extensions/extension_service.h" 26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/extensions/test_extension_service.h" 27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/extensions/test_extension_system.h" 285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/profiles/profile.h" 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/services/gcm/fake_signin_manager.h" 30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/services/gcm/gcm_profile_service.h" 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/services/gcm/gcm_profile_service_factory.h" 32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/signin/signin_manager_factory.h" 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/common/pref_names.h" 35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/test/base/testing_profile.h" 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/gcm_driver/fake_gcm_app_handler.h" 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/gcm_driver/fake_gcm_client.h" 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/gcm_driver/fake_gcm_client_factory.h" 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/gcm_driver/gcm_client_factory.h" 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/gcm_driver/gcm_driver.h" 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "components/keyed_service/core/keyed_service.h" 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/browser/browser_context.h" 43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/browser/browser_thread.h" 44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/test/test_browser_thread_bundle.h" 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/public/test/test_utils.h" 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "extensions/browser/extension_system.h" 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/uninstall_reason.h" 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/extension.h" 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "extensions/common/manifest.h" 50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/manifest_constants.h" 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "extensions/common/permissions/api_permission.h" 5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.h" 53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_CHROMEOS) 566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h" 57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/chromeos/settings/cros_settings.h" 58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/chromeos/settings/device_settings_service.h" 59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace extensions { 62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace { 64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst char kTestExtensionName[] = "FooBar"; 66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst char kTestingUsername[] = "user1@example.com"; 67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} // namespace 69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Helper class for asynchronous waiting. 715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass Waiter { 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public: 735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Waiter() {} 745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ~Waiter() {} 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Waits until the asynchronous operation finishes. 775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void WaitUntilCompleted() { 785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu run_loop_.reset(new base::RunLoop); 795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu run_loop_->Run(); 805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Signals that the asynchronous operation finishes. 835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void SignalCompleted() { 845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (run_loop_ && run_loop_->running()) 855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu run_loop_->Quit(); 865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Runs until UI loop becomes idle. 895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void PumpUILoop() { 905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::MessageLoop::current()->RunUntilIdle(); 915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Runs until IO loop becomes idle. 945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void PumpIOLoop() { 955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content::BrowserThread::PostTask( 965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content::BrowserThread::IO, 975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FROM_HERE, 985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Bind(&Waiter::OnIOLoopPump, base::Unretained(this))); 995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WaitUntilCompleted(); 1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private: 1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void PumpIOLoopCompleted() { 1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SignalCompleted(); 1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void OnIOLoopPump() { 1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); 1125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content::BrowserThread::PostTask( 1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content::BrowserThread::IO, 1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FROM_HERE, 1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Bind(&Waiter::OnIOLoopPumpCompleted, base::Unretained(this))); 1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void OnIOLoopPumpCompleted() { 1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); 1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content::BrowserThread::PostTask( 1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content::BrowserThread::UI, 1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FROM_HERE, 1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Bind(&Waiter::PumpIOLoopCompleted, base::Unretained(this))); 1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<base::RunLoop> run_loop_; 1295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DISALLOW_COPY_AND_ASSIGN(Waiter); 1315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 1325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass FakeExtensionGCMAppHandler : public ExtensionGCMAppHandler { 134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public: 135c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch FakeExtensionGCMAppHandler(Profile* profile, Waiter* waiter) 136c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : ExtensionGCMAppHandler(profile), 137c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch waiter_(waiter), 138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) unregistration_result_(gcm::GCMClient::UNKNOWN_ERROR), 139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) app_handler_count_drop_to_zero_(false) { 140c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 141c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 142c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual ~FakeExtensionGCMAppHandler() { 143c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void OnMessage( 146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const std::string& app_id, 1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const gcm::GCMClient::IncomingMessage& message) OVERRIDE { 148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void OnMessagesDeleted(const std::string& app_id) OVERRIDE { 151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void OnSendError( 154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const std::string& app_id, 1555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const gcm::GCMClient::SendErrorDetails& send_error_details) OVERRIDE { 156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void OnUnregisterCompleted(const std::string& app_id, 1595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gcm::GCMClient::Result result) OVERRIDE { 160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch unregistration_result_ = result; 161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch waiter_->SignalCompleted(); 162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void RemoveAppHandler(const std::string& app_id) OVERRIDE{ 165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionGCMAppHandler::RemoveAppHandler(app_id); 166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!GetGCMDriver()->app_handlers().size()) 167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) app_handler_count_drop_to_zero_ = true; 168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gcm::GCMClient::Result unregistration_result() const { 171c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return unregistration_result_; 172c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool app_handler_count_drop_to_zero() const { 174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return app_handler_count_drop_to_zero_; 175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private: 178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Waiter* waiter_; 1795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gcm::GCMClient::Result unregistration_result_; 180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool app_handler_count_drop_to_zero_; 181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DISALLOW_COPY_AND_ASSIGN(FakeExtensionGCMAppHandler); 183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}; 184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass ExtensionGCMAppHandlerTest : public testing::Test { 186c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public: 187c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static KeyedService* BuildGCMProfileService( 188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::BrowserContext* context) { 189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return new gcm::GCMProfileService( 190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Profile::FromBrowserContext(context), 191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<gcm::GCMClientFactory>(new gcm::FakeGCMClientFactory( 192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gcm::FakeGCMClient::NO_DELAY_START, 193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::BrowserThread::GetMessageLoopProxyForThread( 194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::BrowserThread::UI), 195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::BrowserThread::GetMessageLoopProxyForThread( 196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::BrowserThread::IO)))); 197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ExtensionGCMAppHandlerTest() 200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : extension_service_(NULL), 2015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu registration_result_(gcm::GCMClient::UNKNOWN_ERROR), 2025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu unregistration_result_(gcm::GCMClient::UNKNOWN_ERROR) { 203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual ~ExtensionGCMAppHandlerTest() { 206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Overridden from test::Test: 209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void SetUp() OVERRIDE { 210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Make BrowserThread work in unittest. 213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch thread_bundle_.reset(new content::TestBrowserThreadBundle( 214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::TestBrowserThreadBundle::REAL_IO_THREAD)); 215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Allow extension update to unpack crx in process. 217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) in_process_utility_thread_helper_.reset( 218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new content::InProcessUtilityThreadHelper); 219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // This is needed to create extension service under CrOS. 221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_CHROMEOS) 222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch test_user_manager_.reset(new chromeos::ScopedTestUserManager()); 223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Create a new profile. 226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TestingProfile::Builder builder; 227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch builder.AddTestingFactory(SigninManagerFactory::GetInstance(), 228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gcm::FakeSigninManager::Build); 229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch profile_ = builder.Build(); 230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch signin_manager_ = static_cast<gcm::FakeSigninManager*>( 231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SigninManagerFactory::GetInstance()->GetForProfile(profile_.get())); 232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Create extension service in order to uninstall the extension. 234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TestExtensionSystem* extension_system( 235c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static_cast<TestExtensionSystem*>(ExtensionSystem::Get(profile()))); 236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath extensions_install_dir = 237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) temp_dir_.path().Append(FILE_PATH_LITERAL("Extensions")); 238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch extension_system->CreateExtensionService( 239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CommandLine::ForCurrentProcess(), extensions_install_dir, false); 240c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch extension_service_ = extension_system->Get(profile())->extension_service(); 241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_service_->set_extensions_enabled(true); 242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_service_->set_show_extensions_prompts(false); 243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_service_->set_install_updates_when_idle_for_test(false); 244c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 245c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Enable GCM such that tests could be run on all channels. 246c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch profile()->GetPrefs()->SetBoolean(prefs::kGCMChannelEnabled, true); 247c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 248c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Create GCMProfileService that talks with fake GCMClient. 249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gcm::GCMProfileServiceFactory::GetInstance()->SetTestingFactoryAndUse( 250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profile(), &ExtensionGCMAppHandlerTest::BuildGCMProfileService); 251c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 252c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Create a fake version of ExtensionGCMAppHandler. 253c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gcm_app_handler_.reset(new FakeExtensionGCMAppHandler(profile(), &waiter_)); 254c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 255c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 256c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void TearDown() OVERRIDE { 257c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_CHROMEOS) 258c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch test_user_manager_.reset(); 259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 261c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch waiter_.PumpUILoop(); 262c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 263c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 264c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Returns a barebones test extension. 265c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_refptr<Extension> CreateExtension() { 266c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::DictionaryValue manifest; 267c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch manifest.SetString(manifest_keys::kVersion, "1.0.0.0"); 268c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch manifest.SetString(manifest_keys::kName, kTestExtensionName); 269c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::ListValue* permission_list = new base::ListValue; 2705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) permission_list->Append(new base::StringValue("gcm")); 271c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch manifest.Set(manifest_keys::kPermissions, permission_list); 272c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 273c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::string error; 274c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_refptr<Extension> extension = Extension::Create( 275f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) temp_dir_.path(), 276f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Manifest::UNPACKED, 277c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch manifest, 278c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Extension::NO_FLAGS, 279f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "ldnnhddmnhbkjipkidpdiheffobcpfmf", 280c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch &error); 281c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(extension.get()) << error; 28246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE( 28346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) extension->permissions_data()->HasAPIPermission(APIPermission::kGcm)); 284c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 285c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return extension; 286c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 287c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 288c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void LoadExtension(const Extension* extension) { 289c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch extension_service_->AddExtension(extension); 290c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 291c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 292f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) static bool IsCrxInstallerDone(extensions::CrxInstaller** installer, 293f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const content::NotificationSource& source, 294f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const content::NotificationDetails& details) { 295f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return content::Source<extensions::CrxInstaller>(source).ptr() == 296f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *installer; 297f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 298f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 299f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void UpdateExtension(const Extension* extension, 300f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& update_crx) { 301f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath data_dir; 302f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!PathService::Get(chrome::DIR_TEST_DATA, &data_dir)) { 303f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ADD_FAILURE(); 304f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return; 305f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 306f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir = data_dir.AppendASCII("extensions"); 307f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_dir = data_dir.AppendASCII(update_crx); 308f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 309f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath path = temp_dir_.path(); 310f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path = path.Append(data_dir.BaseName()); 311f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(base::CopyFile(data_dir, path)); 312f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 313f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::CrxInstaller* installer = NULL; 314f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::WindowedNotificationObserver observer( 3155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::NOTIFICATION_CRX_INSTALLER_DONE, 316f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&IsCrxInstallerDone, &installer)); 317f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_service_->UpdateExtension( 318f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension->id(), path, true, &installer); 319f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 320f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (installer) 321f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) observer.Wait(); 322f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 323f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 324c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void DisableExtension(const Extension* extension) { 325c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch extension_service_->DisableExtension( 326c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch extension->id(), Extension::DISABLE_USER_ACTION); 327c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 328c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 329c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void EnableExtension(const Extension* extension) { 330c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch extension_service_->EnableExtension(extension->id()); 331c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 332c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 333c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void UninstallExtension(const Extension* extension) { 334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extension_service_->UninstallExtension( 3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extension->id(), 3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) extensions::UNINSTALL_REASON_FOR_TESTING, 3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&base::DoNothing), 3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NULL); 339c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 340c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 341c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void SignIn(const std::string& username) { 342c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch signin_manager_->SignIn(username); 343c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch waiter_.PumpIOLoop(); 344c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 345c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 346c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void SignOut() { 347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch signin_manager_->SignOut(signin_metrics::SIGNOUT_TEST); 348c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch waiter_.PumpIOLoop(); 349c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 350c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 351c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void Register(const std::string& app_id, 352c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const std::vector<std::string>& sender_ids) { 353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetGCMDriver()->Register( 354c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch app_id, 355c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sender_ids, 356c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Bind(&ExtensionGCMAppHandlerTest::RegisterCompleted, 357c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Unretained(this))); 358c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 359c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 360c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void RegisterCompleted(const std::string& registration_id, 3615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gcm::GCMClient::Result result) { 362c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch registration_result_ = result; 363c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch waiter_.SignalCompleted(); 364c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 365c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gcm::GCMDriver* GetGCMDriver() const { 367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return gcm::GCMProfileServiceFactory::GetForProfile(profile())->driver(); 368c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 369c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 370c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool HasAppHandlers(const std::string& app_id) const { 371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GetGCMDriver()->app_handlers().count(app_id); 372c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 373c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 374c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Profile* profile() const { return profile_.get(); } 375c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Waiter* waiter() { return &waiter_; } 376c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch FakeExtensionGCMAppHandler* gcm_app_handler() const { 377c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return gcm_app_handler_.get(); 378c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 3795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gcm::GCMClient::Result registration_result() const { 3805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return registration_result_; 3815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 3825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gcm::GCMClient::Result unregistration_result() const { 383c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return unregistration_result_; 384c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 385c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 386c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private: 387c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<content::TestBrowserThreadBundle> thread_bundle_; 388f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<content::InProcessUtilityThreadHelper> 389f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) in_process_utility_thread_helper_; 390c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<TestingProfile> profile_; 391c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ExtensionService* extension_service_; // Not owned. 392c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gcm::FakeSigninManager* signin_manager_; // Not owned. 393f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::ScopedTempDir temp_dir_; 394c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 395c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // This is needed to create extension service under CrOS. 396c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_CHROMEOS) 397c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch chromeos::ScopedTestDeviceSettingsService test_device_settings_service_; 398c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch chromeos::ScopedTestCrosSettings test_cros_settings_; 399c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<chromeos::ScopedTestUserManager> test_user_manager_; 400c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 401c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 402c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Waiter waiter_; 403c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<FakeExtensionGCMAppHandler> gcm_app_handler_; 4045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gcm::GCMClient::Result registration_result_; 4055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gcm::GCMClient::Result unregistration_result_; 406c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 407c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DISALLOW_COPY_AND_ASSIGN(ExtensionGCMAppHandlerTest); 408c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}; 409c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 410c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(ExtensionGCMAppHandlerTest, AddAndRemoveAppHandler) { 411c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_refptr<Extension> extension(CreateExtension()); 412c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 413c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // App handler is added when extension is loaded. 414c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch LoadExtension(extension); 415c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch waiter()->PumpUILoop(); 416c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(HasAppHandlers(extension->id())); 417c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 418c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // App handler is removed when extension is unloaded. 419c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DisableExtension(extension); 420c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch waiter()->PumpUILoop(); 421c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(HasAppHandlers(extension->id())); 422c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 423c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // App handler is added when extension is reloaded. 424c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EnableExtension(extension); 425c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch waiter()->PumpUILoop(); 426c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(HasAppHandlers(extension->id())); 427c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 428c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // App handler is removed when extension is uninstalled. 429c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch UninstallExtension(extension); 430c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch waiter()->PumpUILoop(); 431c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(HasAppHandlers(extension->id())); 432c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 433c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 434c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(ExtensionGCMAppHandlerTest, UnregisterOnExtensionUninstall) { 435c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_refptr<Extension> extension(CreateExtension()); 436c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch LoadExtension(extension); 437c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 438c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Sign-in is needed for registration. 439c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SignIn(kTestingUsername); 440c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 441c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Kick off registration. 442c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::vector<std::string> sender_ids; 443c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sender_ids.push_back("sender1"); 444c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Register(extension->id(), sender_ids); 445c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch waiter()->WaitUntilCompleted(); 4465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(gcm::GCMClient::SUCCESS, registration_result()); 447c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Add another app handler in order to prevent the GCM service from being 449cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // stopped when the extension is uninstalled. This is needed because otherwise 450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // we are not able to receive the unregistration result. 451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetGCMDriver()->AddAppHandler("Foo", gcm_app_handler()); 452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 453c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Unregistration should be triggered when the extension is uninstalled. 454c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch UninstallExtension(extension); 455c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch waiter()->WaitUntilCompleted(); 4565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(gcm::GCMClient::SUCCESS, 4575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gcm_app_handler()->unregistration_result()); 458cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 459cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Clean up. 460cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetGCMDriver()->RemoveAppHandler("Foo"); 461c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 462c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 463f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(ExtensionGCMAppHandlerTest, UpdateExtensionWithGcmPermissionKept) { 464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<Extension> extension(CreateExtension()); 465f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 466f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // App handler is added when the extension is loaded. 467f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LoadExtension(extension); 468f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) waiter()->PumpUILoop(); 469f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(HasAppHandlers(extension->id())); 470f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 471f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // App handler count should not drop to zero when the extension is updated. 472f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) UpdateExtension(extension, "gcm2.crx"); 473f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) waiter()->PumpUILoop(); 474f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(gcm_app_handler()->app_handler_count_drop_to_zero()); 475f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(HasAppHandlers(extension->id())); 476f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 477f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 478f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(ExtensionGCMAppHandlerTest, UpdateExtensionWithGcmPermissionRemoved) { 479f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<Extension> extension(CreateExtension()); 480f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 481f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // App handler is added when the extension is loaded. 482f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LoadExtension(extension); 483f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) waiter()->PumpUILoop(); 484f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(HasAppHandlers(extension->id())); 485f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 486f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // App handler is removed when the extension is updated to the version that 487f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // has GCM permission removed. 488f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) UpdateExtension(extension, "good2.crx"); 489f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) waiter()->PumpUILoop(); 490f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(gcm_app_handler()->app_handler_count_drop_to_zero()); 491f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(HasAppHandlers(extension->id())); 492f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 493f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 494c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} // namespace extensions 495