Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/android/webapk/webapk_installer.h" | 5 #include "chrome/browser/android/webapk/webapk_installer.h" |
| 6 | 6 |
| 7 #include <jni.h> | 7 #include <jni.h> |
|
dominickn
2016/10/27 00:36:26
Nit: #include <map>
| |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| 11 #include "base/android/field_trial_list.h" | |
| 11 #include "base/android/scoped_java_ref.h" | 12 #include "base/android/scoped_java_ref.h" |
| 12 #include "base/bind.h" | 13 #include "base/bind.h" |
| 13 #include "base/callback_forward.h" | 14 #include "base/callback_forward.h" |
| 14 #include "base/command_line.h" | 15 #include "base/feature_list.h" |
| 15 #include "base/files/file_path.h" | 16 #include "base/files/file_path.h" |
| 17 #include "base/memory/ptr_util.h" | |
| 16 #include "base/memory/ref_counted.h" | 18 #include "base/memory/ref_counted.h" |
| 17 #include "base/run_loop.h" | 19 #include "base/run_loop.h" |
| 18 #include "base/single_thread_task_runner.h" | 20 #include "base/single_thread_task_runner.h" |
| 21 #include "base/test/scoped_feature_list.h" | |
| 19 #include "base/threading/thread_task_runner_handle.h" | 22 #include "base/threading/thread_task_runner_handle.h" |
| 23 #include "chrome/browser/android/chrome_feature_list.h" | |
| 20 #include "chrome/browser/android/shortcut_info.h" | 24 #include "chrome/browser/android/shortcut_info.h" |
| 21 #include "chrome/browser/android/webapk/webapk.pb.h" | 25 #include "chrome/browser/android/webapk/webapk.pb.h" |
| 22 #include "chrome/common/chrome_switches.h" | 26 #include "chrome/common/chrome_switches.h" |
| 27 #include "components/variations/variations_associated_data.h" | |
| 23 #include "content/public/browser/browser_thread.h" | 28 #include "content/public/browser/browser_thread.h" |
| 24 #include "content/public/test/test_browser_thread_bundle.h" | 29 #include "content/public/test/test_browser_thread_bundle.h" |
| 25 #include "net/test/embedded_test_server/embedded_test_server.h" | 30 #include "net/test/embedded_test_server/embedded_test_server.h" |
| 26 #include "net/test/embedded_test_server/http_request.h" | 31 #include "net/test/embedded_test_server/http_request.h" |
| 27 #include "net/test/embedded_test_server/http_response.h" | 32 #include "net/test/embedded_test_server/http_response.h" |
| 28 #include "net/url_request/url_request_test_util.h" | 33 #include "net/url_request/url_request_test_util.h" |
| 29 #include "testing/gtest/include/gtest/gtest.h" | 34 #include "testing/gtest/include/gtest/gtest.h" |
| 30 #include "third_party/skia/include/core/SkBitmap.h" | 35 #include "third_party/skia/include/core/SkBitmap.h" |
| 31 #include "url/gurl.h" | 36 #include "url/gurl.h" |
| 32 | 37 |
| 33 namespace { | 38 namespace { |
| 34 | 39 |
| 35 const base::FilePath::CharType kTestDataDir[] = | 40 const base::FilePath::CharType kTestDataDir[] = |
| 36 FILE_PATH_LITERAL("chrome/test/data"); | 41 FILE_PATH_LITERAL("chrome/test/data"); |
| 37 | 42 |
| 43 // Mock field trial name and field trial group to use for "WebApks" feature. | |
| 44 const char kFieldTrialName[] = "MockFieldTrial"; | |
| 45 const char kFieldTrialGroup[] = "MockFieldTrialGroup"; | |
| 46 | |
| 38 // URL of mock WebAPK server. | 47 // URL of mock WebAPK server. |
| 39 const char* kServerUrl = "/webapkserver/"; | 48 const char* kServerUrl = "/webapkserver/"; |
| 40 | 49 |
| 41 // Icon URL from Web Manifest. We use a random file in the test data directory. | 50 // Icon URL from Web Manifest. We use a random file in the test data directory. |
| 42 // Since WebApkInstaller does not try to decode the file as an image it is OK | 51 // Since WebApkInstaller does not try to decode the file as an image it is OK |
| 43 // that the file is not an image. | 52 // that the file is not an image. |
| 44 const char* kIconUrl = "/simple.html"; | 53 const char* kIconUrl = "/simple.html"; |
| 45 | 54 |
| 46 // URL of file to download from the WebAPK server. We use a random file in the | 55 // URL of file to download from the WebAPK server. We use a random file in the |
| 47 // test data directory. | 56 // test data directory. |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 177 | 186 |
| 178 } // anonymous namespace | 187 } // anonymous namespace |
| 179 | 188 |
| 180 class WebApkInstallerTest : public ::testing::Test { | 189 class WebApkInstallerTest : public ::testing::Test { |
| 181 public: | 190 public: |
| 182 typedef base::Callback<std::unique_ptr<net::test_server::HttpResponse>(void)> | 191 typedef base::Callback<std::unique_ptr<net::test_server::HttpResponse>(void)> |
| 183 WebApkResponseBuilder; | 192 WebApkResponseBuilder; |
| 184 | 193 |
| 185 WebApkInstallerTest() | 194 WebApkInstallerTest() |
| 186 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {} | 195 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {} |
| 187 ~WebApkInstallerTest() override {} | 196 ~WebApkInstallerTest() override { |
| 197 variations::testing::ClearAllVariationParams(); | |
| 198 } | |
| 188 | 199 |
| 189 void SetUp() override { | 200 void SetUp() override { |
| 190 test_server_.AddDefaultHandlers(base::FilePath(kTestDataDir)); | 201 test_server_.AddDefaultHandlers(base::FilePath(kTestDataDir)); |
| 191 test_server_.RegisterRequestHandler( | 202 test_server_.RegisterRequestHandler( |
| 192 base::Bind(&WebApkInstallerTest::HandleWebApkRequest, | 203 base::Bind(&WebApkInstallerTest::HandleWebApkRequest, |
| 193 base::Unretained(this))); | 204 base::Unretained(this))); |
| 194 ASSERT_TRUE(test_server_.Start()); | 205 ASSERT_TRUE(test_server_.Start()); |
| 195 | 206 |
| 207 field_trial_list_.reset(new base::FieldTrialList(nullptr)); | |
| 208 base::FieldTrial* field_trial = base::FieldTrialList::CreateFieldTrial( | |
| 209 kFieldTrialName, kFieldTrialGroup); | |
| 210 std::unique_ptr<base::FeatureList> feature_list = | |
| 211 base::MakeUnique<base::FeatureList>(); | |
| 212 feature_list->RegisterFieldTrialOverride( | |
| 213 chrome::android::kWebApks.name, | |
| 214 base::FeatureList::OVERRIDE_ENABLE_FEATURE, field_trial); | |
| 215 scoped_feature_list_.InitWithFeatureList(std::move(feature_list)); | |
| 216 | |
| 196 SetDefaults(); | 217 SetDefaults(); |
| 197 } | 218 } |
| 198 | 219 |
| 199 // Sets the Web Manifest's icon URL. | 220 // Sets the Web Manifest's icon URL. |
| 200 void SetIconUrl(const GURL& icon_url) { icon_url_ = icon_url; } | 221 void SetIconUrl(const GURL& icon_url) { icon_url_ = icon_url; } |
| 201 | 222 |
| 202 // Sets the URL to send the webapk::CreateWebApkRequest to. WebApkInstaller | 223 // Sets the URL to send the webapk::CreateWebApkRequest to. WebApkInstaller |
| 203 // should fail if the URL is not |kServerUrl|. | 224 // should fail if the URL is not |kServerUrl|. |
| 204 void SetWebApkServerUrl(const GURL& server_url) { | 225 void SetWebApkServerUrl(const GURL& server_url) { |
| 205 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 226 variations::testing::ClearAllVariationParams(); |
| 206 switches::kWebApkServerUrl, server_url.spec()); | 227 std::map<std::string, std::string> params; |
| 228 params["ServerUrl"] = server_url.spec(); | |
| 229 ASSERT_TRUE(variations::AssociateVariationParams(kFieldTrialName, | |
| 230 kFieldTrialGroup, params)); | |
| 207 } | 231 } |
| 208 | 232 |
| 209 // Sets the function that should be used to build the response to the | 233 // Sets the function that should be used to build the response to the |
| 210 // WebAPK creation request. | 234 // WebAPK creation request. |
| 211 void SetWebApkResponseBuilder(const WebApkResponseBuilder& builder) { | 235 void SetWebApkResponseBuilder(const WebApkResponseBuilder& builder) { |
| 212 webapk_response_builder_ = builder; | 236 webapk_response_builder_ = builder; |
| 213 } | 237 } |
| 214 | 238 |
| 215 std::unique_ptr<WebApkInstallerRunner> CreateWebApkInstallerRunner() { | 239 std::unique_ptr<WebApkInstallerRunner> CreateWebApkInstallerRunner() { |
| 216 return std::unique_ptr<WebApkInstallerRunner>( | 240 return std::unique_ptr<WebApkInstallerRunner>( |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 234 std::unique_ptr<net::test_server::HttpResponse> HandleWebApkRequest( | 258 std::unique_ptr<net::test_server::HttpResponse> HandleWebApkRequest( |
| 235 const net::test_server::HttpRequest& request) { | 259 const net::test_server::HttpRequest& request) { |
| 236 return (request.relative_url == kServerUrl) | 260 return (request.relative_url == kServerUrl) |
| 237 ? webapk_response_builder_.Run() | 261 ? webapk_response_builder_.Run() |
| 238 : std::unique_ptr<net::test_server::HttpResponse>(); | 262 : std::unique_ptr<net::test_server::HttpResponse>(); |
| 239 } | 263 } |
| 240 | 264 |
| 241 content::TestBrowserThreadBundle thread_bundle_; | 265 content::TestBrowserThreadBundle thread_bundle_; |
| 242 net::EmbeddedTestServer test_server_; | 266 net::EmbeddedTestServer test_server_; |
| 243 | 267 |
| 268 std::unique_ptr<base::FieldTrialList> field_trial_list_; | |
| 269 base::test::ScopedFeatureList scoped_feature_list_; | |
| 270 | |
| 244 // Web Manifest's icon URL. | 271 // Web Manifest's icon URL. |
| 245 GURL icon_url_; | 272 GURL icon_url_; |
| 246 | 273 |
| 247 // Builds response to the WebAPK creation request. | 274 // Builds response to the WebAPK creation request. |
| 248 WebApkResponseBuilder webapk_response_builder_; | 275 WebApkResponseBuilder webapk_response_builder_; |
| 249 | 276 |
| 250 DISALLOW_COPY_AND_ASSIGN(WebApkInstallerTest); | 277 DISALLOW_COPY_AND_ASSIGN(WebApkInstallerTest); |
| 251 }; | 278 }; |
| 252 | 279 |
| 253 // Test installation succeeding. | 280 // Test installation succeeding. |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 322 runner->RunInstallWebApk(); | 349 runner->RunInstallWebApk(); |
| 323 EXPECT_FALSE(runner->success()); | 350 EXPECT_FALSE(runner->success()); |
| 324 } | 351 } |
| 325 | 352 |
| 326 // Test update succeeding. | 353 // Test update succeeding. |
| 327 TEST_F(WebApkInstallerTest, UpdateSuccess) { | 354 TEST_F(WebApkInstallerTest, UpdateSuccess) { |
| 328 std::unique_ptr<WebApkInstallerRunner> runner = CreateWebApkInstallerRunner(); | 355 std::unique_ptr<WebApkInstallerRunner> runner = CreateWebApkInstallerRunner(); |
| 329 runner->RunUpdateWebApk(); | 356 runner->RunUpdateWebApk(); |
| 330 EXPECT_TRUE(runner->success()); | 357 EXPECT_TRUE(runner->success()); |
| 331 } | 358 } |
| OLD | NEW |