| // 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_manager.h" | 
 |  | 
 | #include <map> | 
 |  | 
 | #include <base/json/json_writer.h> | 
 | #include <gtest/gtest.h> | 
 | #include <weave/provider/test/mock_config_store.h> | 
 |  | 
 | #include "src/bind_lambda.h" | 
 | #include "src/commands/unittest_utils.h" | 
 |  | 
 | using testing::Return; | 
 |  | 
 | namespace weave { | 
 |  | 
 | using test::CreateDictionaryValue; | 
 |  | 
 | namespace { | 
 |  | 
 | 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": {} | 
 |     } | 
 |   } | 
 | })"; | 
 |  | 
 | }  // namespace | 
 |  | 
 | TEST(CommandManager, Empty) { | 
 |   CommandManager manager; | 
 |   EXPECT_TRUE(manager.GetCommandDictionary().IsEmpty()); | 
 | } | 
 |  | 
 | TEST(CommandManager, LoadCommandsDict) { | 
 |   CommandManager manager; | 
 |   auto json = CreateDictionaryValue(kTestVendorCommands); | 
 |   EXPECT_TRUE(manager.LoadCommands(*json, nullptr)); | 
 | } | 
 |  | 
 | TEST(CommandManager, LoadCommandsJson) { | 
 |   CommandManager manager; | 
 |  | 
 |   // Load device-supported commands. | 
 |   auto json_str = R"({ | 
 |     "base": { | 
 |       "reboot": { | 
 |         "parameters": {"delay": "integer"}, | 
 |         "results": {} | 
 |       } | 
 |     }, | 
 |     "robot": { | 
 |       "_jump": { | 
 |         "parameters": {"height": "integer"}, | 
 |         "results": {} | 
 |       } | 
 |     } | 
 |   })"; | 
 |   EXPECT_TRUE(manager.LoadCommands(json_str, nullptr)); | 
 |   EXPECT_EQ(2, manager.GetCommandDictionary().GetSize()); | 
 |   EXPECT_NE(nullptr, manager.GetCommandDictionary().FindCommand("base.reboot")); | 
 |   EXPECT_NE(nullptr, manager.GetCommandDictionary().FindCommand("robot._jump")); | 
 | } | 
 |  | 
 | TEST(CommandManager, ShouldLoadStandardAndTestDefinitions) { | 
 |   CommandManager manager; | 
 |   ASSERT_TRUE(manager.LoadCommands(kTestVendorCommands, nullptr)); | 
 |   ASSERT_TRUE(manager.LoadCommands(kTestTestCommands, nullptr)); | 
 |   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")); | 
 | } | 
 |  | 
 | TEST(CommandManager, UpdateCommandVisibility) { | 
 |   CommandManager manager; | 
 |   int update_count = 0; | 
 |   auto on_command_change = [&update_count]() { update_count++; }; | 
 |   manager.AddCommandDefChanged(base::Bind(on_command_change)); | 
 |  | 
 |   auto json = CreateDictionaryValue(R"({ | 
 |     'foo': { | 
 |       '_baz': { | 
 |         'parameters': {}, | 
 |         'results': {} | 
 |       }, | 
 |       '_bar': { | 
 |         'parameters': {}, | 
 |         'results': {} | 
 |       } | 
 |     }, | 
 |     'bar': { | 
 |       '_quux': { | 
 |         'parameters': {}, | 
 |         'results': {}, | 
 |         'visibility': 'none' | 
 |       } | 
 |     } | 
 |   })"); | 
 |   ASSERT_TRUE(manager.LoadCommands(*json, nullptr)); | 
 |   EXPECT_EQ(2, update_count); | 
 |   const CommandDictionary& dict = manager.GetCommandDictionary(); | 
 |   EXPECT_TRUE(manager.SetCommandVisibility( | 
 |       {"foo._baz"}, CommandDefinition::Visibility::GetLocal(), nullptr)); | 
 |   EXPECT_EQ(3, update_count); | 
 |   EXPECT_EQ("local", dict.FindCommand("foo._baz")->GetVisibility().ToString()); | 
 |   EXPECT_EQ("all", dict.FindCommand("foo._bar")->GetVisibility().ToString()); | 
 |   EXPECT_EQ("none", dict.FindCommand("bar._quux")->GetVisibility().ToString()); | 
 |  | 
 |   ErrorPtr error; | 
 |   ASSERT_FALSE(manager.SetCommandVisibility( | 
 |       {"foo._baz", "foo._bar", "test.cmd"}, | 
 |       CommandDefinition::Visibility::GetLocal(), &error)); | 
 |   EXPECT_EQ(errors::commands::kInvalidCommandName, error->GetCode()); | 
 |   // The visibility state of commands shouldn't have changed. | 
 |   EXPECT_EQ(3, update_count); | 
 |   EXPECT_EQ("local", dict.FindCommand("foo._baz")->GetVisibility().ToString()); | 
 |   EXPECT_EQ("all", dict.FindCommand("foo._bar")->GetVisibility().ToString()); | 
 |   EXPECT_EQ("none", dict.FindCommand("bar._quux")->GetVisibility().ToString()); | 
 |  | 
 |   EXPECT_TRUE(manager.SetCommandVisibility( | 
 |       {"foo._baz", "bar._quux"}, CommandDefinition::Visibility::GetCloud(), | 
 |       nullptr)); | 
 |   EXPECT_EQ(4, update_count); | 
 |   EXPECT_EQ("cloud", dict.FindCommand("foo._baz")->GetVisibility().ToString()); | 
 |   EXPECT_EQ("all", dict.FindCommand("foo._bar")->GetVisibility().ToString()); | 
 |   EXPECT_EQ("cloud", dict.FindCommand("bar._quux")->GetVisibility().ToString()); | 
 | } | 
 |  | 
 | }  // namespace weave |