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

Unified Diff: base/metrics/stats_table_unittest.cc

Issue 935333002: Update from https://crrev.com/316786 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/metrics/stats_table.cc ('k') | base/observer_list_threadsafe.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « base/metrics/stats_table.cc ('k') | base/observer_list_threadsafe.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698