OLD | NEW |
---|---|
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_aggregator.h" | |
18 #include "components/data_usage/core/data_use_amortizer.h" | |
19 #include "components/data_usage/core/data_use_annotator.h" | |
20 #include "content/public/browser/browser_thread.h" | |
13 #include "content/public/browser/web_contents.h" | 21 #include "content/public/browser/web_contents.h" |
14 #include "content/public/test/test_renderer_host.h" | 22 #include "content/public/test/test_renderer_host.h" |
15 #include "content/public/test/web_contents_tester.h" | 23 #include "content/public/test/web_contents_tester.h" |
16 #include "testing/gtest/include/gtest/gtest.h" | 24 #include "testing/gtest/include/gtest/gtest.h" |
17 #include "ui/base/page_transition_types.h" | 25 #include "ui/base/page_transition_types.h" |
18 #include "url/gurl.h" | 26 #include "url/gurl.h" |
19 | 27 |
20 namespace chrome { | 28 namespace chrome { |
21 | 29 |
22 namespace android { | 30 namespace android { |
23 | 31 |
32 class DataUseTabModelTest : public DataUseTabModel { | |
sclittle
2015/11/16 23:13:43
nit: Name this TestDataUseTabModel, so that it isn
tbansal1
2015/11/17 21:12:33
Done.
| |
33 public: | |
34 DataUseTabModelTest(ExternalDataUseObserver* external_data_use_observer, | |
35 scoped_refptr<base::SingleThreadTaskRunner> task_runner_) | |
36 : DataUseTabModel(external_data_use_observer, task_runner_.get()), | |
37 weak_factory_(this) {} | |
38 | |
39 base::WeakPtr<DataUseTabModelTest> GetWeakPtr() { | |
40 return weak_factory_.GetWeakPtr(); | |
41 } | |
42 | |
43 private: | |
44 base::WeakPtrFactory<DataUseTabModelTest> weak_factory_; | |
45 }; | |
46 | |
24 class DataUseUITabModelTest : public ChromeRenderViewHostTestHarness { | 47 class DataUseUITabModelTest : public ChromeRenderViewHostTestHarness { |
25 public: | 48 public: |
26 using ChromeRenderViewHostTestHarness::web_contents; | 49 using ChromeRenderViewHostTestHarness::web_contents; |
27 | 50 |
28 DataUseUITabModel* data_use_ui_tab_model() { | 51 DataUseUITabModel* data_use_ui_tab_model() { |
29 return chrome::android::DataUseUITabModelFactory::GetForBrowserContext( | 52 return chrome::android::DataUseUITabModelFactory::GetForBrowserContext( |
30 Profile::FromBrowserContext(web_contents()->GetBrowserContext())); | 53 Profile::FromBrowserContext(web_contents()->GetBrowserContext())); |
31 } | 54 } |
32 }; | 55 }; |
33 | 56 |
34 // Tests that DataUseTabModel is notified of tab closure and navigation events. | 57 // Tests that DataUseTabModel is notified of tab closure and navigation events, |
58 // and DataUseTabModel notifies DataUseUITabModel. | |
35 TEST_F(DataUseUITabModelTest, ReportTabEventsTest) { | 59 TEST_F(DataUseUITabModelTest, ReportTabEventsTest) { |
36 data_use_ui_tab_model()->ReportBrowserNavigation( | 60 std::string foo_label("foo_label"); |
37 GURL("https://www.example.com"), | 61 |
38 ui::PageTransition::PAGE_TRANSITION_TYPED, | 62 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner = |
39 SessionTabHelper::IdForTab(web_contents())); | 63 content::BrowserThread::GetMessageLoopProxyForThread( |
40 data_use_ui_tab_model()->ReportTabClosure( | 64 content::BrowserThread::IO); |
41 SessionTabHelper::IdForTab(web_contents())); | 65 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner = |
42 // TODO(tbansal): Test that DataUseTabModel is notified. | 66 content::BrowserThread::GetMessageLoopProxyForThread( |
67 content::BrowserThread::UI); | |
68 | |
69 scoped_ptr<data_usage::DataUseAggregator> data_use_aggregator( | |
sclittle
2015/11/16 23:13:42
nit: This doesn't have to be a scoped_ptr, this co
tbansal1
2015/11/17 21:12:33
Done.
| |
70 new data_usage::DataUseAggregator( | |
71 scoped_ptr<data_usage::DataUseAnnotator>(), | |
72 scoped_ptr<data_usage::DataUseAmortizer>())); | |
73 | |
74 scoped_ptr<ExternalDataUseObserver> external_data_use_observer( | |
sclittle
2015/11/16 23:13:43
nit: same here, this doesn't need to be a scoped_p
tbansal1
2015/11/17 21:12:33
Done.
| |
75 new ExternalDataUseObserver(data_use_aggregator.get(), | |
76 io_task_runner.get(), ui_task_runner.get())); | |
77 base::RunLoop().RunUntilIdle(); | |
78 std::vector<std::string> url_regexes; | |
79 url_regexes.push_back( | |
80 "http://www[.]foo[.]com/#q=.*|https://www[.]foo[.]com/#q=.*"); | |
81 external_data_use_observer->RegisterURLRegexes( | |
82 std::vector<std::string>(url_regexes.size(), std::string()), url_regexes, | |
83 std::vector<std::string>(url_regexes.size(), foo_label)); | |
84 | |
85 DataUseTabModelTest data_use_tab_model( | |
86 external_data_use_observer.get(), | |
87 content::BrowserThread::GetMessageLoopProxyForThread( | |
88 content::BrowserThread::IO)); | |
89 data_use_ui_tab_model()->SetIODataUseTabModel( | |
90 data_use_tab_model.GetWeakPtr()); | |
91 data_use_ui_tab_model()->SetUIDataUseTabModel( | |
92 data_use_tab_model.GetWeakPtr()); | |
93 | |
94 const struct { | |
95 ui::PageTransition transition_type; | |
96 std::string expected_label; | |
97 } tests[] = { | |
98 {ui::PageTransitionFromInt(ui::PageTransition::PAGE_TRANSITION_LINK | | |
99 ui::PAGE_TRANSITION_FROM_API), | |
100 std::string()}, | |
101 {ui::PageTransition::PAGE_TRANSITION_LINK, std::string()}, | |
102 {ui::PageTransition::PAGE_TRANSITION_TYPED, foo_label}, | |
103 {ui::PageTransition::PAGE_TRANSITION_AUTO_BOOKMARK, std::string()}, | |
104 {ui::PageTransition::PAGE_TRANSITION_AUTO_TOPLEVEL, std::string()}, | |
105 {ui::PageTransition::PAGE_TRANSITION_GENERATED, foo_label}, | |
106 {ui::PageTransition::PAGE_TRANSITION_RELOAD, std::string()}, | |
107 }; | |
108 | |
109 for (size_t i = 0; i < arraysize(tests); ++i) { | |
110 // Start a new tab. | |
111 int32_t foo_tab_id = i + 1; | |
112 data_use_ui_tab_model()->ReportBrowserNavigation( | |
113 GURL("https://www.foo.com/#q=abc"), tests[i].transition_type, | |
114 foo_tab_id); | |
115 base::RunLoop().RunUntilIdle(); | |
116 | |
117 // |data_use_ui_tab_model| should receive callback about starting of | |
118 // tracking of data usage for |foo_tab_id|. | |
119 EXPECT_EQ(!tests[i].expected_label.empty(), | |
120 data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)) | |
121 << i; | |
122 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)) | |
123 << i; | |
124 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingEnded(foo_tab_id)) | |
125 << i; | |
126 | |
127 // DataUse object should be labeled correctly. | |
128 data_usage::DataUse data_use(GURL("http://foo.com/#q=abc"), | |
sclittle
2015/11/16 23:13:42
Add an include for data_use.h
tbansal1
2015/11/17 21:12:33
Done.
| |
129 base::TimeTicks::Now(), | |
130 GURL("http://foobar.com"), foo_tab_id, | |
131 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, | |
sclittle
2015/11/16 23:13:42
nit: Pull this DataUse creation and the DataUse cr
tbansal1
2015/11/17 21:12:33
Reduced it to one function call.
| |
132 std::string(), 1000, 1000); | |
133 std::string got_label; | |
134 data_use_tab_model.GetLabelForDataUse(data_use, &got_label); | |
135 EXPECT_EQ(tests[i].expected_label, got_label) << i; | |
136 | |
137 // Report closure of tab. | |
138 data_use_ui_tab_model()->ReportTabClosure(foo_tab_id); | |
139 base::RunLoop().RunUntilIdle(); | |
140 | |
141 // DataUse object should not be labeled. | |
142 data_usage::DataUse data_use_expired( | |
143 GURL("http://foo.com/#q=abc"), base::TimeTicks::Now(), | |
sclittle
2015/11/16 23:13:43
base::TimeTicks::Now() could be the same as it was
tbansal1
2015/11/17 21:12:33
Done.
| |
144 GURL("http://foobar.com"), foo_tab_id, | |
145 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, std::string(), 1000, | |
146 1000); | |
147 | |
148 data_use_tab_model.GetLabelForDataUse(data_use_expired, &got_label); | |
149 EXPECT_EQ(std::string(), got_label) << i; | |
150 } | |
43 } | 151 } |
44 | 152 |
45 // Tests if the Entrance/Exit UI state is tracked correctly. | 153 // Tests if the Entrance/Exit UI state is tracked correctly. |
46 TEST_F(DataUseUITabModelTest, EntranceExitState) { | 154 TEST_F(DataUseUITabModelTest, EntranceExitState) { |
47 int32_t foo_tab_id = 1; | 155 int32_t foo_tab_id = 1; |
48 int32_t bar_tab_id = 2; | 156 int32_t bar_tab_id = 2; |
49 int32_t baz_tab_id = 3; | 157 int32_t baz_tab_id = 3; |
50 | 158 |
51 // ShowEntrance should return true only once. | 159 // HasDataUseTrackingStarted should return true only once. |
52 data_use_ui_tab_model()->OnTrackingStarted(foo_tab_id); | 160 data_use_ui_tab_model()->NotifyTrackingStarting(foo_tab_id); |
53 EXPECT_TRUE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); | 161 EXPECT_TRUE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); |
54 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); | 162 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); |
55 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingEnded(foo_tab_id)); | 163 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingEnded(foo_tab_id)); |
56 | 164 |
57 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(bar_tab_id)); | 165 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(bar_tab_id)); |
58 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingEnded(bar_tab_id)); | 166 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingEnded(bar_tab_id)); |
59 | 167 |
60 // ShowExit should return true only once. | 168 // HasDataUseTrackingEnded should return true only once. |
61 data_use_ui_tab_model()->OnTrackingEnded(foo_tab_id); | 169 data_use_ui_tab_model()->NotifyTrackingEnding(foo_tab_id); |
62 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); | 170 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); |
63 EXPECT_TRUE(data_use_ui_tab_model()->HasDataUseTrackingEnded(foo_tab_id)); | 171 EXPECT_TRUE(data_use_ui_tab_model()->HasDataUseTrackingEnded(foo_tab_id)); |
64 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingEnded(foo_tab_id)); | 172 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingEnded(foo_tab_id)); |
65 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); | 173 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); |
66 | 174 |
67 // The tab enters the tracking state again. | 175 // The tab enters the tracking state again. |
68 data_use_ui_tab_model()->OnTrackingStarted(foo_tab_id); | 176 data_use_ui_tab_model()->NotifyTrackingStarting(foo_tab_id); |
69 EXPECT_TRUE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); | 177 EXPECT_TRUE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); |
70 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); | 178 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); |
71 | 179 |
72 // The tab exits the tracking state. | 180 // The tab exits the tracking state. |
73 data_use_ui_tab_model()->OnTrackingEnded(foo_tab_id); | 181 data_use_ui_tab_model()->NotifyTrackingEnding(foo_tab_id); |
74 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); | 182 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); |
75 | 183 |
76 // The tab enters the tracking state again. | 184 // The tab enters the tracking state again. |
77 data_use_ui_tab_model()->OnTrackingStarted(foo_tab_id); | 185 data_use_ui_tab_model()->NotifyTrackingStarting(foo_tab_id); |
78 data_use_ui_tab_model()->OnTrackingStarted(foo_tab_id); | 186 data_use_ui_tab_model()->NotifyTrackingStarting(foo_tab_id); |
79 EXPECT_TRUE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); | 187 EXPECT_TRUE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); |
80 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); | 188 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(foo_tab_id)); |
81 | 189 |
82 // ShowExit should return true only once. | 190 // ShowExit should return true only once. |
83 data_use_ui_tab_model()->OnTrackingEnded(bar_tab_id); | 191 data_use_ui_tab_model()->NotifyTrackingEnding(bar_tab_id); |
84 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(bar_tab_id)); | 192 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(bar_tab_id)); |
85 EXPECT_TRUE(data_use_ui_tab_model()->HasDataUseTrackingEnded(bar_tab_id)); | 193 EXPECT_TRUE(data_use_ui_tab_model()->HasDataUseTrackingEnded(bar_tab_id)); |
86 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingEnded(bar_tab_id)); | 194 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingEnded(bar_tab_id)); |
87 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(bar_tab_id)); | 195 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(bar_tab_id)); |
88 | 196 |
89 data_use_ui_tab_model()->ReportTabClosure(foo_tab_id); | 197 data_use_ui_tab_model()->ReportTabClosure(foo_tab_id); |
90 data_use_ui_tab_model()->ReportTabClosure(bar_tab_id); | 198 data_use_ui_tab_model()->ReportTabClosure(bar_tab_id); |
91 | 199 |
92 // HasDataUseTrackingStarted/Ended should return false for closed tabs. | 200 // HasDataUseTrackingStarted/Ended should return false for closed tabs. |
93 data_use_ui_tab_model()->OnTrackingStarted(baz_tab_id); | 201 data_use_ui_tab_model()->NotifyTrackingStarting(baz_tab_id); |
94 data_use_ui_tab_model()->ReportTabClosure(baz_tab_id); | 202 data_use_ui_tab_model()->ReportTabClosure(baz_tab_id); |
95 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(baz_tab_id)); | 203 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingStarted(baz_tab_id)); |
96 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingEnded(baz_tab_id)); | 204 EXPECT_FALSE(data_use_ui_tab_model()->HasDataUseTrackingEnded(baz_tab_id)); |
97 } | 205 } |
98 | 206 |
207 // Checks if page transition type is converted correctly. | |
208 TEST_F(DataUseUITabModelTest, ConvertTransitionType) { | |
209 DataUseTabModel::TransitionType transition_type; | |
210 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType( | |
211 ui::PageTransition(ui::PAGE_TRANSITION_TYPED), &transition_type)); | |
212 EXPECT_EQ(DataUseTabModel::TRANSITION_OMNIBOX_NAVIGATION, transition_type); | |
213 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType( | |
214 ui::PageTransition(ui::PAGE_TRANSITION_TYPED | 0xFF00), | |
215 &transition_type)); | |
216 EXPECT_EQ(DataUseTabModel::TRANSITION_OMNIBOX_NAVIGATION, transition_type); | |
217 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType( | |
218 ui::PageTransition(ui::PAGE_TRANSITION_TYPED | 0xFFFF00), | |
219 &transition_type)); | |
220 EXPECT_EQ(DataUseTabModel::TRANSITION_OMNIBOX_NAVIGATION, transition_type); | |
221 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType( | |
222 ui::PageTransition(ui::PAGE_TRANSITION_TYPED | 0x12FFFF00), | |
223 &transition_type)); | |
224 EXPECT_EQ(DataUseTabModel::TRANSITION_OMNIBOX_NAVIGATION, transition_type); | |
225 | |
226 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType( | |
227 ui::PageTransition(ui::PAGE_TRANSITION_AUTO_BOOKMARK), &transition_type)); | |
228 EXPECT_EQ(DataUseTabModel::TRANSITION_BOOKMARK, transition_type); | |
229 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType( | |
230 ui::PageTransition(ui::PAGE_TRANSITION_AUTO_BOOKMARK | 0xFF00), | |
231 &transition_type)); | |
232 EXPECT_EQ(DataUseTabModel::TRANSITION_BOOKMARK, transition_type); | |
233 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType( | |
234 ui::PageTransition(ui::PAGE_TRANSITION_AUTO_BOOKMARK | 0xFFFF00), | |
235 &transition_type)); | |
236 EXPECT_EQ(DataUseTabModel::TRANSITION_BOOKMARK, transition_type); | |
237 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType( | |
238 ui::PageTransition(ui::PAGE_TRANSITION_AUTO_BOOKMARK | 0x12FFFF00), | |
239 &transition_type)); | |
240 EXPECT_EQ(DataUseTabModel::TRANSITION_BOOKMARK, transition_type); | |
241 | |
242 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType( | |
243 ui::PageTransition(ui::PAGE_TRANSITION_GENERATED), &transition_type)); | |
244 EXPECT_EQ(DataUseTabModel::TRANSITION_OMNIBOX_SEARCH, transition_type); | |
245 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType( | |
246 ui::PageTransition(ui::PAGE_TRANSITION_GENERATED | 0xFF00), | |
247 &transition_type)); | |
248 EXPECT_EQ(DataUseTabModel::TRANSITION_OMNIBOX_SEARCH, transition_type); | |
249 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType( | |
250 ui::PageTransition(ui::PAGE_TRANSITION_GENERATED | 0xFFFF00), | |
251 &transition_type)); | |
252 EXPECT_EQ(DataUseTabModel::TRANSITION_OMNIBOX_SEARCH, transition_type); | |
253 EXPECT_TRUE(data_use_ui_tab_model()->ConvertTransitionType( | |
254 ui::PageTransition(ui::PAGE_TRANSITION_GENERATED | 0x12FFFF00), | |
255 &transition_type)); | |
256 EXPECT_EQ(DataUseTabModel::TRANSITION_OMNIBOX_SEARCH, transition_type); | |
257 | |
258 EXPECT_FALSE(data_use_ui_tab_model()->ConvertTransitionType( | |
259 ui::PageTransition(ui::PAGE_TRANSITION_AUTO_SUBFRAME), &transition_type)); | |
260 EXPECT_FALSE(data_use_ui_tab_model()->ConvertTransitionType( | |
261 ui::PageTransition(ui::PAGE_TRANSITION_MANUAL_SUBFRAME), | |
262 &transition_type)); | |
263 EXPECT_FALSE(data_use_ui_tab_model()->ConvertTransitionType( | |
264 ui::PageTransition(ui::PAGE_TRANSITION_FORM_SUBMIT), &transition_type)); | |
265 } | |
266 | |
99 } // namespace android | 267 } // namespace android |
100 | 268 |
101 } // namespace chrome | 269 } // namespace chrome |
OLD | NEW |