blob: e06332f08881e71a21d993e65d2f775e00734270 [file] [log] [blame]
Vitaly Buka4615e0d2015-10-14 15:35:12 -07001// Copyright 2015 The Weave Authors. All rights reserved.
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -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_instance.h"
Alex Deymof6cbe322014-11-10 19:55:35 -08006
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -07007#include <gtest/gtest.h>
Alex Vakulenko8a05beb2015-11-24 17:13:20 -08008#include <weave/test/unittest_utils.h>
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -07009
Vitaly Bukab6f015a2015-07-09 14:59:23 -070010namespace weave {
Vitaly Buka5f0d1d02015-04-29 11:39:55 -070011
Vitaly Buka0f6b2ec2015-08-20 15:35:19 -070012using test::CreateDictionaryValue;
13using test::CreateValue;
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070014
Alex Vakulenko88f55d82015-12-03 15:30:27 -080015TEST(CommandInstanceTest, Test) {
Alex Vakulenko36bf1b52015-11-23 09:35:37 -080016 auto params = CreateDictionaryValue(R"({
17 'phrase': 'iPityDaFool',
18 'volume': 5
19 })");
Alex Vakulenko2c7740a2015-11-30 08:51:29 -080020 CommandInstance instance{"robot.speak", Command::Origin::kCloud, *params};
Anton Muhincfde8692014-11-25 03:36:59 +040021
Vitaly Buka4f4e2282015-07-23 17:50:07 -070022 EXPECT_TRUE(
Vitaly Buka2f548972015-10-08 19:34:49 -070023 instance.Complete(*CreateDictionaryValue("{'foo': 239}"), nullptr));
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -070024
Alex Vakulenkofedc4872014-08-20 12:38:43 -070025 EXPECT_EQ("", instance.GetID());
Anton Muhincfde8692014-11-25 03:36:59 +040026 EXPECT_EQ("robot.speak", instance.GetName());
Vitaly Buka0209da42015-10-08 00:07:18 -070027 EXPECT_EQ(Command::Origin::kCloud, instance.GetOrigin());
Vitaly Buka8d8d2192015-07-21 22:25:09 -070028 EXPECT_JSON_EQ("{'phrase': 'iPityDaFool', 'volume': 5}",
Vitaly Bukac4305602015-11-24 23:33:09 -080029 instance.GetParameters());
30 EXPECT_JSON_EQ("{'foo': 239}", instance.GetResults());
Alex Vakulenkof784e212015-04-20 12:33:52 -070031
Alex Vakulenko2c7740a2015-11-30 08:51:29 -080032 CommandInstance instance2{"base.reboot", Command::Origin::kLocal, {}};
Vitaly Buka0209da42015-10-08 00:07:18 -070033 EXPECT_EQ(Command::Origin::kLocal, instance2.GetOrigin());
Alex Vakulenkoaa3a5592014-08-07 07:24:06 -070034}
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070035
Alex Vakulenko88f55d82015-12-03 15:30:27 -080036TEST(CommandInstanceTest, SetID) {
Alex Vakulenko2c7740a2015-11-30 08:51:29 -080037 CommandInstance instance{"base.reboot", Command::Origin::kLocal, {}};
Alex Vakulenkofedc4872014-08-20 12:38:43 -070038 instance.SetID("command_id");
39 EXPECT_EQ("command_id", instance.GetID());
40}
41
Alex Vakulenko88f55d82015-12-03 15:30:27 -080042TEST(CommandInstanceTest, FromJson) {
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070043 auto json = CreateDictionaryValue(R"({
44 'name': 'robot.jump',
Alex Vakulenko88f55d82015-12-03 15:30:27 -080045 'component': 'comp1.comp2',
Alex Vakulenkod1978d32015-04-29 17:33:26 -070046 'id': 'abcd',
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070047 'parameters': {
48 'height': 53,
49 '_jumpType': '_withKick'
Anton Muhin71fb9d52014-11-21 22:22:39 +040050 },
51 'results': {}
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070052 })");
Alex Vakulenkod1978d32015-04-29 17:33:26 -070053 std::string id;
Vitaly Buka0209da42015-10-08 00:07:18 -070054 auto instance = CommandInstance::FromJson(json.get(), Command::Origin::kCloud,
Alex Vakulenko88f55d82015-12-03 15:30:27 -080055 &id, nullptr);
Alex Vakulenkod1978d32015-04-29 17:33:26 -070056 EXPECT_EQ("abcd", id);
57 EXPECT_EQ("abcd", instance->GetID());
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070058 EXPECT_EQ("robot.jump", instance->GetName());
Alex Vakulenko88f55d82015-12-03 15:30:27 -080059 EXPECT_EQ("comp1.comp2", instance->GetComponent());
Vitaly Buka8d8d2192015-07-21 22:25:09 -070060 EXPECT_JSON_EQ("{'height': 53, '_jumpType': '_withKick'}",
Vitaly Bukac4305602015-11-24 23:33:09 -080061 instance->GetParameters());
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070062}
63
Alex Vakulenko88f55d82015-12-03 15:30:27 -080064TEST(CommandInstanceTest, FromJson_ParamsOmitted) {
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070065 auto json = CreateDictionaryValue("{'name': 'base.reboot'}");
Vitaly Buka0209da42015-10-08 00:07:18 -070066 auto instance = CommandInstance::FromJson(json.get(), Command::Origin::kCloud,
Alex Vakulenko88f55d82015-12-03 15:30:27 -080067 nullptr, nullptr);
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070068 EXPECT_EQ("base.reboot", instance->GetName());
Vitaly Bukac4305602015-11-24 23:33:09 -080069 EXPECT_JSON_EQ("{}", instance->GetParameters());
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070070}
71
Alex Vakulenko88f55d82015-12-03 15:30:27 -080072TEST(CommandInstanceTest, FromJson_NotObject) {
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070073 auto json = CreateValue("'string'");
Vitaly Buka0801a1f2015-08-14 10:03:46 -070074 ErrorPtr error;
Vitaly Buka0209da42015-10-08 00:07:18 -070075 auto instance = CommandInstance::FromJson(json.get(), Command::Origin::kCloud,
Alex Vakulenko88f55d82015-12-03 15:30:27 -080076 nullptr, &error);
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070077 EXPECT_EQ(nullptr, instance.get());
78 EXPECT_EQ("json_object_expected", error->GetCode());
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070079}
80
Alex Vakulenko88f55d82015-12-03 15:30:27 -080081TEST(CommandInstanceTest, FromJson_NameMissing) {
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070082 auto json = CreateDictionaryValue("{'param': 'value'}");
Vitaly Buka0801a1f2015-08-14 10:03:46 -070083 ErrorPtr error;
Vitaly Buka0209da42015-10-08 00:07:18 -070084 auto instance = CommandInstance::FromJson(json.get(), Command::Origin::kCloud,
Alex Vakulenko88f55d82015-12-03 15:30:27 -080085 nullptr, &error);
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070086 EXPECT_EQ(nullptr, instance.get());
87 EXPECT_EQ("parameter_missing", error->GetCode());
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070088}
89
Alex Vakulenko88f55d82015-12-03 15:30:27 -080090TEST(CommandInstanceTest, FromJson_ParamsNotObject) {
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070091 auto json = CreateDictionaryValue(R"({
92 'name': 'robot.speak',
93 'parameters': 'hello'
94 })");
Vitaly Buka0801a1f2015-08-14 10:03:46 -070095 ErrorPtr error;
Vitaly Buka0209da42015-10-08 00:07:18 -070096 auto instance = CommandInstance::FromJson(json.get(), Command::Origin::kCloud,
Alex Vakulenko88f55d82015-12-03 15:30:27 -080097 nullptr, &error);
Alex Vakulenko8dc69af2014-08-07 10:29:42 -070098 EXPECT_EQ(nullptr, instance.get());
99 auto inner = error->GetInnerError();
100 EXPECT_EQ("json_object_expected", inner->GetCode());
Alex Vakulenko8dc69af2014-08-07 10:29:42 -0700101 EXPECT_EQ("command_failed", error->GetCode());
Alex Vakulenko8dc69af2014-08-07 10:29:42 -0700102}
103
Alex Vakulenko88f55d82015-12-03 15:30:27 -0800104TEST(CommandInstanceTest, ToJson) {
Vitaly Buka906d39e2015-03-24 10:08:26 -0700105 auto json = CreateDictionaryValue(R"({
Vitaly Buka5ddd9912016-03-09 10:44:48 -0800106 'component': 'testComponent',
Vitaly Buka906d39e2015-03-24 10:08:26 -0700107 'name': 'robot.jump',
108 'parameters': {
109 'height': 53,
110 '_jumpType': '_withKick'
111 },
112 'results': {}
113 })");
Vitaly Buka0209da42015-10-08 00:07:18 -0700114 auto instance = CommandInstance::FromJson(json.get(), Command::Origin::kCloud,
Alex Vakulenko88f55d82015-12-03 15:30:27 -0800115 nullptr, nullptr);
Vitaly Buka4f4e2282015-07-23 17:50:07 -0700116 EXPECT_TRUE(instance->SetProgress(*CreateDictionaryValue("{'progress': 15}"),
117 nullptr));
118 EXPECT_TRUE(instance->SetProgress(*CreateDictionaryValue("{'progress': 15}"),
119 nullptr));
Vitaly Buka906d39e2015-03-24 10:08:26 -0700120 instance->SetID("testId");
Vitaly Buka2f548972015-10-08 19:34:49 -0700121 EXPECT_TRUE(instance->Complete(*CreateDictionaryValue("{'testResult': 17}"),
122 nullptr));
Vitaly Buka906d39e2015-03-24 10:08:26 -0700123
124 json->MergeDictionary(CreateDictionaryValue(R"({
Vitaly Buka5ddd9912016-03-09 10:44:48 -0800125 'component': 'testComponent',
Vitaly Buka906d39e2015-03-24 10:08:26 -0700126 'id': 'testId',
Alex Vakulenko808e2d82015-04-08 15:45:56 -0700127 'progress': {'progress': 15},
Vitaly Buka47a1f6f2015-10-07 18:09:57 -0700128 'state': 'done',
129 'results': {'testResult': 17}
130 })").get());
131
132 auto converted = instance->ToJson();
133 EXPECT_PRED2([](const base::Value& val1,
134 const base::Value& val2) { return val1.Equals(&val2); },
135 *json, *converted);
136}
137
Alex Vakulenko88f55d82015-12-03 15:30:27 -0800138TEST(CommandInstanceTest, ToJsonError) {
Vitaly Buka47a1f6f2015-10-07 18:09:57 -0700139 auto json = CreateDictionaryValue(R"({
Vitaly Buka5ddd9912016-03-09 10:44:48 -0800140 'component': 'testComponent',
Vitaly Buka47a1f6f2015-10-07 18:09:57 -0700141 'name': 'base.reboot',
142 'parameters': {}
143 })");
Vitaly Buka0209da42015-10-08 00:07:18 -0700144 auto instance = CommandInstance::FromJson(json.get(), Command::Origin::kCloud,
Alex Vakulenko88f55d82015-12-03 15:30:27 -0800145 nullptr, nullptr);
Vitaly Buka47a1f6f2015-10-07 18:09:57 -0700146 instance->SetID("testId");
147
148 ErrorPtr error;
Vitaly Buka48a86692016-01-21 17:15:58 -0800149 Error::AddTo(&error, FROM_HERE, "CODE", "MESSAGE");
Vitaly Buka47a1f6f2015-10-07 18:09:57 -0700150 instance->Abort(error.get(), nullptr);
151
152 json->MergeDictionary(CreateDictionaryValue(R"({
Vitaly Buka5ddd9912016-03-09 10:44:48 -0800153 'component': 'testComponent',
Vitaly Buka47a1f6f2015-10-07 18:09:57 -0700154 'id': 'testId',
Vitaly Buka70f77d92015-10-07 15:42:40 -0700155 'state': 'aborted',
Vitaly Buka47a1f6f2015-10-07 18:09:57 -0700156 'progress': {},
157 'results': {},
Vitaly Buka70f77d92015-10-07 15:42:40 -0700158 'error': {'code': 'CODE', 'message': 'MESSAGE'}
Vitaly Buka906d39e2015-03-24 10:08:26 -0700159 })").get());
160
161 auto converted = instance->ToJson();
Vitaly Buka4ebd3292015-09-23 18:04:17 -0700162 EXPECT_PRED2([](const base::Value& val1,
163 const base::Value& val2) { return val1.Equals(&val2); },
164 *json, *converted);
Vitaly Buka906d39e2015-03-24 10:08:26 -0700165}
Vitaly Buka5f0d1d02015-04-29 11:39:55 -0700166
Vitaly Bukab6f015a2015-07-09 14:59:23 -0700167} // namespace weave