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

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: Remove unnecessary thread checks in the factory class 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"
18 #include "components/data_usage/core/data_use.h" 20 #include "components/data_usage/core/data_use.h"
19 #include "components/data_usage/core/data_use_aggregator.h" 21 #include "components/data_usage/core/data_use_aggregator.h"
20 #include "components/data_usage/core/data_use_amortizer.h" 22 #include "components/data_usage/core/data_use_amortizer.h"
21 #include "components/data_usage/core/data_use_annotator.h" 23 #include "components/data_usage/core/data_use_annotator.h"
24 #include "components/sessions/core/session_id.h"
25 #include "content/public/browser/browser_thread.h"
26 #include "content/public/test/test_browser_thread_bundle.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"
30 #include "url/gurl.h"
25 31
26 namespace { 32 namespace {
27 33
28 // Tracking labels for tests. 34 // Tracking labels for tests.
29 const std::string kTestLabel1 = "label_1"; 35 const std::string kTestLabel1 = "label_1";
30 const std::string kTestLabel2 = "label_2"; 36 const std::string kTestLabel2 = "label_2";
31 const std::string kTestLabel3 = "label_3"; 37 const std::string kTestLabel3 = "label_3";
32 38
33 const int kTabID1 = 1; 39 const int kTabID1 = 1;
34 const int kTabID2 = 2; 40 const int kTabID2 = 2;
35 const int kTabID3 = 3; 41 const int kTabID3 = 3;
36 42
37 enum TabEntrySize { ZERO = 0, ONE, TWO, THREE }; 43 enum TabEntrySize { ZERO = 0, ONE, TWO, THREE };
38 44
39 const int kMaxMockObservers = 5; 45 const int kMaxMockObservers = 5;
40 46
41 } // namespace 47 } // namespace
42 48
43 namespace base { 49 namespace base {
44 class SingleThreadTaskRunner; 50 class SingleThreadTaskRunner;
45 } 51 }
46 52
47 namespace chrome { 53 namespace chrome {
48 54
49 namespace android { 55 namespace android {
50 56
51 // Test version of |DataUseTabModel|, which permits overriding of calls to Now. 57 // Test version of |DataUseTabModel|, which permits overriding of calls to Now.
58 // TODO(rajendrant): Move this class to anonymous namespace.
52 class DataUseTabModelNowTest : public DataUseTabModel { 59 class DataUseTabModelNowTest : public DataUseTabModel {
53 public: 60 public:
54 DataUseTabModelNowTest( 61 DataUseTabModelNowTest(
55 const ExternalDataUseObserver* data_use_observer, 62 const ExternalDataUseObserver* data_use_observer,
56 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) 63 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner)
57 : DataUseTabModel(data_use_observer, ui_task_runner) {} 64 : DataUseTabModel(data_use_observer, ui_task_runner) {}
58 65
59 ~DataUseTabModelNowTest() override {} 66 ~DataUseTabModelNowTest() override {}
60 67
68 // TODO(rajendrant): Change this test class to use a SimpleTestTickClock
69 // instead.
61 void AdvanceTime(base::TimeDelta now_offset) { now_offset_ = now_offset; } 70 void AdvanceTime(base::TimeDelta now_offset) { now_offset_ = now_offset; }
62 71
63 private: 72 private:
64 // Returns the current time advanced by |now_offset_|. 73 // Returns the current time advanced by |now_offset_|.
65 base::TimeTicks Now() const override { 74 base::TimeTicks Now() const override {
66 return base::TimeTicks::Now() + now_offset_; 75 return base::TimeTicks::Now() + now_offset_;
67 } 76 }
68 77
69 // Represents the delta offset to be added to current time that is returned by 78 // Represents the delta offset to be added to current time that is returned by
70 // Now. 79 // Now.
71 base::TimeDelta now_offset_; 80 base::TimeDelta now_offset_;
72 }; 81 };
73 82
74 class DataUseTabModelTest : public testing::Test { 83 class DataUseTabModelTest : public testing::Test {
75 public: 84 public:
76 DataUseTabModelTest() {} 85 DataUseTabModelTest()
86 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {}
77 87
78 protected: 88 protected:
79 void SetUp() override { 89 void SetUp() override {
80 data_use_aggregator_.reset(new data_usage::DataUseAggregator( 90 data_use_aggregator_.reset(new data_usage::DataUseAggregator(
81 scoped_ptr<data_usage::DataUseAnnotator>(), 91 scoped_ptr<data_usage::DataUseAnnotator>(),
82 scoped_ptr<data_usage::DataUseAmortizer>())); 92 scoped_ptr<data_usage::DataUseAmortizer>()));
83 data_use_observer_.reset(new ExternalDataUseObserver( 93 data_use_observer_.reset(new ExternalDataUseObserver(
84 data_use_aggregator_.get(), message_loop_.task_runner().get(), 94 data_use_aggregator_.get(),
85 message_loop_.task_runner().get())); 95 content::BrowserThread::GetMessageLoopProxyForThread(
96 content::BrowserThread::IO),
97 content::BrowserThread::GetMessageLoopProxyForThread(
98 content::BrowserThread::UI)));
86 data_use_tab_model_ = new DataUseTabModelNowTest( 99 data_use_tab_model_ = new DataUseTabModelNowTest(
87 data_use_observer_.get(), message_loop_.task_runner().get()); 100 data_use_observer_.get(),
101 content::BrowserThread::GetMessageLoopProxyForThread(
102 content::BrowserThread::UI));
88 103
89 // |data_use_tab_model_| will be owned by |data_use_observer_|. 104 // |data_use_tab_model_| will be owned by |data_use_observer_|.
90 data_use_observer_->data_use_tab_model_.reset(data_use_tab_model_); 105 data_use_observer_->data_use_tab_model_.reset(data_use_tab_model_);
91 } 106 }
92 107
93 // Returns true if tab entry for |tab_id| exists in |active_tabs_|. 108 // Returns true if tab entry for |tab_id| exists in |active_tabs_|.
94 bool IsTabEntryExists(int32_t tab_id) const { 109 bool IsTabEntryExists(SessionID::id_type tab_id) const {
95 return data_use_tab_model_->active_tabs_.find(tab_id) != 110 return data_use_tab_model_->active_tabs_.find(tab_id) !=
96 data_use_tab_model_->active_tabs_.end(); 111 data_use_tab_model_->active_tabs_.end();
97 } 112 }
98 113
99 // Checks if there are |expected_size| tab entries being tracked in 114 // Checks if there are |expected_size| tab entries being tracked in
100 // |active_tabs_|. 115 // |active_tabs_|.
101 void ExpectTabEntrySize(uint32_t expected_size) const { 116 void ExpectTabEntrySize(uint32_t expected_size) const {
102 EXPECT_EQ(expected_size, data_use_tab_model_->active_tabs_.size()); 117 EXPECT_EQ(expected_size, data_use_tab_model_->active_tabs_.size());
103 } 118 }
104 119
105 // Returns true if the tracking session for tab with id |tab_id| is currently 120 // Returns true if the tracking session for tab with id |tab_id| is currently
106 // active. 121 // active.
107 bool IsTrackingDataUse(int32_t tab_id) const { 122 bool IsTrackingDataUse(SessionID::id_type tab_id) const {
108 auto tab_entry_iterator = data_use_tab_model_->active_tabs_.find(tab_id); 123 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()) 124 if (tab_entry_iterator == data_use_tab_model_->active_tabs_.end())
110 return false; 125 return false;
111 return tab_entry_iterator->second.IsTrackingDataUse(); 126 return tab_entry_iterator->second.IsTrackingDataUse();
112 } 127 }
113 128
114 // Checks if the DataUse object for the given |tab_id| with request start time 129 // Checks if the DataUse object for the given |tab_id| with request start time
115 // |at_time| is labeled as an empty string. 130 // |at_time| is labeled as an empty string.
116 void ExpectEmptyDataUseLabelAtTime(int32_t tab_id, 131 void ExpectEmptyDataUseLabelAtTime(SessionID::id_type tab_id,
117 const base::TimeTicks& at_time) const { 132 const base::TimeTicks& at_time) const {
118 ExpectDataUseLabelAtTimeWithReturn(tab_id, at_time, false, std::string()); 133 ExpectDataUseLabelAtTimeWithReturn(tab_id, at_time, false, std::string());
119 } 134 }
120 135
121 // Checks if the DataUse object for the given |tab_id| is labeled as an empty 136 // Checks if the DataUse object for the given |tab_id| is labeled as an empty
122 // string. 137 // string.
123 void ExpectEmptyDataUseLabel(int32_t tab_id) const { 138 void ExpectEmptyDataUseLabel(SessionID::id_type tab_id) const {
124 ExpectDataUseLabelAtTimeWithReturn(tab_id, base::TimeTicks::Now(), false, 139 ExpectDataUseLabelAtTimeWithReturn(tab_id, base::TimeTicks::Now(), false,
125 std::string()); 140 std::string());
126 } 141 }
127 142
128 // Checks if the DataUse object for given |tab_id| is labeled as 143 // Checks if the DataUse object for given |tab_id| is labeled as
129 // |expected_label|. 144 // |expected_label|.
130 void ExpectDataUseLabel(int32_t tab_id, 145 void ExpectDataUseLabel(SessionID::id_type tab_id,
131 const std::string& expected_label) const { 146 const std::string& expected_label) const {
132 ExpectDataUseLabelAtTimeWithReturn(tab_id, base::TimeTicks::Now(), true, 147 ExpectDataUseLabelAtTimeWithReturn(tab_id, base::TimeTicks::Now(), true,
133 expected_label); 148 expected_label);
134 } 149 }
135 150
136 // Checks if GetLabelForDataUse labels the DataUse object for |tab_id| with 151 // Checks if GetLabelForDataUse labels the DataUse object for |tab_id| with
137 // request start time |at_time|, as |expected_label| and returns 152 // request start time |at_time|, as |expected_label| and returns
138 // |expected_return|. 153 // |expected_return|.
139 void ExpectDataUseLabelAtTimeWithReturn( 154 void ExpectDataUseLabelAtTimeWithReturn(
140 int32_t tab_id, 155 SessionID::id_type tab_id,
141 const base::TimeTicks& at_time, 156 const base::TimeTicks& at_time,
142 bool expected_return, 157 bool expected_return,
143 const std::string& expected_label) const { 158 const std::string& expected_label) const {
144 data_usage::DataUse data_use(GURL("http://foo.com"), at_time, 159 data_usage::DataUse data_use(GURL("http://foo.com"), at_time,
145 GURL("http://foobar.com"), tab_id, 160 GURL("http://foobar.com"), tab_id,
146 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, 161 net::NetworkChangeNotifier::CONNECTION_UNKNOWN,
147 std::string(), 1000, 1000); 162 std::string(), 1000, 1000);
148 std::string actual_label; 163 std::string actual_label;
149 bool actual_return = 164 bool actual_return =
150 data_use_tab_model_->GetLabelForDataUse(data_use, &actual_label); 165 data_use_tab_model_->GetLabelForDataUse(data_use, &actual_label);
151 EXPECT_EQ(expected_return, actual_return); 166 EXPECT_EQ(expected_return, actual_return);
152 EXPECT_EQ(expected_label, actual_label); 167 EXPECT_EQ(expected_label, actual_label);
153 } 168 }
154 169
155 void StartTrackingDataUse(int32_t tab_id, const std::string& label) { 170 void StartTrackingDataUse(SessionID::id_type tab_id,
171 const std::string& label) {
156 data_use_tab_model_->StartTrackingDataUse(tab_id, label); 172 data_use_tab_model_->StartTrackingDataUse(tab_id, label);
157 } 173 }
158 174
159 void EndTrackingDataUse(int32_t tab_id) { 175 void EndTrackingDataUse(SessionID::id_type tab_id) {
160 data_use_tab_model_->EndTrackingDataUse(tab_id); 176 data_use_tab_model_->EndTrackingDataUse(tab_id);
161 } 177 }
162 178
163 void RegisterURLRegexesInDataUseObserver( 179 void RegisterURLRegexesInDataUseObserver(
164 const std::vector<std::string>& app_package_names, 180 const std::vector<std::string>& app_package_names,
165 const std::vector<std::string>& domain_regexes, 181 const std::vector<std::string>& domain_regexes,
166 const std::vector<std::string>& labels) { 182 const std::vector<std::string>& labels) {
167 data_use_observer_->RegisterURLRegexes(app_package_names, domain_regexes, 183 data_use_observer_->RegisterURLRegexes(app_package_names, domain_regexes,
168 labels); 184 labels);
169 } 185 }
170 186
187 content::TestBrowserThreadBundle thread_bundle_;
171 scoped_ptr<data_usage::DataUseAggregator> data_use_aggregator_; 188 scoped_ptr<data_usage::DataUseAggregator> data_use_aggregator_;
172 scoped_ptr<ExternalDataUseObserver> data_use_observer_; 189 scoped_ptr<ExternalDataUseObserver> data_use_observer_;
173 190
174 // Pointer to the tab model within and owned by ExternalDataUseObserver. 191 // Pointer to the tab model within and owned by ExternalDataUseObserver.
175 DataUseTabModelNowTest* data_use_tab_model_; 192 DataUseTabModelNowTest* data_use_tab_model_;
176 193
177 base::MessageLoop message_loop_; 194 private:
195 DISALLOW_COPY_AND_ASSIGN(DataUseTabModelTest);
178 }; 196 };
179 197
180 // Mock observer to track the calls to start and end tracking events. 198 // Mock observer to track the calls to start and end tracking events.
199 // TODO(rajendrant): Move this class to anonymous namespace.
181 class MockTabDataUseObserver : public DataUseTabModel::TabDataUseObserver { 200 class MockTabDataUseObserver : public DataUseTabModel::TabDataUseObserver {
182 public: 201 public:
183 MOCK_METHOD1(NotifyTrackingStarting, void(int32_t tab_id)); 202 MockTabDataUseObserver() : weak_ptr_factory_(this) {}
184 MOCK_METHOD1(NotifyTrackingEnding, void(int32_t tab_id)); 203 MOCK_METHOD1(NotifyTrackingStarting, void(SessionID::id_type tab_id));
204 MOCK_METHOD1(NotifyTrackingEnding, void(SessionID::id_type tab_id));
205
206 base::WeakPtr<MockTabDataUseObserver> GetWeakPtr() {
207 return weak_ptr_factory_.GetWeakPtr();
208 }
209
210 private:
211 base::WeakPtrFactory<MockTabDataUseObserver> weak_ptr_factory_;
212
213 DISALLOW_COPY_AND_ASSIGN(MockTabDataUseObserver);
185 }; 214 };
186 215
187 // Starts and ends tracking a single tab and checks if its label is returned 216 // Starts and ends tracking a single tab and checks if its label is returned
188 // correctly for DataUse objects. 217 // correctly for DataUse objects.
189 TEST_F(DataUseTabModelTest, SingleTabTracking) { 218 TEST_F(DataUseTabModelTest, SingleTabTracking) {
190 ExpectTabEntrySize(TabEntrySize::ZERO); 219 ExpectTabEntrySize(TabEntrySize::ZERO);
191 220
192 // No label is applied initially. 221 // No label is applied initially.
193 ExpectEmptyDataUseLabel(kTabID1); 222 ExpectEmptyDataUseLabel(kTabID1);
194 ExpectEmptyDataUseLabel(kTabID2); 223 ExpectEmptyDataUseLabel(kTabID2);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 } 271 }
243 272
244 // Checks that the mock observer receives start and end tracking events for a 273 // Checks that the mock observer receives start and end tracking events for a
245 // single tab. 274 // single tab.
246 TEST_F(DataUseTabModelTest, ObserverStartEndEvents) { 275 TEST_F(DataUseTabModelTest, ObserverStartEndEvents) {
247 MockTabDataUseObserver mock_observer; 276 MockTabDataUseObserver mock_observer;
248 277
249 EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(1); 278 EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(1);
250 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(1); 279 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(1);
251 280
252 data_use_tab_model_->AddObserver(&mock_observer); 281 data_use_tab_model_->AddObserver(mock_observer.GetWeakPtr());
282 EXPECT_EQ(1U, data_use_tab_model_->observers_.size());
253 StartTrackingDataUse(kTabID1, kTestLabel1); 283 StartTrackingDataUse(kTabID1, kTestLabel1);
254 EndTrackingDataUse(kTabID1); 284 EndTrackingDataUse(kTabID1);
255 285
256 message_loop_.RunUntilIdle(); 286 base::RunLoop().RunUntilIdle();
257 } 287 }
258 288
259 // Checks that multiple mock observers receive start and end tracking events for 289 // Checks that multiple mock observers receive start and end tracking events for
260 // multiple tabs. 290 // multiple tabs.
261 TEST_F(DataUseTabModelTest, MultipleObserverMultipleStartEndEvents) { 291 TEST_F(DataUseTabModelTest, MultipleObserverMultipleStartEndEvents) {
262 MockTabDataUseObserver mock_observers[kMaxMockObservers]; 292 MockTabDataUseObserver mock_observers[kMaxMockObservers];
293 size_t expected_observer_count = 0;
294 EXPECT_EQ(expected_observer_count, data_use_tab_model_->observers_.size());
263 295
264 for (auto& mock_observer : mock_observers) { 296 for (auto& mock_observer : mock_observers) {
265 // Add the observer. 297 // Add the observer.
266 data_use_tab_model_->AddObserver(&mock_observer); 298 data_use_tab_model_->AddObserver(mock_observer.GetWeakPtr());
299 ++expected_observer_count;
300 EXPECT_EQ(expected_observer_count, data_use_tab_model_->observers_.size());
267 301
268 // Expect start and end events for tab ids 1-3. 302 // Expect start and end events for tab ids 1-3.
269 EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(1); 303 EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(1);
270 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(1); 304 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(1);
271 EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID2)).Times(1); 305 EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID2)).Times(1);
272 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID2)).Times(1); 306 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID2)).Times(1);
273 EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID3)).Times(1); 307 EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID3)).Times(1);
274 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID3)).Times(1); 308 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID3)).Times(1);
275 } 309 }
276 310
277 // Start and end tracking for tab ids 1-3. 311 // Start and end tracking for tab ids 1-3.
278 StartTrackingDataUse(kTabID1, kTestLabel1); 312 StartTrackingDataUse(kTabID1, kTestLabel1);
279 StartTrackingDataUse(kTabID2, kTestLabel2); 313 StartTrackingDataUse(kTabID2, kTestLabel2);
280 StartTrackingDataUse(kTabID3, kTestLabel3); 314 StartTrackingDataUse(kTabID3, kTestLabel3);
281 EndTrackingDataUse(kTabID1); 315 EndTrackingDataUse(kTabID1);
282 EndTrackingDataUse(kTabID2); 316 EndTrackingDataUse(kTabID2);
283 EndTrackingDataUse(kTabID3); 317 EndTrackingDataUse(kTabID3);
284 318
285 message_loop_.RunUntilIdle(); 319 base::RunLoop().RunUntilIdle();
286 }
287
288 // Checks that the observer is not notified of start and end events after
289 // RemoveObserver.
290 TEST_F(DataUseTabModelTest, ObserverNotNotifiedAfterRemove) {
291 MockTabDataUseObserver mock_observer;
292
293 // Observer notified of start and end events.
294 EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(1);
295 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(1);
296
297 data_use_tab_model_->AddObserver(&mock_observer);
298 StartTrackingDataUse(kTabID1, kTestLabel1);
299 EndTrackingDataUse(kTabID1);
300
301 message_loop_.RunUntilIdle();
302 testing::Mock::VerifyAndClear(&mock_observer);
303
304 // Observer should not be notified after RemoveObserver.
305 EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(0);
306 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(0);
307
308 data_use_tab_model_->RemoveObserver(&mock_observer);
309 StartTrackingDataUse(kTabID1, kTestLabel1);
310 EndTrackingDataUse(kTabID1);
311
312 message_loop_.RunUntilIdle();
313 } 320 }
314 321
315 // Checks that tab close event updates the close time of the tab entry. 322 // Checks that tab close event updates the close time of the tab entry.
316 TEST_F(DataUseTabModelTest, TabCloseEvent) { 323 TEST_F(DataUseTabModelTest, TabCloseEvent) {
317 StartTrackingDataUse(kTabID1, kTestLabel1); 324 StartTrackingDataUse(kTabID1, kTestLabel1);
318 EndTrackingDataUse(kTabID1); 325 EndTrackingDataUse(kTabID1);
319 326
320 ExpectTabEntrySize(TabEntrySize::ONE); 327 ExpectTabEntrySize(TabEntrySize::ONE);
321 EXPECT_TRUE( 328 EXPECT_TRUE(
322 data_use_tab_model_->active_tabs_[kTabID1].tab_close_time_.is_null()); 329 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)); 348 kTabID1, base::TimeTicks::Now() + base::TimeDelta::FromMilliseconds(20));
342 } 349 }
343 350
344 // Checks that end tracking for specific labels closes those active sessions. 351 // Checks that end tracking for specific labels closes those active sessions.
345 TEST_F(DataUseTabModelTest, OnTrackingLabelRemoved) { 352 TEST_F(DataUseTabModelTest, OnTrackingLabelRemoved) {
346 MockTabDataUseObserver mock_observer; 353 MockTabDataUseObserver mock_observer;
347 354
348 StartTrackingDataUse(kTabID1, kTestLabel1); 355 StartTrackingDataUse(kTabID1, kTestLabel1);
349 StartTrackingDataUse(kTabID2, kTestLabel2); 356 StartTrackingDataUse(kTabID2, kTestLabel2);
350 StartTrackingDataUse(kTabID3, kTestLabel3); 357 StartTrackingDataUse(kTabID3, kTestLabel3);
351 data_use_tab_model_->AddObserver(&mock_observer); 358 data_use_tab_model_->AddObserver(mock_observer.GetWeakPtr());
352 ExpectTabEntrySize(TabEntrySize::THREE); 359 ExpectTabEntrySize(TabEntrySize::THREE);
353 360
354 EXPECT_TRUE(IsTrackingDataUse(kTabID1)); 361 EXPECT_TRUE(IsTrackingDataUse(kTabID1));
355 EXPECT_TRUE(IsTrackingDataUse(kTabID2)); 362 EXPECT_TRUE(IsTrackingDataUse(kTabID2));
356 EXPECT_TRUE(IsTrackingDataUse(kTabID3)); 363 EXPECT_TRUE(IsTrackingDataUse(kTabID3));
357 364
358 // Observer notified of end tracking. 365 // Observer notified of end tracking.
359 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID2)).Times(1); 366 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID2)).Times(1);
360 367
361 data_use_tab_model_->OnTrackingLabelRemoved(kTestLabel2); 368 data_use_tab_model_->OnTrackingLabelRemoved(kTestLabel2);
362 message_loop_.RunUntilIdle(); 369 base::RunLoop().RunUntilIdle();
363 370
364 EXPECT_TRUE(IsTrackingDataUse(kTabID1)); 371 EXPECT_TRUE(IsTrackingDataUse(kTabID1));
365 EXPECT_FALSE(IsTrackingDataUse(kTabID2)); 372 EXPECT_FALSE(IsTrackingDataUse(kTabID2));
366 EXPECT_TRUE(IsTrackingDataUse(kTabID3)); 373 EXPECT_TRUE(IsTrackingDataUse(kTabID3));
367 374
368 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID3)).Times(1); 375 EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID3)).Times(1);
369 376
370 data_use_tab_model_->OnTrackingLabelRemoved(kTestLabel3); 377 data_use_tab_model_->OnTrackingLabelRemoved(kTestLabel3);
371 message_loop_.RunUntilIdle(); 378 base::RunLoop().RunUntilIdle();
372 379
373 EXPECT_TRUE(IsTrackingDataUse(kTabID1)); 380 EXPECT_TRUE(IsTrackingDataUse(kTabID1));
374 EXPECT_FALSE(IsTrackingDataUse(kTabID2)); 381 EXPECT_FALSE(IsTrackingDataUse(kTabID2));
375 EXPECT_FALSE(IsTrackingDataUse(kTabID3)); 382 EXPECT_FALSE(IsTrackingDataUse(kTabID3));
376 } 383 }
377 384
378 // Checks that |active_tabs_| does not grow beyond GetMaxTabEntriesForTests tab 385 // Checks that |active_tabs_| does not grow beyond GetMaxTabEntriesForTests tab
379 // entries. 386 // entries.
380 TEST_F(DataUseTabModelTest, CompactTabEntriesWithinMaxLimit) { 387 TEST_F(DataUseTabModelTest, CompactTabEntriesWithinMaxLimit) {
381 const size_t max_tab_entries = data_use_tab_model_->max_tab_entries_; 388 const int32_t max_tab_entries =
382 uint32_t tab_id = 1; 389 static_cast<int32_t>(data_use_tab_model_->max_tab_entries_);
390 SessionID::id_type tab_id = 1;
383 391
384 ExpectTabEntrySize(TabEntrySize::ZERO); 392 ExpectTabEntrySize(TabEntrySize::ZERO);
385 393
386 while (tab_id <= max_tab_entries) { 394 while (tab_id <= max_tab_entries) {
387 std::string tab_label = base::StringPrintf("label_%d", tab_id); 395 std::string tab_label = base::StringPrintf("label_%d", tab_id);
388 StartTrackingDataUse(tab_id, tab_label); 396 StartTrackingDataUse(tab_id, tab_label);
389 EndTrackingDataUse(tab_id); 397 EndTrackingDataUse(tab_id);
390 398
391 ExpectTabEntrySize(tab_id); 399 ExpectTabEntrySize(tab_id);
392 ++tab_id; 400 ++tab_id;
393 } 401 }
394 402
395 uint32_t oldest_tab_id = 1; // oldest tab entry that will be removed first. 403 // Oldest tab entry that will be removed first.
404 SessionID::id_type oldest_tab_id = 1;
396 405
397 // Starting and ending more tracking tab entries does not increase the size of 406 // Starting and ending more tracking tab entries does not increase the size of
398 // |active_tabs_|. 407 // |active_tabs_|.
399 while (tab_id < max_tab_entries + 10) { 408 while (tab_id < max_tab_entries + 10) {
400 EXPECT_TRUE(IsTabEntryExists(oldest_tab_id)); 409 EXPECT_TRUE(IsTabEntryExists(oldest_tab_id));
401 std::string tab_label = base::StringPrintf("label_%d", tab_id); 410 std::string tab_label = base::StringPrintf("label_%d", tab_id);
402 StartTrackingDataUse(tab_id, tab_label); 411 StartTrackingDataUse(tab_id, tab_label);
403 EndTrackingDataUse(tab_id); 412 EndTrackingDataUse(tab_id);
404 413
405 // Oldest entry got removed. 414 // Oldest entry got removed.
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 kUMAExpiredInactiveTabEntryRemovalDurationSecondsHistogram, 1); 463 kUMAExpiredInactiveTabEntryRemovalDurationSecondsHistogram, 1);
455 histogram_tester.ExpectBucketCount( 464 histogram_tester.ExpectBucketCount(
456 kUMAExpiredInactiveTabEntryRemovalDurationSecondsHistogram, 465 kUMAExpiredInactiveTabEntryRemovalDurationSecondsHistogram,
457 base::TimeDelta::FromSeconds(50).InMilliseconds(), 1); 466 base::TimeDelta::FromSeconds(50).InMilliseconds(), 1);
458 } 467 }
459 468
460 TEST_F(DataUseTabModelTest, UnexpiredTabEntryRemovaltimeHistogram) { 469 TEST_F(DataUseTabModelTest, UnexpiredTabEntryRemovaltimeHistogram) {
461 const char kUMAUnexpiredTabEntryRemovalDurationMinutesHistogram[] = 470 const char kUMAUnexpiredTabEntryRemovalDurationMinutesHistogram[] =
462 "DataUse.TabModel.UnexpiredTabEntryRemovalDuration"; 471 "DataUse.TabModel.UnexpiredTabEntryRemovalDuration";
463 base::HistogramTester histogram_tester; 472 base::HistogramTester histogram_tester;
464 const size_t max_tab_entries = data_use_tab_model_->max_tab_entries_; 473 const int32_t max_tab_entries =
465 uint32_t tab_id = 1; 474 static_cast<int32_t>(data_use_tab_model_->max_tab_entries_);
475 SessionID::id_type tab_id = 1;
466 476
467 while (tab_id <= max_tab_entries) { 477 while (tab_id <= max_tab_entries) {
468 std::string tab_label = base::StringPrintf("label_%d", tab_id); 478 std::string tab_label = base::StringPrintf("label_%d", tab_id);
469 StartTrackingDataUse(tab_id, tab_label); 479 StartTrackingDataUse(tab_id, tab_label);
470 EndTrackingDataUse(tab_id); 480 EndTrackingDataUse(tab_id);
471 ++tab_id; 481 ++tab_id;
472 } 482 }
473 483
474 // Fast forward 10 minutes. 484 // Fast forward 10 minutes.
475 data_use_tab_model_->AdvanceTime(base::TimeDelta::FromMinutes(10)); 485 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); 561 labels.push_back(kTestLabel2);
552 562
553 RegisterURLRegexesInDataUseObserver(app_package_names, domain_regexes, 563 RegisterURLRegexesInDataUseObserver(app_package_names, domain_regexes,
554 labels); 564 labels);
555 565
556 data_use_tab_model_->OnNavigationEvent( 566 data_use_tab_model_->OnNavigationEvent(
557 kTabID1, DataUseTabModel::TRANSITION_OMNIBOX_SEARCH, 567 kTabID1, DataUseTabModel::TRANSITION_OMNIBOX_SEARCH,
558 GURL("http://foo.com/"), std::string()); 568 GURL("http://foo.com/"), std::string());
559 ExpectTabEntrySize(TabEntrySize::ONE); 569 ExpectTabEntrySize(TabEntrySize::ONE);
560 EXPECT_TRUE(IsTrackingDataUse(kTabID1)); 570 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 } 571 }
567 572
568 // Tests that any of the Enter transition events start the tracking. 573 // Tests that any of the Enter transition events start the tracking.
569 TEST_F(DataUseTabModelTest, AllNavigationEnterEvents) { 574 TEST_F(DataUseTabModelTest, AllNavigationEnterEvents) {
570 const struct { 575 const struct {
571 DataUseTabModel::TransitionType transition; 576 DataUseTabModel::TransitionType transition;
572 std::string url; 577 std::string url;
573 std::string package; 578 std::string package;
574 std::string expect_label; 579 std::string expect_label;
575 } all_enter_transition_tests[] = { 580 } all_enter_transition_tests[] = {
576 {DataUseTabModel::TRANSITION_FROM_EXTERNAL_APP, std::string(), 581 {DataUseTabModel::TRANSITION_FROM_EXTERNAL_APP, std::string(),
577 "com.google.package.foo", kTestLabel1}, 582 "com.google.package.foo", kTestLabel1},
578 {DataUseTabModel::TRANSITION_FROM_EXTERNAL_APP, "http://foo.com", 583 {DataUseTabModel::TRANSITION_FROM_EXTERNAL_APP, "http://foo.com",
579 "com.google.package.nomatch", kTestLabel2}, 584 "com.google.package.nomatch", kTestLabel2},
580 {DataUseTabModel::TRANSITION_OMNIBOX_SEARCH, "http://foo.com", 585 {DataUseTabModel::TRANSITION_OMNIBOX_SEARCH, "http://foo.com",
581 std::string(), kTestLabel2}, 586 std::string(), kTestLabel2},
582 }; 587 };
583 std::vector<std::string> app_package_names, domain_regexes, labels; 588 std::vector<std::string> app_package_names, domain_regexes, labels;
584 int32_t tab_id = 1; 589 SessionID::id_type tab_id = 1;
585 590
586 app_package_names.push_back("com.google.package.foo"); 591 app_package_names.push_back("com.google.package.foo");
587 domain_regexes.push_back(std::string()); 592 domain_regexes.push_back(std::string());
588 labels.push_back(kTestLabel1); 593 labels.push_back(kTestLabel1);
589 app_package_names.push_back(std::string()); 594 app_package_names.push_back(std::string());
590 domain_regexes.push_back("http://foo.com/"); 595 domain_regexes.push_back("http://foo.com/");
591 labels.push_back(kTestLabel2); 596 labels.push_back(kTestLabel2);
592 597
593 RegisterURLRegexesInDataUseObserver(app_package_names, domain_regexes, 598 RegisterURLRegexesInDataUseObserver(app_package_names, domain_regexes,
594 labels); 599 labels);
595 600
596 for (auto test : all_enter_transition_tests) { 601 for (auto test : all_enter_transition_tests) {
597 EXPECT_FALSE(IsTrackingDataUse(tab_id)); 602 EXPECT_FALSE(IsTrackingDataUse(tab_id));
598 ExpectEmptyDataUseLabel(tab_id); 603 ExpectEmptyDataUseLabel(tab_id);
599 604
600 // Tracking should start. 605 // Tracking should start.
601 data_use_tab_model_->OnNavigationEvent(tab_id, test.transition, 606 data_use_tab_model_->OnNavigationEvent(tab_id, test.transition,
602 GURL(test.url), test.package); 607 GURL(test.url), test.package);
603 608
604 EXPECT_TRUE(IsTrackingDataUse(tab_id)); 609 EXPECT_TRUE(IsTrackingDataUse(tab_id));
605 ExpectDataUseLabel(tab_id, test.expect_label); 610 ExpectDataUseLabel(tab_id, test.expect_label);
606 ExpectTabEntrySize(tab_id); 611 ExpectTabEntrySize(tab_id);
607 ++tab_id; 612 ++tab_id;
608 } 613 }
609 } 614 }
610 615
611 // Tests that any of the Exit transition events end the tracking. 616 // Tests that any of the Exit transition events end the tracking.
612 TEST_F(DataUseTabModelTest, AllNavigationExitEvents) { 617 TEST_F(DataUseTabModelTest, AllNavigationExitEvents) {
613 DataUseTabModel::TransitionType all_exit_transitions[] = { 618 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, 619 DataUseTabModel::TRANSITION_BOOKMARK,
618 DataUseTabModel::TRANSITION_HISTORY_ITEM}; 620 DataUseTabModel::TRANSITION_HISTORY_ITEM};
619 std::vector<std::string> app_package_names, domain_regexes, labels; 621 std::vector<std::string> app_package_names, domain_regexes, labels;
620 int32_t tab_id = 1; 622 SessionID::id_type tab_id = 1;
621 623
622 app_package_names.push_back(std::string()); 624 app_package_names.push_back(std::string());
623 domain_regexes.push_back("http://foo.com/"); 625 domain_regexes.push_back("http://foo.com/");
624 labels.push_back(kTestLabel1); 626 labels.push_back(kTestLabel1);
625 627
626 RegisterURLRegexesInDataUseObserver(app_package_names, domain_regexes, 628 RegisterURLRegexesInDataUseObserver(app_package_names, domain_regexes,
627 labels); 629 labels);
628 630
629 for (auto exit_transition : all_exit_transitions) { 631 for (auto exit_transition : all_exit_transitions) {
630 EXPECT_FALSE(IsTrackingDataUse(tab_id)); 632 EXPECT_FALSE(IsTrackingDataUse(tab_id));
631 data_use_tab_model_->OnNavigationEvent( 633 data_use_tab_model_->OnNavigationEvent(
632 tab_id, DataUseTabModel::TRANSITION_OMNIBOX_SEARCH, 634 tab_id, DataUseTabModel::TRANSITION_OMNIBOX_SEARCH,
633 GURL("http://foo.com"), std::string()); 635 GURL("http://foo.com"), std::string());
634 EXPECT_TRUE(IsTrackingDataUse(tab_id)); 636 EXPECT_TRUE(IsTrackingDataUse(tab_id));
635 637
636 // Tracking should end. 638 // Tracking should end.
637 data_use_tab_model_->OnNavigationEvent(tab_id, exit_transition, GURL(), 639 data_use_tab_model_->OnNavigationEvent(tab_id, exit_transition, GURL(),
638 std::string()); 640 std::string());
639 641
640 EXPECT_FALSE(IsTrackingDataUse(tab_id)); 642 EXPECT_FALSE(IsTrackingDataUse(tab_id));
641 ExpectTabEntrySize(tab_id); 643 ExpectTabEntrySize(tab_id);
642 ++tab_id; 644 ++tab_id;
643 } 645 }
644 } 646 }
645 647
646 } // namespace android 648 } // namespace android
647 649
648 } // namespace chrome 650 } // namespace chrome
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698