blob: 0c890a94f6ab0d666991448f085e919838a150e2 [file] [log] [blame]
Vitaly Buka4615e0d2015-10-14 15:35:12 -07001// Copyright 2015 The Weave Authors. All rights reserved.
Alex Vakulenko7c36b672014-07-16 14:50:58 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Stefan Sauer2d16dfa2015-09-25 17:08:35 +02005#include "src/commands/command_manager.h"
Alex Deymof6cbe322014-11-10 19:55:35 -08006
Vitaly Bukae2810e02015-08-16 23:31:55 -07007#include <map>
8
Alex Vakulenkofd448692014-07-22 07:46:53 -07009#include <base/json/json_writer.h>
Alex Vakulenko7c36b672014-07-16 14:50:58 -070010#include <gtest/gtest.h>
Vitaly Buka1e363672015-09-25 14:01:16 -070011#include <weave/provider/test/mock_config_store.h>
Alex Vakulenko7c36b672014-07-16 14:50:58 -070012
Stefan Sauer2d16dfa2015-09-25 17:08:35 +020013#include "src/bind_lambda.h"
14#include "src/commands/unittest_utils.h"
Alex Vakulenkofd448692014-07-22 07:46:53 -070015
Vitaly Buka11b2f232015-08-20 13:55:41 -070016using testing::Return;
17
Vitaly Bukab6f015a2015-07-09 14:59:23 -070018namespace weave {
Vitaly Buka32005de2015-05-01 12:33:31 -070019
Vitaly Buka0f6b2ec2015-08-20 15:35:19 -070020using test::CreateDictionaryValue;
Alex Vakulenkofd448692014-07-22 07:46:53 -070021
Christopher Wileybb5b8482015-02-12 13:42:16 -080022namespace {
23
Christopher Wileybb5b8482015-02-12 13:42:16 -080024const char kTestVendorCommands[] = R"({
Vitaly Bukae2810e02015-08-16 23:31:55 -070025 "robot": {
26 "_jump": {
27 "parameters": {"height": "integer"},
28 "results": {}
Christopher Wileybb5b8482015-02-12 13:42:16 -080029 },
Vitaly Bukae2810e02015-08-16 23:31:55 -070030 "_speak": {
31 "parameters": {"phrase": "string"},
32 "results": {}
Christopher Wileybb5b8482015-02-12 13:42:16 -080033 }
34 }
35})";
36
37const char kTestTestCommands[] = R"({
Vitaly Bukae2810e02015-08-16 23:31:55 -070038 "test": {
39 "_yo": {
40 "parameters": {"name": "string"},
41 "results": {}
Christopher Wileybb5b8482015-02-12 13:42:16 -080042 }
43 }
44})";
45
Christopher Wileybb5b8482015-02-12 13:42:16 -080046} // namespace
47
Alex Vakulenko7c36b672014-07-16 14:50:58 -070048TEST(CommandManager, Empty) {
Vitaly Buka32005de2015-05-01 12:33:31 -070049 CommandManager manager;
Alex Vakulenko7c36b672014-07-16 14:50:58 -070050 EXPECT_TRUE(manager.GetCommandDictionary().IsEmpty());
51}
Alex Vakulenkofd448692014-07-22 07:46:53 -070052
Vitaly Bukae2810e02015-08-16 23:31:55 -070053TEST(CommandManager, LoadCommandsDict) {
Vitaly Buka32005de2015-05-01 12:33:31 -070054 CommandManager manager;
Christopher Wileybb5b8482015-02-12 13:42:16 -080055 auto json = CreateDictionaryValue(kTestVendorCommands);
Vitaly Buka453c4dd2015-10-04 18:01:50 -070056 EXPECT_TRUE(manager.LoadCommands(*json, nullptr));
Alex Vakulenkofd448692014-07-22 07:46:53 -070057}
58
Vitaly Bukae2810e02015-08-16 23:31:55 -070059TEST(CommandManager, LoadCommandsJson) {
Vitaly Buka32005de2015-05-01 12:33:31 -070060 CommandManager manager;
Vitaly Bukae2810e02015-08-16 23:31:55 -070061
Alex Vakulenkofd448692014-07-22 07:46:53 -070062 // Load device-supported commands.
Vitaly Bukae2810e02015-08-16 23:31:55 -070063 auto json_str = R"({
64 "base": {
65 "reboot": {
66 "parameters": {"delay": "integer"},
67 "results": {}
Alex Vakulenkofd448692014-07-22 07:46:53 -070068 }
69 },
Vitaly Bukae2810e02015-08-16 23:31:55 -070070 "robot": {
71 "_jump": {
72 "parameters": {"height": "integer"},
73 "results": {}
Alex Vakulenkofd448692014-07-22 07:46:53 -070074 }
75 }
Vitaly Bukae2810e02015-08-16 23:31:55 -070076 })";
Vitaly Buka453c4dd2015-10-04 18:01:50 -070077 EXPECT_TRUE(manager.LoadCommands(json_str, nullptr));
Alex Vakulenkofd448692014-07-22 07:46:53 -070078 EXPECT_EQ(2, manager.GetCommandDictionary().GetSize());
79 EXPECT_NE(nullptr, manager.GetCommandDictionary().FindCommand("base.reboot"));
80 EXPECT_NE(nullptr, manager.GetCommandDictionary().FindCommand("robot._jump"));
81}
Christopher Wileybb5b8482015-02-12 13:42:16 -080082
83TEST(CommandManager, ShouldLoadStandardAndTestDefinitions) {
Vitaly Buka32005de2015-05-01 12:33:31 -070084 CommandManager manager;
Vitaly Buka0ac6ca62015-10-06 19:16:29 -070085 ASSERT_TRUE(manager.LoadCommands(kTestVendorCommands, nullptr));
86 ASSERT_TRUE(manager.LoadCommands(kTestTestCommands, nullptr));
Christopher Wileybb5b8482015-02-12 13:42:16 -080087 EXPECT_EQ(3, manager.GetCommandDictionary().GetSize());
Vitaly Bukaa647c852015-07-06 14:51:01 -070088 EXPECT_NE(nullptr, manager.GetCommandDictionary().FindCommand("robot._jump"));
Christopher Wileybb5b8482015-02-12 13:42:16 -080089 EXPECT_NE(nullptr,
90 manager.GetCommandDictionary().FindCommand("robot._speak"));
Vitaly Bukaa647c852015-07-06 14:51:01 -070091 EXPECT_NE(nullptr, manager.GetCommandDictionary().FindCommand("test._yo"));
Christopher Wileybb5b8482015-02-12 13:42:16 -080092}
Alex Vakulenkoe03af6d2015-04-20 11:00:54 -070093
94TEST(CommandManager, UpdateCommandVisibility) {
Vitaly Buka32005de2015-05-01 12:33:31 -070095 CommandManager manager;
Alex Vakulenkoe03af6d2015-04-20 11:00:54 -070096 int update_count = 0;
97 auto on_command_change = [&update_count]() { update_count++; };
Vitaly Buka553a7622015-10-05 13:53:20 -070098 manager.AddCommandDefChanged(base::Bind(on_command_change));
Alex Vakulenkoe03af6d2015-04-20 11:00:54 -070099
100 auto json = CreateDictionaryValue(R"({
101 'foo': {
102 '_baz': {
103 'parameters': {},
104 'results': {}
105 },
106 '_bar': {
107 'parameters': {},
108 'results': {}
109 }
110 },
111 'bar': {
112 '_quux': {
113 'parameters': {},
114 'results': {},
115 'visibility': 'none'
116 }
117 }
118 })");
Vitaly Buka453c4dd2015-10-04 18:01:50 -0700119 ASSERT_TRUE(manager.LoadCommands(*json, nullptr));
Vitaly Buka7ab89ff2015-06-09 22:11:40 -0700120 EXPECT_EQ(2, update_count);
Vitaly Buka32005de2015-05-01 12:33:31 -0700121 const CommandDictionary& dict = manager.GetCommandDictionary();
Alex Vakulenkoe03af6d2015-04-20 11:00:54 -0700122 EXPECT_TRUE(manager.SetCommandVisibility(
Vitaly Buka32005de2015-05-01 12:33:31 -0700123 {"foo._baz"}, CommandDefinition::Visibility::GetLocal(), nullptr));
Vitaly Buka7ab89ff2015-06-09 22:11:40 -0700124 EXPECT_EQ(3, update_count);
Alex Vakulenkoe03af6d2015-04-20 11:00:54 -0700125 EXPECT_EQ("local", dict.FindCommand("foo._baz")->GetVisibility().ToString());
126 EXPECT_EQ("all", dict.FindCommand("foo._bar")->GetVisibility().ToString());
127 EXPECT_EQ("none", dict.FindCommand("bar._quux")->GetVisibility().ToString());
128
Vitaly Buka0801a1f2015-08-14 10:03:46 -0700129 ErrorPtr error;
Alex Vakulenkoe03af6d2015-04-20 11:00:54 -0700130 ASSERT_FALSE(manager.SetCommandVisibility(
131 {"foo._baz", "foo._bar", "test.cmd"},
Vitaly Buka32005de2015-05-01 12:33:31 -0700132 CommandDefinition::Visibility::GetLocal(), &error));
133 EXPECT_EQ(errors::commands::kInvalidCommandName, error->GetCode());
Alex Vakulenkoe03af6d2015-04-20 11:00:54 -0700134 // The visibility state of commands shouldn't have changed.
Vitaly Buka7ab89ff2015-06-09 22:11:40 -0700135 EXPECT_EQ(3, update_count);
Alex Vakulenkoe03af6d2015-04-20 11:00:54 -0700136 EXPECT_EQ("local", dict.FindCommand("foo._baz")->GetVisibility().ToString());
137 EXPECT_EQ("all", dict.FindCommand("foo._bar")->GetVisibility().ToString());
138 EXPECT_EQ("none", dict.FindCommand("bar._quux")->GetVisibility().ToString());
139
140 EXPECT_TRUE(manager.SetCommandVisibility(
Vitaly Buka32005de2015-05-01 12:33:31 -0700141 {"foo._baz", "bar._quux"}, CommandDefinition::Visibility::GetCloud(),
142 nullptr));
Vitaly Buka7ab89ff2015-06-09 22:11:40 -0700143 EXPECT_EQ(4, update_count);
Alex Vakulenkoe03af6d2015-04-20 11:00:54 -0700144 EXPECT_EQ("cloud", dict.FindCommand("foo._baz")->GetVisibility().ToString());
145 EXPECT_EQ("all", dict.FindCommand("foo._bar")->GetVisibility().ToString());
146 EXPECT_EQ("cloud", dict.FindCommand("bar._quux")->GetVisibility().ToString());
147}
148
Vitaly Bukab6f015a2015-07-09 14:59:23 -0700149} // namespace weave