Index: base/metrics/stats_table_unittest.cc |
diff --git a/base/metrics/stats_table_unittest.cc b/base/metrics/stats_table_unittest.cc |
deleted file mode 100644 |
index 38a21cc31df9b5e3dcf5246ca18b8668827ea9f9..0000000000000000000000000000000000000000 |
--- a/base/metrics/stats_table_unittest.cc |
+++ /dev/null |
@@ -1,402 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "base/memory/shared_memory.h" |
-#include "base/metrics/stats_counters.h" |
-#include "base/metrics/stats_table.h" |
-#include "base/process/kill.h" |
-#include "base/strings/string_piece.h" |
-#include "base/strings/stringprintf.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "base/test/multiprocess_test.h" |
-#include "base/threading/platform_thread.h" |
-#include "base/threading/simple_thread.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "testing/multiprocess_func_list.h" |
- |
-namespace base { |
- |
-class StatsTableTest : public MultiProcessTest { |
-}; |
- |
-// Open a StatsTable and verify that we can write to each of the |
-// locations in the table. |
-TEST_F(StatsTableTest, VerifySlots) { |
- const int kMaxThreads = 1; |
- const int kMaxCounter = 5; |
- StatsTable table(StatsTable::TableIdentifier(), kMaxThreads, kMaxCounter); |
- |
- // Register a single thread. |
- std::string thread_name = "mainThread"; |
- int slot_id = table.RegisterThread(thread_name); |
- EXPECT_NE(slot_id, 0); |
- |
- // Fill up the table with counters. |
- std::string counter_base_name = "counter"; |
- for (int index = 0; index < kMaxCounter; index++) { |
- std::string counter_name = counter_base_name; |
- base::StringAppendF(&counter_name, "counter.ctr%d", index); |
- int counter_id = table.FindCounter(counter_name); |
- EXPECT_GT(counter_id, 0); |
- } |
- |
- // Try to allocate an additional thread. Verify it fails. |
- slot_id = table.RegisterThread("too many threads"); |
- EXPECT_EQ(slot_id, 0); |
- |
- // Try to allocate an additional counter. Verify it fails. |
- int counter_id = table.FindCounter(counter_base_name); |
- EXPECT_EQ(counter_id, 0); |
-} |
- |
-// CounterZero will continually be set to 0. |
-const std::string kCounterZero = "CounterZero"; |
-// Counter1313 will continually be set to 1313. |
-const std::string kCounter1313 = "Counter1313"; |
-// CounterIncrement will be incremented each time. |
-const std::string kCounterIncrement = "CounterIncrement"; |
-// CounterDecrement will be decremented each time. |
-const std::string kCounterDecrement = "CounterDecrement"; |
-// CounterMixed will be incremented by odd numbered threads and |
-// decremented by even threads. |
-const std::string kCounterMixed = "CounterMixed"; |
-// The number of thread loops that we will do. |
-const int kThreadLoops = 100; |
- |
-class StatsTableThread : public SimpleThread { |
- public: |
- StatsTableThread(std::string name, int id) |
- : SimpleThread(name), |
- id_(id) {} |
- |
- void Run() override; |
- |
- private: |
- int id_; |
-}; |
- |
-void StatsTableThread::Run() { |
- // Each thread will open the shared memory and set counters |
- // concurrently in a loop. We'll use some pauses to |
- // mixup the thread scheduling. |
- |
- StatsCounter zero_counter(kCounterZero); |
- StatsCounter lucky13_counter(kCounter1313); |
- StatsCounter increment_counter(kCounterIncrement); |
- StatsCounter decrement_counter(kCounterDecrement); |
- for (int index = 0; index < kThreadLoops; index++) { |
- StatsCounter mixed_counter(kCounterMixed); // create this one in the loop |
- zero_counter.Set(0); |
- lucky13_counter.Set(1313); |
- increment_counter.Increment(); |
- decrement_counter.Decrement(); |
- if (id_ % 2) |
- mixed_counter.Decrement(); |
- else |
- mixed_counter.Increment(); |
- PlatformThread::Sleep(TimeDelta::FromMilliseconds(index % 10)); |
- } |
-} |
- |
-// Create a few threads and have them poke on their counters. |
-// See http://crbug.com/10611 for more information. |
-// It is disabled on Win x64 incremental linking pending resolution of |
-// http://crbug.com/251251. |
-#if defined(OS_MACOSX) || defined(THREAD_SANITIZER) || \ |
- (defined(OS_WIN) && defined(ARCH_CPU_X86_64) && \ |
- defined(INCREMENTAL_LINKING)) |
-#define MAYBE_MultipleThreads DISABLED_MultipleThreads |
-#else |
-#define MAYBE_MultipleThreads MultipleThreads |
-#endif |
-TEST_F(StatsTableTest, MAYBE_MultipleThreads) { |
- // Create a stats table. |
- const int kMaxThreads = 20; |
- const int kMaxCounter = 5; |
- StatsTable table(StatsTable::TableIdentifier(), kMaxThreads, kMaxCounter); |
- StatsTable::set_current(&table); |
- |
- EXPECT_EQ(0, table.CountThreadsRegistered()); |
- |
- // Spin up a set of threads to go bang on the various counters. |
- // After we join the threads, we'll make sure the counters |
- // contain the values we expected. |
- StatsTableThread* threads[kMaxThreads]; |
- |
- // Spawn the threads. |
- for (int index = 0; index < kMaxThreads; index++) { |
- threads[index] = new StatsTableThread("MultipleThreadsTest", index); |
- threads[index]->Start(); |
- } |
- |
- // Wait for the threads to finish. |
- for (int index = 0; index < kMaxThreads; index++) { |
- threads[index]->Join(); |
- delete threads[index]; |
- } |
- |
- StatsCounter zero_counter(kCounterZero); |
- StatsCounter lucky13_counter(kCounter1313); |
- StatsCounter increment_counter(kCounterIncrement); |
- StatsCounter decrement_counter(kCounterDecrement); |
- StatsCounter mixed_counter(kCounterMixed); |
- |
- // Verify the various counters are correct. |
- std::string name; |
- name = "c:" + kCounterZero; |
- EXPECT_EQ(0, table.GetCounterValue(name)); |
- name = "c:" + kCounter1313; |
- EXPECT_EQ(1313 * kMaxThreads, |
- table.GetCounterValue(name)); |
- name = "c:" + kCounterIncrement; |
- EXPECT_EQ(kMaxThreads * kThreadLoops, |
- table.GetCounterValue(name)); |
- name = "c:" + kCounterDecrement; |
- EXPECT_EQ(-kMaxThreads * kThreadLoops, |
- table.GetCounterValue(name)); |
- name = "c:" + kCounterMixed; |
- EXPECT_EQ((kMaxThreads % 2) * kThreadLoops, |
- table.GetCounterValue(name)); |
- EXPECT_EQ(0, table.CountThreadsRegistered()); |
-} |
- |
-// This multiprocess test only runs on Windows. On Posix, the shared memory |
-// handle is not sent between the processes properly. |
-#if defined(OS_WIN) |
-const std::string kMPTableName = "MultipleProcessStatTable"; |
- |
-MULTIPROCESS_TEST_MAIN(StatsTableMultipleProcessMain) { |
- // Each process will open the shared memory and set counters |
- // concurrently in a loop. We'll use some pauses to |
- // mixup the scheduling. |
- |
- StatsTable table(kMPTableName, 0, 0); |
- StatsTable::set_current(&table); |
- StatsCounter zero_counter(kCounterZero); |
- StatsCounter lucky13_counter(kCounter1313); |
- StatsCounter increment_counter(kCounterIncrement); |
- StatsCounter decrement_counter(kCounterDecrement); |
- for (int index = 0; index < kThreadLoops; index++) { |
- zero_counter.Set(0); |
- lucky13_counter.Set(1313); |
- increment_counter.Increment(); |
- decrement_counter.Decrement(); |
- PlatformThread::Sleep(TimeDelta::FromMilliseconds(index % 10)); |
- } |
- return 0; |
-} |
- |
-// Create a few processes and have them poke on their counters. |
-// This test is slow and flaky http://crbug.com/10611 |
-TEST_F(StatsTableTest, DISABLED_MultipleProcesses) { |
- // Create a stats table. |
- const int kMaxProcs = 20; |
- const int kMaxCounter = 5; |
- StatsTable table(kMPTableName, kMaxProcs, kMaxCounter); |
- StatsTable::set_current(&table); |
- EXPECT_EQ(0, table.CountThreadsRegistered()); |
- |
- // Spin up a set of processes to go bang on the various counters. |
- // After we join the processes, we'll make sure the counters |
- // contain the values we expected. |
- Process procs[kMaxProcs]; |
- |
- // Spawn the processes. |
- for (int16 index = 0; index < kMaxProcs; index++) { |
- procs[index] = SpawnChild("StatsTableMultipleProcessMain"); |
- EXPECT_TRUE(procs[index].IsValid()); |
- } |
- |
- // Wait for the processes to finish. |
- for (int index = 0; index < kMaxProcs; index++) { |
- EXPECT_TRUE(WaitForSingleProcess(procs[index].Handle(), |
- base::TimeDelta::FromMinutes(1))); |
- procs[index].Close(); |
- } |
- |
- StatsCounter zero_counter(kCounterZero); |
- StatsCounter lucky13_counter(kCounter1313); |
- StatsCounter increment_counter(kCounterIncrement); |
- StatsCounter decrement_counter(kCounterDecrement); |
- |
- // Verify the various counters are correct. |
- std::string name; |
- name = "c:" + kCounterZero; |
- EXPECT_EQ(0, table.GetCounterValue(name)); |
- name = "c:" + kCounter1313; |
- EXPECT_EQ(1313 * kMaxProcs, |
- table.GetCounterValue(name)); |
- name = "c:" + kCounterIncrement; |
- EXPECT_EQ(kMaxProcs * kThreadLoops, |
- table.GetCounterValue(name)); |
- name = "c:" + kCounterDecrement; |
- EXPECT_EQ(-kMaxProcs * kThreadLoops, |
- table.GetCounterValue(name)); |
- EXPECT_EQ(0, table.CountThreadsRegistered()); |
-} |
-#endif |
- |
-class MockStatsCounter : public StatsCounter { |
- public: |
- explicit MockStatsCounter(const std::string& name) |
- : StatsCounter(name) {} |
- int* Pointer() { return GetPtr(); } |
-}; |
- |
-// Test some basic StatsCounter operations |
-TEST_F(StatsTableTest, StatsCounter) { |
- // Create a stats table. |
- const int kMaxThreads = 20; |
- const int kMaxCounter = 5; |
- StatsTable table(StatsTable::TableIdentifier(), kMaxThreads, kMaxCounter); |
- StatsTable::set_current(&table); |
- |
- MockStatsCounter foo("foo"); |
- |
- // Test initial state. |
- EXPECT_TRUE(foo.Enabled()); |
- ASSERT_NE(foo.Pointer(), static_cast<int*>(0)); |
- EXPECT_EQ(0, *(foo.Pointer())); |
- EXPECT_EQ(0, table.GetCounterValue("c:foo")); |
- |
- // Test Increment. |
- while (*(foo.Pointer()) < 123) foo.Increment(); |
- EXPECT_EQ(123, table.GetCounterValue("c:foo")); |
- foo.Add(0); |
- EXPECT_EQ(123, table.GetCounterValue("c:foo")); |
- foo.Add(-1); |
- EXPECT_EQ(122, table.GetCounterValue("c:foo")); |
- |
- // Test Set. |
- foo.Set(0); |
- EXPECT_EQ(0, table.GetCounterValue("c:foo")); |
- foo.Set(100); |
- EXPECT_EQ(100, table.GetCounterValue("c:foo")); |
- foo.Set(-1); |
- EXPECT_EQ(-1, table.GetCounterValue("c:foo")); |
- foo.Set(0); |
- EXPECT_EQ(0, table.GetCounterValue("c:foo")); |
- |
- // Test Decrement. |
- foo.Subtract(1); |
- EXPECT_EQ(-1, table.GetCounterValue("c:foo")); |
- foo.Subtract(0); |
- EXPECT_EQ(-1, table.GetCounterValue("c:foo")); |
- foo.Subtract(-1); |
- EXPECT_EQ(0, table.GetCounterValue("c:foo")); |
-} |
- |
-class MockStatsCounterTimer : public StatsCounterTimer { |
- public: |
- explicit MockStatsCounterTimer(const std::string& name) |
- : StatsCounterTimer(name) {} |
- |
- TimeTicks start_time() { return start_time_; } |
- TimeTicks stop_time() { return stop_time_; } |
-}; |
- |
-// Test some basic StatsCounterTimer operations |
-TEST_F(StatsTableTest, StatsCounterTimer) { |
- // Create a stats table. |
- const int kMaxThreads = 20; |
- const int kMaxCounter = 5; |
- StatsTable table(StatsTable::TableIdentifier(), kMaxThreads, kMaxCounter); |
- StatsTable::set_current(&table); |
- |
- MockStatsCounterTimer bar("bar"); |
- |
- // Test initial state. |
- EXPECT_FALSE(bar.Running()); |
- EXPECT_TRUE(bar.start_time().is_null()); |
- EXPECT_TRUE(bar.stop_time().is_null()); |
- |
- const TimeDelta kDuration = TimeDelta::FromMilliseconds(100); |
- |
- // Do some timing. |
- bar.Start(); |
- PlatformThread::Sleep(kDuration); |
- bar.Stop(); |
- EXPECT_GT(table.GetCounterValue("t:bar"), 0); |
- EXPECT_LE(kDuration.InMilliseconds(), table.GetCounterValue("t:bar")); |
- |
- // Verify that timing again is additive. |
- bar.Start(); |
- PlatformThread::Sleep(kDuration); |
- bar.Stop(); |
- EXPECT_GT(table.GetCounterValue("t:bar"), 0); |
- EXPECT_LE(kDuration.InMilliseconds() * 2, table.GetCounterValue("t:bar")); |
-} |
- |
-// Test some basic StatsRate operations |
-TEST_F(StatsTableTest, StatsRate) { |
- // Create a stats table. |
- const int kMaxThreads = 20; |
- const int kMaxCounter = 5; |
- StatsTable table(StatsTable::TableIdentifier(), kMaxThreads, kMaxCounter); |
- StatsTable::set_current(&table); |
- |
- StatsRate baz("baz"); |
- |
- // Test initial state. |
- EXPECT_FALSE(baz.Running()); |
- EXPECT_EQ(0, table.GetCounterValue("c:baz")); |
- EXPECT_EQ(0, table.GetCounterValue("t:baz")); |
- |
- const TimeDelta kDuration = TimeDelta::FromMilliseconds(100); |
- |
- // Do some timing. |
- baz.Start(); |
- PlatformThread::Sleep(kDuration); |
- baz.Stop(); |
- EXPECT_EQ(1, table.GetCounterValue("c:baz")); |
- EXPECT_LE(kDuration.InMilliseconds(), table.GetCounterValue("t:baz")); |
- |
- // Verify that timing again is additive. |
- baz.Start(); |
- PlatformThread::Sleep(kDuration); |
- baz.Stop(); |
- EXPECT_EQ(2, table.GetCounterValue("c:baz")); |
- EXPECT_LE(kDuration.InMilliseconds() * 2, table.GetCounterValue("t:baz")); |
-} |
- |
-// Test some basic StatsScope operations |
-TEST_F(StatsTableTest, StatsScope) { |
- // Create a stats table. |
- const int kMaxThreads = 20; |
- const int kMaxCounter = 5; |
- StatsTable table(StatsTable::TableIdentifier(), kMaxThreads, kMaxCounter); |
- StatsTable::set_current(&table); |
- |
- StatsCounterTimer foo("foo"); |
- StatsRate bar("bar"); |
- |
- // Test initial state. |
- EXPECT_EQ(0, table.GetCounterValue("t:foo")); |
- EXPECT_EQ(0, table.GetCounterValue("t:bar")); |
- EXPECT_EQ(0, table.GetCounterValue("c:bar")); |
- |
- const TimeDelta kDuration = TimeDelta::FromMilliseconds(100); |
- |
- // Try a scope. |
- { |
- StatsScope<StatsCounterTimer> timer(foo); |
- StatsScope<StatsRate> timer2(bar); |
- PlatformThread::Sleep(kDuration); |
- } |
- EXPECT_LE(kDuration.InMilliseconds(), table.GetCounterValue("t:foo")); |
- EXPECT_LE(kDuration.InMilliseconds(), table.GetCounterValue("t:bar")); |
- EXPECT_EQ(1, table.GetCounterValue("c:bar")); |
- |
- // Try a second scope. |
- { |
- StatsScope<StatsCounterTimer> timer(foo); |
- StatsScope<StatsRate> timer2(bar); |
- PlatformThread::Sleep(kDuration); |
- } |
- EXPECT_LE(kDuration.InMilliseconds() * 2, table.GetCounterValue("t:foo")); |
- EXPECT_LE(kDuration.InMilliseconds() * 2, table.GetCounterValue("t:bar")); |
- EXPECT_EQ(2, table.GetCounterValue("c:bar")); |
-} |
- |
-} // namespace base |