OLD | NEW |
---|---|
(Empty) | |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/android/webapk/webapk_installer.h" | |
6 | |
7 #include <jni.h> | |
8 #include <memory> | |
9 #include <string> | |
10 | |
11 #include "base/android/scoped_java_ref.h" | |
12 #include "base/bind.h" | |
13 #include "base/callback_forward.h" | |
14 #include "base/command_line.h" | |
15 #include "base/files/file_path.h" | |
16 #include "base/memory/ref_counted.h" | |
17 #include "base/run_loop.h" | |
18 #include "base/single_thread_task_runner.h" | |
19 #include "base/threading/thread_task_runner_handle.h" | |
20 #include "chrome/browser/android/shortcut_info.h" | |
21 #include "chrome/browser/android/webapk/webapk.pb.h" | |
22 #include "chrome/common/chrome_switches.h" | |
23 #include "content/public/browser/browser_thread.h" | |
24 #include "content/public/test/test_browser_thread_bundle.h" | |
25 #include "net/test/embedded_test_server/embedded_test_server.h" | |
26 #include "net/test/embedded_test_server/http_request.h" | |
27 #include "net/test/embedded_test_server/http_response.h" | |
28 #include "net/url_request/url_request_test_util.h" | |
29 #include "testing/gtest/include/gtest/gtest.h" | |
30 #include "third_party/skia/include/core/SkBitmap.h" | |
31 #include "url/gurl.h" | |
32 | |
33 namespace { | |
34 | |
35 const base::FilePath::CharType kTestDataDir[] = | |
36 FILE_PATH_LITERAL("chrome/test/data"); | |
37 | |
38 // URL of mock WebAPK server. | |
39 const std::string kServerUrl = "/webapkserver"; | |
40 | |
41 // URL of file to download from the WebAPK server. We use a random file in the | |
42 // test data directory. | |
43 const std::string kDownloadUrl = "/simple.html"; | |
44 | |
45 // The package name of the downloaded WebAPK. | |
46 const std::string kDownloadedWebApkPackageName = "party.unicode"; | |
47 | |
48 // WebApkInstaller subclass where | |
49 // WebApkInstaller::StartDownloadedWebApkInstall() is stubbed out. | |
50 class TestWebApkInstaller : public WebApkInstaller { | |
51 public: | |
52 TestWebApkInstaller(const ShortcutInfo& shortcut_info, | |
53 const SkBitmap& shortcut_icon) | |
54 : WebApkInstaller(shortcut_info, shortcut_icon) {} | |
55 | |
56 bool StartDownloadedWebApkInstall( | |
57 JNIEnv* env, | |
58 const base::android::ScopedJavaLocalRef<jstring>& file_path, | |
59 const base::android::ScopedJavaLocalRef<jstring>& package_name) override { | |
60 return true; | |
61 } | |
62 | |
63 private: | |
64 DISALLOW_COPY_AND_ASSIGN(TestWebApkInstaller); | |
65 }; | |
66 | |
67 // Runs the WebApkInstaller installation process and blocks till done. | |
68 class WebApkInstallerRunner { | |
69 public: | |
70 WebApkInstallerRunner() | |
71 : url_request_context_getter_(new net::TestURLRequestContextGetter( | |
72 base::ThreadTaskRunnerHandle::Get())) {} | |
73 ~WebApkInstallerRunner() {} | |
74 | |
75 void Run() { | |
76 ShortcutInfo info(GURL::EmptyGURL()); | |
77 | |
78 // WebApkInstaller owns itself. | |
79 WebApkInstaller* installer = new TestWebApkInstaller(info, SkBitmap()); | |
80 | |
81 installer->InstallAsyncWithURLRequestContextGetter( | |
82 url_request_context_getter_.get(), | |
83 base::Bind(&WebApkInstallerRunner::OnCompleted, | |
84 base::Unretained(this))); | |
85 | |
86 base::RunLoop run_loop; | |
87 on_completed_callback_ = run_loop.QuitClosure(); | |
88 run_loop.Run(); | |
89 } | |
90 | |
91 bool success() { return success_; } | |
92 | |
93 private: | |
94 void OnCompleted(bool success) { | |
95 success_ = success; | |
96 on_completed_callback_.Run(); | |
97 } | |
98 | |
99 scoped_refptr<net::TestURLRequestContextGetter> | |
100 url_request_context_getter_; | |
101 | |
102 // Called after the installation process has succeeded or failed. | |
103 base::Closure on_completed_callback_; | |
104 | |
105 // Whether the installation process succeeded. | |
106 bool success_; | |
107 | |
108 DISALLOW_COPY_AND_ASSIGN(WebApkInstallerRunner); | |
109 }; | |
110 | |
111 // Builds a webapk::CreateWebApkResponse with |download_url| as the WebAPK | |
112 // download URL. | |
113 std::unique_ptr<net::test_server::HttpResponse> BuildValidCreateWebApkResponse( | |
114 const GURL& download_url) { | |
115 std::unique_ptr<webapk::CreateWebApkResponse> response_proto( | |
116 new webapk::CreateWebApkResponse); | |
117 response_proto->set_webapk_package_name(kDownloadedWebApkPackageName); | |
118 response_proto->set_signed_download_url(download_url.spec()); | |
119 std::string response_content; | |
120 response_proto->SerializeToString(&response_content); | |
121 | |
122 std::unique_ptr<net::test_server::BasicHttpResponse> response( | |
123 new net::test_server::BasicHttpResponse()); | |
124 response->set_code(net::HTTP_OK); | |
125 response->set_content(response_content); | |
126 return response; | |
127 } | |
128 | |
129 } // anonymous namespace | |
130 | |
131 class WebApkInstallerTest : public ::testing::Test { | |
132 public: | |
133 typedef base::Callback<std::unique_ptr<net::test_server::HttpResponse>(void)> | |
134 CreateWebApkResponseBuilder; | |
135 | |
136 WebApkInstallerTest() | |
137 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {} | |
138 ~WebApkInstallerTest() override {} | |
139 | |
140 void SetUp() override { | |
141 test_server_.AddDefaultHandlers(base::FilePath(kTestDataDir)); | |
142 test_server_.RegisterRequestHandler( | |
143 base::Bind(&WebApkInstallerTest::HandleCreateWebApkRequest, | |
144 base::Unretained(this))); | |
145 ASSERT_TRUE(test_server_.Start()); | |
146 | |
147 SetDefaults(); | |
148 } | |
149 | |
150 // Sets the URL to send the webapk::CreateWebApkRequest to. WebApkInstaller | |
151 // should fail if the URL is not |kServerUrl|. | |
152 void SetWebApkServerUrl(const GURL& server_url) { | |
153 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( | |
154 switches::kWebApkServerUrl, server_url.spec()); | |
155 } | |
156 | |
157 // Sets the function that should be used to build the response to the | |
158 // webapk::CreateWebApkRequest. | |
159 void SetCreateWebApkResponseBuilder( | |
160 const CreateWebApkResponseBuilder& builder) { | |
161 create_webapk_response_builder_ = builder; | |
162 } | |
163 | |
164 net::test_server::EmbeddedTestServer* test_server() { return &test_server_; } | |
165 | |
166 private: | |
167 // Sets default configuration for running WebApkInstaller. | |
168 void SetDefaults() { | |
169 GURL server_url = test_server_.GetURL(kServerUrl); | |
170 SetWebApkServerUrl(server_url); | |
171 GURL download_url = test_server_.GetURL(kDownloadUrl); | |
172 SetCreateWebApkResponseBuilder( | |
173 base::Bind(&BuildValidCreateWebApkResponse, download_url)); | |
174 } | |
175 | |
176 std::unique_ptr<net::test_server::HttpResponse> HandleCreateWebApkRequest( | |
177 const net::test_server::HttpRequest& request) { | |
178 return (request.relative_url == kServerUrl) | |
179 ? create_webapk_response_builder_.Run() | |
180 : std::unique_ptr<net::test_server::HttpResponse>(); | |
181 } | |
182 | |
183 content::TestBrowserThreadBundle thread_bundle_; | |
184 net::EmbeddedTestServer test_server_; | |
185 | |
186 // Builds response to the webapk::CreateWebApkRequest. | |
187 CreateWebApkResponseBuilder create_webapk_response_builder_; | |
188 | |
189 DISALLOW_COPY_AND_ASSIGN(WebApkInstallerTest); | |
190 }; | |
191 | |
192 // Test installation succeeding. | |
193 TEST_F(WebApkInstallerTest, Success) { | |
194 WebApkInstallerRunner runner; | |
195 runner.Run(); | |
196 EXPECT_TRUE(runner.success()); | |
197 } | |
198 | |
199 // Test that installation fails if the CreateWebApkRequest times out. | |
200 TEST_F(WebApkInstallerTest, CreateWebApkRequestTimesOut) { | |
201 GURL server_url = test_server()->GetURL("/slow?1000"); | |
202 SetWebApkServerUrl(server_url); | |
203 | |
204 WebApkInstallerRunner runner; | |
205 runner.Run(); | |
206 EXPECT_FALSE(runner.success()); | |
207 } | |
208 | |
209 // Test that installation fails if the WebAPK download times out. | |
210 TEST_F(WebApkInstallerTest, WebApkDownloadTimesOut) { | |
211 GURL download_url = test_server()->GetURL("/slow?1000"); | |
212 SetCreateWebApkResponseBuilder( | |
213 base::Bind(&BuildValidCreateWebApkResponse, download_url)); | |
214 | |
215 WebApkInstallerRunner runner; | |
216 runner.Run(); | |
217 EXPECT_FALSE(runner.success()); | |
218 } | |
219 | |
220 // Test that installation fails if the WebAPK download fails. | |
221 TEST_F(WebApkInstallerTest, WebApkDownloadFails) { | |
222 GURL download_url = test_server()->GetURL("/nocontent"); | |
223 SetCreateWebApkResponseBuilder( | |
224 base::Bind(&BuildValidCreateWebApkResponse, download_url)); | |
225 | |
226 WebApkInstallerRunner runner; | |
227 runner.Run(); | |
228 EXPECT_FALSE(runner.success()); | |
229 } | |
230 | |
231 namespace { | |
232 | |
233 // Returns an HttpResponse which cannot be parsed as a | |
234 // webapk::CreateWebApkResponse. | |
235 std::unique_ptr<net::test_server::HttpResponse> | |
236 BuildUnparsableCreateWebApkResponse() { | |
237 std::unique_ptr<net::test_server::BasicHttpResponse> response( | |
238 new net::test_server::BasicHttpResponse()); | |
239 response->set_code(net::HTTP_OK); | |
240 response->set_content("😀"); | |
Robert Sesek
2016/07/29 17:38:05
:)
| |
241 return response; | |
242 } | |
243 | |
244 } // anonymous namespace | |
245 | |
246 // Test that an HTTP response which cannot be parsed as | |
247 // a webapk::CreateWebApkResponse is handled properly. | |
248 TEST_F(WebApkInstallerTest, UnparsableCreateWebApkResponse) { | |
249 SetCreateWebApkResponseBuilder( | |
250 base::Bind(&BuildUnparsableCreateWebApkResponse)); | |
251 | |
252 WebApkInstallerRunner runner; | |
253 runner.Run(); | |
254 EXPECT_FALSE(runner.success()); | |
255 } | |
OLD | NEW |