diff --git a/buffet/commands/command_manager_unittest.cc b/buffet/commands/command_manager_unittest.cc
index c40f2dc..2d4fed8 100644
--- a/buffet/commands/command_manager_unittest.cc
+++ b/buffet/commands/command_manager_unittest.cc
@@ -5,6 +5,7 @@
 #include "buffet/commands/command_manager.h"
 
 #include <base/files/file_util.h>
+#include <base/files/scoped_temp_dir.h>
 #include <base/json/json_writer.h>
 #include <gtest/gtest.h>
 
@@ -12,15 +13,60 @@
 
 using buffet::unittests::CreateDictionaryValue;
 
-static base::FilePath SaveJsonToTempFile(const base::DictionaryValue& dict) {
+namespace {
+
+const char kTestBaseCommands[] = R"({
+  'base': {
+    'reboot': {
+      'parameters': {'delay': 'integer'},
+      'results': {}
+    },
+    'shutdown': {
+      'parameters': {},
+      'results': {}
+    }
+  }
+})";
+
+const char kTestVendorCommands[] = R"({
+  'robot': {
+    '_jump': {
+      'parameters': {'height': 'integer'},
+      'results': {}
+    },
+    '_speak': {
+      'parameters': {'phrase': 'string'},
+      'results': {}
+    }
+  }
+})";
+
+const char kTestTestCommands[] = R"({
+  'test': {
+    '_yo': {
+      'parameters': {'name': 'string'},
+      'results': {}
+    }
+  }
+})";
+
+static void SaveJsonToFile(const base::DictionaryValue& dict,
+                           const base::FilePath& file_path) {
   std::string json;
   base::JSONWriter::Write(&dict, &json);
+  const int bytes_to_write = static_cast<int>(json.size());
+  CHECK_EQ(bytes_to_write, WriteFile(file_path, json.data(), bytes_to_write));
+}
+
+static base::FilePath SaveJsonToTempFile(const base::DictionaryValue& dict) {
   base::FilePath temp_file;
   base::CreateTemporaryFile(&temp_file);
-  base::WriteFile(temp_file, json.data(), static_cast<int>(json.size()));
+  SaveJsonToFile(dict, temp_file);
   return temp_file;
 }
 
+}  // namespace
+
 TEST(CommandManager, Empty) {
   buffet::CommandManager manager;
   EXPECT_TRUE(manager.GetCommandDictionary().IsEmpty());
@@ -28,35 +74,13 @@
 
 TEST(CommandManager, LoadBaseCommandsJSON) {
   buffet::CommandManager manager;
-  auto json = CreateDictionaryValue(R"({
-    'base': {
-      'reboot': {
-        'parameters': {'delay': 'integer'},
-        'results': {}
-      },
-      'shutdown': {
-        'parameters': {},
-        'results': {}
-      }
-    }
-  })");
+  auto json = CreateDictionaryValue(kTestBaseCommands);
   EXPECT_TRUE(manager.LoadBaseCommands(*json, nullptr));
 }
 
 TEST(CommandManager, LoadBaseCommandsFile) {
   buffet::CommandManager manager;
-  auto json = CreateDictionaryValue(R"({
-    'base': {
-      'reboot': {
-        'parameters': {'delay': 'integer'},
-        'results': {}
-      },
-      'shutdown': {
-        'parameters': {},
-        'results': {}
-      }
-    }
-  })");
+  auto json = CreateDictionaryValue(kTestBaseCommands);
   base::FilePath temp_file = SaveJsonToTempFile(*json);
   EXPECT_TRUE(manager.LoadBaseCommands(temp_file, nullptr));
   base::DeleteFile(temp_file, false);
@@ -64,18 +88,7 @@
 
 TEST(CommandManager, LoadCommandsJSON) {
   buffet::CommandManager manager;
-  auto json = CreateDictionaryValue(R"({
-    'robot': {
-      '_jump': {
-        'parameters': {'height': 'integer'},
-        'results': {}
-      },
-      '_speak': {
-        'parameters': {'phrase': 'string'},
-        'results': {}
-      }
-    }
-  })");
+  auto json = CreateDictionaryValue(kTestVendorCommands);
   EXPECT_TRUE(manager.LoadCommands(*json, "category", nullptr));
 }
 
@@ -117,3 +130,29 @@
   EXPECT_NE(nullptr, manager.GetCommandDictionary().FindCommand("base.reboot"));
   EXPECT_NE(nullptr, manager.GetCommandDictionary().FindCommand("robot._jump"));
 }
+
+TEST(CommandManager, ShouldLoadStandardAndTestDefinitions) {
+  buffet::CommandManager manager;
+  base::ScopedTempDir temp;
+  CHECK(temp.CreateUniqueTempDir());
+  base::FilePath base_path{temp.path().Append("base_defs")};
+  base::FilePath test_path{temp.path().Append("test_defs")};
+  base::FilePath base_commands_path{base_path.Append("commands")};
+  base::FilePath test_commands_path{test_path.Append("commands")};
+  CHECK(CreateDirectory(base_commands_path));
+  CHECK(CreateDirectory(test_commands_path));
+  SaveJsonToFile(*CreateDictionaryValue(kTestBaseCommands),
+                 base_path.Append("gcd.json"));
+  SaveJsonToFile(*CreateDictionaryValue(kTestVendorCommands),
+                 base_commands_path.Append("category.json"));
+  SaveJsonToFile(*CreateDictionaryValue(kTestTestCommands),
+                 test_commands_path.Append("test.json"));
+  manager.Startup(base_path, test_path);
+  EXPECT_EQ(3, manager.GetCommandDictionary().GetSize());
+  EXPECT_NE(nullptr,
+            manager.GetCommandDictionary().FindCommand("robot._jump"));
+  EXPECT_NE(nullptr,
+            manager.GetCommandDictionary().FindCommand("robot._speak"));
+  EXPECT_NE(nullptr,
+            manager.GetCommandDictionary().FindCommand("test._yo"));
+}
