blob: a32c7739e2a8c030ededfb41db9ddde76a99c8d8 [file] [log] [blame]
Vitaly Bukaa0305d32015-07-27 16:08:51 -07001// Copyright 2014 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "buffet/dbus_command_proxy.h"
6
7#include <functional>
8#include <memory>
9#include <vector>
10
11#include <dbus/mock_bus.h>
12#include <dbus/mock_exported_object.h>
13#include <dbus/property.h>
Alex Vakulenko41705852015-10-13 10:12:06 -070014#include <brillo/dbus/dbus_object.h>
15#include <brillo/dbus/dbus_object_test_helpers.h>
Vitaly Bukaa0305d32015-07-27 16:08:51 -070016#include <gtest/gtest.h>
Vitaly Bukae2713ac2015-08-03 13:50:01 -070017#include <weave/command.h>
18#include <weave/enum_to_string.h>
Vitaly Bukaea2f1e22015-08-20 15:35:19 -070019#include <weave/test/mock_command.h>
Vitaly Bukaea2f1e22015-08-20 15:35:19 -070020#include <weave/test/unittest_utils.h>
Vitaly Bukaa0305d32015-07-27 16:08:51 -070021
22#include "buffet/dbus_constants.h"
Vitaly Bukaa0305d32015-07-27 16:08:51 -070023
24namespace buffet {
25
Vitaly Buka3a58bb92015-08-05 23:16:13 -070026using ::testing::_;
Vitaly Bukaa0305d32015-07-27 16:08:51 -070027using ::testing::AnyNumber;
28using ::testing::Return;
29using ::testing::ReturnRefOfCopy;
Vitaly Buka3a58bb92015-08-05 23:16:13 -070030using ::testing::StrictMock;
Vitaly Bukaa0305d32015-07-27 16:08:51 -070031
Alex Vakulenko41705852015-10-13 10:12:06 -070032using brillo::VariantDictionary;
33using brillo::dbus_utils::AsyncEventSequencer;
Vitaly Bukaea2f1e22015-08-20 15:35:19 -070034using weave::test::CreateDictionaryValue;
35using weave::test::IsEqualValue;
Vitaly Bukaa0305d32015-07-27 16:08:51 -070036
37namespace {
38
Vitaly Bukaa0305d32015-07-27 16:08:51 -070039const char kTestCommandId[] = "cmd_1";
40
41MATCHER_P(EqualToJson, json, "") {
42 auto json_value = CreateDictionaryValue(json);
43 return IsEqualValue(*json_value, arg);
44}
45
Alex Vakulenkobe39e932015-10-09 08:10:36 -070046MATCHER_P2(ExpectError, code, message, "") {
47 return arg->GetCode() == code && arg->GetMessage() == message;
48}
49
Vitaly Bukaa0305d32015-07-27 16:08:51 -070050} // namespace
51
52class DBusCommandProxyTest : public ::testing::Test {
53 public:
54 void SetUp() override {
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070055 command_ = std::make_shared<StrictMock<weave::test::MockCommand>>();
Vitaly Bukaa0305d32015-07-27 16:08:51 -070056 // Set up a mock DBus bus object.
57 dbus::Bus::Options options;
58 options.bus_type = dbus::Bus::SYSTEM;
59 bus_ = new dbus::MockBus(options);
60 // By default, don't worry about threading assertions.
61 EXPECT_CALL(*bus_, AssertOnOriginThread()).Times(AnyNumber());
62 EXPECT_CALL(*bus_, AssertOnDBusThread()).Times(AnyNumber());
63
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070064 EXPECT_CALL(*command_, GetID())
Vitaly Bukaa0305d32015-07-27 16:08:51 -070065 .WillOnce(ReturnRefOfCopy<std::string>(kTestCommandId));
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070066 // Use WillRepeatedly because GetName is used for logging.
67 EXPECT_CALL(*command_, GetName())
Vitaly Bukaa0305d32015-07-27 16:08:51 -070068 .WillRepeatedly(ReturnRefOfCopy<std::string>("robot.jump"));
Alex Vakulenkobe39e932015-10-09 08:10:36 -070069 EXPECT_CALL(*command_, GetState())
70 .WillRepeatedly(Return(weave::Command::State::kQueued));
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070071 EXPECT_CALL(*command_, GetOrigin())
Alex Vakulenkobe39e932015-10-09 08:10:36 -070072 .WillOnce(Return(weave::Command::Origin::kLocal));
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070073 EXPECT_CALL(*command_, MockGetParameters())
Vitaly Bukaa0305d32015-07-27 16:08:51 -070074 .WillOnce(ReturnRefOfCopy<std::string>(R"({
75 'height': 53,
76 '_jumpType': '_withKick'
77 })"));
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070078 EXPECT_CALL(*command_, MockGetProgress())
79 .WillRepeatedly(ReturnRefOfCopy<std::string>("{}"));
80 EXPECT_CALL(*command_, MockGetResults())
Vitaly Bukabaf7a952015-10-10 01:44:45 -070081 .WillRepeatedly(ReturnRefOfCopy<std::string>("{}"));
Vitaly Bukaa0305d32015-07-27 16:08:51 -070082
83 // Set up a mock ExportedObject to be used with the DBus command proxy.
Robert Gindacf92c662015-08-20 09:30:11 -070084 std::string cmd_path = buffet::dbus_constants::kCommandServicePathPrefix;
Vitaly Bukaa0305d32015-07-27 16:08:51 -070085 cmd_path += kTestCommandId;
86 const dbus::ObjectPath kCmdObjPath(cmd_path);
87 // Use a mock exported object for the exported object manager.
88 mock_exported_object_command_ =
89 new dbus::MockExportedObject(bus_.get(), kCmdObjPath);
90 EXPECT_CALL(*bus_, GetExportedObject(kCmdObjPath))
91 .Times(AnyNumber())
92 .WillRepeatedly(Return(mock_exported_object_command_.get()));
93 EXPECT_CALL(*mock_exported_object_command_, ExportMethod(_, _, _, _))
94 .Times(AnyNumber());
95
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070096 proxy_.reset(new DBusCommandProxy{
97 nullptr, bus_, std::weak_ptr<weave::Command>{command_}, cmd_path});
Vitaly Bukaa0305d32015-07-27 16:08:51 -070098 GetCommandProxy()->RegisterAsync(
99 AsyncEventSequencer::GetDefaultCompletionAction());
100 }
101
102 void TearDown() override {
103 EXPECT_CALL(*mock_exported_object_command_, Unregister()).Times(1);
104 bus_ = nullptr;
105 }
106
107 DBusCommandProxy* GetCommandProxy() const { return proxy_.get(); }
108
Alex Vakulenko63bdf082015-08-21 09:27:12 -0700109 com::android::Weave::CommandAdaptor* GetCommandAdaptor() const {
Vitaly Bukaa0305d32015-07-27 16:08:51 -0700110 return &GetCommandProxy()->dbus_adaptor_;
111 }
112
Alex Vakulenko63bdf082015-08-21 09:27:12 -0700113 com::android::Weave::CommandInterface* GetCommandInterface() const {
Vitaly Bukaa0305d32015-07-27 16:08:51 -0700114 // DBusCommandProxy also implements CommandInterface.
115 return GetCommandProxy();
116 }
117
Alex Vakulenkobe39e932015-10-09 08:10:36 -0700118 weave::Command::State GetCommandState() const {
119 weave::Command::State state;
120 EXPECT_TRUE(StringToEnum(GetCommandAdaptor()->GetState(), &state));
121 return state;
Vitaly Bukaa0305d32015-07-27 16:08:51 -0700122 }
123
124 scoped_refptr<dbus::MockExportedObject> mock_exported_object_command_;
125 scoped_refptr<dbus::MockBus> bus_;
126
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700127 std::shared_ptr<StrictMock<weave::test::MockCommand>> command_;
Vitaly Bukaa0305d32015-07-27 16:08:51 -0700128 std::unique_ptr<DBusCommandProxy> proxy_;
129};
130
131TEST_F(DBusCommandProxyTest, Init) {
132 VariantDictionary params = {
133 {"height", int32_t{53}}, {"_jumpType", std::string{"_withKick"}},
134 };
Alex Vakulenkobe39e932015-10-09 08:10:36 -0700135 EXPECT_EQ(weave::Command::State::kQueued, GetCommandState());
Vitaly Bukaa0305d32015-07-27 16:08:51 -0700136 EXPECT_EQ(params, GetCommandAdaptor()->GetParameters());
137 EXPECT_EQ(VariantDictionary{}, GetCommandAdaptor()->GetProgress());
138 EXPECT_EQ(VariantDictionary{}, GetCommandAdaptor()->GetResults());
139 EXPECT_EQ("robot.jump", GetCommandAdaptor()->GetName());
Vitaly Bukaa0305d32015-07-27 16:08:51 -0700140 EXPECT_EQ(kTestCommandId, GetCommandAdaptor()->GetId());
141}
142
Vitaly Bukaa0305d32015-07-27 16:08:51 -0700143TEST_F(DBusCommandProxyTest, SetProgress) {
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700144 EXPECT_CALL(*command_, SetProgress(EqualToJson("{'progress': 10}"), _))
Vitaly Bukaa0305d32015-07-27 16:08:51 -0700145 .WillOnce(Return(true));
146 EXPECT_TRUE(
147 GetCommandInterface()->SetProgress(nullptr, {{"progress", int32_t{10}}}));
148}
149
Alex Vakulenkobe39e932015-10-09 08:10:36 -0700150TEST_F(DBusCommandProxyTest, Complete) {
Vitaly Bukaa0305d32015-07-27 16:08:51 -0700151 EXPECT_CALL(
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700152 *command_,
Alex Vakulenkobe39e932015-10-09 08:10:36 -0700153 Complete(
Vitaly Bukaa0305d32015-07-27 16:08:51 -0700154 EqualToJson("{'foo': 42, 'bar': 'foobar', 'resultList': [1, 2, 3]}"),
155 _))
156 .WillOnce(Return(true));
Alex Vakulenkobe39e932015-10-09 08:10:36 -0700157 EXPECT_TRUE(GetCommandInterface()->Complete(
Vitaly Bukaa0305d32015-07-27 16:08:51 -0700158 nullptr, VariantDictionary{{"foo", int32_t{42}},
159 {"bar", std::string{"foobar"}},
160 {"resultList", std::vector<int>{1, 2, 3}}}));
161}
162
163TEST_F(DBusCommandProxyTest, Abort) {
Alex Vakulenkobe39e932015-10-09 08:10:36 -0700164 EXPECT_CALL(*command_, Abort(ExpectError("foo", "bar"), _))
165 .WillOnce(Return(true));
166 EXPECT_TRUE(GetCommandInterface()->Abort(nullptr, "foo", "bar"));
Vitaly Bukaa0305d32015-07-27 16:08:51 -0700167}
168
169TEST_F(DBusCommandProxyTest, Cancel) {
Alex Vakulenkobe39e932015-10-09 08:10:36 -0700170 EXPECT_CALL(*command_, Cancel(_)).WillOnce(Return(true));
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700171 EXPECT_TRUE(GetCommandInterface()->Cancel(nullptr));
Vitaly Bukaa0305d32015-07-27 16:08:51 -0700172}
173
Vitaly Bukaa0305d32015-07-27 16:08:51 -0700174} // namespace buffet