buffet: Allow tests to pass in a path to search for command definitions
This allows us to dynamically generate commands to test Buffet with at
runtime. The read only nature of the file system makes this difficult
with just the statically configured files.
BUG=brillo:172
TEST=unittests, buffet_Registration passes with this change.
Change-Id: I54a92edadbb5c8a5ebad63b8464d87bb21ba5aa2
Reviewed-on: https://chromium-review.googlesource.com/249440
Tested-by: Christopher Wiley <wiley@chromium.org>
Reviewed-by: Alex Vakulenko <avakulenko@chromium.org>
Commit-Queue: Christopher Wiley <wiley@chromium.org>
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"));
+}