blob: 7c539350799912c69aac13d555cfb0750cbf1d1b [file] [log] [blame]
// 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