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

Side by Side Diff: base/metrics/stats_table_unittest.cc

Issue 224713017: Remove IPC dependency from base (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: unit tests Created 6 years, 8 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "base/memory/shared_memory.h" 5 #include "base/memory/shared_memory.h"
6 #include "base/metrics/stats_counters.h" 6 #include "base/metrics/stats_counters.h"
7 #include "base/metrics/stats_table.h" 7 #include "base/metrics/stats_table.h"
8 #include "base/process/kill.h" 8 #include "base/process/kill.h"
9 #include "base/strings/string_piece.h" 9 #include "base/strings/string_piece.h"
10 #include "base/strings/stringprintf.h" 10 #include "base/strings/stringprintf.h"
11 #include "base/strings/utf_string_conversions.h" 11 #include "base/strings/utf_string_conversions.h"
12 #include "base/test/multiprocess_test.h" 12 #include "base/test/multiprocess_test.h"
13 #include "base/threading/platform_thread.h" 13 #include "base/threading/platform_thread.h"
14 #include "base/threading/simple_thread.h" 14 #include "base/threading/simple_thread.h"
15 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
16 #include "testing/multiprocess_func_list.h" 16 #include "testing/multiprocess_func_list.h"
17 17
18 namespace base { 18 namespace base {
19 19
20 class StatsTableTest : public MultiProcessTest { 20 class StatsTableTest : public MultiProcessTest {
21 public:
22 void DeleteShmem(const std::string& name) {
23 SharedMemory mem;
24 mem.Delete(name);
25 }
26 }; 21 };
27 22
28 // Open a StatsTable and verify that we can write to each of the 23 // Open a StatsTable and verify that we can write to each of the
29 // locations in the table. 24 // locations in the table.
30 TEST_F(StatsTableTest, VerifySlots) { 25 TEST_F(StatsTableTest, VerifySlots) {
31 const std::string kTableName = "VerifySlotsStatTable";
32 const int kMaxThreads = 1; 26 const int kMaxThreads = 1;
33 const int kMaxCounter = 5; 27 const int kMaxCounter = 5;
34 DeleteShmem(kTableName); 28 StatsTable table(StatsTable::TableIdentifier(), kMaxThreads, kMaxCounter);
35 StatsTable table(kTableName, kMaxThreads, kMaxCounter);
36 29
37 // Register a single thread. 30 // Register a single thread.
38 std::string thread_name = "mainThread"; 31 std::string thread_name = "mainThread";
39 int slot_id = table.RegisterThread(thread_name); 32 int slot_id = table.RegisterThread(thread_name);
40 EXPECT_NE(slot_id, 0); 33 EXPECT_NE(slot_id, 0);
41 34
42 // Fill up the table with counters. 35 // Fill up the table with counters.
43 std::string counter_base_name = "counter"; 36 std::string counter_base_name = "counter";
44 for (int index = 0; index < kMaxCounter; index++) { 37 for (int index = 0; index < kMaxCounter; index++) {
45 std::string counter_name = counter_base_name; 38 std::string counter_name = counter_base_name;
46 base::StringAppendF(&counter_name, "counter.ctr%d", index); 39 base::StringAppendF(&counter_name, "counter.ctr%d", index);
47 int counter_id = table.FindCounter(counter_name); 40 int counter_id = table.FindCounter(counter_name);
48 EXPECT_GT(counter_id, 0); 41 EXPECT_GT(counter_id, 0);
49 } 42 }
50 43
51 // Try to allocate an additional thread. Verify it fails. 44 // Try to allocate an additional thread. Verify it fails.
52 slot_id = table.RegisterThread("too many threads"); 45 slot_id = table.RegisterThread("too many threads");
53 EXPECT_EQ(slot_id, 0); 46 EXPECT_EQ(slot_id, 0);
54 47
55 // Try to allocate an additional counter. Verify it fails. 48 // Try to allocate an additional counter. Verify it fails.
56 int counter_id = table.FindCounter(counter_base_name); 49 int counter_id = table.FindCounter(counter_base_name);
57 EXPECT_EQ(counter_id, 0); 50 EXPECT_EQ(counter_id, 0);
58
59 DeleteShmem(kTableName);
60 } 51 }
61 52
62 // CounterZero will continually be set to 0. 53 // CounterZero will continually be set to 0.
63 const std::string kCounterZero = "CounterZero"; 54 const std::string kCounterZero = "CounterZero";
64 // Counter1313 will continually be set to 1313. 55 // Counter1313 will continually be set to 1313.
65 const std::string kCounter1313 = "Counter1313"; 56 const std::string kCounter1313 = "Counter1313";
66 // CounterIncrement will be incremented each time. 57 // CounterIncrement will be incremented each time.
67 const std::string kCounterIncrement = "CounterIncrement"; 58 const std::string kCounterIncrement = "CounterIncrement";
68 // CounterDecrement will be decremented each time. 59 // CounterDecrement will be decremented each time.
69 const std::string kCounterDecrement = "CounterDecrement"; 60 const std::string kCounterDecrement = "CounterDecrement";
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 101
111 // Create a few threads and have them poke on their counters. 102 // Create a few threads and have them poke on their counters.
112 // See http://crbug.com/10611 for more information. 103 // See http://crbug.com/10611 for more information.
113 #if defined(OS_MACOSX) || defined(THREAD_SANITIZER) 104 #if defined(OS_MACOSX) || defined(THREAD_SANITIZER)
114 #define MAYBE_MultipleThreads DISABLED_MultipleThreads 105 #define MAYBE_MultipleThreads DISABLED_MultipleThreads
115 #else 106 #else
116 #define MAYBE_MultipleThreads MultipleThreads 107 #define MAYBE_MultipleThreads MultipleThreads
117 #endif 108 #endif
118 TEST_F(StatsTableTest, MAYBE_MultipleThreads) { 109 TEST_F(StatsTableTest, MAYBE_MultipleThreads) {
119 // Create a stats table. 110 // Create a stats table.
120 const std::string kTableName = "MultipleThreadStatTable";
121 const int kMaxThreads = 20; 111 const int kMaxThreads = 20;
122 const int kMaxCounter = 5; 112 const int kMaxCounter = 5;
123 DeleteShmem(kTableName); 113 StatsTable table(StatsTable::TableIdentifier(), kMaxThreads, kMaxCounter);
124 StatsTable table(kTableName, kMaxThreads, kMaxCounter);
125 StatsTable::set_current(&table); 114 StatsTable::set_current(&table);
126 115
127 EXPECT_EQ(0, table.CountThreadsRegistered()); 116 EXPECT_EQ(0, table.CountThreadsRegistered());
128 117
129 // Spin up a set of threads to go bang on the various counters. 118 // Spin up a set of threads to go bang on the various counters.
130 // After we join the threads, we'll make sure the counters 119 // After we join the threads, we'll make sure the counters
131 // contain the values we expected. 120 // contain the values we expected.
132 StatsTableThread* threads[kMaxThreads]; 121 StatsTableThread* threads[kMaxThreads];
133 122
134 // Spawn the threads. 123 // Spawn the threads.
(...skipping 24 matching lines...) Expand all
159 name = "c:" + kCounterIncrement; 148 name = "c:" + kCounterIncrement;
160 EXPECT_EQ(kMaxThreads * kThreadLoops, 149 EXPECT_EQ(kMaxThreads * kThreadLoops,
161 table.GetCounterValue(name)); 150 table.GetCounterValue(name));
162 name = "c:" + kCounterDecrement; 151 name = "c:" + kCounterDecrement;
163 EXPECT_EQ(-kMaxThreads * kThreadLoops, 152 EXPECT_EQ(-kMaxThreads * kThreadLoops,
164 table.GetCounterValue(name)); 153 table.GetCounterValue(name));
165 name = "c:" + kCounterMixed; 154 name = "c:" + kCounterMixed;
166 EXPECT_EQ((kMaxThreads % 2) * kThreadLoops, 155 EXPECT_EQ((kMaxThreads % 2) * kThreadLoops,
167 table.GetCounterValue(name)); 156 table.GetCounterValue(name));
168 EXPECT_EQ(0, table.CountThreadsRegistered()); 157 EXPECT_EQ(0, table.CountThreadsRegistered());
169
170 DeleteShmem(kTableName);
171 } 158 }
172 159
160 // This multiprocess test only runs on Windows. On Posix, the shared memory
161 // handle is not sent between the processes properly.
162 #if defined(OS_WIN)
173 const std::string kMPTableName = "MultipleProcessStatTable"; 163 const std::string kMPTableName = "MultipleProcessStatTable";
174 164
175 MULTIPROCESS_TEST_MAIN(StatsTableMultipleProcessMain) { 165 MULTIPROCESS_TEST_MAIN(StatsTableMultipleProcessMain) {
176 // Each process will open the shared memory and set counters 166 // Each process will open the shared memory and set counters
177 // concurrently in a loop. We'll use some pauses to 167 // concurrently in a loop. We'll use some pauses to
178 // mixup the scheduling. 168 // mixup the scheduling.
179 169
180 StatsTable table(kMPTableName, 0, 0); 170 StatsTable table(kMPTableName, 0, 0);
181 StatsTable::set_current(&table); 171 StatsTable::set_current(&table);
182 StatsCounter zero_counter(kCounterZero); 172 StatsCounter zero_counter(kCounterZero);
183 StatsCounter lucky13_counter(kCounter1313); 173 StatsCounter lucky13_counter(kCounter1313);
184 StatsCounter increment_counter(kCounterIncrement); 174 StatsCounter increment_counter(kCounterIncrement);
185 StatsCounter decrement_counter(kCounterDecrement); 175 StatsCounter decrement_counter(kCounterDecrement);
186 for (int index = 0; index < kThreadLoops; index++) { 176 for (int index = 0; index < kThreadLoops; index++) {
187 zero_counter.Set(0); 177 zero_counter.Set(0);
188 lucky13_counter.Set(1313); 178 lucky13_counter.Set(1313);
189 increment_counter.Increment(); 179 increment_counter.Increment();
190 decrement_counter.Decrement(); 180 decrement_counter.Decrement();
191 PlatformThread::Sleep(TimeDelta::FromMilliseconds(index % 10)); 181 PlatformThread::Sleep(TimeDelta::FromMilliseconds(index % 10));
192 } 182 }
193 return 0; 183 return 0;
194 } 184 }
195 185
196 // Create a few processes and have them poke on their counters. 186 // Create a few processes and have them poke on their counters.
197 // This test is slow and flaky http://crbug.com/10611 187 // This test is slow and flaky http://crbug.com/10611
198 TEST_F(StatsTableTest, DISABLED_MultipleProcesses) { 188 TEST_F(StatsTableTest, DISABLED_MultipleProcesses) {
199 // Create a stats table. 189 // Create a stats table.
200 const int kMaxProcs = 20; 190 const int kMaxProcs = 20;
201 const int kMaxCounter = 5; 191 const int kMaxCounter = 5;
202 DeleteShmem(kMPTableName);
203 StatsTable table(kMPTableName, kMaxProcs, kMaxCounter); 192 StatsTable table(kMPTableName, kMaxProcs, kMaxCounter);
204 StatsTable::set_current(&table); 193 StatsTable::set_current(&table);
205 EXPECT_EQ(0, table.CountThreadsRegistered()); 194 EXPECT_EQ(0, table.CountThreadsRegistered());
206 195
207 // Spin up a set of processes to go bang on the various counters. 196 // Spin up a set of processes to go bang on the various counters.
208 // After we join the processes, we'll make sure the counters 197 // After we join the processes, we'll make sure the counters
209 // contain the values we expected. 198 // contain the values we expected.
210 ProcessHandle procs[kMaxProcs]; 199 ProcessHandle procs[kMaxProcs];
211 200
212 // Spawn the processes. 201 // Spawn the processes.
(...skipping 21 matching lines...) Expand all
234 name = "c:" + kCounter1313; 223 name = "c:" + kCounter1313;
235 EXPECT_EQ(1313 * kMaxProcs, 224 EXPECT_EQ(1313 * kMaxProcs,
236 table.GetCounterValue(name)); 225 table.GetCounterValue(name));
237 name = "c:" + kCounterIncrement; 226 name = "c:" + kCounterIncrement;
238 EXPECT_EQ(kMaxProcs * kThreadLoops, 227 EXPECT_EQ(kMaxProcs * kThreadLoops,
239 table.GetCounterValue(name)); 228 table.GetCounterValue(name));
240 name = "c:" + kCounterDecrement; 229 name = "c:" + kCounterDecrement;
241 EXPECT_EQ(-kMaxProcs * kThreadLoops, 230 EXPECT_EQ(-kMaxProcs * kThreadLoops,
242 table.GetCounterValue(name)); 231 table.GetCounterValue(name));
243 EXPECT_EQ(0, table.CountThreadsRegistered()); 232 EXPECT_EQ(0, table.CountThreadsRegistered());
244
245 DeleteShmem(kMPTableName);
246 } 233 }
234 #endif
247 235
248 class MockStatsCounter : public StatsCounter { 236 class MockStatsCounter : public StatsCounter {
249 public: 237 public:
250 explicit MockStatsCounter(const std::string& name) 238 explicit MockStatsCounter(const std::string& name)
251 : StatsCounter(name) {} 239 : StatsCounter(name) {}
252 int* Pointer() { return GetPtr(); } 240 int* Pointer() { return GetPtr(); }
253 }; 241 };
254 242
255 // Test some basic StatsCounter operations 243 // Test some basic StatsCounter operations
256 TEST_F(StatsTableTest, StatsCounter) { 244 TEST_F(StatsTableTest, StatsCounter) {
257 // Create a stats table. 245 // Create a stats table.
258 const std::string kTableName = "StatTable";
259 const int kMaxThreads = 20; 246 const int kMaxThreads = 20;
260 const int kMaxCounter = 5; 247 const int kMaxCounter = 5;
261 DeleteShmem(kTableName); 248 StatsTable table(StatsTable::TableIdentifier(), kMaxThreads, kMaxCounter);
262 StatsTable table(kTableName, kMaxThreads, kMaxCounter);
263 StatsTable::set_current(&table); 249 StatsTable::set_current(&table);
264 250
265 MockStatsCounter foo("foo"); 251 MockStatsCounter foo("foo");
266 252
267 // Test initial state. 253 // Test initial state.
268 EXPECT_TRUE(foo.Enabled()); 254 EXPECT_TRUE(foo.Enabled());
269 ASSERT_NE(foo.Pointer(), static_cast<int*>(0)); 255 ASSERT_NE(foo.Pointer(), static_cast<int*>(0));
270 EXPECT_EQ(0, *(foo.Pointer())); 256 EXPECT_EQ(0, *(foo.Pointer()));
271 EXPECT_EQ(0, table.GetCounterValue("c:foo")); 257 EXPECT_EQ(0, table.GetCounterValue("c:foo"));
272 258
(...skipping 15 matching lines...) Expand all
288 foo.Set(0); 274 foo.Set(0);
289 EXPECT_EQ(0, table.GetCounterValue("c:foo")); 275 EXPECT_EQ(0, table.GetCounterValue("c:foo"));
290 276
291 // Test Decrement. 277 // Test Decrement.
292 foo.Subtract(1); 278 foo.Subtract(1);
293 EXPECT_EQ(-1, table.GetCounterValue("c:foo")); 279 EXPECT_EQ(-1, table.GetCounterValue("c:foo"));
294 foo.Subtract(0); 280 foo.Subtract(0);
295 EXPECT_EQ(-1, table.GetCounterValue("c:foo")); 281 EXPECT_EQ(-1, table.GetCounterValue("c:foo"));
296 foo.Subtract(-1); 282 foo.Subtract(-1);
297 EXPECT_EQ(0, table.GetCounterValue("c:foo")); 283 EXPECT_EQ(0, table.GetCounterValue("c:foo"));
298
299 DeleteShmem(kTableName);
300 } 284 }
301 285
302 class MockStatsCounterTimer : public StatsCounterTimer { 286 class MockStatsCounterTimer : public StatsCounterTimer {
303 public: 287 public:
304 explicit MockStatsCounterTimer(const std::string& name) 288 explicit MockStatsCounterTimer(const std::string& name)
305 : StatsCounterTimer(name) {} 289 : StatsCounterTimer(name) {}
306 290
307 TimeTicks start_time() { return start_time_; } 291 TimeTicks start_time() { return start_time_; }
308 TimeTicks stop_time() { return stop_time_; } 292 TimeTicks stop_time() { return stop_time_; }
309 }; 293 };
310 294
311 // Test some basic StatsCounterTimer operations 295 // Test some basic StatsCounterTimer operations
312 TEST_F(StatsTableTest, StatsCounterTimer) { 296 TEST_F(StatsTableTest, StatsCounterTimer) {
313 // Create a stats table. 297 // Create a stats table.
314 const std::string kTableName = "StatTable";
315 const int kMaxThreads = 20; 298 const int kMaxThreads = 20;
316 const int kMaxCounter = 5; 299 const int kMaxCounter = 5;
317 DeleteShmem(kTableName); 300 StatsTable table(StatsTable::TableIdentifier(), kMaxThreads, kMaxCounter);
318 StatsTable table(kTableName, kMaxThreads, kMaxCounter);
319 StatsTable::set_current(&table); 301 StatsTable::set_current(&table);
320 302
321 MockStatsCounterTimer bar("bar"); 303 MockStatsCounterTimer bar("bar");
322 304
323 // Test initial state. 305 // Test initial state.
324 EXPECT_FALSE(bar.Running()); 306 EXPECT_FALSE(bar.Running());
325 EXPECT_TRUE(bar.start_time().is_null()); 307 EXPECT_TRUE(bar.start_time().is_null());
326 EXPECT_TRUE(bar.stop_time().is_null()); 308 EXPECT_TRUE(bar.stop_time().is_null());
327 309
328 const TimeDelta kDuration = TimeDelta::FromMilliseconds(100); 310 const TimeDelta kDuration = TimeDelta::FromMilliseconds(100);
329 311
330 // Do some timing. 312 // Do some timing.
331 bar.Start(); 313 bar.Start();
332 PlatformThread::Sleep(kDuration); 314 PlatformThread::Sleep(kDuration);
333 bar.Stop(); 315 bar.Stop();
334 EXPECT_GT(table.GetCounterValue("t:bar"), 0); 316 EXPECT_GT(table.GetCounterValue("t:bar"), 0);
335 EXPECT_LE(kDuration.InMilliseconds(), table.GetCounterValue("t:bar")); 317 EXPECT_LE(kDuration.InMilliseconds(), table.GetCounterValue("t:bar"));
336 318
337 // Verify that timing again is additive. 319 // Verify that timing again is additive.
338 bar.Start(); 320 bar.Start();
339 PlatformThread::Sleep(kDuration); 321 PlatformThread::Sleep(kDuration);
340 bar.Stop(); 322 bar.Stop();
341 EXPECT_GT(table.GetCounterValue("t:bar"), 0); 323 EXPECT_GT(table.GetCounterValue("t:bar"), 0);
342 EXPECT_LE(kDuration.InMilliseconds() * 2, table.GetCounterValue("t:bar")); 324 EXPECT_LE(kDuration.InMilliseconds() * 2, table.GetCounterValue("t:bar"));
343 DeleteShmem(kTableName);
344 } 325 }
345 326
346 // Test some basic StatsRate operations 327 // Test some basic StatsRate operations
347 TEST_F(StatsTableTest, StatsRate) { 328 TEST_F(StatsTableTest, StatsRate) {
348 // Create a stats table. 329 // Create a stats table.
349 const std::string kTableName = "StatTable";
350 const int kMaxThreads = 20; 330 const int kMaxThreads = 20;
351 const int kMaxCounter = 5; 331 const int kMaxCounter = 5;
352 DeleteShmem(kTableName); 332 StatsTable table(StatsTable::TableIdentifier(), kMaxThreads, kMaxCounter);
353 StatsTable table(kTableName, kMaxThreads, kMaxCounter);
354 StatsTable::set_current(&table); 333 StatsTable::set_current(&table);
355 334
356 StatsRate baz("baz"); 335 StatsRate baz("baz");
357 336
358 // Test initial state. 337 // Test initial state.
359 EXPECT_FALSE(baz.Running()); 338 EXPECT_FALSE(baz.Running());
360 EXPECT_EQ(0, table.GetCounterValue("c:baz")); 339 EXPECT_EQ(0, table.GetCounterValue("c:baz"));
361 EXPECT_EQ(0, table.GetCounterValue("t:baz")); 340 EXPECT_EQ(0, table.GetCounterValue("t:baz"));
362 341
363 const TimeDelta kDuration = TimeDelta::FromMilliseconds(100); 342 const TimeDelta kDuration = TimeDelta::FromMilliseconds(100);
364 343
365 // Do some timing. 344 // Do some timing.
366 baz.Start(); 345 baz.Start();
367 PlatformThread::Sleep(kDuration); 346 PlatformThread::Sleep(kDuration);
368 baz.Stop(); 347 baz.Stop();
369 EXPECT_EQ(1, table.GetCounterValue("c:baz")); 348 EXPECT_EQ(1, table.GetCounterValue("c:baz"));
370 EXPECT_LE(kDuration.InMilliseconds(), table.GetCounterValue("t:baz")); 349 EXPECT_LE(kDuration.InMilliseconds(), table.GetCounterValue("t:baz"));
371 350
372 // Verify that timing again is additive. 351 // Verify that timing again is additive.
373 baz.Start(); 352 baz.Start();
374 PlatformThread::Sleep(kDuration); 353 PlatformThread::Sleep(kDuration);
375 baz.Stop(); 354 baz.Stop();
376 EXPECT_EQ(2, table.GetCounterValue("c:baz")); 355 EXPECT_EQ(2, table.GetCounterValue("c:baz"));
377 EXPECT_LE(kDuration.InMilliseconds() * 2, table.GetCounterValue("t:baz")); 356 EXPECT_LE(kDuration.InMilliseconds() * 2, table.GetCounterValue("t:baz"));
378 DeleteShmem(kTableName);
379 } 357 }
380 358
381 // Test some basic StatsScope operations 359 // Test some basic StatsScope operations
382 TEST_F(StatsTableTest, StatsScope) { 360 TEST_F(StatsTableTest, StatsScope) {
383 // Create a stats table. 361 // Create a stats table.
384 const std::string kTableName = "StatTable";
385 const int kMaxThreads = 20; 362 const int kMaxThreads = 20;
386 const int kMaxCounter = 5; 363 const int kMaxCounter = 5;
387 DeleteShmem(kTableName); 364 StatsTable table(StatsTable::TableIdentifier(), kMaxThreads, kMaxCounter);
388 StatsTable table(kTableName, kMaxThreads, kMaxCounter);
389 StatsTable::set_current(&table); 365 StatsTable::set_current(&table);
390 366
391 StatsCounterTimer foo("foo"); 367 StatsCounterTimer foo("foo");
392 StatsRate bar("bar"); 368 StatsRate bar("bar");
393 369
394 // Test initial state. 370 // Test initial state.
395 EXPECT_EQ(0, table.GetCounterValue("t:foo")); 371 EXPECT_EQ(0, table.GetCounterValue("t:foo"));
396 EXPECT_EQ(0, table.GetCounterValue("t:bar")); 372 EXPECT_EQ(0, table.GetCounterValue("t:bar"));
397 EXPECT_EQ(0, table.GetCounterValue("c:bar")); 373 EXPECT_EQ(0, table.GetCounterValue("c:bar"));
398 374
(...skipping 11 matching lines...) Expand all
410 386
411 // Try a second scope. 387 // Try a second scope.
412 { 388 {
413 StatsScope<StatsCounterTimer> timer(foo); 389 StatsScope<StatsCounterTimer> timer(foo);
414 StatsScope<StatsRate> timer2(bar); 390 StatsScope<StatsRate> timer2(bar);
415 PlatformThread::Sleep(kDuration); 391 PlatformThread::Sleep(kDuration);
416 } 392 }
417 EXPECT_LE(kDuration.InMilliseconds() * 2, table.GetCounterValue("t:foo")); 393 EXPECT_LE(kDuration.InMilliseconds() * 2, table.GetCounterValue("t:foo"));
418 EXPECT_LE(kDuration.InMilliseconds() * 2, table.GetCounterValue("t:bar")); 394 EXPECT_LE(kDuration.InMilliseconds() * 2, table.GetCounterValue("t:bar"));
419 EXPECT_EQ(2, table.GetCounterValue("c:bar")); 395 EXPECT_EQ(2, table.GetCounterValue("c:bar"));
420
421 DeleteShmem(kTableName);
422 } 396 }
423 397
424 } // namespace base 398 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698