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

Side by Side Diff: chrome/browser/android/data_usage/data_use_ui_tab_model_unittest.cc

Issue 1443683002: Notify DataUseTabModel of navigations and tab closures (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed sclittle comments Created 5 years, 1 month 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/data_usage/data_use_ui_tab_model.h" 5 #include "chrome/browser/android/data_usage/data_use_ui_tab_model.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include "base/message_loop/message_loop.h"
10 #include "base/run_loop.h"
11 #include "chrome/browser/android/data_usage/data_use_tab_model.h"
9 #include "chrome/browser/android/data_usage/data_use_ui_tab_model_factory.h" 12 #include "chrome/browser/android/data_usage/data_use_ui_tab_model_factory.h"
13 #include "chrome/browser/android/data_usage/external_data_use_observer.h"
10 #include "chrome/browser/profiles/profile.h" 14 #include "chrome/browser/profiles/profile.h"
11 #include "chrome/browser/sessions/session_tab_helper.h" 15 #include "chrome/browser/sessions/session_tab_helper.h"
12 #include "chrome/test/base/chrome_render_view_host_test_harness.h" 16 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
17 #include "components/data_usage/core/data_use.h"
18 #include "components/data_usage/core/data_use_aggregator.h"
19 #include "components/data_usage/core/data_use_amortizer.h"
20 #include "components/data_usage/core/data_use_annotator.h"
21 #include "content/public/browser/browser_thread.h"
13 #include "content/public/browser/web_contents.h" 22 #include "content/public/browser/web_contents.h"
14 #include "content/public/test/test_renderer_host.h" 23 #include "content/public/test/test_renderer_host.h"
15 #include "content/public/test/web_contents_tester.h" 24 #include "content/public/test/web_contents_tester.h"
16 #include "testing/gtest/include/gtest/gtest.h" 25 #include "testing/gtest/include/gtest/gtest.h"
17 #include "ui/base/page_transition_types.h" 26 #include "ui/base/page_transition_types.h"
18 #include "url/gurl.h" 27 #include "url/gurl.h"
19 28
20 namespace chrome { 29 namespace chrome {
21 30
22 namespace android { 31 namespace android {
23 32
33 class TestDataUseTabModel : public DataUseTabModel {
34 public:
35 TestDataUseTabModel(ExternalDataUseObserver* external_data_use_observer,
36 scoped_refptr<base::SingleThreadTaskRunner> task_runner_)
sclittle 2015/11/17 22:50:12 What thread is |task_runner_| for? Name it |io_tas
tbansal1 2015/11/18 01:32:23 Done.
37 : DataUseTabModel(external_data_use_observer, task_runner_.get()),
38 weak_factory_(this) {}
39
40 base::WeakPtr<TestDataUseTabModel> GetWeakPtr() {
41 return weak_factory_.GetWeakPtr();
42 }
43
44 private:
45 base::WeakPtrFactory<TestDataUseTabModel> weak_factory_;
46 };
47
24 class DataUseUITabModelTest : public ChromeRenderViewHostTestHarness { 48 class DataUseUITabModelTest : public ChromeRenderViewHostTestHarness {
25 public: 49 public:
26 using ChromeRenderViewHostTestHarness::web_contents; 50 using ChromeRenderViewHostTestHarness::web_contents;
27 51
28 DataUseUITabModel* data_use_ui_tab_model() { 52 DataUseUITabModel* data_use_ui_tab_model() {
53 DataUseUITabModel* data_use_ui_tab_model = data_use_ui_tab_model_private();
54 base::RunLoop().RunUntilIdle();
55 return data_use_ui_tab_model;
56 }
57
58 void NotifyTrackingStarting(int tab_id) {
59 base::RunLoop().RunUntilIdle();
60 io_task_runner_->PostTask(
61 FROM_HERE, base::Bind(&DataUseUITabModelTest::NotifyTrackingStartingIO,
62 base::Unretained(this), tab_id));
63 base::RunLoop().RunUntilIdle();
64 }
65
66 void NotifyTrackingEnding(int tab_id) {
67 base::RunLoop().RunUntilIdle();
68 io_task_runner_->PostTask(
69 FROM_HERE, base::Bind(&DataUseUITabModelTest::NotifyTrackingEndingIO,
70 base::Unretained(this), tab_id));
71 base::RunLoop().RunUntilIdle();
72 }
73
74 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner() const {
75 return io_task_runner_;
76 }
77
78 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner() const {
79 return ui_task_runner_;
80 }
81
82 protected:
83 void SetUp() override {
84 ChromeRenderViewHostTestHarness::SetUp();
85
86 io_task_runner_ = content::BrowserThread::GetMessageLoopProxyForThread(
87 content::BrowserThread::IO);
88 ui_task_runner_ = content::BrowserThread::GetMessageLoopProxyForThread(
89 content::BrowserThread::UI);
90 }
91
92 private:
93 DataUseUITabModel* data_use_ui_tab_model_private() {
29 return chrome::android::DataUseUITabModelFactory::GetForBrowserContext( 94 return chrome::android::DataUseUITabModelFactory::GetForBrowserContext(
30 Profile::FromBrowserContext(web_contents()->GetBrowserContext())); 95 Profile::FromBrowserContext(web_contents()->GetBrowserContext()));
31 } 96 }
97
98 void NotifyTrackingStartingIO(int tab_id) {
99 data_use_ui_tab_model()->tab_data_use_observer_->NotifyTrackingStarting(
sclittle 2015/11/17 22:50:12 Instead of reaching into the |tab_data_use_observe
tbansal1 2015/11/18 01:32:23 Done.
100 tab_id);
101 }
102
103 void NotifyTrackingEndingIO(int tab_id) {
104 data_use_ui_tab_model()->tab_data_use_observer_->NotifyTrackingEnding(
105 tab_id);
106 }
107
108 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
109 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
32 }; 110 };
33 111
34 // Tests that DataUseTabModel is notified of tab closure and navigation events. 112 // Tests that DataUseTabModel is notified of tab closure and navigation events,
113 // and DataUseTabModel notifies DataUseUITabModel.
35 TEST_F(DataUseUITabModelTest, ReportTabEventsTest) { 114 TEST_F(DataUseUITabModelTest, ReportTabEventsTest) {
36 data_use_ui_tab_model()->ReportBrowserNavigation( 115 std::string foo_label("foo_label");
37 GURL("https://www.example.com"), 116
38 ui::PageTransition::PAGE_TRANSITION_TYPED, 117 data_usage::DataUseAggregator data_use_aggregator(nullptr, nullptr);
39 SessionTabHelper::IdForTab(web_contents())); 118
40 data_use_ui_tab_model()->ReportTabClosure( 119 ExternalDataUseObserver external_data_use_observer(
41 SessionTabHelper::IdForTab(web_contents())); 120 &data_use_aggregator, io_task_runner(), ui_task_runner());
42 // TODO(tbansal): Test that DataUseTabModel is notified. 121 base::RunLoop().RunUntilIdle();
122 std::vector<std::string> url_regexes;
123 url_regexes.push_back(
124 "http://www[.]foo[.]com/#q=.*|https://www[.]foo[.]com/#q=.*");
125 external_data_use_observer.RegisterURLRegexes(
126 std::vector<std::string>(url_regexes.size(), std::string()), url_regexes,
127 std::vector<std::string>(url_regexes.size(), foo_label));
128
129 TestDataUseTabModel data_use_tab_model(
130 &external_data_use_observer,
131 content::BrowserThread::GetMessageLoopProxyForThread(
132 content::BrowserThread::IO));
133 data_use_ui_tab_model()->SetIODataUseTabModel(
134 data_use_tab_model.GetWeakPtr());
135
136 const struct {
137 ui::PageTransition transition_type;
138 std::string expected_label;
139 } tests[] = {
140 {ui::PageTransitionFromInt(ui::PageTransition::PAGE_TRANSITION_LINK |
141 ui::PAGE_TRANSITION_FROM_API),
142 std::string()},
143 {ui::PageTransition::PAGE_TRANSITION_LINK, std::string()},
144 {ui::PageTransition::PAGE_TRANSITION_TYPED, foo_label},
145 {ui::PageTransition::PAGE_TRANSITION_AUTO_BOOKMARK, std::string()},
146 {ui::PageTransition::PAGE_TRANSITION_AUTO_TOPLEVEL, std::string()},
147 {ui::PageTransition::PAGE_TRANSITION_GENERATED, foo_label},
148 {ui::PageTransition::PAGE_TRANSITION_RELOAD, std::string()},
149 };
150
151 for (size_t i = 0; i < arraysize(tests); ++i) {
152 // Start a new tab.
153 int32_t foo_tab_id = i + 1;
154 data_use_ui_tab_model()->ReportBrowserNavigation(
155 GURL("https://www.foo.com/#q=abc"), tests[i].transition_type,
156 foo_tab_id);
157 base::RunLoop().RunUntilIdle();
158
159 // |data_use_ui_tab_model| should receive callback about starting of
160 // tracking of data usage for |foo_tab_id|.
161 EXPECT_EQ(!tests[i].expected_label.empty(),
162 data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id))
163 << i;
164 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id))
165 << i;
166 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingEnded(foo_tab_id))
167 << i;
168
169 // DataUse object should be labeled correctly.
170 data_usage::DataUse data_use(GURL("http://foo.com/#q=abc"),
171 base::TimeTicks::Now(),
172 GURL("http://foobar.com"), foo_tab_id,
173 net::NetworkChangeNotifier::CONNECTION_UNKNOWN,
174 std::string(), 1000, 1000);
175 std::string got_label;
176 data_use_tab_model.GetLabelForDataUse(data_use, &got_label);
177 EXPECT_EQ(tests[i].expected_label, got_label) << i;
178
179 // Report closure of tab.
180 data_use_ui_tab_model()->ReportTabClosure(foo_tab_id);
181 base::RunLoop().RunUntilIdle();
182
183 // DataUse object should not be labeled.
184 data_use.request_start =
185 base::TimeTicks::Now() + base::TimeDelta::FromMinutes(10);
186 data_use_tab_model.GetLabelForDataUse(data_use, &got_label);
187 EXPECT_EQ(std::string(), got_label) << i;
188 }
43 } 189 }
44 190
45 // Tests if the Entrance/Exit UI state is tracked correctly. 191 // Tests if the Entrance/Exit UI state is tracked correctly.
46 TEST_F(DataUseUITabModelTest, EntranceExitState) { 192 TEST_F(DataUseUITabModelTest, EntranceExitState) {
47 int32_t foo_tab_id = 1; 193 int32_t foo_tab_id = 1;
48 int32_t bar_tab_id = 2; 194 int32_t bar_tab_id = 2;
49 int32_t baz_tab_id = 3; 195 int32_t baz_tab_id = 3;
50 196
51 // ShowEntrance should return true only once. 197 ASSERT_NE(data_use_ui_tab_model(), nullptr);
52 data_use_ui_tab_model()->OnTrackingStarted(foo_tab_id); 198
199 // HasDataUseTrackingStarted should return true only once.
200 NotifyTrackingStarting(foo_tab_id);
53 EXPECT_TRUE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); 201 EXPECT_TRUE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id));
54 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); 202 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id));
55 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingEnded(foo_tab_id)); 203 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingEnded(foo_tab_id));
56 204
57 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(bar_tab_id)); 205 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(bar_tab_id));
58 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingEnded(bar_tab_id)); 206 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingEnded(bar_tab_id));
59 207
60 // ShowExit should return true only once. 208 // HasDataUseTrackingEnded should return true only once.
61 data_use_ui_tab_model()->OnTrackingEnded(foo_tab_id); 209 NotifyTrackingEnding(foo_tab_id);
62 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); 210 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id));
63 EXPECT_TRUE(data_use_ui_tab_model()->HasDataUseTrackingEnded(foo_tab_id)); 211 EXPECT_TRUE(data_use_ui_tab_model()->HasDataUseTrackingEnded(foo_tab_id));
64 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingEnded(foo_tab_id)); 212 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingEnded(foo_tab_id));
65 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); 213 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id));
66 214
67 // The tab enters the tracking state again. 215 // The tab enters the tracking state again.
68 data_use_ui_tab_model()->OnTrackingStarted(foo_tab_id); 216 NotifyTrackingStarting(foo_tab_id);
69 EXPECT_TRUE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); 217 EXPECT_TRUE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id));
70 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); 218 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id));
71 219
72 // The tab exits the tracking state. 220 // The tab exits the tracking state.
73 data_use_ui_tab_model()->OnTrackingEnded(foo_tab_id); 221 NotifyTrackingEnding(foo_tab_id);
74 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); 222 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id));
75 223
76 // The tab enters the tracking state again. 224 // The tab enters the tracking state again.
77 data_use_ui_tab_model()->OnTrackingStarted(foo_tab_id); 225 NotifyTrackingStarting(foo_tab_id);
78 data_use_ui_tab_model()->OnTrackingStarted(foo_tab_id); 226 NotifyTrackingStarting(foo_tab_id);
79 EXPECT_TRUE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); 227 EXPECT_TRUE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id));
80 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); 228 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id));
81 229
82 // ShowExit should return true only once. 230 // ShowExit should return true only once.
83 data_use_ui_tab_model()->OnTrackingEnded(bar_tab_id); 231 NotifyTrackingEnding(bar_tab_id);
84 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(bar_tab_id)); 232 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(bar_tab_id));
85 EXPECT_TRUE(data_use_ui_tab_model()->HasDataUseTrackingEnded(bar_tab_id)); 233 EXPECT_TRUE(data_use_ui_tab_model()->HasDataUseTrackingEnded(bar_tab_id));
86 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingEnded(bar_tab_id)); 234 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingEnded(bar_tab_id));
87 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(bar_tab_id)); 235 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(bar_tab_id));
88 236
89 data_use_ui_tab_model()->ReportTabClosure(foo_tab_id); 237 data_use_ui_tab_model()->ReportTabClosure(foo_tab_id);
90 data_use_ui_tab_model()->ReportTabClosure(bar_tab_id); 238 data_use_ui_tab_model()->ReportTabClosure(bar_tab_id);
91 239
92 // HasDataUseTrackingStarted/Ended should return false for closed tabs. 240 // HasDataUseTrackingStarted/Ended should return false for closed tabs.
93 data_use_ui_tab_model()->OnTrackingStarted(baz_tab_id); 241 NotifyTrackingStarting(baz_tab_id);
94 data_use_ui_tab_model()->ReportTabClosure(baz_tab_id); 242 data_use_ui_tab_model()->ReportTabClosure(baz_tab_id);
95 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(baz_tab_id)); 243 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(baz_tab_id));
96 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingEnded(baz_tab_id)); 244 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingEnded(baz_tab_id));
97 } 245 }
98 246
247 // Checks if page transition type is converted correctly.
248 TEST_F(DataUseUITabModelTest, ConvertTransitionType) {
249 DataUseTabModel::TransitionType transition_type;
250 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType(
251 ui::PageTransition(ui::PAGE_TRANSITION_TYPED), &transition_type));
252 EXPECT_EQ(DataUseTabModel::TRANSITION_OMNIBOX_NAVIGATION, transition_type);
253 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType(
254 ui::PageTransition(ui::PAGE_TRANSITION_TYPED | 0xFF00),
255 &transition_type));
256 EXPECT_EQ(DataUseTabModel::TRANSITION_OMNIBOX_NAVIGATION, transition_type);
257 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType(
258 ui::PageTransition(ui::PAGE_TRANSITION_TYPED | 0xFFFF00),
259 &transition_type));
260 EXPECT_EQ(DataUseTabModel::TRANSITION_OMNIBOX_NAVIGATION, transition_type);
261 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType(
262 ui::PageTransition(ui::PAGE_TRANSITION_TYPED | 0x12FFFF00),
263 &transition_type));
264 EXPECT_EQ(DataUseTabModel::TRANSITION_OMNIBOX_NAVIGATION, transition_type);
265
266 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType(
267 ui::PageTransition(ui::PAGE_TRANSITION_AUTO_BOOKMARK), &transition_type));
268 EXPECT_EQ(DataUseTabModel::TRANSITION_BOOKMARK, transition_type);
269 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType(
270 ui::PageTransition(ui::PAGE_TRANSITION_AUTO_BOOKMARK | 0xFF00),
271 &transition_type));
272 EXPECT_EQ(DataUseTabModel::TRANSITION_BOOKMARK, transition_type);
273 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType(
274 ui::PageTransition(ui::PAGE_TRANSITION_AUTO_BOOKMARK | 0xFFFF00),
275 &transition_type));
276 EXPECT_EQ(DataUseTabModel::TRANSITION_BOOKMARK, transition_type);
277 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType(
278 ui::PageTransition(ui::PAGE_TRANSITION_AUTO_BOOKMARK | 0x12FFFF00),
279 &transition_type));
280 EXPECT_EQ(DataUseTabModel::TRANSITION_BOOKMARK, transition_type);
281
282 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType(
283 ui::PageTransition(ui::PAGE_TRANSITION_GENERATED), &transition_type));
284 EXPECT_EQ(DataUseTabModel::TRANSITION_OMNIBOX_SEARCH, transition_type);
285 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType(
286 ui::PageTransition(ui::PAGE_TRANSITION_GENERATED | 0xFF00),
287 &transition_type));
288 EXPECT_EQ(DataUseTabModel::TRANSITION_OMNIBOX_SEARCH, transition_type);
289 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType(
290 ui::PageTransition(ui::PAGE_TRANSITION_GENERATED | 0xFFFF00),
291 &transition_type));
292 EXPECT_EQ(DataUseTabModel::TRANSITION_OMNIBOX_SEARCH, transition_type);
293 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType(
294 ui::PageTransition(ui::PAGE_TRANSITION_GENERATED | 0x12FFFF00),
295 &transition_type));
296 EXPECT_EQ(DataUseTabModel::TRANSITION_OMNIBOX_SEARCH, transition_type);
297
298 EXPECT_FALSE(data_use_ui_tab_model()->ConvertTransitionType(
299 ui::PageTransition(ui::PAGE_TRANSITION_AUTO_SUBFRAME), &transition_type));
300 EXPECT_FALSE(data_use_ui_tab_model()->ConvertTransitionType(
301 ui::PageTransition(ui::PAGE_TRANSITION_MANUAL_SUBFRAME),
302 &transition_type));
303 EXPECT_FALSE(data_use_ui_tab_model()->ConvertTransitionType(
304 ui::PageTransition(ui::PAGE_TRANSITION_FORM_SUBMIT), &transition_type));
305 }
306
99 } // namespace android 307 } // namespace android
100 308
101 } // namespace chrome 309 } // namespace chrome
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698