Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Side by Side Diff: chrome/browser/webshare/share_service_impl_unittest.cc

Issue 2664033002: Read share targets from prefstore, and filter by engagement. (Closed)
Patch Set: Don't build tests on Android Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/webshare/share_service_impl.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <memory> 5 #include <memory>
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback.h" 8 #include "base/callback.h"
9 #include "base/run_loop.h" 9 #include "base/run_loop.h"
10 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
11 #include "chrome/browser/webshare/share_service_impl.h" 11 #include "chrome/browser/webshare/share_service_impl.h"
12 #include "chrome/common/pref_names.h"
12 #include "chrome/test/base/chrome_render_view_host_test_harness.h" 13 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
14 #include "components/prefs/pref_registry_simple.h"
15 #include "components/prefs/scoped_user_pref_update.h"
16 #include "components/prefs/testing_pref_service.h"
13 #include "mojo/public/cpp/bindings/interface_request.h" 17 #include "mojo/public/cpp/bindings/interface_request.h"
14 #include "mojo/public/cpp/bindings/strong_binding.h" 18 #include "mojo/public/cpp/bindings/strong_binding.h"
15 #include "testing/gtest/include/gtest/gtest.h" 19 #include "testing/gtest/include/gtest/gtest.h"
16 #include "url/gurl.h" 20 #include "url/gurl.h"
17 21
18 namespace { 22 namespace {
19 23
20 constexpr char kTitle[] = "My title"; 24 constexpr char kTitle[] = "My title";
21 constexpr char kText[] = "My text"; 25 constexpr char kText[] = "My text";
22 constexpr char kUrlSpec[] = "https://www.google.com/"; 26 constexpr char kUrlSpec[] = "https://www.google.com/";
23 27
28 constexpr char kTargetName[] = "Share Target";
29 constexpr char kUrlTemplate[] = "share?title={title}&text={text}&url={url}";
30 constexpr char kManifestUrlHigh[] =
31 "https://www.example-high.com/target/manifest.json";
32 constexpr char kManifestUrlLow[] =
33 "https://www.example-low.com/target/manifest.json";
34 constexpr char kManifestUrlMin[] =
35 "https://www.example-min.com/target/manifest.json";
36
24 class ShareServiceTestImpl : public ShareServiceImpl { 37 class ShareServiceTestImpl : public ShareServiceImpl {
25 public: 38 public:
26 static ShareServiceTestImpl* Create( 39 explicit ShareServiceTestImpl(blink::mojom::ShareServiceRequest request)
27 blink::mojom::ShareServiceRequest request) { 40 : binding_(this) {
28 std::unique_ptr<ShareServiceTestImpl> share_service_helper = 41 binding_.Bind(std::move(request));
29 base::MakeUnique<ShareServiceTestImpl>(); 42
30 ShareServiceTestImpl* share_service_helper_raw = share_service_helper.get(); 43 pref_service_.reset(new TestingPrefServiceSimple());
31 mojo::MakeStrongBinding(std::move(share_service_helper), 44 pref_service_->registry()->RegisterDictionaryPref(
32 std::move(request)); 45 prefs::kWebShareVisitedTargets);
33 return share_service_helper_raw;
34 } 46 }
35 47
36 void set_picker_result(base::Optional<std::string> result) { 48 void set_picker_result(base::Optional<std::string> result) {
37 picker_result_ = result; 49 picker_result_ = result;
38 } 50 }
39 51
52 void AddShareTargetToPrefs(const std::string& manifest_url,
53 const std::string& name,
54 const std::string& url_template) {
55 constexpr char kUrlTemplateKey[] = "url_template";
56 constexpr char kNameKey[] = "name";
57
58 DictionaryPrefUpdate update(GetPrefService(),
59 prefs::kWebShareVisitedTargets);
60 base::DictionaryValue* share_target_dict = update.Get();
61
62 std::unique_ptr<base::DictionaryValue> origin_dict(
63 new base::DictionaryValue);
64
65 origin_dict->SetStringWithoutPathExpansion(kUrlTemplateKey, url_template);
66 origin_dict->SetStringWithoutPathExpansion(kNameKey, name);
67
68 share_target_dict->SetWithoutPathExpansion(manifest_url,
69 std::move(origin_dict));
70 }
71
72 void SetEngagementForTarget(const std::string& manifest_url,
73 blink::mojom::EngagementLevel level) {
74 engagement_map_[manifest_url] = level;
75 }
76
40 const std::string& GetLastUsedTargetURL() { return last_used_target_url_; } 77 const std::string& GetLastUsedTargetURL() { return last_used_target_url_; }
41 78
79 const std::vector<std::pair<base::string16, GURL>>& GetTargetsInPicker() {
80 return targets_in_picker_;
81 }
82
42 private: 83 private:
43 base::Optional<std::string> picker_result_;
44 std::string last_used_target_url_;
45
46 void ShowPickerDialog( 84 void ShowPickerDialog(
47 const std::vector<std::pair<base::string16, GURL>>& targets, 85 const std::vector<std::pair<base::string16, GURL>>& targets,
48 const base::Callback<void(base::Optional<std::string>)>& callback) 86 const base::Callback<void(base::Optional<std::string>)>& callback)
49 override { 87 override {
88 targets_in_picker_ = targets;
50 callback.Run(picker_result_); 89 callback.Run(picker_result_);
51 } 90 }
52 91
53 void OpenTargetURL(const GURL& target_url) override { 92 void OpenTargetURL(const GURL& target_url) override {
54 last_used_target_url_ = target_url.spec(); 93 last_used_target_url_ = target_url.spec();
55 } 94 }
95
96 PrefService* GetPrefService() override { return pref_service_.get(); }
97
98 blink::mojom::EngagementLevel GetEngagementLevel(const GURL& url) override {
99 return engagement_map_[url.spec()];
100 }
101
102 mojo::Binding<blink::mojom::ShareService> binding_;
103
104 base::Optional<std::string> picker_result_;
105 std::string last_used_target_url_;
106 std::unique_ptr<TestingPrefServiceSimple> pref_service_;
107 std::map<std::string, blink::mojom::EngagementLevel> engagement_map_;
108 std::vector<std::pair<base::string16, GURL>> targets_in_picker_;
56 }; 109 };
57 110
58 class ShareServiceImplUnittest : public ChromeRenderViewHostTestHarness { 111 class ShareServiceImplUnittest : public ChromeRenderViewHostTestHarness {
59 public: 112 public:
60 ShareServiceImplUnittest() = default; 113 ShareServiceImplUnittest() = default;
61 ~ShareServiceImplUnittest() override = default; 114 ~ShareServiceImplUnittest() override = default;
62 115
63 void SetUp() override { 116 void SetUp() override {
64 ChromeRenderViewHostTestHarness::SetUp(); 117 ChromeRenderViewHostTestHarness::SetUp();
65 118
66 share_service_helper_ = 119 share_service_helper_ = base::MakeUnique<ShareServiceTestImpl>(
67 ShareServiceTestImpl::Create(mojo::MakeRequest(&share_service_)); 120 mojo::MakeRequest(&share_service_));
121
122 share_service_helper_->SetEngagementForTarget(
123 kManifestUrlHigh, blink::mojom::EngagementLevel::HIGH);
124 share_service_helper_->SetEngagementForTarget(
125 kManifestUrlMin, blink::mojom::EngagementLevel::MINIMAL);
126 share_service_helper_->SetEngagementForTarget(
127 kManifestUrlLow, blink::mojom::EngagementLevel::LOW);
68 } 128 }
69 129
70 void TearDown() override { ChromeRenderViewHostTestHarness::TearDown(); } 130 void TearDown() override { ChromeRenderViewHostTestHarness::TearDown(); }
71 131
72 void DidShare(const std::string& expected_target_url, 132 void DidShare(const std::vector<std::pair<base::string16, GURL>>&
73 const base::Optional<std::string>& expected_param, 133 expected_targets_in_picker,
74 const base::Optional<std::string>& param) { 134 const std::string& expected_target_url,
75 EXPECT_EQ(expected_param, param); 135 const base::Optional<std::string>& expected_error,
136 const base::Optional<std::string>& error) {
137 std::vector<std::pair<base::string16, GURL>> targets_in_picker =
138 share_service_helper_->GetTargetsInPicker();
139 EXPECT_EQ(expected_targets_in_picker, targets_in_picker);
140
76 std::string target_url = share_service_helper_->GetLastUsedTargetURL(); 141 std::string target_url = share_service_helper_->GetLastUsedTargetURL();
77 EXPECT_EQ(expected_target_url, target_url); 142 EXPECT_EQ(expected_target_url, target_url);
78 143
144 EXPECT_EQ(expected_error, error);
145
79 if (!on_callback_.is_null()) 146 if (!on_callback_.is_null())
80 on_callback_.Run(); 147 on_callback_.Run();
81 } 148 }
82 149
83 blink::mojom::ShareServicePtr share_service_; 150 blink::mojom::ShareServicePtr share_service_;
84 ShareServiceTestImpl* share_service_helper_; 151 std::unique_ptr<ShareServiceTestImpl> share_service_helper_;
85 base::Closure on_callback_; 152 base::Closure on_callback_;
86 }; 153 };
87 154
88 } // namespace 155 } // namespace
89 156
157 #if defined(OS_LINUX) || defined(OS_WIN)
158
90 // Basic test to check the Share method calls the callback with the expected 159 // Basic test to check the Share method calls the callback with the expected
91 // parameters. 160 // parameters.
92 TEST_F(ShareServiceImplUnittest, ShareCallbackParams) { 161 TEST_F(ShareServiceImplUnittest, ShareCallbackParams) {
162 share_service_helper_->set_picker_result(
163 base::Optional<std::string>(kManifestUrlLow));
164
165 share_service_helper_->AddShareTargetToPrefs(kManifestUrlLow, kTargetName,
166 kUrlTemplate);
167 share_service_helper_->AddShareTargetToPrefs(kManifestUrlHigh, kTargetName,
168 kUrlTemplate);
169
93 std::string expected_url = 170 std::string expected_url =
94 "https://wicg.github.io/web-share-target/demos/" 171 "https://www.example-low.com/target/"
95 "sharetarget.html?title=My%20title&text=My%20text&url=https%3A%2F%2Fwww." 172 "share?title=My%20title&text=My%20text&url=https%3A%2F%2Fwww."
96 "google.com%2F"; 173 "google.com%2F";
97 share_service_helper_->set_picker_result(base::Optional<std::string>(
98 "https://wicg.github.io/web-share-target/demos/"));
99 174
100 const GURL url(kUrlSpec); 175 std::vector<std::pair<base::string16, GURL>> expected_targets{
176 make_pair(base::UTF8ToUTF16(kTargetName), GURL(kManifestUrlHigh)),
177 make_pair(base::UTF8ToUTF16(kTargetName), GURL(kManifestUrlLow))};
101 base::Callback<void(const base::Optional<std::string>&)> callback = 178 base::Callback<void(const base::Optional<std::string>&)> callback =
102 base::Bind(&ShareServiceImplUnittest::DidShare, base::Unretained(this), 179 base::Bind(&ShareServiceImplUnittest::DidShare, base::Unretained(this),
103 expected_url, base::Optional<std::string>()); 180 expected_targets, expected_url, base::Optional<std::string>());
104 181
105 base::RunLoop run_loop; 182 base::RunLoop run_loop;
106 on_callback_ = run_loop.QuitClosure(); 183 on_callback_ = run_loop.QuitClosure();
107 184
185 const GURL url(kUrlSpec);
108 share_service_->Share(kTitle, kText, url, callback); 186 share_service_->Share(kTitle, kText, url, callback);
109 187
110 run_loop.Run(); 188 run_loop.Run();
111 } 189 }
112 190
113 // Tests the result of cancelling the share in the picker UI. 191 // Tests the result of cancelling the share in the picker UI, that doesn't have
114 TEST_F(ShareServiceImplUnittest, ShareCancel) { 192 // any targets.
193 TEST_F(ShareServiceImplUnittest, ShareCancelNoTargets) {
115 // picker_result_ is set to nullopt by default, so this imitates the user 194 // picker_result_ is set to nullopt by default, so this imitates the user
116 // cancelling a share. 195 // cancelling a share.
117 // Expect an error message in response. 196 // Expect an error message in response.
118 base::Callback<void(const base::Optional<std::string>&)> callback = 197 base::Callback<void(const base::Optional<std::string>&)> callback =
119 base::Bind(&ShareServiceImplUnittest::DidShare, base::Unretained(this), 198 base::Bind(&ShareServiceImplUnittest::DidShare, base::Unretained(this),
120 std::string(), 199 std::vector<std::pair<base::string16, GURL>>(), std::string(),
121 base::Optional<std::string>("Share was cancelled")); 200 base::Optional<std::string>("Share was cancelled"));
122 201
123 base::RunLoop run_loop; 202 base::RunLoop run_loop;
203 on_callback_ = run_loop.QuitClosure();
204
205 const GURL url(kUrlSpec);
206 share_service_->Share(kTitle, kText, url, callback);
207
208 run_loop.Run();
209 }
210
211 // Tests the result of cancelling the share in the picker UI, that has targets.
212 TEST_F(ShareServiceImplUnittest, ShareCancelWithTargets) {
213 // picker_result_ is set to nullopt by default, so this imitates the user
214 // cancelling a share.
215 share_service_helper_->AddShareTargetToPrefs(kManifestUrlHigh, kTargetName,
216 kUrlTemplate);
217 share_service_helper_->AddShareTargetToPrefs(kManifestUrlLow, kTargetName,
218 kUrlTemplate);
219
220 std::vector<std::pair<base::string16, GURL>> expected_targets{
221 make_pair(base::UTF8ToUTF16(kTargetName), GURL(kManifestUrlHigh)),
222 make_pair(base::UTF8ToUTF16(kTargetName), GURL(kManifestUrlLow))};
223 // Expect an error message in response.
224 base::Callback<void(const base::Optional<std::string>&)> callback =
225 base::Bind(&ShareServiceImplUnittest::DidShare, base::Unretained(this),
226 expected_targets, std::string(),
227 base::Optional<std::string>("Share was cancelled"));
228
229 base::RunLoop run_loop;
124 on_callback_ = run_loop.QuitClosure(); 230 on_callback_ = run_loop.QuitClosure();
125 231
126 const GURL url(kUrlSpec); 232 const GURL url(kUrlSpec);
127 share_service_->Share(kTitle, kText, url, callback); 233 share_service_->Share(kTitle, kText, url, callback);
128 234
129 run_loop.Run(); 235 run_loop.Run();
130 } 236 }
131 237
238 // Test to check that only targets with enough engagement were in picker.
239 TEST_F(ShareServiceImplUnittest, ShareWithSomeInsufficientlyEngagedTargets) {
240 std::string expected_url =
241 "https://www.example-low.com/target/"
242 "share?title=My%20title&text=My%20text&url=https%3A%2F%2Fwww."
243 "google.com%2F";
244
245 share_service_helper_->set_picker_result(
246 base::Optional<std::string>(kManifestUrlLow));
247
248 share_service_helper_->AddShareTargetToPrefs(kManifestUrlMin, kTargetName,
249 kUrlTemplate);
250 share_service_helper_->AddShareTargetToPrefs(kManifestUrlLow, kTargetName,
251 kUrlTemplate);
252
253 std::vector<std::pair<base::string16, GURL>> expected_targets{
254 make_pair(base::UTF8ToUTF16(kTargetName), GURL(kManifestUrlLow))};
255 base::Callback<void(const base::Optional<std::string>&)> callback =
256 base::Bind(&ShareServiceImplUnittest::DidShare, base::Unretained(this),
257 expected_targets, expected_url, base::Optional<std::string>());
258
259 base::RunLoop run_loop;
260 on_callback_ = run_loop.QuitClosure();
261
262 const GURL url(kUrlSpec);
263 share_service_->Share(kTitle, kText, url, callback);
264
265 run_loop.Run();
266 }
267
268 #endif // defined(OS_LINUX) || defined(OS_WIN)
269
132 // Replace various numbers of placeholders in various orders. Placeholders are 270 // Replace various numbers of placeholders in various orders. Placeholders are
133 // adjacent to eachother; there are no padding characters. 271 // adjacent to eachother; there are no padding characters.
134 TEST_F(ShareServiceImplUnittest, ReplacePlaceholders) { 272 TEST_F(ShareServiceImplUnittest, ReplacePlaceholders) {
135 const GURL url(kUrlSpec); 273 const GURL url(kUrlSpec);
136 std::string url_template_filled; 274 std::string url_template_filled;
137 bool succeeded; 275 bool succeeded;
138 276
139 // No placeholders 277 // No placeholders
140 std::string url_template = "blank"; 278 std::string url_template = "blank";
141 succeeded = ShareServiceImpl::ReplacePlaceholders(url_template, kTitle, kText, 279 succeeded = ShareServiceImpl::ReplacePlaceholders(url_template, kTitle, kText,
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 EXPECT_TRUE(succeeded); 463 EXPECT_TRUE(succeeded);
326 EXPECT_EQ("%C3%A9", url_template_filled); 464 EXPECT_EQ("%C3%A9", url_template_filled);
327 465
328 // U+1F4A9 466 // U+1F4A9
329 url_template = "{title}"; 467 url_template = "{title}";
330 succeeded = ShareServiceImpl::ReplacePlaceholders( 468 succeeded = ShareServiceImpl::ReplacePlaceholders(
331 url_template, "\xf0\x9f\x92\xa9", kText, url, &url_template_filled); 469 url_template, "\xf0\x9f\x92\xa9", kText, url, &url_template_filled);
332 EXPECT_TRUE(succeeded); 470 EXPECT_TRUE(succeeded);
333 EXPECT_EQ("%F0%9F%92%A9", url_template_filled); 471 EXPECT_EQ("%F0%9F%92%A9", url_template_filled);
334 } 472 }
OLDNEW
« no previous file with comments | « chrome/browser/webshare/share_service_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698