|  | // 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. | 
|  |  | 
|  | #include "src/commands/command_dictionary.h" | 
|  |  | 
|  | #include <gtest/gtest.h> | 
|  | #include <weave/test/unittest_utils.h> | 
|  |  | 
|  | namespace weave { | 
|  |  | 
|  | using test::CreateDictionaryValue; | 
|  | using test::IsEqualValue; | 
|  |  | 
|  | TEST(CommandDictionary, Empty) { | 
|  | CommandDictionary dict; | 
|  | EXPECT_TRUE(dict.IsEmpty()); | 
|  | EXPECT_EQ(nullptr, dict.FindCommand("robot.jump")); | 
|  | } | 
|  |  | 
|  | TEST(CommandDictionary, LoadCommands) { | 
|  | auto json = CreateDictionaryValue(R"({ | 
|  | 'robot': { | 
|  | 'jump': { | 
|  | 'minimalRole': 'manager', | 
|  | 'parameters': { | 
|  | 'height': 'integer', | 
|  | '_jumpType': ['_withAirFlip', '_withSpin', '_withKick'] | 
|  | }, | 
|  | 'progress': { | 
|  | 'progress': 'integer' | 
|  | }, | 
|  | 'results': {} | 
|  | } | 
|  | } | 
|  | })"); | 
|  | CommandDictionary dict; | 
|  | EXPECT_TRUE(dict.LoadCommands(*json, nullptr)); | 
|  | EXPECT_EQ(1u, dict.GetSize()); | 
|  | EXPECT_NE(nullptr, dict.FindCommand("robot.jump")); | 
|  | json = CreateDictionaryValue(R"({ | 
|  | 'base': { | 
|  | 'reboot': { | 
|  | 'minimalRole': 'owner', | 
|  | 'parameters': {'delay': 'integer'} | 
|  | }, | 
|  | 'shutdown': { | 
|  | 'minimalRole': 'user' | 
|  | } | 
|  | } | 
|  | })"); | 
|  | EXPECT_TRUE(dict.LoadCommands(*json, nullptr)); | 
|  | EXPECT_EQ(3u, dict.GetSize()); | 
|  | EXPECT_NE(nullptr, dict.FindCommand("robot.jump")); | 
|  | EXPECT_NE(nullptr, dict.FindCommand("base.reboot")); | 
|  | EXPECT_NE(nullptr, dict.FindCommand("base.shutdown")); | 
|  | EXPECT_EQ(nullptr, dict.FindCommand("foo.bar")); | 
|  | } | 
|  |  | 
|  | TEST(CommandDictionary, LoadCommands_Failures) { | 
|  | CommandDictionary dict; | 
|  | ErrorPtr error; | 
|  |  | 
|  | // Command definition is not an object. | 
|  | auto json = CreateDictionaryValue("{'robot':{'jump':0}}"); | 
|  | EXPECT_FALSE(dict.LoadCommands(*json, &error)); | 
|  | EXPECT_EQ("type_mismatch", error->GetCode()); | 
|  | error.reset(); | 
|  |  | 
|  | // Package definition is not an object. | 
|  | json = CreateDictionaryValue("{'robot':'blah'}"); | 
|  | EXPECT_FALSE(dict.LoadCommands(*json, &error)); | 
|  | EXPECT_EQ("type_mismatch", error->GetCode()); | 
|  | error.reset(); | 
|  |  | 
|  | // Empty command name. | 
|  | json = CreateDictionaryValue("{'robot':{'':{'parameters':{},'results':{}}}}"); | 
|  | EXPECT_FALSE(dict.LoadCommands(*json, &error)); | 
|  | EXPECT_EQ("invalid_command_name", error->GetCode()); | 
|  | error.reset(); | 
|  |  | 
|  | // No 'minimalRole'. | 
|  | json = CreateDictionaryValue(R"({ | 
|  | 'base': { | 
|  | 'reboot': { | 
|  | 'parameters': {'delay': 'integer'} | 
|  | } | 
|  | } | 
|  | })"); | 
|  | EXPECT_FALSE(dict.LoadCommands(*json, &error)); | 
|  | EXPECT_EQ("invalid_minimal_role", error->GetCode()); | 
|  | error.reset(); | 
|  |  | 
|  | // Invalid 'minimalRole'. | 
|  | json = CreateDictionaryValue(R"({ | 
|  | 'base': { | 
|  | 'reboot': { | 
|  | 'minimalRole': 'foo', | 
|  | 'parameters': {'delay': 'integer'} | 
|  | } | 
|  | } | 
|  | })"); | 
|  | EXPECT_FALSE(dict.LoadCommands(*json, &error)); | 
|  | EXPECT_EQ("invalid_minimal_role", error->GetCode()); | 
|  | error.reset(); | 
|  | } | 
|  |  | 
|  | TEST(CommandDictionaryDeathTest, LoadCommands_Redefine) { | 
|  | // Redefine commands. | 
|  | CommandDictionary dict; | 
|  | ErrorPtr error; | 
|  | auto json = | 
|  | CreateDictionaryValue("{'robot':{'jump':{'minimalRole': 'viewer'}}}"); | 
|  | dict.LoadCommands(*json, nullptr); | 
|  | ASSERT_DEATH(dict.LoadCommands(*json, &error), | 
|  | ".*Definition for command 'robot.jump' overrides an " | 
|  | "earlier definition"); | 
|  | } | 
|  |  | 
|  | TEST(CommandDictionary, GetMinimalRole) { | 
|  | CommandDictionary base_dict; | 
|  | auto json = CreateDictionaryValue(R"({ | 
|  | 'base': { | 
|  | 'command1': { | 
|  | 'minimalRole': 'viewer', | 
|  | 'parameters': {}, | 
|  | 'results': {} | 
|  | }, | 
|  | 'command2': { | 
|  | 'minimalRole': 'user', | 
|  | 'parameters': {}, | 
|  | 'results': {} | 
|  | }, | 
|  | 'command3': { | 
|  | 'minimalRole': 'manager', | 
|  | 'parameters': {}, | 
|  | 'results': {} | 
|  | }, | 
|  | 'command4': { | 
|  | 'minimalRole': 'owner', | 
|  | 'parameters': {}, | 
|  | 'results': {} | 
|  | } | 
|  | } | 
|  | })"); | 
|  | EXPECT_TRUE(base_dict.LoadCommands(*json, nullptr)); | 
|  | UserRole role; | 
|  | EXPECT_TRUE(base_dict.GetMinimalRole("base.command1", &role, nullptr)); | 
|  | EXPECT_EQ(UserRole::kViewer, role); | 
|  | EXPECT_TRUE(base_dict.GetMinimalRole("base.command2", &role, nullptr)); | 
|  | EXPECT_EQ(UserRole::kUser, role); | 
|  | EXPECT_TRUE(base_dict.GetMinimalRole("base.command3", &role, nullptr)); | 
|  | EXPECT_EQ(UserRole::kManager, role); | 
|  | EXPECT_TRUE(base_dict.GetMinimalRole("base.command4", &role, nullptr)); | 
|  | EXPECT_EQ(UserRole::kOwner, role); | 
|  | EXPECT_FALSE(base_dict.GetMinimalRole("base.command5", &role, nullptr)); | 
|  | } | 
|  |  | 
|  | }  // namespace weave |