Add shared MockClock class and cleaned up base::Clock usage

Change-Id: I8492747700274591eab1a3f591ddb94814723943
Reviewed-on: https://weave-review.googlesource.com/1870
Reviewed-by: Alex Vakulenko <avakulenko@google.com>
diff --git a/libweave.gypi b/libweave.gypi
index b529add..6f64c89 100644
--- a/libweave.gypi
+++ b/libweave.gypi
@@ -115,6 +115,7 @@
       'third_party/chromium/base/third_party/dmg_fp/dtoa.cc',
       'third_party/chromium/base/third_party/icu/icu_utf.cc',
       'third_party/chromium/base/time/clock.cc',
+      'third_party/chromium/base/time/default_clock.cc',
       'third_party/chromium/base/time/time.cc',
       'third_party/chromium/base/time/time_posix.cc',
       'third_party/chromium/base/values.cc',
diff --git a/src/base_api_handler_unittest.cc b/src/base_api_handler_unittest.cc
index ca47626..14421b0 100644
--- a/src/base_api_handler_unittest.cc
+++ b/src/base_api_handler_unittest.cc
@@ -5,6 +5,7 @@
 #include "src/base_api_handler.h"
 
 #include <base/strings/string_number_conversions.h>
+#include <base/time/default_clock.h>
 #include <base/values.h>
 #include <gtest/gtest.h>
 #include <weave/provider/test/mock_config_store.h>
diff --git a/src/component_manager_impl.cc b/src/component_manager_impl.cc
index a23f34d..89ca0cd 100644
--- a/src/component_manager_impl.cc
+++ b/src/component_manager_impl.cc
@@ -31,10 +31,8 @@
 LIBWEAVE_EXPORT EnumToStringMap<UserRole>::EnumToStringMap()
     : EnumToStringMap(kMap) {}
 
-ComponentManagerImpl::ComponentManagerImpl() {}
-
-ComponentManagerImpl::ComponentManagerImpl(base::Clock* clock) : clock_{clock} {
-}
+ComponentManagerImpl::ComponentManagerImpl(base::Clock* clock)
+    : clock_{clock ? clock : &default_clock_} {}
 
 ComponentManagerImpl::~ComponentManagerImpl() {}
 
@@ -343,7 +341,7 @@
   auto& queue = state_change_queues_[component_path];
   if (!queue)
     queue.reset(new StateChangeQueue{kMaxStateChangeQueueSize});
-  base::Time timestamp = clock_ ? clock_->Now() : base::Time::Now();
+  base::Time timestamp = clock_->Now();
   queue->NotifyPropertiesUpdated(timestamp, dict);
   for (const auto& cb : on_state_changed_)
     cb.Run();
diff --git a/src/component_manager_impl.h b/src/component_manager_impl.h
index c59c6d9..426b4b0 100644
--- a/src/component_manager_impl.h
+++ b/src/component_manager_impl.h
@@ -5,6 +5,8 @@
 #ifndef LIBWEAVE_SRC_COMPONENT_MANAGER_IMPL_H_
 #define LIBWEAVE_SRC_COMPONENT_MANAGER_IMPL_H_
 
+#include <base/time/default_clock.h>
+
 #include "src/commands/command_queue.h"
 #include "src/component_manager.h"
 #include "src/states/state_change_queue.h"
@@ -13,8 +15,7 @@
 
 class ComponentManagerImpl final : public ComponentManager {
  public:
-  ComponentManagerImpl();
-  explicit ComponentManagerImpl(base::Clock* clock);
+  explicit ComponentManagerImpl(base::Clock* clock = nullptr);
   ~ComponentManagerImpl() override;
 
   // Loads trait definition schema.
@@ -188,6 +189,7 @@
       const std::string& path,
       ErrorPtr* error);
 
+  base::DefaultClock default_clock_;
   base::Clock* clock_{nullptr};
   // An ID of last state change update. Each NotifyPropertiesUpdated()
   // invocation increments this value by 1.
diff --git a/src/component_manager_unittest.cc b/src/component_manager_unittest.cc
index 902ee15..c63d2dd 100644
--- a/src/component_manager_unittest.cc
+++ b/src/component_manager_unittest.cc
@@ -12,10 +12,12 @@
 #include "src/bind_lambda.h"
 #include "src/commands/schema_constants.h"
 #include "src/mock_component_manager.h"
+#include "src/test/mock_clock.h"
 
 namespace weave {
 
 using test::CreateDictionaryValue;
+using testing::Return;
 
 namespace {
 
@@ -65,47 +67,36 @@
 //     }
 //   }
 // }
-void CreateTestComponentTree(ComponentManager* manager) {
-  const char kTraits[] = R"({"t1":{},"t2":{},"t3":{},"t4":{},"t5":{},"t6":{}})";
-  auto json = CreateDictionaryValue(kTraits);
-  ASSERT_TRUE(manager->LoadTraits(*json, nullptr));
-  EXPECT_TRUE(manager->AddComponent("", "comp1", {"t1"}, nullptr));
-  EXPECT_TRUE(manager->AddComponentArrayItem("comp1", "comp2", {"t2"},
-                                             nullptr));
-  EXPECT_TRUE(manager->AddComponentArrayItem("comp1", "comp2", {"t3"},
-                                             nullptr));
-  EXPECT_TRUE(manager->AddComponent("comp1.comp2[1]", "comp3", {"t4"},
-                                    nullptr));
-  EXPECT_TRUE(manager->AddComponent("comp1.comp2[1].comp3", "comp4",
-                                    {"t5", "t6"}, nullptr));
-}
+class ComponentManagerTest : public ::testing::Test {
+ protected:
+  void CreateTestComponentTree(ComponentManager* manager) {
+    const char kTraits[] =
+        R"({"t1":{},"t2":{},"t3":{},"t4":{},"t5":{},"t6":{}})";
+    auto json = CreateDictionaryValue(kTraits);
+    ASSERT_TRUE(manager->LoadTraits(*json, nullptr));
+    EXPECT_TRUE(manager->AddComponent("", "comp1", {"t1"}, nullptr));
+    EXPECT_TRUE(
+        manager->AddComponentArrayItem("comp1", "comp2", {"t2"}, nullptr));
+    EXPECT_TRUE(
+        manager->AddComponentArrayItem("comp1", "comp2", {"t3"}, nullptr));
+    EXPECT_TRUE(
+        manager->AddComponent("comp1.comp2[1]", "comp3", {"t4"}, nullptr));
+    EXPECT_TRUE(manager->AddComponent("comp1.comp2[1].comp3", "comp4",
+                                      {"t5", "t6"}, nullptr));
+  }
 
-// Test clock class to record predefined time intervals.
-// Implementation from base/test/simple_test_clock.{h|cc}
-class SimpleTestClock : public base::Clock {
- public:
-  base::Time Now() override { return now_; }
-
-  // Advances the clock by |delta|.
-  void Advance(base::TimeDelta delta) { now_ += delta; }
-
-  // Sets the clock to the given time.
-  void SetNow(base::Time now) { now_ = now; }
-
- private:
-  base::Time now_;
+  test::MockClock clock_;
+  ComponentManagerImpl manager_{&clock_};
 };
 
 }  // anonymous namespace
 
-TEST(ComponentManager, Empty) {
-  ComponentManagerImpl manager;
-  EXPECT_TRUE(manager.GetTraits().empty());
-  EXPECT_TRUE(manager.GetComponents().empty());
+TEST_F(ComponentManagerTest, Empty) {
+  EXPECT_TRUE(manager_.GetTraits().empty());
+  EXPECT_TRUE(manager_.GetComponents().empty());
 }
 
-TEST(ComponentManager, LoadTraits) {
-  ComponentManagerImpl manager;
+TEST_F(ComponentManagerTest, LoadTraits) {
   const char kTraits[] = R"({
     "trait1": {
       "commands": {
@@ -125,13 +116,12 @@
     }
   })";
   auto json = CreateDictionaryValue(kTraits);
-  EXPECT_TRUE(manager.LoadTraits(*json, nullptr));
-  EXPECT_JSON_EQ(kTraits, manager.GetTraits());
-  EXPECT_TRUE(manager.GetComponents().empty());
+  EXPECT_TRUE(manager_.LoadTraits(*json, nullptr));
+  EXPECT_JSON_EQ(kTraits, manager_.GetTraits());
+  EXPECT_TRUE(manager_.GetComponents().empty());
 }
 
-TEST(ComponentManager, LoadTraitsDuplicateIdentical) {
-  ComponentManagerImpl manager;
+TEST_F(ComponentManagerTest, LoadTraitsDuplicateIdentical) {
   const char kTraits1[] = R"({
     "trait1": {
       "commands": {
@@ -151,7 +141,7 @@
     }
   })";
   auto json = CreateDictionaryValue(kTraits1);
-  EXPECT_TRUE(manager.LoadTraits(*json, nullptr));
+  EXPECT_TRUE(manager_.LoadTraits(*json, nullptr));
   const char kTraits2[] = R"({
     "trait1": {
       "commands": {
@@ -171,7 +161,7 @@
     }
   })";
   json = CreateDictionaryValue(kTraits2);
-  EXPECT_TRUE(manager.LoadTraits(*json, nullptr));
+  EXPECT_TRUE(manager_.LoadTraits(*json, nullptr));
   const char kExpected[] = R"({
     "trait1": {
       "commands": {
@@ -195,11 +185,10 @@
       }
     }
   })";
-  EXPECT_JSON_EQ(kExpected, manager.GetTraits());
+  EXPECT_JSON_EQ(kExpected, manager_.GetTraits());
 }
 
-TEST(ComponentManager, LoadTraitsDuplicateOverride) {
-  ComponentManagerImpl manager;
+TEST_F(ComponentManagerTest, LoadTraitsDuplicateOverride) {
   const char kTraits1[] = R"({
     "trait1": {
       "commands": {
@@ -219,7 +208,7 @@
     }
   })";
   auto json = CreateDictionaryValue(kTraits1);
-  EXPECT_TRUE(manager.LoadTraits(*json, nullptr));
+  EXPECT_TRUE(manager_.LoadTraits(*json, nullptr));
   const char kTraits2[] = R"({
     "trait1": {
       "commands": {
@@ -239,15 +228,14 @@
     }
   })";
   json = CreateDictionaryValue(kTraits2);
-  EXPECT_FALSE(manager.LoadTraits(*json, nullptr));
+  EXPECT_FALSE(manager_.LoadTraits(*json, nullptr));
 }
 
-TEST(ComponentManager, AddTraitDefChangedCallback) {
-  ComponentManagerImpl manager;
+TEST_F(ComponentManagerTest, AddTraitDefChangedCallback) {
   int count = 0;
   int count2 = 0;
-  manager.AddTraitDefChangedCallback(base::Bind([&count]() { count++; }));
-  manager.AddTraitDefChangedCallback(base::Bind([&count2]() { count2++; }));
+  manager_.AddTraitDefChangedCallback(base::Bind([&count]() { count++; }));
+  manager_.AddTraitDefChangedCallback(base::Bind([&count2]() { count2++; }));
   EXPECT_EQ(1, count);
   EXPECT_EQ(1, count2);
   // New definitions.
@@ -264,7 +252,7 @@
     }
   })";
   auto json = CreateDictionaryValue(kTraits1);
-  EXPECT_TRUE(manager.LoadTraits(*json, nullptr));
+  EXPECT_TRUE(manager_.LoadTraits(*json, nullptr));
   EXPECT_EQ(2, count);
   // Duplicate definition, shouldn't call the callback.
   const char kTraits2[] = R"({
@@ -275,7 +263,7 @@
     }
   })";
   json = CreateDictionaryValue(kTraits2);
-  EXPECT_TRUE(manager.LoadTraits(*json, nullptr));
+  EXPECT_TRUE(manager_.LoadTraits(*json, nullptr));
   EXPECT_EQ(2, count);
   // New definition, should call the callback now.
   const char kTraits3[] = R"({
@@ -286,30 +274,28 @@
     }
   })";
   json = CreateDictionaryValue(kTraits3);
-  EXPECT_TRUE(manager.LoadTraits(*json, nullptr));
+  EXPECT_TRUE(manager_.LoadTraits(*json, nullptr));
   EXPECT_EQ(3, count);
   // Wrong definition, shouldn't call the callback.
   const char kTraits4[] = R"({
     "trait4": "foo"
   })";
   json = CreateDictionaryValue(kTraits4);
-  EXPECT_FALSE(manager.LoadTraits(*json, nullptr));
+  EXPECT_FALSE(manager_.LoadTraits(*json, nullptr));
   EXPECT_EQ(3, count);
   // Make sure both callbacks were called the same number of times.
   EXPECT_EQ(count2, count);
 }
 
-TEST(ComponentManager, LoadTraitsNotAnObject) {
-  ComponentManagerImpl manager;
+TEST_F(ComponentManagerTest, LoadTraitsNotAnObject) {
   const char kTraits1[] = R"({"trait1": 0})";
   auto json = CreateDictionaryValue(kTraits1);
   ErrorPtr error;
-  EXPECT_FALSE(manager.LoadTraits(*json, &error));
+  EXPECT_FALSE(manager_.LoadTraits(*json, &error));
   EXPECT_EQ(errors::commands::kTypeMismatch, error->GetCode());
 }
 
-TEST(ComponentManager, FindTraitDefinition) {
-  ComponentManagerImpl manager;
+TEST_F(ComponentManagerTest, FindTraitDefinition) {
   const char kTraits[] = R"({
     "trait1": {
       "commands": {
@@ -329,9 +315,9 @@
     }
   })";
   auto json = CreateDictionaryValue(kTraits);
-  ASSERT_TRUE(manager.LoadTraits(*json, nullptr));
+  ASSERT_TRUE(manager_.LoadTraits(*json, nullptr));
 
-  const base::DictionaryValue* trait = manager.FindTraitDefinition("trait1");
+  const base::DictionaryValue* trait = manager_.FindTraitDefinition("trait1");
   ASSERT_NE(nullptr, trait);
   const char kExpected1[] = R"({
     "commands": {
@@ -346,7 +332,7 @@
   })";
   EXPECT_JSON_EQ(kExpected1, *trait);
 
-  trait = manager.FindTraitDefinition("trait2");
+  trait = manager_.FindTraitDefinition("trait2");
   ASSERT_NE(nullptr, trait);
   const char kExpected2[] = R"({
     "state": {
@@ -355,11 +341,10 @@
   })";
   EXPECT_JSON_EQ(kExpected2, *trait);
 
-  EXPECT_EQ(nullptr, manager.FindTraitDefinition("trait3"));
+  EXPECT_EQ(nullptr, manager_.FindTraitDefinition("trait3"));
 }
 
-TEST(ComponentManager, FindCommandDefinition) {
-  ComponentManagerImpl manager;
+TEST_F(ComponentManagerTest, FindCommandDefinition) {
   const char kTraits[] = R"({
     "trait1": {
       "commands": {
@@ -381,9 +366,9 @@
     }
   })";
   auto json = CreateDictionaryValue(kTraits);
-  ASSERT_TRUE(manager.LoadTraits(*json, nullptr));
+  ASSERT_TRUE(manager_.LoadTraits(*json, nullptr));
 
-  const auto* cmd_def = manager.FindCommandDefinition("trait1.command1");
+  const auto* cmd_def = manager_.FindCommandDefinition("trait1.command1");
   ASSERT_NE(nullptr, cmd_def);
   const char kExpected1[] = R"({
     "minimalRole": "user",
@@ -391,28 +376,28 @@
   })";
   EXPECT_JSON_EQ(kExpected1, *cmd_def);
 
-  cmd_def = manager.FindCommandDefinition("trait2.command1");
+  cmd_def = manager_.FindCommandDefinition("trait2.command1");
   ASSERT_NE(nullptr, cmd_def);
   const char kExpected2[] = R"({
     "minimalRole": "manager"
   })";
   EXPECT_JSON_EQ(kExpected2, *cmd_def);
 
-  cmd_def = manager.FindCommandDefinition("trait2.command2");
+  cmd_def = manager_.FindCommandDefinition("trait2.command2");
   ASSERT_NE(nullptr, cmd_def);
   const char kExpected3[] = R"({
     "minimalRole": "owner"
   })";
   EXPECT_JSON_EQ(kExpected3, *cmd_def);
 
-  EXPECT_EQ(nullptr, manager.FindTraitDefinition("trait1.command2"));
-  EXPECT_EQ(nullptr, manager.FindTraitDefinition("trait3.command1"));
-  EXPECT_EQ(nullptr, manager.FindTraitDefinition("trait"));
-  EXPECT_EQ(nullptr, manager.FindTraitDefinition("trait1.command1.parameters"));
+  EXPECT_EQ(nullptr, manager_.FindTraitDefinition("trait1.command2"));
+  EXPECT_EQ(nullptr, manager_.FindTraitDefinition("trait3.command1"));
+  EXPECT_EQ(nullptr, manager_.FindTraitDefinition("trait"));
+  EXPECT_EQ(nullptr,
+            manager_.FindTraitDefinition("trait1.command1.parameters"));
 }
 
-TEST(ComponentManager, GetMinimalRole) {
-  ComponentManagerImpl manager;
+TEST_F(ComponentManagerTest, GetMinimalRole) {
   const char kTraits[] = R"({
     "trait1": {
       "commands": {
@@ -428,31 +413,31 @@
     }
   })";
   auto json = CreateDictionaryValue(kTraits);
-  ASSERT_TRUE(manager.LoadTraits(*json, nullptr));
+  ASSERT_TRUE(manager_.LoadTraits(*json, nullptr));
 
   UserRole role;
-  ASSERT_TRUE(manager.GetMinimalRole("trait1.command1", &role, nullptr));
+  ASSERT_TRUE(manager_.GetMinimalRole("trait1.command1", &role, nullptr));
   EXPECT_EQ(UserRole::kUser, role);
 
-  ASSERT_TRUE(manager.GetMinimalRole("trait1.command2", &role, nullptr));
+  ASSERT_TRUE(manager_.GetMinimalRole("trait1.command2", &role, nullptr));
   EXPECT_EQ(UserRole::kViewer, role);
 
-  ASSERT_TRUE(manager.GetMinimalRole("trait2.command1", &role, nullptr));
+  ASSERT_TRUE(manager_.GetMinimalRole("trait2.command1", &role, nullptr));
   EXPECT_EQ(UserRole::kManager, role);
 
-  ASSERT_TRUE(manager.GetMinimalRole("trait2.command2", &role, nullptr));
+  ASSERT_TRUE(manager_.GetMinimalRole("trait2.command2", &role, nullptr));
   EXPECT_EQ(UserRole::kOwner, role);
 
-  EXPECT_FALSE(manager.GetMinimalRole("trait1.command3", &role, nullptr));
+  EXPECT_FALSE(manager_.GetMinimalRole("trait1.command3", &role, nullptr));
 }
 
-TEST(ComponentManager, AddComponent) {
-  ComponentManagerImpl manager;
+TEST_F(ComponentManagerTest, AddComponent) {
   const char kTraits[] = R"({"trait1": {}, "trait2": {}, "trait3": {}})";
   auto json = CreateDictionaryValue(kTraits);
-  ASSERT_TRUE(manager.LoadTraits(*json, nullptr));
-  EXPECT_TRUE(manager.AddComponent("", "comp1", {"trait1", "trait2"}, nullptr));
-  EXPECT_TRUE(manager.AddComponent("", "comp2", {"trait3"}, nullptr));
+  ASSERT_TRUE(manager_.LoadTraits(*json, nullptr));
+  EXPECT_TRUE(
+      manager_.AddComponent("", "comp1", {"trait1", "trait2"}, nullptr));
+  EXPECT_TRUE(manager_.AddComponent("", "comp2", {"trait3"}, nullptr));
   const char kExpected[] = R"({
     "comp1": {
       "traits": ["trait1", "trait2"]
@@ -461,18 +446,17 @@
       "traits": ["trait3"]
     }
   })";
-  EXPECT_JSON_EQ(kExpected, manager.GetComponents());
+  EXPECT_JSON_EQ(kExpected, manager_.GetComponents());
 
   // 'trait4' is undefined, so can't add a component referring to it.
-  EXPECT_FALSE(manager.AddComponent("", "comp3", {"trait4"}, nullptr));
+  EXPECT_FALSE(manager_.AddComponent("", "comp3", {"trait4"}, nullptr));
 }
 
-TEST(ComponentManager, AddSubComponent) {
-  ComponentManagerImpl manager;
-  EXPECT_TRUE(manager.AddComponent("", "comp1", {}, nullptr));
-  EXPECT_TRUE(manager.AddComponent("comp1", "comp2", {}, nullptr));
-  EXPECT_TRUE(manager.AddComponent("comp1", "comp3", {}, nullptr));
-  EXPECT_TRUE(manager.AddComponent("comp1.comp2", "comp4", {}, nullptr));
+TEST_F(ComponentManagerTest, AddSubComponent) {
+  EXPECT_TRUE(manager_.AddComponent("", "comp1", {}, nullptr));
+  EXPECT_TRUE(manager_.AddComponent("comp1", "comp2", {}, nullptr));
+  EXPECT_TRUE(manager_.AddComponent("comp1", "comp3", {}, nullptr));
+  EXPECT_TRUE(manager_.AddComponent("comp1.comp2", "comp4", {}, nullptr));
   const char kExpected[] = R"({
     "comp1": {
       "traits": [],
@@ -491,23 +475,22 @@
       }
     }
   })";
-  EXPECT_JSON_EQ(kExpected, manager.GetComponents());
+  EXPECT_JSON_EQ(kExpected, manager_.GetComponents());
 }
 
-TEST(ComponentManager, AddComponentArrayItem) {
-  ComponentManagerImpl manager;
+TEST_F(ComponentManagerTest, AddComponentArrayItem) {
   const char kTraits[] = R"({"foo": {}, "bar": {}})";
   auto json = CreateDictionaryValue(kTraits);
-  ASSERT_TRUE(manager.LoadTraits(*json, nullptr));
+  ASSERT_TRUE(manager_.LoadTraits(*json, nullptr));
 
-  EXPECT_TRUE(manager.AddComponent("", "comp1", {}, nullptr));
-  EXPECT_TRUE(manager.AddComponentArrayItem("comp1", "comp2", {"foo"},
-                                            nullptr));
-  EXPECT_TRUE(manager.AddComponentArrayItem("comp1", "comp2", {"bar"},
-                                            nullptr));
-  EXPECT_TRUE(manager.AddComponent("comp1.comp2[1]", "comp3", {}, nullptr));
-  EXPECT_TRUE(manager.AddComponent("comp1.comp2[1].comp3", "comp4", {},
-                                   nullptr));
+  EXPECT_TRUE(manager_.AddComponent("", "comp1", {}, nullptr));
+  EXPECT_TRUE(
+      manager_.AddComponentArrayItem("comp1", "comp2", {"foo"}, nullptr));
+  EXPECT_TRUE(
+      manager_.AddComponentArrayItem("comp1", "comp2", {"bar"}, nullptr));
+  EXPECT_TRUE(manager_.AddComponent("comp1.comp2[1]", "comp3", {}, nullptr));
+  EXPECT_TRUE(
+      manager_.AddComponent("comp1.comp2[1].comp3", "comp4", {}, nullptr));
   const char kExpected[] = R"({
     "comp1": {
       "traits": [],
@@ -533,96 +516,91 @@
       }
     }
   })";
-  EXPECT_JSON_EQ(kExpected, manager.GetComponents());
+  EXPECT_JSON_EQ(kExpected, manager_.GetComponents());
 }
 
-TEST(ComponentManager, AddComponentExist) {
-  ComponentManagerImpl manager;
-  EXPECT_TRUE(manager.AddComponent("", "comp1", {}, nullptr));
-  EXPECT_FALSE(manager.AddComponent("", "comp1", {}, nullptr));
-  EXPECT_TRUE(manager.AddComponent("comp1", "comp2", {}, nullptr));
-  EXPECT_FALSE(manager.AddComponent("comp1", "comp2", {}, nullptr));
+TEST_F(ComponentManagerTest, AddComponentExist) {
+  EXPECT_TRUE(manager_.AddComponent("", "comp1", {}, nullptr));
+  EXPECT_FALSE(manager_.AddComponent("", "comp1", {}, nullptr));
+  EXPECT_TRUE(manager_.AddComponent("comp1", "comp2", {}, nullptr));
+  EXPECT_FALSE(manager_.AddComponent("comp1", "comp2", {}, nullptr));
 }
 
-TEST(ComponentManager, AddComponentDoesNotExist) {
-  ComponentManagerImpl manager;
-  EXPECT_FALSE(manager.AddComponent("comp1", "comp2", {}, nullptr));
+TEST_F(ComponentManagerTest, AddComponentDoesNotExist) {
+  EXPECT_FALSE(manager_.AddComponent("comp1", "comp2", {}, nullptr));
 }
 
-TEST(ComponentManager, AddComponentTreeChangedCallback) {
-  ComponentManagerImpl manager;
+TEST_F(ComponentManagerTest, AddComponentTreeChangedCallback) {
   int count = 0;
   int count2 = 0;
-  manager.AddComponentTreeChangedCallback(base::Bind([&count]() { count++; }));
-  manager.AddComponentTreeChangedCallback(
+  manager_.AddComponentTreeChangedCallback(base::Bind([&count]() { count++; }));
+  manager_.AddComponentTreeChangedCallback(
       base::Bind([&count2]() { count2++; }));
   EXPECT_EQ(1, count);
   EXPECT_EQ(1, count2);
-  EXPECT_TRUE(manager.AddComponent("", "comp1", {}, nullptr));
+  EXPECT_TRUE(manager_.AddComponent("", "comp1", {}, nullptr));
   EXPECT_EQ(2, count);
-  EXPECT_TRUE(manager.AddComponent("comp1", "comp2", {}, nullptr));
+  EXPECT_TRUE(manager_.AddComponent("comp1", "comp2", {}, nullptr));
   EXPECT_EQ(3, count);
-  EXPECT_TRUE(manager.AddComponent("comp1.comp2", "comp4", {}, nullptr));
+  EXPECT_TRUE(manager_.AddComponent("comp1.comp2", "comp4", {}, nullptr));
   EXPECT_EQ(4, count);
-  EXPECT_TRUE(manager.AddComponentArrayItem("comp1", "comp3", {}, nullptr));
+  EXPECT_TRUE(manager_.AddComponentArrayItem("comp1", "comp3", {}, nullptr));
   EXPECT_EQ(5, count);
-  EXPECT_TRUE(manager.AddComponentArrayItem("comp1", "comp3", {}, nullptr));
+  EXPECT_TRUE(manager_.AddComponentArrayItem("comp1", "comp3", {}, nullptr));
   EXPECT_EQ(6, count);
   // Make sure both callbacks were called the same number of times.
   EXPECT_EQ(count2, count);
 }
 
-TEST(ComponentManager, FindComponent) {
-  ComponentManagerImpl manager;
-  CreateTestComponentTree(&manager);
+TEST_F(ComponentManagerTest, FindComponent) {
+  CreateTestComponentTree(&manager_);
 
-  const base::DictionaryValue* comp = manager.FindComponent("comp1", nullptr);
+  const base::DictionaryValue* comp = manager_.FindComponent("comp1", nullptr);
   ASSERT_NE(nullptr, comp);
   EXPECT_TRUE(HasTrait(*comp, "t1"));
 
-  comp = manager.FindComponent("comp1.comp2[0]", nullptr);
+  comp = manager_.FindComponent("comp1.comp2[0]", nullptr);
   ASSERT_NE(nullptr, comp);
   EXPECT_TRUE(HasTrait(*comp, "t2"));
 
-  comp = manager.FindComponent("comp1.comp2[1]", nullptr);
+  comp = manager_.FindComponent("comp1.comp2[1]", nullptr);
   ASSERT_NE(nullptr, comp);
   EXPECT_TRUE(HasTrait(*comp, "t3"));
 
-  comp = manager.FindComponent("comp1.comp2[1].comp3", nullptr);
+  comp = manager_.FindComponent("comp1.comp2[1].comp3", nullptr);
   ASSERT_NE(nullptr, comp);
   EXPECT_TRUE(HasTrait(*comp, "t4"));
 
-  comp = manager.FindComponent("comp1.comp2[1].comp3.comp4", nullptr);
+  comp = manager_.FindComponent("comp1.comp2[1].comp3.comp4", nullptr);
   ASSERT_NE(nullptr, comp);
   EXPECT_TRUE(HasTrait(*comp, "t5"));
 
   // Some whitespaces don't hurt.
-  comp = manager.FindComponent(" comp1 . comp2 [  \t 1 ] .   comp3.comp4 ",
-                               nullptr);
+  comp = manager_.FindComponent(" comp1 . comp2 [  \t 1 ] .   comp3.comp4 ",
+                                nullptr);
   EXPECT_NE(nullptr, comp);
 
   // Now check some failure cases.
   ErrorPtr error;
-  EXPECT_EQ(nullptr, manager.FindComponent("", &error));
+  EXPECT_EQ(nullptr, manager_.FindComponent("", &error));
   EXPECT_NE(nullptr, error.get());
   // 'comp2' doesn't exist:
-  EXPECT_EQ(nullptr, manager.FindComponent("comp2", nullptr));
+  EXPECT_EQ(nullptr, manager_.FindComponent("comp2", nullptr));
   // 'comp1.comp2' is an array, not a component:
-  EXPECT_EQ(nullptr, manager.FindComponent("comp1.comp2", nullptr));
+  EXPECT_EQ(nullptr, manager_.FindComponent("comp1.comp2", nullptr));
   // 'comp1.comp2[3]' doesn't exist:
-  EXPECT_EQ(nullptr, manager.FindComponent("comp1.comp2[3]", nullptr));
+  EXPECT_EQ(nullptr, manager_.FindComponent("comp1.comp2[3]", nullptr));
   // Empty component names:
-  EXPECT_EQ(nullptr, manager.FindComponent(".comp2[1]", nullptr));
-  EXPECT_EQ(nullptr, manager.FindComponent("comp1.[1]", nullptr));
+  EXPECT_EQ(nullptr, manager_.FindComponent(".comp2[1]", nullptr));
+  EXPECT_EQ(nullptr, manager_.FindComponent("comp1.[1]", nullptr));
   // Invalid array indices:
-  EXPECT_EQ(nullptr, manager.FindComponent("comp1.comp2[s]", nullptr));
-  EXPECT_EQ(nullptr, manager.FindComponent("comp1.comp2[-2]", nullptr));
-  EXPECT_EQ(nullptr, manager.FindComponent("comp1.comp2[1e1]", nullptr));
-  EXPECT_EQ(nullptr, manager.FindComponent("comp1.comp2[1", nullptr));
+  EXPECT_EQ(nullptr, manager_.FindComponent("comp1.comp2[s]", nullptr));
+  EXPECT_EQ(nullptr, manager_.FindComponent("comp1.comp2[-2]", nullptr));
+  EXPECT_EQ(nullptr, manager_.FindComponent("comp1.comp2[1e1]", nullptr));
+  EXPECT_EQ(nullptr, manager_.FindComponent("comp1.comp2[1", nullptr));
 }
 
-TEST(ComponentManager, ParseCommandInstance) {
-  ComponentManagerImpl manager;
+TEST_F(ComponentManagerTest, ParseCommandInstance) {
   const char kTraits[] = R"({
     "trait1": {
       "commands": {
@@ -644,9 +622,9 @@
     }
   })";
   auto traits = CreateDictionaryValue(kTraits);
-  ASSERT_TRUE(manager.LoadTraits(*traits, nullptr));
-  ASSERT_TRUE(manager.AddComponent("", "comp1", {"trait1"}, nullptr));
-  ASSERT_TRUE(manager.AddComponent("", "comp2", {"trait2"}, nullptr));
+  ASSERT_TRUE(manager_.LoadTraits(*traits, nullptr));
+  ASSERT_TRUE(manager_.AddComponent("", "comp1", {"trait1"}, nullptr));
+  ASSERT_TRUE(manager_.AddComponent("", "comp2", {"trait2"}, nullptr));
 
   std::string id;
   const char kCommand1[] = R"({
@@ -657,13 +635,15 @@
   })";
   auto command1 = CreateDictionaryValue(kCommand1);
   EXPECT_NE(nullptr,
-            manager.ParseCommandInstance(*command1, Command::Origin::kLocal,
-                                         UserRole::kUser, &id, nullptr).get());
+            manager_.ParseCommandInstance(*command1, Command::Origin::kLocal,
+                                          UserRole::kUser, &id, nullptr)
+                .get());
   EXPECT_EQ("1234-12345", id);
   // Not enough access rights
   EXPECT_EQ(nullptr,
-            manager.ParseCommandInstance(*command1, Command::Origin::kLocal,
-                                         UserRole::kViewer, &id, nullptr).get());
+            manager_.ParseCommandInstance(*command1, Command::Origin::kLocal,
+                                          UserRole::kViewer, &id, nullptr)
+                .get());
 
   const char kCommand2[] = R"({
     "name": "trait1.command3",
@@ -673,8 +653,9 @@
   auto command2 = CreateDictionaryValue(kCommand2);
   // trait1.command3 doesn't exist
   EXPECT_EQ(nullptr,
-            manager.ParseCommandInstance(*command2, Command::Origin::kLocal,
-                                         UserRole::kOwner, &id, nullptr).get());
+            manager_.ParseCommandInstance(*command2, Command::Origin::kLocal,
+                                          UserRole::kOwner, &id, nullptr)
+                .get());
   EXPECT_TRUE(id.empty());
 
   const char kCommand3[] = R"({
@@ -685,8 +666,9 @@
   auto command3 = CreateDictionaryValue(kCommand3);
   // Component comp1 doesn't have trait2.
   EXPECT_EQ(nullptr,
-            manager.ParseCommandInstance(*command3, Command::Origin::kLocal,
-                                         UserRole::kOwner, &id, nullptr).get());
+            manager_.ParseCommandInstance(*command3, Command::Origin::kLocal,
+                                          UserRole::kOwner, &id, nullptr)
+                .get());
 
   // No component specified, find the suitable component
   const char kCommand4[] = R"({
@@ -694,7 +676,7 @@
     "parameters": {}
   })";
   auto command4 = CreateDictionaryValue(kCommand4);
-  auto command_instance = manager.ParseCommandInstance(
+  auto command_instance = manager_.ParseCommandInstance(
       *command4, Command::Origin::kLocal, UserRole::kOwner, &id, nullptr);
   EXPECT_NE(nullptr, command_instance.get());
   EXPECT_EQ("comp1", command_instance->GetComponent());
@@ -704,7 +686,7 @@
     "parameters": {}
   })";
   auto command5 = CreateDictionaryValue(kCommand5);
-  command_instance = manager.ParseCommandInstance(
+  command_instance = manager_.ParseCommandInstance(
       *command5, Command::Origin::kLocal, UserRole::kOwner, &id, nullptr);
   EXPECT_NE(nullptr, command_instance.get());
   EXPECT_EQ("comp2", command_instance->GetComponent());
@@ -716,12 +698,12 @@
   })";
   auto command6 = CreateDictionaryValue(kCommand6);
   EXPECT_EQ(nullptr,
-            manager.ParseCommandInstance(*command6, Command::Origin::kLocal,
-                                         UserRole::kOwner, &id, nullptr).get());
+            manager_.ParseCommandInstance(*command6, Command::Origin::kLocal,
+                                          UserRole::kOwner, &id, nullptr)
+                .get());
 }
 
-TEST(ComponentManager, AddCommand) {
-  ComponentManagerImpl manager;
+TEST_F(ComponentManagerTest, AddCommand) {
   const char kTraits[] = R"({
     "trait1": {
       "commands": {
@@ -730,8 +712,8 @@
     }
   })";
   auto traits = CreateDictionaryValue(kTraits);
-  ASSERT_TRUE(manager.LoadTraits(*traits, nullptr));
-  ASSERT_TRUE(manager.AddComponent("", "comp1", {"trait1"}, nullptr));
+  ASSERT_TRUE(manager_.LoadTraits(*traits, nullptr));
+  ASSERT_TRUE(manager_.AddComponent("", "comp1", {"trait1"}, nullptr));
 
   std::string id;
   const char kCommand[] = R"({
@@ -741,17 +723,16 @@
     "parameters": {}
   })";
   auto command = CreateDictionaryValue(kCommand);
-  auto command_instance = manager.ParseCommandInstance(
+  auto command_instance = manager_.ParseCommandInstance(
       *command, Command::Origin::kLocal, UserRole::kUser, &id, nullptr);
   ASSERT_NE(nullptr, command_instance.get());
-  manager.AddCommand(std::move(command_instance));
-  const auto* queued_command = manager.FindCommand(id);
+  manager_.AddCommand(std::move(command_instance));
+  const auto* queued_command = manager_.FindCommand(id);
   ASSERT_NE(nullptr, queued_command);
   EXPECT_EQ("trait1.command1", queued_command->GetName());
 }
 
-TEST(ComponentManager, AddCommandHandler) {
-  ComponentManagerImpl manager;
+TEST_F(ComponentManagerTest, AddCommandHandler) {
   const char kTraits[] = R"({
     "trait1": {
       "commands": {
@@ -765,9 +746,10 @@
     }
   })";
   auto traits = CreateDictionaryValue(kTraits);
-  ASSERT_TRUE(manager.LoadTraits(*traits, nullptr));
-  ASSERT_TRUE(manager.AddComponent("", "comp1", {"trait1"}, nullptr));
-  ASSERT_TRUE(manager.AddComponent("", "comp2", {"trait1", "trait2"}, nullptr));
+  ASSERT_TRUE(manager_.LoadTraits(*traits, nullptr));
+  ASSERT_TRUE(manager_.AddComponent("", "comp1", {"trait1"}, nullptr));
+  ASSERT_TRUE(
+      manager_.AddComponent("", "comp2", {"trait1", "trait2"}, nullptr));
 
   std::string last_tags;
   auto handler = [&last_tags](int tag, const std::weak_ptr<Command>& command) {
@@ -776,9 +758,12 @@
     last_tags += std::to_string(tag);
   };
 
-  manager.AddCommandHandler("comp1", "trait1.command1", base::Bind(handler, 1));
-  manager.AddCommandHandler("comp2", "trait1.command1", base::Bind(handler, 2));
-  manager.AddCommandHandler("comp2", "trait2.command2", base::Bind(handler, 3));
+  manager_.AddCommandHandler("comp1", "trait1.command1",
+                             base::Bind(handler, 1));
+  manager_.AddCommandHandler("comp2", "trait1.command1",
+                             base::Bind(handler, 2));
+  manager_.AddCommandHandler("comp2", "trait2.command2",
+                             base::Bind(handler, 3));
   EXPECT_TRUE(last_tags.empty());
 
   const char kCommand1[] = R"({
@@ -786,10 +771,10 @@
     "component": "comp1"
   })";
   auto command1 = CreateDictionaryValue(kCommand1);
-  auto command_instance = manager.ParseCommandInstance(
+  auto command_instance = manager_.ParseCommandInstance(
       *command1, Command::Origin::kCloud, UserRole::kUser, nullptr, nullptr);
   ASSERT_NE(nullptr, command_instance.get());
-  manager.AddCommand(std::move(command_instance));
+  manager_.AddCommand(std::move(command_instance));
   EXPECT_EQ("1", last_tags);
   last_tags.clear();
 
@@ -798,10 +783,10 @@
     "component": "comp2"
   })";
   auto command2 = CreateDictionaryValue(kCommand2);
-  command_instance = manager.ParseCommandInstance(
+  command_instance = manager_.ParseCommandInstance(
       *command2, Command::Origin::kCloud, UserRole::kUser, nullptr, nullptr);
   ASSERT_NE(nullptr, command_instance.get());
-  manager.AddCommand(std::move(command_instance));
+  manager_.AddCommand(std::move(command_instance));
   EXPECT_EQ("2", last_tags);
   last_tags.clear();
 
@@ -811,16 +796,15 @@
     "parameters": {}
   })";
   auto command3 = CreateDictionaryValue(kCommand3);
-  command_instance = manager.ParseCommandInstance(
+  command_instance = manager_.ParseCommandInstance(
       *command3, Command::Origin::kCloud, UserRole::kUser, nullptr, nullptr);
   ASSERT_NE(nullptr, command_instance.get());
-  manager.AddCommand(std::move(command_instance));
+  manager_.AddCommand(std::move(command_instance));
   EXPECT_EQ("3", last_tags);
   last_tags.clear();
 }
 
-TEST(ComponentManager, AddDefaultCommandHandler) {
-  ComponentManagerImpl manager;
+TEST_F(ComponentManagerTest, AddDefaultCommandHandler) {
   const char kTraits[] = R"({
     "trait1": {
       "commands": {
@@ -834,15 +818,15 @@
     }
   })";
   auto traits = CreateDictionaryValue(kTraits);
-  ASSERT_TRUE(manager.LoadTraits(*traits, nullptr));
-  ASSERT_TRUE(manager.AddComponent("", "comp", {"trait1", "trait2"}, nullptr));
+  ASSERT_TRUE(manager_.LoadTraits(*traits, nullptr));
+  ASSERT_TRUE(manager_.AddComponent("", "comp", {"trait1", "trait2"}, nullptr));
 
   int count = 0;
   auto handler = [&count](int tag, const std::weak_ptr<Command>& command) {
     count++;
   };
 
-  manager.AddCommandHandler("", "", base::Bind(handler, 1));
+  manager_.AddCommandHandler("", "", base::Bind(handler, 1));
   EXPECT_EQ(0, count);
 
   const char kCommand1[] = R"({
@@ -850,10 +834,10 @@
     "component": "comp"
   })";
   auto command1 = CreateDictionaryValue(kCommand1);
-  auto command_instance = manager.ParseCommandInstance(
+  auto command_instance = manager_.ParseCommandInstance(
       *command1, Command::Origin::kCloud, UserRole::kUser, nullptr, nullptr);
   ASSERT_NE(nullptr, command_instance.get());
-  manager.AddCommand(std::move(command_instance));
+  manager_.AddCommand(std::move(command_instance));
   EXPECT_EQ(1, count);
 
   const char kCommand2[] = R"({
@@ -861,20 +845,19 @@
     "component": "comp"
   })";
   auto command2 = CreateDictionaryValue(kCommand2);
-  command_instance = manager.ParseCommandInstance(
+  command_instance = manager_.ParseCommandInstance(
       *command2, Command::Origin::kCloud, UserRole::kUser, nullptr, nullptr);
   ASSERT_NE(nullptr, command_instance.get());
-  manager.AddCommand(std::move(command_instance));
+  manager_.AddCommand(std::move(command_instance));
   EXPECT_EQ(2, count);
 }
 
-TEST(ComponentManager, SetStateProperties) {
-  ComponentManagerImpl manager;
-  CreateTestComponentTree(&manager);
+TEST_F(ComponentManagerTest, SetStateProperties) {
+  CreateTestComponentTree(&manager_);
 
   const char kState1[] = R"({"t1": {"p1": 0, "p2": "foo"}})";
   auto state1 = CreateDictionaryValue(kState1);
-  ASSERT_TRUE(manager.SetStateProperties("comp1", *state1, nullptr));
+  ASSERT_TRUE(manager_.SetStateProperties("comp1", *state1, nullptr));
   const char kExpected1[] = R"({
     "comp1": {
       "traits": [ "t1" ],
@@ -901,11 +884,11 @@
       }
     }
   })";
-  EXPECT_JSON_EQ(kExpected1, manager.GetComponents());
+  EXPECT_JSON_EQ(kExpected1, manager_.GetComponents());
 
   const char kState2[] = R"({"t1": {"p1": {"bar": "baz"}}})";
   auto state2 = CreateDictionaryValue(kState2);
-  ASSERT_TRUE(manager.SetStateProperties("comp1", *state2, nullptr));
+  ASSERT_TRUE(manager_.SetStateProperties("comp1", *state2, nullptr));
 
   const char kExpected2[] = R"({
     "comp1": {
@@ -933,12 +916,12 @@
       }
     }
   })";
-  EXPECT_JSON_EQ(kExpected2, manager.GetComponents());
+  EXPECT_JSON_EQ(kExpected2, manager_.GetComponents());
 
   const char kState3[] = R"({"t5": {"p1": 1}})";
   auto state3 = CreateDictionaryValue(kState3);
-  ASSERT_TRUE(manager.SetStateProperties("comp1.comp2[1].comp3.comp4", *state3,
-                                         nullptr));
+  ASSERT_TRUE(manager_.SetStateProperties("comp1.comp2[1].comp3.comp4", *state3,
+                                          nullptr));
 
   const char kExpected3[] = R"({
     "comp1": {
@@ -967,14 +950,13 @@
       }
     }
   })";
-  EXPECT_JSON_EQ(kExpected3, manager.GetComponents());
+  EXPECT_JSON_EQ(kExpected3, manager_.GetComponents());
 }
 
-TEST(ComponentManager, SetStatePropertiesFromJson) {
-  ComponentManagerImpl manager;
-  CreateTestComponentTree(&manager);
+TEST_F(ComponentManagerTest, SetStatePropertiesFromJson) {
+  CreateTestComponentTree(&manager_);
 
-  ASSERT_TRUE(manager.SetStatePropertiesFromJson(
+  ASSERT_TRUE(manager_.SetStatePropertiesFromJson(
       "comp1.comp2[1].comp3.comp4", R"({"t5": {"p1": 3}, "t6": {"p2": 5}})",
       nullptr));
 
@@ -1007,11 +989,10 @@
       }
     }
   })";
-  EXPECT_JSON_EQ(kExpected, manager.GetComponents());
+  EXPECT_JSON_EQ(kExpected, manager_.GetComponents());
 }
 
-TEST(ComponentManager, SetGetStateProperty) {
-  ComponentManagerImpl manager;
+TEST_F(ComponentManagerTest, SetGetStateProperty) {
   const char kTraits[] = R"({
     "trait1": {
       "state": {
@@ -1027,11 +1008,12 @@
     }
   })";
   auto traits = CreateDictionaryValue(kTraits);
-  ASSERT_TRUE(manager.LoadTraits(*traits, nullptr));
-  ASSERT_TRUE(manager.AddComponent("", "comp1", {"trait1", "trait2"}, nullptr));
+  ASSERT_TRUE(manager_.LoadTraits(*traits, nullptr));
+  ASSERT_TRUE(
+      manager_.AddComponent("", "comp1", {"trait1", "trait2"}, nullptr));
 
   base::StringValue p1("foo");
-  ASSERT_TRUE(manager.SetStateProperty("comp1", "trait1.prop1", p1, nullptr));
+  ASSERT_TRUE(manager_.SetStateProperty("comp1", "trait1.prop1", p1, nullptr));
 
   const char kExpected1[] = R"({
     "comp1": {
@@ -1041,10 +1023,10 @@
       }
     }
   })";
-  EXPECT_JSON_EQ(kExpected1, manager.GetComponents());
+  EXPECT_JSON_EQ(kExpected1, manager_.GetComponents());
 
   base::FundamentalValue p2(2);
-  ASSERT_TRUE(manager.SetStateProperty("comp1", "trait2.prop3", p2, nullptr));
+  ASSERT_TRUE(manager_.SetStateProperty("comp1", "trait2.prop3", p2, nullptr));
 
   const char kExpected2[] = R"({
     "comp1": {
@@ -1055,29 +1037,27 @@
       }
     }
   })";
-  EXPECT_JSON_EQ(kExpected2, manager.GetComponents());
+  EXPECT_JSON_EQ(kExpected2, manager_.GetComponents());
   // Just the package name without property:
-  EXPECT_FALSE(manager.SetStateProperty("comp1", "trait2", p2, nullptr));
+  EXPECT_FALSE(manager_.SetStateProperty("comp1", "trait2", p2, nullptr));
 
-  const base::Value* value = manager.GetStateProperty("comp1", "trait1.prop1",
-                                                      nullptr);
+  const base::Value* value =
+      manager_.GetStateProperty("comp1", "trait1.prop1", nullptr);
   ASSERT_NE(nullptr, value);
   EXPECT_TRUE(p1.Equals(value));
-  value = manager.GetStateProperty("comp1", "trait2.prop3", nullptr);
+  value = manager_.GetStateProperty("comp1", "trait2.prop3", nullptr);
   ASSERT_NE(nullptr, value);
   EXPECT_TRUE(p2.Equals(value));
 
   // Non-existing property:
-  EXPECT_EQ(nullptr, manager.GetStateProperty("comp1", "trait2.p", nullptr));
+  EXPECT_EQ(nullptr, manager_.GetStateProperty("comp1", "trait2.p", nullptr));
   // Non-existing component
-  EXPECT_EQ(nullptr, manager.GetStateProperty("comp2", "trait.prop", nullptr));
+  EXPECT_EQ(nullptr, manager_.GetStateProperty("comp2", "trait.prop", nullptr));
   // Just the package name without property:
-  EXPECT_EQ(nullptr, manager.GetStateProperty("comp1", "trait2", nullptr));
+  EXPECT_EQ(nullptr, manager_.GetStateProperty("comp1", "trait2", nullptr));
 }
 
-TEST(ComponentManager, AddStateChangedCallback) {
-  SimpleTestClock clock;
-  ComponentManagerImpl manager{&clock};
+TEST_F(ComponentManagerTest, AddStateChangedCallback) {
   const char kTraits[] = R"({
     "trait1": {
       "state": {
@@ -1087,38 +1067,36 @@
     }
   })";
   auto traits = CreateDictionaryValue(kTraits);
-  ASSERT_TRUE(manager.LoadTraits(*traits, nullptr));
-  ASSERT_TRUE(manager.AddComponent("", "comp1", {"trait1"}, nullptr));
+  ASSERT_TRUE(manager_.LoadTraits(*traits, nullptr));
+  ASSERT_TRUE(manager_.AddComponent("", "comp1", {"trait1"}, nullptr));
 
   int count = 0;
   int count2 = 0;
-  manager.AddStateChangedCallback(base::Bind([&count]() { count++; }));
-  manager.AddStateChangedCallback(base::Bind([&count2]() { count2++; }));
+  manager_.AddStateChangedCallback(base::Bind([&count]() { count++; }));
+  manager_.AddStateChangedCallback(base::Bind([&count2]() { count2++; }));
   EXPECT_EQ(1, count);
   EXPECT_EQ(1, count2);
-  EXPECT_EQ(0, manager.GetLastStateChangeId());
+  EXPECT_EQ(0, manager_.GetLastStateChangeId());
 
   base::StringValue p1("foo");
-  ASSERT_TRUE(manager.SetStateProperty("comp1", "trait1.prop1", p1, nullptr));
+  ASSERT_TRUE(manager_.SetStateProperty("comp1", "trait1.prop1", p1, nullptr));
   EXPECT_EQ(2, count);
   EXPECT_EQ(2, count2);
-  EXPECT_EQ(1, manager.GetLastStateChangeId());
+  EXPECT_EQ(1, manager_.GetLastStateChangeId());
 
-  ASSERT_TRUE(manager.SetStateProperty("comp1", "trait1.prop2", p1, nullptr));
+  ASSERT_TRUE(manager_.SetStateProperty("comp1", "trait1.prop2", p1, nullptr));
   EXPECT_EQ(3, count);
   EXPECT_EQ(3, count2);
-  EXPECT_EQ(2, manager.GetLastStateChangeId());
+  EXPECT_EQ(2, manager_.GetLastStateChangeId());
 
   // Fail - no component.
-  ASSERT_FALSE(manager.SetStateProperty("comp2", "trait1.prop2", p1, nullptr));
+  ASSERT_FALSE(manager_.SetStateProperty("comp2", "trait1.prop2", p1, nullptr));
   EXPECT_EQ(3, count);
   EXPECT_EQ(3, count2);
-  EXPECT_EQ(2, manager.GetLastStateChangeId());
+  EXPECT_EQ(2, manager_.GetLastStateChangeId());
 }
 
-TEST(ComponentManager, ComponentStateUpdates) {
-  SimpleTestClock clock;
-  ComponentManagerImpl manager{&clock};
+TEST_F(ComponentManagerTest, ComponentStateUpdates) {
   const char kTraits[] = R"({
     "trait1": {
       "state": {
@@ -1134,48 +1112,50 @@
     }
   })";
   auto traits = CreateDictionaryValue(kTraits);
-  ASSERT_TRUE(manager.LoadTraits(*traits, nullptr));
-  ASSERT_TRUE(manager.AddComponent("", "comp1", {"trait1", "trait2"}, nullptr));
-  ASSERT_TRUE(manager.AddComponent("", "comp2", {"trait1", "trait2"}, nullptr));
+  ASSERT_TRUE(manager_.LoadTraits(*traits, nullptr));
+  ASSERT_TRUE(
+      manager_.AddComponent("", "comp1", {"trait1", "trait2"}, nullptr));
+  ASSERT_TRUE(
+      manager_.AddComponent("", "comp2", {"trait1", "trait2"}, nullptr));
 
   std::vector<ComponentManager::UpdateID> updates1;
   auto callback1 = [&updates1](ComponentManager::UpdateID id) {
     updates1.push_back(id);
   };
   // State change queue is empty, callback should be called immediately.
-  auto token1 = manager.AddServerStateUpdatedCallback(base::Bind(callback1));
+  auto token1 = manager_.AddServerStateUpdatedCallback(base::Bind(callback1));
   ASSERT_EQ(1u, updates1.size());
-  EXPECT_EQ(manager.GetLastStateChangeId(), updates1.front());
+  EXPECT_EQ(manager_.GetLastStateChangeId(), updates1.front());
   updates1.clear();
 
   base::StringValue foo("foo");
   base::Time time1 = base::Time::Now();
-  clock.SetNow(time1);
+  EXPECT_CALL(clock_, Now()).WillRepeatedly(Return(time1));
   // These three updates should be grouped into two separate state change queue
   // items, since they all happen at the same time, but for two different
   // components.
-  ASSERT_TRUE(manager.SetStateProperty("comp1", "trait1.prop1", foo, nullptr));
-  ASSERT_TRUE(manager.SetStateProperty("comp2", "trait2.prop3", foo, nullptr));
-  ASSERT_TRUE(manager.SetStateProperty("comp1", "trait1.prop2", foo, nullptr));
+  ASSERT_TRUE(manager_.SetStateProperty("comp1", "trait1.prop1", foo, nullptr));
+  ASSERT_TRUE(manager_.SetStateProperty("comp2", "trait2.prop3", foo, nullptr));
+  ASSERT_TRUE(manager_.SetStateProperty("comp1", "trait1.prop2", foo, nullptr));
 
   std::vector<ComponentManager::UpdateID> updates2;
   auto callback2 = [&updates2](ComponentManager::UpdateID id) {
     updates2.push_back(id);
   };
   // State change queue is not empty, so callback will be called later.
-  auto token2 = manager.AddServerStateUpdatedCallback(base::Bind(callback2));
+  auto token2 = manager_.AddServerStateUpdatedCallback(base::Bind(callback2));
   EXPECT_TRUE(updates2.empty());
 
   base::StringValue bar("bar");
   base::Time time2 = time1 + base::TimeDelta::FromSeconds(1);
-  clock.SetNow(time2);
+  EXPECT_CALL(clock_, Now()).WillRepeatedly(Return(time2));
   // Two more update events (as above) but at |time2|.
-  ASSERT_TRUE(manager.SetStateProperty("comp1", "trait1.prop1", bar, nullptr));
-  ASSERT_TRUE(manager.SetStateProperty("comp2", "trait2.prop3", bar, nullptr));
-  ASSERT_TRUE(manager.SetStateProperty("comp1", "trait1.prop2", bar, nullptr));
+  ASSERT_TRUE(manager_.SetStateProperty("comp1", "trait1.prop1", bar, nullptr));
+  ASSERT_TRUE(manager_.SetStateProperty("comp2", "trait2.prop3", bar, nullptr));
+  ASSERT_TRUE(manager_.SetStateProperty("comp1", "trait1.prop2", bar, nullptr));
 
-  auto snapshot = manager.GetAndClearRecordedStateChanges();
-  EXPECT_EQ(manager.GetLastStateChangeId(), snapshot.update_id);
+  auto snapshot = manager_.GetAndClearRecordedStateChanges();
+  EXPECT_EQ(manager_.GetLastStateChangeId(), snapshot.update_id);
   ASSERT_EQ(4u, snapshot.state_changes.size());
 
   EXPECT_EQ("comp1", snapshot.state_changes[0].component);
@@ -1199,38 +1179,37 @@
                  *snapshot.state_changes[3].changed_properties);
 
   // Make sure previous GetAndClearRecordedStateChanges() clears the queue.
-  auto snapshot2 = manager.GetAndClearRecordedStateChanges();
-  EXPECT_EQ(manager.GetLastStateChangeId(), snapshot2.update_id);
+  auto snapshot2 = manager_.GetAndClearRecordedStateChanges();
+  EXPECT_EQ(manager_.GetLastStateChangeId(), snapshot2.update_id);
   EXPECT_TRUE(snapshot2.state_changes.empty());
 
   // Now indicate that we have update the changes on the server.
-  manager.NotifyStateUpdatedOnServer(snapshot.update_id);
+  manager_.NotifyStateUpdatedOnServer(snapshot.update_id);
   ASSERT_EQ(1u, updates1.size());
   EXPECT_EQ(snapshot.update_id, updates1.front());
   ASSERT_EQ(1u, updates2.size());
   EXPECT_EQ(snapshot.update_id, updates2.front());
 }
 
-TEST(ComponentManager, FindComponentWithTrait) {
-  ComponentManagerImpl manager;
+TEST_F(ComponentManagerTest, FindComponentWithTrait) {
   const char kTraits[] = R"({
     "trait1": {},
     "trait2": {},
     "trait3": {}
   })";
   auto traits = CreateDictionaryValue(kTraits);
-  ASSERT_TRUE(manager.LoadTraits(*traits, nullptr));
-  ASSERT_TRUE(manager.AddComponent("", "comp1", {"trait1", "trait2"}, nullptr));
-  ASSERT_TRUE(manager.AddComponent("", "comp2", {"trait3"}, nullptr));
+  ASSERT_TRUE(manager_.LoadTraits(*traits, nullptr));
+  ASSERT_TRUE(
+      manager_.AddComponent("", "comp1", {"trait1", "trait2"}, nullptr));
+  ASSERT_TRUE(manager_.AddComponent("", "comp2", {"trait3"}, nullptr));
 
-  EXPECT_EQ("comp1", manager.FindComponentWithTrait("trait1"));
-  EXPECT_EQ("comp1", manager.FindComponentWithTrait("trait2"));
-  EXPECT_EQ("comp2", manager.FindComponentWithTrait("trait3"));
-  EXPECT_EQ("", manager.FindComponentWithTrait("trait4"));
+  EXPECT_EQ("comp1", manager_.FindComponentWithTrait("trait1"));
+  EXPECT_EQ("comp1", manager_.FindComponentWithTrait("trait2"));
+  EXPECT_EQ("comp2", manager_.FindComponentWithTrait("trait3"));
+  EXPECT_EQ("", manager_.FindComponentWithTrait("trait4"));
 }
 
-TEST(ComponentManager, AddLegacyCommandAndStateDefinitions) {
-  ComponentManagerImpl manager;
+TEST_F(ComponentManagerTest, AddLegacyCommandAndStateDefinitions) {
   const char kCommandDefs1[] = R"({
     "package1": {
       "command1": {
@@ -1248,7 +1227,7 @@
     }
   })";
   auto json = CreateDictionaryValue(kCommandDefs1);
-  EXPECT_TRUE(manager.AddLegacyCommandDefinitions(*json, nullptr));
+  EXPECT_TRUE(manager_.AddLegacyCommandDefinitions(*json, nullptr));
   const char kExpected1[] = R"({
     "package1": {
       "commands": {
@@ -1269,11 +1248,11 @@
       }
     }
   })";
-  EXPECT_JSON_EQ(kExpected1, manager.GetTraits());
+  EXPECT_JSON_EQ(kExpected1, manager_.GetTraits());
   const char kExpectedComponents1[] = R"({
     "__weave__": { "traits": ["package1", "package2"] }
   })";
-  EXPECT_JSON_EQ(kExpectedComponents1, manager.GetComponents());
+  EXPECT_JSON_EQ(kExpectedComponents1, manager_.GetComponents());
 
   const char kCommandDefs2[] = R"({
     "package2": {
@@ -1285,7 +1264,7 @@
     }
   })";
   json = CreateDictionaryValue(kCommandDefs2);
-  EXPECT_TRUE(manager.AddLegacyCommandDefinitions(*json, nullptr));
+  EXPECT_TRUE(manager_.AddLegacyCommandDefinitions(*json, nullptr));
   const char kExpected2[] = R"({
     "package1": {
       "commands": {
@@ -1313,14 +1292,14 @@
       }
     }
   })";
-  EXPECT_JSON_EQ(kExpected2, manager.GetTraits());
+  EXPECT_JSON_EQ(kExpected2, manager_.GetTraits());
   const char kExpectedComponents2[] = R"({
     "__weave__": { "traits": ["package1", "package2", "package3"] }
   })";
-  EXPECT_JSON_EQ(kExpectedComponents2, manager.GetComponents());
+  EXPECT_JSON_EQ(kExpectedComponents2, manager_.GetComponents());
 
   // Redefining existing commands.
-  EXPECT_FALSE(manager.AddLegacyCommandDefinitions(*json, nullptr));
+  EXPECT_FALSE(manager_.AddLegacyCommandDefinitions(*json, nullptr));
 
   const char kStateDefs1[] = R"({
     "package1": {
@@ -1333,11 +1312,11 @@
     }
   })";
   json = CreateDictionaryValue(kStateDefs1);
-  EXPECT_TRUE(manager.AddLegacyStateDefinitions(*json, nullptr));
+  EXPECT_TRUE(manager_.AddLegacyStateDefinitions(*json, nullptr));
   const char kExpectedComponents3[] = R"({
     "__weave__": { "traits": ["package1", "package2", "package3", "package4"] }
   })";
-  EXPECT_JSON_EQ(kExpectedComponents3, manager.GetComponents());
+  EXPECT_JSON_EQ(kExpectedComponents3, manager_.GetComponents());
 
   const char kExpected3[] = R"({
     "package1": {
@@ -1376,14 +1355,14 @@
       }
     }
   })";
-  EXPECT_JSON_EQ(kExpected3, manager.GetTraits());
+  EXPECT_JSON_EQ(kExpected3, manager_.GetTraits());
   const char kExpectedComponents4[] = R"({
     "__weave__": { "traits": ["package1", "package2", "package3", "package4"] }
   })";
-  EXPECT_JSON_EQ(kExpectedComponents4, manager.GetComponents());
+  EXPECT_JSON_EQ(kExpectedComponents4, manager_.GetComponents());
 
   // Redefining existing commands.
-  EXPECT_FALSE(manager.AddLegacyStateDefinitions(*json, nullptr));
+  EXPECT_FALSE(manager_.AddLegacyStateDefinitions(*json, nullptr));
 
   const char kExpected4[] = R"({
     "package1": {
@@ -1406,11 +1385,10 @@
       "command2": { "minimalRole": "owner" }
     }
   })";
-  EXPECT_JSON_EQ(kExpected4, manager.GetLegacyCommandDefinitions());
+  EXPECT_JSON_EQ(kExpected4, manager_.GetLegacyCommandDefinitions());
 }
 
-TEST(ComponentManager, GetLegacyState) {
-  ComponentManagerImpl manager;
+TEST_F(ComponentManagerTest, GetLegacyState) {
   const char kTraits[] = R"({
     "trait1": {
       "state": {
@@ -1426,13 +1404,13 @@
     }
   })";
   auto traits = CreateDictionaryValue(kTraits);
-  ASSERT_TRUE(manager.LoadTraits(*traits, nullptr));
-  ASSERT_TRUE(manager.AddComponent("", "comp1", {"trait1"}, nullptr));
-  ASSERT_TRUE(manager.AddComponent("", "comp2", {"trait2"}, nullptr));
+  ASSERT_TRUE(manager_.LoadTraits(*traits, nullptr));
+  ASSERT_TRUE(manager_.AddComponent("", "comp1", {"trait1"}, nullptr));
+  ASSERT_TRUE(manager_.AddComponent("", "comp2", {"trait2"}, nullptr));
 
-  ASSERT_TRUE(manager.SetStatePropertiesFromJson(
+  ASSERT_TRUE(manager_.SetStatePropertiesFromJson(
       "comp1", R"({"trait1": {"prop1": "foo", "prop2": "bar"}})", nullptr));
-  ASSERT_TRUE(manager.SetStatePropertiesFromJson(
+  ASSERT_TRUE(manager_.SetStatePropertiesFromJson(
       "comp2", R"({"trait2": {"prop3": "baz", "prop4": "quux"}})", nullptr));
 
   const char kExpected[] = R"({
@@ -1445,10 +1423,10 @@
       "prop4": "quux"
     }
   })";
-  EXPECT_JSON_EQ(kExpected, manager.GetLegacyState());
+  EXPECT_JSON_EQ(kExpected, manager_.GetLegacyState());
 }
 
-TEST(ComponentManager, TestMockComponentManager) {
+TEST_F(ComponentManagerTest, TestMockComponentManager) {
   // Check that all the virtual methods are mocked out.
   MockComponentManager mock;
 }
diff --git a/src/test/mock_clock.h b/src/test/mock_clock.h
new file mode 100644
index 0000000..f1a2260
--- /dev/null
+++ b/src/test/mock_clock.h
@@ -0,0 +1,22 @@
+// Copyright 2015 The Weave Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef LIBWEAVE_SRC_TEST_MOCK_CLOCK_H_
+#define LIBWEAVE_SRC_TEST_MOCK_CLOCK_H_
+
+#include <base/time/clock.h>
+#include <gmock/gmock.h>
+
+namespace weave {
+namespace test {
+
+class MockClock : public base::Clock {
+ public:
+  MOCK_METHOD0(Now, base::Time());
+};
+
+}  // namespace test
+}  // namespace weave
+
+#endif  // LIBWEAVE_SRC_TEST_MOCK_CLOCK_H_