1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/extensions/external_provider_impl.h" 6 7#include "base/command_line.h" 8#include "base/files/file_path.h" 9#include "base/files/file_util.h" 10#include "base/memory/scoped_ptr.h" 11#include "base/path_service.h" 12#include "base/prefs/testing_pref_service.h" 13#include "base/strings/stringprintf.h" 14#include "base/test/scoped_path_override.h" 15#include "chrome/browser/chrome_notification_types.h" 16#include "chrome/browser/extensions/extension_service.h" 17#include "chrome/browser/extensions/extension_service_test_base.h" 18#include "chrome/browser/extensions/updater/extension_cache_fake.h" 19#include "chrome/common/chrome_paths.h" 20#include "chrome/common/chrome_switches.h" 21#include "chrome/common/extensions/extension_constants.h" 22#include "chrome/common/pref_names.h" 23#include "chrome/test/base/testing_browser_process.h" 24#include "chrome/test/base/testing_profile.h" 25#include "content/public/browser/notification_service.h" 26#include "content/public/test/test_utils.h" 27#include "net/test/embedded_test_server/embedded_test_server.h" 28#include "net/test/embedded_test_server/http_request.h" 29#include "net/test/embedded_test_server/http_response.h" 30#include "testing/gmock/include/gmock/gmock.h" 31 32#if defined(OS_CHROMEOS) 33#include "chrome/browser/chromeos/customization_document.h" 34#include "chrome/browser/chromeos/login/users/fake_user_manager.h" 35#include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h" 36#include "chromeos/system/mock_statistics_provider.h" 37#include "chromeos/system/statistics_provider.h" 38#endif 39 40using ::testing::_; 41using ::testing::NotNull; 42using ::testing::Return; 43 44namespace extensions { 45 46namespace { 47 48using namespace net::test_server; 49 50const char kManifestPath[] = "/update_manifest"; 51const char kAppPath[] = "/app.crx"; 52 53class ExternalProviderImplTest : public ExtensionServiceTestBase { 54 public: 55 ExternalProviderImplTest() {} 56 virtual ~ExternalProviderImplTest() {} 57 58 void InitServiceWithExternalProviders() { 59#if defined(OS_CHROMEOS) 60 chromeos::ScopedUserManagerEnabler scoped_user_manager( 61 new chromeos::FakeUserManager); 62#endif 63 InitializeExtensionServiceWithUpdater(); 64 65 // Don't install default apps. Some of the default apps are downloaded from 66 // the webstore, ignoring the url we pass to kAppsGalleryUpdateURL, which 67 // would cause the external updates to never finish install. 68 profile_->GetPrefs()->SetString(prefs::kDefaultApps, ""); 69 70 ProviderCollection providers; 71 extensions::ExternalProviderImpl::CreateExternalProviders( 72 service_, profile_.get(), &providers); 73 74 for (ProviderCollection::iterator i = providers.begin(); 75 i != providers.end(); 76 ++i) { 77 service_->AddProviderForTesting(i->release()); 78 } 79 } 80 81 // ExtensionServiceTestBase overrides: 82 virtual void SetUp() OVERRIDE { 83 ExtensionServiceTestBase::SetUp(); 84 test_server_.reset(new EmbeddedTestServer()); 85 86#if defined(OS_CHROMEOS) 87 TestingBrowserProcess::GetGlobal()->SetLocalState(&local_state_); 88 chromeos::ServicesCustomizationDocument::RegisterPrefs( 89 local_state_.registry()); 90#endif 91 92 ASSERT_TRUE(test_server_->InitializeAndWaitUntilReady()); 93 test_server_->RegisterRequestHandler( 94 base::Bind(&ExternalProviderImplTest::HandleRequest, 95 base::Unretained(this))); 96 97 test_extension_cache_.reset(new ExtensionCacheFake()); 98 99 CommandLine* cmdline = CommandLine::ForCurrentProcess(); 100 cmdline->AppendSwitchASCII(switches::kAppsGalleryUpdateURL, 101 test_server_->GetURL(kManifestPath).spec()); 102#if defined(OS_CHROMEOS) 103 chromeos::system::StatisticsProvider::SetTestProvider( 104 &mock_statistics_provider_); 105 EXPECT_CALL(mock_statistics_provider_, GetMachineStatistic(_, NotNull())) 106 .WillRepeatedly(Return(false)); 107#endif 108 } 109 110 virtual void TearDown() OVERRIDE { 111#if defined(OS_CHROMEOS) 112 chromeos::system::StatisticsProvider::SetTestProvider(NULL); 113 TestingBrowserProcess::GetGlobal()->SetLocalState(NULL); 114#endif 115 } 116 117 private: 118 scoped_ptr<HttpResponse> HandleRequest(const HttpRequest& request) { 119 GURL url = test_server_->GetURL(request.relative_url); 120 if (url.path() == kManifestPath) { 121 scoped_ptr<BasicHttpResponse> response(new BasicHttpResponse); 122 response->set_code(net::HTTP_OK); 123 response->set_content(base::StringPrintf( 124 "<?xml version='1.0' encoding='UTF-8'?>\n" 125 "<gupdate xmlns='http://www.google.com/update2/response' " 126 "protocol='2.0'>\n" 127 " <app appid='%s'>\n" 128 " <updatecheck codebase='%s' version='1.0' />\n" 129 " </app>\n" 130 "</gupdate>", 131 extension_misc::kInAppPaymentsSupportAppId, 132 test_server_->GetURL(kAppPath).spec().c_str())); 133 response->set_content_type("text/xml"); 134 return response.PassAs<HttpResponse>(); 135 } 136 if (url.path() == kAppPath) { 137 base::FilePath test_data_dir; 138 PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir); 139 std::string contents; 140 base::ReadFileToString( 141 test_data_dir.AppendASCII("extensions/dummyiap.crx"), 142 &contents); 143 scoped_ptr<BasicHttpResponse> response(new BasicHttpResponse); 144 response->set_code(net::HTTP_OK); 145 response->set_content(contents); 146 return response.PassAs<HttpResponse>(); 147 } 148 149 return scoped_ptr<HttpResponse>(); 150 } 151 152 scoped_ptr<EmbeddedTestServer> test_server_; 153 scoped_ptr<ExtensionCacheFake> test_extension_cache_; 154#if defined(OS_CHROMEOS) 155 chromeos::system::MockStatisticsProvider mock_statistics_provider_; 156 TestingPrefServiceSimple local_state_; 157#endif 158 159 DISALLOW_COPY_AND_ASSIGN(ExternalProviderImplTest); 160}; 161 162} // namespace 163 164TEST_F(ExternalProviderImplTest, InAppPayments) { 165 InitServiceWithExternalProviders(); 166 167 scoped_refptr<content::MessageLoopRunner> runner = 168 new content::MessageLoopRunner; 169 service_->set_external_updates_finished_callback_for_test( 170 runner->QuitClosure()); 171 172 service_->CheckForExternalUpdates(); 173 runner->Run(); 174 175 EXPECT_TRUE(service_->GetInstalledExtension( 176 extension_misc::kInAppPaymentsSupportAppId)); 177 EXPECT_TRUE(service_->IsExtensionEnabled( 178 extension_misc::kInAppPaymentsSupportAppId)); 179} 180 181} // namespace extensions 182