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

Side by Side Diff: chrome/browser/task_manager/sampling/task_manager_io_thread_helper_unittest.cc

Issue 2964543002: TaskManager: use an unordered_map for tracking network usage (Closed)
Patch Set: fixed nits from lgtm Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/run_loop.h"
6 #include "base/test/scoped_mock_time_message_loop_task_runner.h"
7 #include "chrome/browser/task_manager/sampling/task_manager_impl.h"
8 #include "content/public/test/test_browser_thread_bundle.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10
11 namespace task_manager {
12
13 class TaskManagerIoThreadHelperTest : public testing::Test {
14 public:
15 TaskManagerIoThreadHelperTest()
16 : helper_manager_(
17 base::BindRepeating(&TaskManagerIoThreadHelperTest::GotData,
18 base::Unretained(this))) {
19 base::RunLoop().RunUntilIdle();
20 }
21 ~TaskManagerIoThreadHelperTest() override {}
22
23 void GotData(BytesTransferredMap params) {
24 EXPECT_TRUE(returned_map_.empty()) << "GotData() delivered twice";
25 EXPECT_FALSE(params.empty()) << "GotData() called with empty map";
26 returned_map_ = params;
27 }
28
29 protected:
30 BytesTransferredMap returned_map_;
31
32 private:
33 content::TestBrowserThreadBundle thread_bundle_;
34 IoThreadHelperManager helper_manager_;
35
36 DISALLOW_COPY_AND_ASSIGN(TaskManagerIoThreadHelperTest);
37 };
38
39 // Tests that the origin_id is used in the map correctly.
40 TEST_F(TaskManagerIoThreadHelperTest, PidData) {
41 base::ScopedMockTimeMessageLoopTaskRunner mock_main_runner;
42
43 BytesTransferredKey key = {123, -1, -1};
44
45 int64_t correct_read_bytes = 0;
46 int64_t correct_sent_bytes = 0;
47
48 int read_bytes_array[] = {200, 400, 800};
49 int sent_bytes_array[] = {100, 123, 234};
50
51 for (int i : read_bytes_array) {
52 TaskManagerIoThreadHelper::OnRawBytesTransferred(key, i, 0);
53 correct_read_bytes += i;
54 }
55 for (int i : sent_bytes_array) {
56 TaskManagerIoThreadHelper::OnRawBytesTransferred(key, 0, i);
57 correct_sent_bytes += i;
58 }
59
60 EXPECT_TRUE(mock_main_runner->HasPendingTask());
61 mock_main_runner->FastForwardBy(base::TimeDelta::FromSeconds(1));
62 base::RunLoop().RunUntilIdle();
63 EXPECT_FALSE(mock_main_runner->HasPendingTask());
64 EXPECT_EQ(correct_sent_bytes, returned_map_[key].byte_sent_count);
65 EXPECT_EQ(correct_read_bytes, returned_map_[key].byte_read_count);
66 }
67
68 // Tests that the |child_id| and |route_id| are used in the map correctly.
69 TEST_F(TaskManagerIoThreadHelperTest, ChildRouteData) {
70 base::ScopedMockTimeMessageLoopTaskRunner mock_main_runner;
71
72 BytesTransferredKey key = {0, 100, 190};
73
74 int64_t correct_read_bytes = 0;
75 int64_t correct_sent_bytes = 0;
76
77 int read_bytes_array[] = {900, 300, 100};
78 int sent_bytes_array[] = {130, 153, 934};
79
80 for (int i : read_bytes_array) {
81 TaskManagerIoThreadHelper::OnRawBytesTransferred(key, i, 0);
82 correct_read_bytes += i;
83 }
84 for (int i : sent_bytes_array) {
85 TaskManagerIoThreadHelper::OnRawBytesTransferred(key, 0, i);
86 correct_sent_bytes += i;
87 }
88
89 EXPECT_TRUE(mock_main_runner->HasPendingTask());
90 mock_main_runner->FastForwardBy(base::TimeDelta::FromSeconds(1));
91 base::RunLoop().RunUntilIdle();
92 EXPECT_FALSE(mock_main_runner->HasPendingTask());
93 EXPECT_EQ(1U, returned_map_.size());
94 EXPECT_EQ(correct_sent_bytes, returned_map_[key].byte_sent_count);
95 EXPECT_EQ(correct_read_bytes, returned_map_[key].byte_read_count);
96 }
97
98 // Tests that two distinct |origin_pid| are tracked separately in the unordered
99 // map.
100 TEST_F(TaskManagerIoThreadHelperTest, TwoPidData) {
101 base::ScopedMockTimeMessageLoopTaskRunner mock_main_runner;
102
103 BytesTransferredKey key1 = {23, -1, -1};
104 BytesTransferredKey key2 = {33, -1, -1};
105
106 int64_t correct_read_bytes1 = 0;
107 int64_t correct_sent_bytes1 = 0;
108
109 int64_t correct_read_bytes2 = 0;
110 int64_t correct_sent_bytes2 = 0;
111
112 int read_bytes_array1[] = {900, 300, 100};
113 int sent_bytes_array1[] = {130, 153, 934};
114
115 int read_bytes_array2[] = {903, 340, 150};
116 int sent_bytes_array2[] = {138, 157, 964};
117
118 for (int i : read_bytes_array1) {
119 TaskManagerIoThreadHelper::OnRawBytesTransferred(key1, i, 0);
120 correct_read_bytes1 += i;
121 }
122 for (int i : sent_bytes_array1) {
123 TaskManagerIoThreadHelper::OnRawBytesTransferred(key1, 0, i);
124 correct_sent_bytes1 += i;
125 }
126
127 for (int i : read_bytes_array2) {
128 TaskManagerIoThreadHelper::OnRawBytesTransferred(key2, i, 0);
129 correct_read_bytes2 += i;
130 }
131 for (int i : sent_bytes_array2) {
132 TaskManagerIoThreadHelper::OnRawBytesTransferred(key2, 0, i);
133 correct_sent_bytes2 += i;
134 }
135
136 mock_main_runner->FastForwardBy(base::TimeDelta::FromSeconds(1));
137 base::RunLoop().RunUntilIdle();
138 const unsigned long number_of_keys = 2;
139 EXPECT_EQ(number_of_keys, returned_map_.size());
140 EXPECT_EQ(correct_sent_bytes1, returned_map_[key1].byte_sent_count);
141 EXPECT_EQ(correct_read_bytes1, returned_map_[key1].byte_read_count);
142 EXPECT_EQ(correct_sent_bytes2, returned_map_[key2].byte_sent_count);
143 EXPECT_EQ(correct_read_bytes2, returned_map_[key2].byte_read_count);
144 }
145
146 // Tests that two keys with the same |origin_pid| are tracked together in the
147 // unordered map.
148 TEST_F(TaskManagerIoThreadHelperTest, TwoSamePidData) {
149 base::ScopedMockTimeMessageLoopTaskRunner mock_main_runner;
150
151 BytesTransferredKey key1 = {23, -1, -1};
152 BytesTransferredKey key2 = {23, -1, -1};
153
154 int64_t correct_read_bytes = 0;
155 int64_t correct_sent_bytes = 0;
156
157 int read_bytes_array[] = {900, 300, 100};
158 int sent_bytes_array[] = {130, 153, 934};
159
160 for (int i : read_bytes_array) {
161 TaskManagerIoThreadHelper::OnRawBytesTransferred(key1, i, 0);
162 correct_read_bytes += i;
163 }
164 for (int i : sent_bytes_array) {
165 TaskManagerIoThreadHelper::OnRawBytesTransferred(key1, 0, i);
166 correct_sent_bytes += i;
167 }
168
169 for (int i : read_bytes_array) {
170 TaskManagerIoThreadHelper::OnRawBytesTransferred(key2, i, 0);
171 correct_read_bytes += i;
172 }
173 for (int i : sent_bytes_array) {
174 TaskManagerIoThreadHelper::OnRawBytesTransferred(key2, 0, i);
175 correct_sent_bytes += i;
176 }
177
178 mock_main_runner->FastForwardBy(base::TimeDelta::FromSeconds(1));
179 base::RunLoop().RunUntilIdle();
180 EXPECT_EQ(1U, returned_map_.size());
181 EXPECT_EQ(correct_sent_bytes, returned_map_[key1].byte_sent_count);
182 EXPECT_EQ(correct_read_bytes, returned_map_[key1].byte_read_count);
183 EXPECT_EQ(correct_sent_bytes, returned_map_[key2].byte_sent_count);
184 EXPECT_EQ(correct_read_bytes, returned_map_[key2].byte_read_count);
185 }
186
187 // Tests that two distinct |child_id| and |route_id| pairs are tracked
188 // separately in the unordered map.
189 TEST_F(TaskManagerIoThreadHelperTest, TwoChildRouteData) {
190 base::ScopedMockTimeMessageLoopTaskRunner mock_main_runner;
191
192 BytesTransferredKey key1 = {0, 32, 1};
193 BytesTransferredKey key2 = {0, 17, 2};
194
195 int64_t correct_read_bytes1 = 0;
196 int64_t correct_sent_bytes1 = 0;
197
198 int64_t correct_read_bytes2 = 0;
199 int64_t correct_sent_bytes2 = 0;
200
201 int read_bytes_array1[] = {453, 987654, 946650};
202 int sent_bytes_array1[] = {138450, 1556473, 954434};
203
204 int read_bytes_array2[] = {905643, 324340, 654150};
205 int sent_bytes_array2[] = {1232138, 157312, 965464};
206
207 for (int i : read_bytes_array1) {
208 TaskManagerIoThreadHelper::OnRawBytesTransferred(key1, i, 0);
209 correct_read_bytes1 += i;
210 }
211 for (int i : sent_bytes_array1) {
212 TaskManagerIoThreadHelper::OnRawBytesTransferred(key1, 0, i);
213 correct_sent_bytes1 += i;
214 }
215
216 for (int i : read_bytes_array2) {
217 TaskManagerIoThreadHelper::OnRawBytesTransferred(key2, i, 0);
218 correct_read_bytes2 += i;
219 }
220 for (int i : sent_bytes_array2) {
221 TaskManagerIoThreadHelper::OnRawBytesTransferred(key2, 0, i);
222 correct_sent_bytes2 += i;
223 }
224
225 EXPECT_TRUE(mock_main_runner->HasPendingTask());
226 mock_main_runner->FastForwardBy(base::TimeDelta::FromSeconds(1));
227 base::RunLoop().RunUntilIdle();
228 const unsigned long number_of_keys = 2;
229 EXPECT_EQ(number_of_keys, returned_map_.size());
230 EXPECT_FALSE(mock_main_runner->HasPendingTask());
231 EXPECT_EQ(correct_sent_bytes1, returned_map_[key1].byte_sent_count);
232 EXPECT_EQ(correct_read_bytes1, returned_map_[key1].byte_read_count);
233 EXPECT_EQ(correct_sent_bytes2, returned_map_[key2].byte_sent_count);
234 EXPECT_EQ(correct_read_bytes2, returned_map_[key2].byte_read_count);
235 }
236
237 // Tests that two keys with the same |child_id| and |route_id| are tracked
238 // together in the unordered map.
239 TEST_F(TaskManagerIoThreadHelperTest, TwoSameChildRouteData) {
240 base::ScopedMockTimeMessageLoopTaskRunner mock_main_runner;
241
242 BytesTransferredKey key1 = {0, 123, 456};
243 BytesTransferredKey key2 = {0, 123, 456};
244
245 int64_t correct_read_bytes = 0;
246 int64_t correct_sent_bytes = 0;
247
248 int read_bytes_array[] = {90440, 12300, 103420};
249 int sent_bytes_array[] = {44130, 12353, 93234};
250
251 for (int i : read_bytes_array) {
252 TaskManagerIoThreadHelper::OnRawBytesTransferred(key1, i, 0);
253 correct_read_bytes += i;
254 }
255 for (int i : sent_bytes_array) {
256 TaskManagerIoThreadHelper::OnRawBytesTransferred(key1, 0, i);
257 correct_sent_bytes += i;
258 }
259
260 for (int i : read_bytes_array) {
261 TaskManagerIoThreadHelper::OnRawBytesTransferred(key2, i, 0);
262 correct_read_bytes += i;
263 }
264 for (int i : sent_bytes_array) {
265 TaskManagerIoThreadHelper::OnRawBytesTransferred(key2, 0, i);
266 correct_sent_bytes += i;
267 }
268
269 mock_main_runner->FastForwardBy(base::TimeDelta::FromSeconds(1));
270 base::RunLoop().RunUntilIdle();
271 EXPECT_EQ(1U, returned_map_.size());
272 EXPECT_EQ(correct_sent_bytes, returned_map_[key1].byte_sent_count);
273 EXPECT_EQ(correct_read_bytes, returned_map_[key1].byte_read_count);
274 EXPECT_EQ(correct_sent_bytes, returned_map_[key2].byte_sent_count);
275 EXPECT_EQ(correct_read_bytes, returned_map_[key2].byte_read_count);
276 }
277
278 // Tests that the unordered_map can hold both types of key in one map.
279 TEST_F(TaskManagerIoThreadHelperTest, OnePidOneChildRouteData) {
280 base::ScopedMockTimeMessageLoopTaskRunner mock_main_runner;
281 // Test the pathological condition of a collision.
282 BytesTransferredKey key1 = {0, 12, 143};
283 BytesTransferredKey key2 = {static_cast<int>(base::HashInts(12, 143)), -1,
284 -1};
285
286 int64_t correct_read_bytes1 = 0;
287 int64_t correct_sent_bytes1 = 0;
288
289 int64_t correct_read_bytes2 = 0;
290 int64_t correct_sent_bytes2 = 0;
291
292 int read_bytes_array1[] = {453, 98754, 94650};
293 int sent_bytes_array1[] = {1350, 15643, 95434};
294
295 int read_bytes_array2[] = {905643, 3243, 654150};
296 int sent_bytes_array2[] = {12338, 157312, 9664};
297
298 for (int i : read_bytes_array1) {
299 TaskManagerIoThreadHelper::OnRawBytesTransferred(key1, i, 0);
300 correct_read_bytes1 += i;
301 }
302 for (int i : sent_bytes_array1) {
303 TaskManagerIoThreadHelper::OnRawBytesTransferred(key1, 0, i);
304 correct_sent_bytes1 += i;
305 }
306
307 for (int i : read_bytes_array2) {
308 TaskManagerIoThreadHelper::OnRawBytesTransferred(key2, i, 0);
309 correct_read_bytes2 += i;
310 }
311 for (int i : sent_bytes_array2) {
312 TaskManagerIoThreadHelper::OnRawBytesTransferred(key2, 0, i);
313 correct_sent_bytes2 += i;
314 }
315
316 mock_main_runner->FastForwardBy(base::TimeDelta::FromSeconds(1));
317 base::RunLoop().RunUntilIdle();
318 EXPECT_EQ(2U, returned_map_.size());
319 EXPECT_EQ(correct_sent_bytes1, returned_map_[key1].byte_sent_count);
320 EXPECT_EQ(correct_read_bytes1, returned_map_[key1].byte_read_count);
321 EXPECT_EQ(correct_sent_bytes2, returned_map_[key2].byte_sent_count);
322 EXPECT_EQ(correct_read_bytes2, returned_map_[key2].byte_read_count);
323 }
324
325 // Tests that the map can store both types of keys and that it does update after
326 // 1 mocked second passes and there is new traffic.
327 TEST_F(TaskManagerIoThreadHelperTest, MultipleWavesMixedData) {
328 base::ScopedMockTimeMessageLoopTaskRunner mock_main_runner;
329
330 BytesTransferredKey key1 = {0, 12, 143};
331 BytesTransferredKey key2 = {32, -1, -1};
332
333 int64_t correct_read_bytes1 = 0;
334 int64_t correct_sent_bytes1 = 0;
335
336 int read_bytes_array1[] = {453, 98754, 94650};
337 int sent_bytes_array1[] = {1350, 15643, 95434};
338
339 for (int i : read_bytes_array1) {
340 TaskManagerIoThreadHelper::OnRawBytesTransferred(key1, i, 0);
341 correct_read_bytes1 += i;
342 }
343 for (int i : sent_bytes_array1) {
344 TaskManagerIoThreadHelper::OnRawBytesTransferred(key1, 0, i);
345 correct_sent_bytes1 += i;
346 }
347
348 mock_main_runner->FastForwardBy(base::TimeDelta::FromSeconds(1));
349 base::RunLoop().RunUntilIdle();
350 returned_map_.clear();
351
352 correct_sent_bytes1 = 0;
353 correct_read_bytes1 = 0;
354
355 TaskManagerIoThreadHelper::OnRawBytesTransferred(key1, 0, 10);
356 correct_sent_bytes1 += 10;
357
358 mock_main_runner->FastForwardBy(base::TimeDelta::FromSeconds(1));
359 base::RunLoop().RunUntilIdle();
360 EXPECT_EQ(1U, returned_map_.size());
361 EXPECT_EQ(correct_sent_bytes1, returned_map_[key1].byte_sent_count);
362 EXPECT_EQ(correct_read_bytes1, returned_map_[key1].byte_read_count);
363 // |key2| has not been used yet so it should call the implicit constructor
364 // which starts at 0.
365 EXPECT_EQ(0U, returned_map_[key2].byte_sent_count);
366 EXPECT_EQ(0U, returned_map_[key2].byte_read_count);
367 returned_map_.clear();
368
369 correct_read_bytes1 = 0;
370 correct_sent_bytes1 = 0;
371
372 int correct_read_bytes2 = 0;
373 int correct_sent_bytes2 = 0;
374
375 int read_bytes_array_second_1[] = {4153, 987154, 946501};
376 int sent_bytes_array_second_1[] = {13510, 115643, 954134};
377
378 int read_bytes_array2[] = {9056243, 32243, 6541250};
379 int sent_bytes_array2[] = {123238, 1527312, 96624};
380
381 for (int i : read_bytes_array_second_1) {
382 TaskManagerIoThreadHelper::OnRawBytesTransferred(key1, i, 0);
383 correct_read_bytes1 += i;
384 }
385 for (int i : sent_bytes_array_second_1) {
386 TaskManagerIoThreadHelper::OnRawBytesTransferred(key1, 0, i);
387 correct_sent_bytes1 += i;
388 }
389
390 for (int i : read_bytes_array2) {
391 TaskManagerIoThreadHelper::OnRawBytesTransferred(key2, i, 0);
392 correct_read_bytes2 += i;
393 }
394 for (int i : sent_bytes_array2) {
395 TaskManagerIoThreadHelper::OnRawBytesTransferred(key2, 0, i);
396 correct_sent_bytes2 += i;
397 }
398
399 mock_main_runner->FastForwardBy(base::TimeDelta::FromSeconds(1));
400 base::RunLoop().RunUntilIdle();
401 EXPECT_EQ(2U, returned_map_.size());
402 EXPECT_EQ(correct_sent_bytes1, returned_map_[key1].byte_sent_count);
403 EXPECT_EQ(correct_read_bytes1, returned_map_[key1].byte_read_count);
404 EXPECT_EQ(correct_sent_bytes2, returned_map_[key2].byte_sent_count);
405 EXPECT_EQ(correct_read_bytes2, returned_map_[key2].byte_read_count);
406 }
407
408 } // namespace task_manager
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698