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

Side by Side Diff: chrome/browser/android/data_usage/data_use_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 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_tab_model.h" 5 #include "chrome/browser/android/data_usage/data_use_tab_model.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <string> 9 #include <string>
10 10
11 #include "base/memory/weak_ptr.h"
11 #include "base/message_loop/message_loop.h" 12 #include "base/message_loop/message_loop.h"
13 #include "base/run_loop.h"
12 #include "base/single_thread_task_runner.h" 14 #include "base/single_thread_task_runner.h"
13 #include "base/strings/stringprintf.h" 15 #include "base/strings/stringprintf.h"
14 #include "base/test/histogram_tester.h" 16 #include "base/test/histogram_tester.h"
15 #include "base/time/time.h" 17 #include "base/time/time.h"
16 #include "chrome/browser/android/data_usage/external_data_use_observer.h" 18 #include "chrome/browser/android/data_usage/external_data_use_observer.h"
17 #include "chrome/browser/android/data_usage/tab_data_use_entry.h" 19 #include "chrome/browser/android/data_usage/tab_data_use_entry.h"
20 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
18 #include "components/data_usage/core/data_use.h" 21 #include "components/data_usage/core/data_use.h"
19 #include "components/data_usage/core/data_use_aggregator.h" 22 #include "components/data_usage/core/data_use_aggregator.h"
20 #include "components/data_usage/core/data_use_amortizer.h" 23 #include "components/data_usage/core/data_use_amortizer.h"
21 #include "components/data_usage/core/data_use_annotator.h" 24 #include "components/data_usage/core/data_use_annotator.h"
25 #include "components/sessions/core/session_id.h"
26 #include "content/public/browser/browser_thread.h"
22 #include "net/base/network_change_notifier.h" 27 #include "net/base/network_change_notifier.h"
23 #include "testing/gmock/include/gmock/gmock.h" 28 #include "testing/gmock/include/gmock/gmock.h"
24 #include "testing/gtest/include/gtest/gtest.h" 29 #include "testing/gtest/include/gtest/gtest.h"
25 30
26 namespace { 31 namespace {
27 32
28 // Tracking labels for tests. 33 // Tracking labels for tests.
29 const std::string kTestLabel1 = "label_1"; 34 const std::string kTestLabel1 = "label_1";
30 const std::string kTestLabel2 = "label_2"; 35 const std::string kTestLabel2 = "label_2";
31 const std::string kTestLabel3 = "label_3"; 36 const std::string kTestLabel3 = "label_3";
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 // Returns the current time advanced by |now_offset_|. 69 // Returns the current time advanced by |now_offset_|.
65 base::TimeTicks Now() const override { 70 base::TimeTicks Now() const override {
66 return base::TimeTicks::Now() + now_offset_; 71 return base::TimeTicks::Now() + now_offset_;
67 } 72 }
68 73
69 // Represents the delta offset to be added to current time that is returned by 74 // Represents the delta offset to be added to current time that is returned by
70 // Now. 75 // Now.
71 base::TimeDelta now_offset_; 76 base::TimeDelta now_offset_;
72 }; 77 };
73 78
74 class DataUseTabModelTest : public testing::Test { 79 class DataUseTabModelTest : public ChromeRenderViewHostTestHarness {
75 public: 80 public:
76 DataUseTabModelTest() {} 81 DataUseTabModelTest() {}
77 82
78 protected: 83 protected:
79 void SetUp() override { 84 void SetUp() override {
85 ChromeRenderViewHostTestHarness::SetUp();
86
80 data_use_aggregator_.reset(new data_usage::DataUseAggregator( 87 data_use_aggregator_.reset(new data_usage::DataUseAggregator(
81 scoped_ptr<data_usage::DataUseAnnotator>(), 88 scoped_ptr<data_usage::DataUseAnnotator>(),
82 scoped_ptr<data_usage::DataUseAmortizer>())); 89 scoped_ptr<data_usage::DataUseAmortizer>()));
83 data_use_observer_.reset(new ExternalDataUseObserver( 90 data_use_observer_.reset(new ExternalDataUseObserver(
84 data_use_aggregator_.get(), message_loop_.task_runner().get(), 91 data_use_aggregator_.get(),
85 message_loop_.task_runner().get())); 92 content::BrowserThread::GetMessageLoopProxyForThread(
93 content::BrowserThread::IO),
94 content::BrowserThread::GetMessageLoopProxyForThread(
95 content::BrowserThread::UI)));
86 data_use_tab_model_ = new DataUseTabModelNowTest( 96 data_use_tab_model_ = new DataUseTabModelNowTest(
87 data_use_observer_.get(), message_loop_.task_runner().get()); 97 data_use_observer_.get(),
98 content::BrowserThread::GetMessageLoopProxyForThread(
99 content::BrowserThread::UI));
88 100
89 // |data_use_tab_model_| will be owned by |data_use_observer_|. 101 // |data_use_tab_model_| will be owned by |data_use_observer_|.
90 data_use_observer_->data_use_tab_model_.reset(data_use_tab_model_); 102 data_use_observer_->data_use_tab_model_.reset(data_use_tab_model_);
91 } 103 }
92 104
93 // Returns true if tab entry for |tab_id| exists in |active_tabs_|. 105 // Returns true if tab entry for |tab_id| exists in |active_tabs_|.
94 bool IsTabEntryExists(int32_t tab_id) const { 106 bool IsTabEntryExists(SessionID::id_type tab_id) const {
95 return data_use_tab_model_->active_tabs_.find(tab_id) != 107 return data_use_tab_model_->active_tabs_.find(tab_id) !=
96 data_use_tab_model_->active_tabs_.end(); 108 data_use_tab_model_->active_tabs_.end();
97 } 109 }
98 110
99 // Checks if there are |expected_size| tab entries being tracked in 111 // Checks if there are |expected_size| tab entries being tracked in
100 // |active_tabs_|. 112 // |active_tabs_|.
101 void ExpectTabEntrySize(uint32_t expected_size) const { 113 void ExpectTabEntrySize(uint32_t expected_size) const {
102 EXPECT_EQ(expected_size, data_use_tab_model_->active_tabs_.size()); 114 EXPECT_EQ(expected_size, data_use_tab_model_->active_tabs_.size());
103 } 115 }
104 116
105 // Returns true if the tracking session for tab with id |tab_id| is currently 117 // Returns true if the tracking session for tab with id |tab_id| is currently
106 // active. 118 // active.
107 bool IsTrackingDataUse(int32_t tab_id) const { 119 bool IsTrackingDataUse(SessionID::id_type tab_id) const {
108 auto tab_entry_iterator = data_use_tab_model_->active_tabs_.find(tab_id); 120 auto tab_entry_iterator = data_use_tab_model_->active_tabs_.find(tab_id);
109 if (tab_entry_iterator == data_use_tab_model_->active_tabs_.end()) 121 if (tab_entry_iterator == data_use_tab_model_->active_tabs_.end())
110 return false; 122 return false;
111 return tab_entry_iterator->second.IsTrackingDataUse(); 123 return tab_entry_iterator->second.IsTrackingDataUse();
112 } 124 }
113 125
114 // Checks if the DataUse object for the given |tab_id| with request start time 126 // Checks if the DataUse object for the given |tab_id| with request start time
115 // |at_time| is labeled as an empty string. 127 // |at_time| is labeled as an empty string.
116 void ExpectEmptyDataUseLabelAtTime(int32_t tab_id, 128 void ExpectEmptyDataUseLabelAtTime(SessionID::id_type tab_id,
117 const base::TimeTicks& at_time) const { 129 const base::TimeTicks& at_time) const {
118 ExpectDataUseLabelAtTimeWithReturn(tab_id, at_time, false, std::string()); 130 ExpectDataUseLabelAtTimeWithReturn(tab_id, at_time, false, std::string());
119 } 131 }
120 132
121 // Checks if the DataUse object for the given |tab_id| is labeled as an empty 133 // Checks if the DataUse object for the given |tab_id| is labeled as an empty
122 // string. 134 // string.
123 void ExpectEmptyDataUseLabel(int32_t tab_id) const { 135 void ExpectEmptyDataUseLabel(SessionID::id_type tab_id) const {
124 ExpectDataUseLabelAtTimeWithReturn(tab_id, base::TimeTicks::Now(), false, 136 ExpectDataUseLabelAtTimeWithReturn(tab_id, base::TimeTicks::Now(), false,
125 std::string()); 137 std::string());
126 } 138 }
127 139
128 // Checks if the DataUse object for given |tab_id| is labeled as 140 // Checks if the DataUse object for given |tab_id| is labeled as
129 // |expected_label|. 141 // |expected_label|.
130 void ExpectDataUseLabel(int32_t tab_id, 142 void ExpectDataUseLabel(SessionID::id_type tab_id,
131 const std::string& expected_label) const { 143 const std::string& expected_label) const {
132 ExpectDataUseLabelAtTimeWithReturn(tab_id, base::TimeTicks::Now(), true, 144 ExpectDataUseLabelAtTimeWithReturn(tab_id, base::TimeTicks::Now(), true,
133 expected_label); 145 expected_label);
134 } 146 }
135 147
136 // Checks if GetLabelForDataUse labels the DataUse object for |tab_id| with 148 // Checks if GetLabelForDataUse labels the DataUse object for |tab_id| with
137 // request start time |at_time|, as |expected_label| and returns 149 // request start time |at_time|, as |expected_label| and returns
138 // |expected_return|. 150 // |expected_return|.
139 void ExpectDataUseLabelAtTimeWithReturn( 151 void ExpectDataUseLabelAtTimeWithReturn(
140 int32_t tab_id, 152 SessionID::id_type tab_id,
141 const base::TimeTicks& at_time, 153 const base::TimeTicks& at_time,
142 bool expected_return, 154 bool expected_return,
143 const std::string& expected_label) const { 155 const std::string& expected_label) const {
144 data_usage::DataUse data_use(GURL("http://foo.com"), at_time, 156 data_usage::DataUse data_use(GURL("http://foo.com"), at_time,
145 GURL("http://foobar.com"), tab_id, 157 GURL("http://foobar.com"), tab_id,
146 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, 158 net::NetworkChangeNotifier::CONNECTION_UNKNOWN,
147 std::string(), 1000, 1000); 159 std::string(), 1000, 1000);
148 std::string actual_label; 160 std::string actual_label;
149 bool actual_return = 161 bool actual_return =
150 data_use_tab_model_->GetLabelForDataUse(data_use, &actual_label); 162 data_use_tab_model_->GetLabelForDataUse(data_use, &actual_label);
151 EXPECT_EQ(expected_return, actual_return); 163 EXPECT_EQ(expected_return, actual_return);
152 EXPECT_EQ(expected_label, actual_label); 164 EXPECT_EQ(expected_label, actual_label);
153 } 165 }
154 166
155 void StartTrackingDataUse(int32_t tab_id, const std::string& label) { 167 void StartTrackingDataUse(SessionID::id_type tab_id,
168 const std::string& label) {
156 data_use_tab_model_->StartTrackingDataUse(tab_id, label); 169 data_use_tab_model_->StartTrackingDataUse(tab_id, label);
157 } 170 }
158 171
159 void EndTrackingDataUse(int32_t tab_id) { 172 void EndTrackingDataUse(SessionID::id_type tab_id) {
160 data_use_tab_model_->EndTrackingDataUse(tab_id); 173 data_use_tab_model_->EndTrackingDataUse(tab_id);
161 } 174 }
162 175
163 void RegisterURLRegexesInDataUseObserver( 176 void RegisterURLRegexesInDataUseObserver(
164 const std::vector<std::string>& app_package_names, 177 const std::vector<std::string>& app_package_names,
165 const std::vector<std::string>& domain_regexes, 178 const std::vector<std::string>& domain_regexes,
166 const std::vector<std::string>& labels) { 179 const std::vector<std::string>& labels) {
167 data_use_observer_->RegisterURLRegexes(app_package_names, domain_regexes, 180 data_use_observer_->RegisterURLRegexes(app_package_names, domain_regexes,
168 labels); 181 labels);
169 } 182 }
170 183
171 scoped_ptr<data_usage::DataUseAggregator> data_use_aggregator_; 184 scoped_ptr<data_usage::DataUseAggregator> data_use_aggregator_;
172 scoped_ptr<ExternalDataUseObserver> data_use_observer_; 185 scoped_ptr<ExternalDataUseObserver> data_use_observer_;
173 186
174 // Pointer to the tab model within and owned by ExternalDataUseObserver. 187 // Pointer to the tab model within and owned by ExternalDataUseObserver.
175 DataUseTabModelNowTest* data_use_tab_model_; 188 DataUseTabModelNowTest* data_use_tab_model_;
176 189
177 base::MessageLoop message_loop_; 190 private:
191 DISALLOW_COPY_AND_ASSIGN(DataUseTabModelTest);
178 }; 192 };
179 193
180 // Mock observer to track the calls to start and end tracking events. 194 // Mock observer to track the calls to start and end tracking events.
181 class MockTabDataUseObserver : public DataUseTabModel::TabDataUseObserver { 195 class MockTabDataUseObserver : public DataUseTabModel::TabDataUseObserver {
182 public: 196 public:
183 MOCK_METHOD1(NotifyTrackingStarting, void(int32_t tab_id)); 197 MockTabDataUseObserver() : weak_ptr_factory_(this) {}
184 MOCK_METHOD1(NotifyTrackingEnding, void(int32_t tab_id)); 198 MOCK_METHOD1(NotifyTrackingStarting, void(SessionID::id_type tab_id));
199 MOCK_METHOD1(NotifyTrackingEnding, void(SessionID::id_type tab_id));
200
201 base::WeakPtr<MockTabDataUseObserver> GetWeakPtr() {
202 return weak_ptr_factory_.GetWeakPtr();
203 }
204
205 private:
206 base::WeakPtrFactory<MockTabDataUseObserver> weak_ptr_factory_;
207
208 DISALLOW_COPY_AND_ASSIGN(MockTabDataUseObserver);
185 }; 209 };
186 210
187 // Starts and ends tracking a single tab and checks if its label is returned 211 // Starts and ends tracking a single tab and checks if its label is returned
188 // correctly for DataUse objects. 212 // correctly for DataUse objects.
189 TEST_F(DataUseTabModelTest, SingleTabTracking) { 213 TEST_F(DataUseTabModelTest, SingleTabTracking) {
190 ExpectTabEntrySize(TabEntrySize::ZERO); 214 ExpectTabEntrySize(TabEntrySize::ZERO);
191 215
192 // No label is applied initially. 216 // No label is applied initially.
193 ExpectEmptyDataUseLabel(kTabID1); 217 ExpectEmptyDataUseLabel(kTabID1);
194 ExpectEmptyDataUseLabel(kTabID2); 218 ExpectEmptyDataUseLabel(kTabID2);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 } 266 }
243 267
244 // Checks that the mock observer receives start and end tracking events for a 268 // Checks that the mock observer receives start and end tracking events for a
245 // single tab. 269 // single tab.
246 TEST_F(DataUseTabModelTest, ObserverStartEndEvents) { 270 TEST_F(DataUseTabModelTest, ObserverStartEndEvents) {
247 MockTabDataUseObserver mock_observer; 271 MockTabDataUseObserver mock_observer;
248 272
249 EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(1); 273 EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(1);
250 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(1); 274 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(1);
251 275
252 data_use_tab_model_->AddObserver(&mock_observer); 276 data_use_tab_model_->AddObserver(&mock_observer, mock_observer.GetWeakPtr());
277 EXPECT_EQ(1U, data_use_tab_model_->observers_.size());
253 StartTrackingDataUse(kTabID1, kTestLabel1); 278 StartTrackingDataUse(kTabID1, kTestLabel1);
254 EndTrackingDataUse(kTabID1); 279 EndTrackingDataUse(kTabID1);
255 280
256 message_loop_.RunUntilIdle(); 281 base::RunLoop().RunUntilIdle();
257 } 282 }
258 283
259 // Checks that multiple mock observers receive start and end tracking events for 284 // Checks that multiple mock observers receive start and end tracking events for
260 // multiple tabs. 285 // multiple tabs.
261 TEST_F(DataUseTabModelTest, MultipleObserverMultipleStartEndEvents) { 286 TEST_F(DataUseTabModelTest, MultipleObserverMultipleStartEndEvents) {
262 MockTabDataUseObserver mock_observers[kMaxMockObservers]; 287 MockTabDataUseObserver mock_observers[kMaxMockObservers];
288 size_t expected_observer_count = 0;
289 EXPECT_EQ(expected_observer_count, data_use_tab_model_->observers_.size());
263 290
264 for (auto& mock_observer : mock_observers) { 291 for (auto& mock_observer : mock_observers) {
265 // Add the observer. 292 // Add the observer.
266 data_use_tab_model_->AddObserver(&mock_observer); 293 data_use_tab_model_->AddObserver(&mock_observer,
294 mock_observer.GetWeakPtr());
295 ++expected_observer_count;
296 EXPECT_EQ(expected_observer_count, data_use_tab_model_->observers_.size());
267 297
268 // Expect start and end events for tab ids 1-3. 298 // Expect start and end events for tab ids 1-3.
269 EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(1); 299 EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(1);
270 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(1); 300 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(1);
271 EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID2)).Times(1); 301 EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID2)).Times(1);
272 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID2)).Times(1); 302 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID2)).Times(1);
273 EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID3)).Times(1); 303 EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID3)).Times(1);
274 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID3)).Times(1); 304 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID3)).Times(1);
275 } 305 }
276 306
277 // Start and end tracking for tab ids 1-3. 307 // Start and end tracking for tab ids 1-3.
278 StartTrackingDataUse(kTabID1, kTestLabel1); 308 StartTrackingDataUse(kTabID1, kTestLabel1);
279 StartTrackingDataUse(kTabID2, kTestLabel2); 309 StartTrackingDataUse(kTabID2, kTestLabel2);
280 StartTrackingDataUse(kTabID3, kTestLabel3); 310 StartTrackingDataUse(kTabID3, kTestLabel3);
281 EndTrackingDataUse(kTabID1); 311 EndTrackingDataUse(kTabID1);
282 EndTrackingDataUse(kTabID2); 312 EndTrackingDataUse(kTabID2);
283 EndTrackingDataUse(kTabID3); 313 EndTrackingDataUse(kTabID3);
284 314
285 message_loop_.RunUntilIdle(); 315 base::RunLoop().RunUntilIdle();
316
317 for (auto& mock_observer : mock_observers) {
318 // Remove the observer.
319 data_use_tab_model_->RemoveObserver(&mock_observer);
320 --expected_observer_count;
321 EXPECT_EQ(expected_observer_count, data_use_tab_model_->observers_.size());
322 }
323 EXPECT_EQ(0U, data_use_tab_model_->observers_.size());
286 } 324 }
287 325
288 // Checks that the observer is not notified of start and end events after 326 // Checks that the observer is not notified of start and end events after
289 // RemoveObserver. 327 // RemoveObserver.
290 TEST_F(DataUseTabModelTest, ObserverNotNotifiedAfterRemove) { 328 TEST_F(DataUseTabModelTest, ObserverNotNotifiedAfterRemove) {
291 MockTabDataUseObserver mock_observer; 329 MockTabDataUseObserver mock_observer;
292 330
293 // Observer notified of start and end events. 331 // Observer notified of start and end events.
294 EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(1); 332 EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(1);
295 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(1); 333 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(1);
296 334
297 data_use_tab_model_->AddObserver(&mock_observer); 335 EXPECT_EQ(0U, data_use_tab_model_->observers_.size());
336 data_use_tab_model_->AddObserver(&mock_observer, mock_observer.GetWeakPtr());
337 EXPECT_EQ(1U, data_use_tab_model_->observers_.size());
298 StartTrackingDataUse(kTabID1, kTestLabel1); 338 StartTrackingDataUse(kTabID1, kTestLabel1);
299 EndTrackingDataUse(kTabID1); 339 EndTrackingDataUse(kTabID1);
300 340
301 message_loop_.RunUntilIdle(); 341 base::RunLoop().RunUntilIdle();
302 testing::Mock::VerifyAndClear(&mock_observer); 342 testing::Mock::VerifyAndClear(&mock_observer);
303 343
304 // Observer should not be notified after RemoveObserver. 344 // Observer should not be notified after RemoveObserver.
305 EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(0); 345 EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(0);
306 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(0); 346 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(0);
307 347
308 data_use_tab_model_->RemoveObserver(&mock_observer); 348 data_use_tab_model_->RemoveObserver(&mock_observer);
349 EXPECT_EQ(0U, data_use_tab_model_->observers_.size());
309 StartTrackingDataUse(kTabID1, kTestLabel1); 350 StartTrackingDataUse(kTabID1, kTestLabel1);
310 EndTrackingDataUse(kTabID1); 351 EndTrackingDataUse(kTabID1);
311 352
312 message_loop_.RunUntilIdle(); 353 base::RunLoop().RunUntilIdle();
313 } 354 }
314 355
315 // Checks that tab close event updates the close time of the tab entry. 356 // Checks that tab close event updates the close time of the tab entry.
316 TEST_F(DataUseTabModelTest, TabCloseEvent) { 357 TEST_F(DataUseTabModelTest, TabCloseEvent) {
317 StartTrackingDataUse(kTabID1, kTestLabel1); 358 StartTrackingDataUse(kTabID1, kTestLabel1);
318 EndTrackingDataUse(kTabID1); 359 EndTrackingDataUse(kTabID1);
319 360
320 ExpectTabEntrySize(TabEntrySize::ONE); 361 ExpectTabEntrySize(TabEntrySize::ONE);
321 EXPECT_TRUE( 362 EXPECT_TRUE(
322 data_use_tab_model_->active_tabs_[kTabID1].tab_close_time_.is_null()); 363 data_use_tab_model_->active_tabs_[kTabID1].tab_close_time_.is_null());
(...skipping 18 matching lines...) Expand all
341 kTabID1, base::TimeTicks::Now() + base::TimeDelta::FromMilliseconds(20)); 382 kTabID1, base::TimeTicks::Now() + base::TimeDelta::FromMilliseconds(20));
342 } 383 }
343 384
344 // Checks that end tracking for specific labels closes those active sessions. 385 // Checks that end tracking for specific labels closes those active sessions.
345 TEST_F(DataUseTabModelTest, OnTrackingLabelRemoved) { 386 TEST_F(DataUseTabModelTest, OnTrackingLabelRemoved) {
346 MockTabDataUseObserver mock_observer; 387 MockTabDataUseObserver mock_observer;
347 388
348 StartTrackingDataUse(kTabID1, kTestLabel1); 389 StartTrackingDataUse(kTabID1, kTestLabel1);
349 StartTrackingDataUse(kTabID2, kTestLabel2); 390 StartTrackingDataUse(kTabID2, kTestLabel2);
350 StartTrackingDataUse(kTabID3, kTestLabel3); 391 StartTrackingDataUse(kTabID3, kTestLabel3);
351 data_use_tab_model_->AddObserver(&mock_observer); 392 data_use_tab_model_->AddObserver(&mock_observer, mock_observer.GetWeakPtr());
352 ExpectTabEntrySize(TabEntrySize::THREE); 393 ExpectTabEntrySize(TabEntrySize::THREE);
353 394
354 EXPECT_TRUE(IsTrackingDataUse(kTabID1)); 395 EXPECT_TRUE(IsTrackingDataUse(kTabID1));
355 EXPECT_TRUE(IsTrackingDataUse(kTabID2)); 396 EXPECT_TRUE(IsTrackingDataUse(kTabID2));
356 EXPECT_TRUE(IsTrackingDataUse(kTabID3)); 397 EXPECT_TRUE(IsTrackingDataUse(kTabID3));
357 398
358 // Observer notified of end tracking. 399 // Observer notified of end tracking.
359 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID2)).Times(1); 400 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID2)).Times(1);
360 401
361 data_use_tab_model_->OnTrackingLabelRemoved(kTestLabel2); 402 data_use_tab_model_->OnTrackingLabelRemoved(kTestLabel2);
362 message_loop_.RunUntilIdle(); 403 base::RunLoop().RunUntilIdle();
363 404
364 EXPECT_TRUE(IsTrackingDataUse(kTabID1)); 405 EXPECT_TRUE(IsTrackingDataUse(kTabID1));
365 EXPECT_FALSE(IsTrackingDataUse(kTabID2)); 406 EXPECT_FALSE(IsTrackingDataUse(kTabID2));
366 EXPECT_TRUE(IsTrackingDataUse(kTabID3)); 407 EXPECT_TRUE(IsTrackingDataUse(kTabID3));
367 408
368 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID3)).Times(1); 409 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID3)).Times(1);
369 410
370 data_use_tab_model_->OnTrackingLabelRemoved(kTestLabel3); 411 data_use_tab_model_->OnTrackingLabelRemoved(kTestLabel3);
371 message_loop_.RunUntilIdle(); 412 base::RunLoop().RunUntilIdle();
372 413
373 EXPECT_TRUE(IsTrackingDataUse(kTabID1)); 414 EXPECT_TRUE(IsTrackingDataUse(kTabID1));
374 EXPECT_FALSE(IsTrackingDataUse(kTabID2)); 415 EXPECT_FALSE(IsTrackingDataUse(kTabID2));
375 EXPECT_FALSE(IsTrackingDataUse(kTabID3)); 416 EXPECT_FALSE(IsTrackingDataUse(kTabID3));
376 } 417 }
377 418
378 // Checks that |active_tabs_| does not grow beyond GetMaxTabEntriesForTests tab 419 // Checks that |active_tabs_| does not grow beyond GetMaxTabEntriesForTests tab
379 // entries. 420 // entries.
380 TEST_F(DataUseTabModelTest, CompactTabEntriesWithinMaxLimit) { 421 TEST_F(DataUseTabModelTest, CompactTabEntriesWithinMaxLimit) {
381 const size_t max_tab_entries = data_use_tab_model_->max_tab_entries_; 422 const int32_t max_tab_entries =
382 uint32_t tab_id = 1; 423 static_cast<int32_t>(data_use_tab_model_->max_tab_entries_);
424 SessionID::id_type tab_id = 1;
383 425
384 ExpectTabEntrySize(TabEntrySize::ZERO); 426 ExpectTabEntrySize(TabEntrySize::ZERO);
385 427
386 while (tab_id <= max_tab_entries) { 428 while (tab_id <= max_tab_entries) {
387 std::string tab_label = base::StringPrintf("label_%d", tab_id); 429 std::string tab_label = base::StringPrintf("label_%d", tab_id);
388 StartTrackingDataUse(tab_id, tab_label); 430 StartTrackingDataUse(tab_id, tab_label);
389 EndTrackingDataUse(tab_id); 431 EndTrackingDataUse(tab_id);
390 432
391 ExpectTabEntrySize(tab_id); 433 ExpectTabEntrySize(tab_id);
392 ++tab_id; 434 ++tab_id;
393 } 435 }
394 436
395 uint32_t oldest_tab_id = 1; // oldest tab entry that will be removed first. 437 SessionID::id_type oldest_tab_id =
438 1; // oldest tab entry that will be removed first.
396 439
397 // Starting and ending more tracking tab entries does not increase the size of 440 // Starting and ending more tracking tab entries does not increase the size of
398 // |active_tabs_|. 441 // |active_tabs_|.
399 while (tab_id < max_tab_entries + 10) { 442 while (tab_id < max_tab_entries + 10) {
400 EXPECT_TRUE(IsTabEntryExists(oldest_tab_id)); 443 EXPECT_TRUE(IsTabEntryExists(oldest_tab_id));
401 std::string tab_label = base::StringPrintf("label_%d", tab_id); 444 std::string tab_label = base::StringPrintf("label_%d", tab_id);
402 StartTrackingDataUse(tab_id, tab_label); 445 StartTrackingDataUse(tab_id, tab_label);
403 EndTrackingDataUse(tab_id); 446 EndTrackingDataUse(tab_id);
404 447
405 // Oldest entry got removed. 448 // Oldest entry got removed.
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 kUMAExpiredInactiveTabEntryRemovalDurationSecondsHistogram, 1); 497 kUMAExpiredInactiveTabEntryRemovalDurationSecondsHistogram, 1);
455 histogram_tester.ExpectBucketCount( 498 histogram_tester.ExpectBucketCount(
456 kUMAExpiredInactiveTabEntryRemovalDurationSecondsHistogram, 499 kUMAExpiredInactiveTabEntryRemovalDurationSecondsHistogram,
457 base::TimeDelta::FromSeconds(50).InMilliseconds(), 1); 500 base::TimeDelta::FromSeconds(50).InMilliseconds(), 1);
458 } 501 }
459 502
460 TEST_F(DataUseTabModelTest, UnexpiredTabEntryRemovaltimeHistogram) { 503 TEST_F(DataUseTabModelTest, UnexpiredTabEntryRemovaltimeHistogram) {
461 const char kUMAUnexpiredTabEntryRemovalDurationMinutesHistogram[] = 504 const char kUMAUnexpiredTabEntryRemovalDurationMinutesHistogram[] =
462 "DataUse.TabModel.UnexpiredTabEntryRemovalDuration"; 505 "DataUse.TabModel.UnexpiredTabEntryRemovalDuration";
463 base::HistogramTester histogram_tester; 506 base::HistogramTester histogram_tester;
464 const size_t max_tab_entries = data_use_tab_model_->max_tab_entries_; 507 const int32_t max_tab_entries =
465 uint32_t tab_id = 1; 508 static_cast<int32_t>(data_use_tab_model_->max_tab_entries_);
509 SessionID::id_type tab_id = 1;
466 510
467 while (tab_id <= max_tab_entries) { 511 while (tab_id <= max_tab_entries) {
468 std::string tab_label = base::StringPrintf("label_%d", tab_id); 512 std::string tab_label = base::StringPrintf("label_%d", tab_id);
469 StartTrackingDataUse(tab_id, tab_label); 513 StartTrackingDataUse(tab_id, tab_label);
470 EndTrackingDataUse(tab_id); 514 EndTrackingDataUse(tab_id);
471 ++tab_id; 515 ++tab_id;
472 } 516 }
473 517
474 // Fast forward 10 minutes. 518 // Fast forward 10 minutes.
475 data_use_tab_model_->AdvanceTime(base::TimeDelta::FromMinutes(10)); 519 data_use_tab_model_->AdvanceTime(base::TimeDelta::FromMinutes(10));
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 labels.push_back(kTestLabel2); 595 labels.push_back(kTestLabel2);
552 596
553 RegisterURLRegexesInDataUseObserver(app_package_names, domain_regexes, 597 RegisterURLRegexesInDataUseObserver(app_package_names, domain_regexes,
554 labels); 598 labels);
555 599
556 data_use_tab_model_->OnNavigationEvent( 600 data_use_tab_model_->OnNavigationEvent(
557 kTabID1, DataUseTabModel::TRANSITION_OMNIBOX_SEARCH, 601 kTabID1, DataUseTabModel::TRANSITION_OMNIBOX_SEARCH,
558 GURL("http://foo.com/"), std::string()); 602 GURL("http://foo.com/"), std::string());
559 ExpectTabEntrySize(TabEntrySize::ONE); 603 ExpectTabEntrySize(TabEntrySize::ONE);
560 EXPECT_TRUE(IsTrackingDataUse(kTabID1)); 604 EXPECT_TRUE(IsTrackingDataUse(kTabID1));
561
562 data_use_tab_model_->OnNavigationEvent(
563 kTabID1, DataUseTabModel::TRANSITION_FROM_NAVSUGGEST, GURL(),
564 std::string());
565 EXPECT_FALSE(IsTrackingDataUse(kTabID1));
566 } 605 }
567 606
568 // Tests that any of the Enter transition events start the tracking. 607 // Tests that any of the Enter transition events start the tracking.
569 TEST_F(DataUseTabModelTest, AllNavigationEnterEvents) { 608 TEST_F(DataUseTabModelTest, AllNavigationEnterEvents) {
570 const struct { 609 const struct {
571 DataUseTabModel::TransitionType transition; 610 DataUseTabModel::TransitionType transition;
572 std::string url; 611 std::string url;
573 std::string package; 612 std::string package;
574 std::string expect_label; 613 std::string expect_label;
575 } all_enter_transition_tests[] = { 614 } all_enter_transition_tests[] = {
576 {DataUseTabModel::TRANSITION_FROM_EXTERNAL_APP, std::string(), 615 {DataUseTabModel::TRANSITION_FROM_EXTERNAL_APP, std::string(),
577 "com.google.package.foo", kTestLabel1}, 616 "com.google.package.foo", kTestLabel1},
578 {DataUseTabModel::TRANSITION_FROM_EXTERNAL_APP, "http://foo.com", 617 {DataUseTabModel::TRANSITION_FROM_EXTERNAL_APP, "http://foo.com",
579 "com.google.package.nomatch", kTestLabel2}, 618 "com.google.package.nomatch", kTestLabel2},
580 {DataUseTabModel::TRANSITION_OMNIBOX_SEARCH, "http://foo.com", 619 {DataUseTabModel::TRANSITION_OMNIBOX_SEARCH, "http://foo.com",
581 std::string(), kTestLabel2}, 620 std::string(), kTestLabel2},
582 }; 621 };
583 std::vector<std::string> app_package_names, domain_regexes, labels; 622 std::vector<std::string> app_package_names, domain_regexes, labels;
584 int32_t tab_id = 1; 623 SessionID::id_type tab_id = 1;
585 624
586 app_package_names.push_back("com.google.package.foo"); 625 app_package_names.push_back("com.google.package.foo");
587 domain_regexes.push_back(std::string()); 626 domain_regexes.push_back(std::string());
588 labels.push_back(kTestLabel1); 627 labels.push_back(kTestLabel1);
589 app_package_names.push_back(std::string()); 628 app_package_names.push_back(std::string());
590 domain_regexes.push_back("http://foo.com/"); 629 domain_regexes.push_back("http://foo.com/");
591 labels.push_back(kTestLabel2); 630 labels.push_back(kTestLabel2);
592 631
593 RegisterURLRegexesInDataUseObserver(app_package_names, domain_regexes, 632 RegisterURLRegexesInDataUseObserver(app_package_names, domain_regexes,
594 labels); 633 labels);
595 634
596 for (auto test : all_enter_transition_tests) { 635 for (auto test : all_enter_transition_tests) {
597 EXPECT_FALSE(IsTrackingDataUse(tab_id)); 636 EXPECT_FALSE(IsTrackingDataUse(tab_id));
598 ExpectEmptyDataUseLabel(tab_id); 637 ExpectEmptyDataUseLabel(tab_id);
599 638
600 // Tracking should start. 639 // Tracking should start.
601 data_use_tab_model_->OnNavigationEvent(tab_id, test.transition, 640 data_use_tab_model_->OnNavigationEvent(tab_id, test.transition,
602 GURL(test.url), test.package); 641 GURL(test.url), test.package);
603 642
604 EXPECT_TRUE(IsTrackingDataUse(tab_id)); 643 EXPECT_TRUE(IsTrackingDataUse(tab_id));
605 ExpectDataUseLabel(tab_id, test.expect_label); 644 ExpectDataUseLabel(tab_id, test.expect_label);
606 ExpectTabEntrySize(tab_id); 645 ExpectTabEntrySize(tab_id);
607 ++tab_id; 646 ++tab_id;
608 } 647 }
609 } 648 }
610 649
611 // Tests that any of the Exit transition events end the tracking. 650 // Tests that any of the Exit transition events end the tracking.
612 TEST_F(DataUseTabModelTest, AllNavigationExitEvents) { 651 TEST_F(DataUseTabModelTest, AllNavigationExitEvents) {
613 DataUseTabModel::TransitionType all_exit_transitions[] = { 652 DataUseTabModel::TransitionType all_exit_transitions[] = {
614 DataUseTabModel::TRANSITION_TO_EXTERNAL_APP,
615 DataUseTabModel::TRANSITION_FROM_NAVSUGGEST,
616 DataUseTabModel::TRANSITION_OMNIBOX_NAVIGATION,
617 DataUseTabModel::TRANSITION_BOOKMARK, 653 DataUseTabModel::TRANSITION_BOOKMARK,
618 DataUseTabModel::TRANSITION_HISTORY_ITEM}; 654 DataUseTabModel::TRANSITION_HISTORY_ITEM};
619 std::vector<std::string> app_package_names, domain_regexes, labels; 655 std::vector<std::string> app_package_names, domain_regexes, labels;
620 int32_t tab_id = 1; 656 SessionID::id_type tab_id = 1;
621 657
622 app_package_names.push_back(std::string()); 658 app_package_names.push_back(std::string());
623 domain_regexes.push_back("http://foo.com/"); 659 domain_regexes.push_back("http://foo.com/");
624 labels.push_back(kTestLabel1); 660 labels.push_back(kTestLabel1);
625 661
626 RegisterURLRegexesInDataUseObserver(app_package_names, domain_regexes, 662 RegisterURLRegexesInDataUseObserver(app_package_names, domain_regexes,
627 labels); 663 labels);
628 664
629 for (auto exit_transition : all_exit_transitions) { 665 for (auto exit_transition : all_exit_transitions) {
630 EXPECT_FALSE(IsTrackingDataUse(tab_id)); 666 EXPECT_FALSE(IsTrackingDataUse(tab_id));
631 data_use_tab_model_->OnNavigationEvent( 667 data_use_tab_model_->OnNavigationEvent(
632 tab_id, DataUseTabModel::TRANSITION_OMNIBOX_SEARCH, 668 tab_id, DataUseTabModel::TRANSITION_OMNIBOX_SEARCH,
633 GURL("http://foo.com"), std::string()); 669 GURL("http://foo.com"), std::string());
634 EXPECT_TRUE(IsTrackingDataUse(tab_id)); 670 EXPECT_TRUE(IsTrackingDataUse(tab_id));
635 671
636 // Tracking should end. 672 // Tracking should end.
637 data_use_tab_model_->OnNavigationEvent(tab_id, exit_transition, GURL(), 673 data_use_tab_model_->OnNavigationEvent(tab_id, exit_transition, GURL(),
638 std::string()); 674 std::string());
639 675
640 EXPECT_FALSE(IsTrackingDataUse(tab_id)); 676 EXPECT_FALSE(IsTrackingDataUse(tab_id));
641 ExpectTabEntrySize(tab_id); 677 ExpectTabEntrySize(tab_id);
642 ++tab_id; 678 ++tab_id;
643 } 679 }
644 } 680 }
645 681
646 } // namespace android 682 } // namespace android
647 683
648 } // namespace chrome 684 } // namespace chrome
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698