1a2461b34SShawn McCarney /**
2a2461b34SShawn McCarney * Copyright © 2019 IBM Corporation
3a2461b34SShawn McCarney *
4a2461b34SShawn McCarney * Licensed under the Apache License, Version 2.0 (the "License");
5a2461b34SShawn McCarney * you may not use this file except in compliance with the License.
6a2461b34SShawn McCarney * You may obtain a copy of the License at
7a2461b34SShawn McCarney *
8a2461b34SShawn McCarney * http://www.apache.org/licenses/LICENSE-2.0
9a2461b34SShawn McCarney *
10a2461b34SShawn McCarney * Unless required by applicable law or agreed to in writing, software
11a2461b34SShawn McCarney * distributed under the License is distributed on an "AS IS" BASIS,
12a2461b34SShawn McCarney * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a2461b34SShawn McCarney * See the License for the specific language governing permissions and
14a2461b34SShawn McCarney * limitations under the License.
15a2461b34SShawn McCarney */
169fc08e73SShawn McCarney #include "action.hpp"
179fc08e73SShawn McCarney #include "action_environment.hpp"
189fc08e73SShawn McCarney #include "id_map.hpp"
199fc08e73SShawn McCarney #include "mock_action.hpp"
20*73eaceebSBob King #include "mock_services.hpp"
21a2461b34SShawn McCarney #include "rule.hpp"
22a2461b34SShawn McCarney
239fc08e73SShawn McCarney #include <exception>
249fc08e73SShawn McCarney #include <memory>
259fc08e73SShawn McCarney #include <stdexcept>
269fc08e73SShawn McCarney #include <utility>
279fc08e73SShawn McCarney #include <vector>
289fc08e73SShawn McCarney
299fc08e73SShawn McCarney #include <gmock/gmock.h>
30a2461b34SShawn McCarney #include <gtest/gtest.h>
31a2461b34SShawn McCarney
32a2461b34SShawn McCarney using namespace phosphor::power::regulators;
33a2461b34SShawn McCarney
349fc08e73SShawn McCarney using ::testing::Return;
359fc08e73SShawn McCarney using ::testing::Throw;
369fc08e73SShawn McCarney
TEST(RuleTests,Constructor)37a2461b34SShawn McCarney TEST(RuleTests, Constructor)
38a2461b34SShawn McCarney {
399fc08e73SShawn McCarney // Build vector of actions
409fc08e73SShawn McCarney std::vector<std::unique_ptr<Action>> actions{};
419fc08e73SShawn McCarney actions.push_back(std::make_unique<MockAction>());
429fc08e73SShawn McCarney actions.push_back(std::make_unique<MockAction>());
439fc08e73SShawn McCarney
449fc08e73SShawn McCarney // Create rule and verify data members
459fc08e73SShawn McCarney Rule rule("set_voltage_rule", std::move(actions));
464afb285eSShawn McCarney EXPECT_EQ(rule.getID(), "set_voltage_rule");
479fc08e73SShawn McCarney EXPECT_EQ(rule.getActions().size(), 2);
489fc08e73SShawn McCarney }
499fc08e73SShawn McCarney
TEST(RuleTests,Execute)509fc08e73SShawn McCarney TEST(RuleTests, Execute)
519fc08e73SShawn McCarney {
529fc08e73SShawn McCarney // Create ActionEnvironment
539fc08e73SShawn McCarney IDMap idMap{};
54*73eaceebSBob King MockServices services{};
55*73eaceebSBob King ActionEnvironment env{idMap, "", services};
569fc08e73SShawn McCarney
579fc08e73SShawn McCarney // Test where an action throws an exception
589fc08e73SShawn McCarney try
599fc08e73SShawn McCarney {
609fc08e73SShawn McCarney std::vector<std::unique_ptr<Action>> actions{};
619fc08e73SShawn McCarney std::unique_ptr<MockAction> action = std::make_unique<MockAction>();
629fc08e73SShawn McCarney EXPECT_CALL(*action, execute)
639fc08e73SShawn McCarney .Times(1)
649fc08e73SShawn McCarney .WillOnce(Throw(std::logic_error{"Communication error"}));
659fc08e73SShawn McCarney actions.push_back(std::move(action));
669fc08e73SShawn McCarney
679fc08e73SShawn McCarney Rule rule("set_voltage_rule", std::move(actions));
689fc08e73SShawn McCarney rule.execute(env);
699fc08e73SShawn McCarney ADD_FAILURE() << "Should not have reached this line.";
709fc08e73SShawn McCarney }
719fc08e73SShawn McCarney catch (const std::exception& error)
729fc08e73SShawn McCarney {
739fc08e73SShawn McCarney EXPECT_STREQ(error.what(), "Communication error");
749fc08e73SShawn McCarney }
759fc08e73SShawn McCarney
769fc08e73SShawn McCarney // Test where all actions are executed
779fc08e73SShawn McCarney try
789fc08e73SShawn McCarney {
799fc08e73SShawn McCarney std::vector<std::unique_ptr<Action>> actions{};
809fc08e73SShawn McCarney std::unique_ptr<MockAction> action;
819fc08e73SShawn McCarney
829fc08e73SShawn McCarney // First action will return true
839fc08e73SShawn McCarney action = std::make_unique<MockAction>();
849fc08e73SShawn McCarney EXPECT_CALL(*action, execute).Times(1).WillOnce(Return(true));
859fc08e73SShawn McCarney actions.push_back(std::move(action));
869fc08e73SShawn McCarney
879fc08e73SShawn McCarney // Second action will return false
889fc08e73SShawn McCarney action = std::make_unique<MockAction>();
899fc08e73SShawn McCarney EXPECT_CALL(*action, execute).Times(1).WillOnce(Return(false));
909fc08e73SShawn McCarney actions.push_back(std::move(action));
919fc08e73SShawn McCarney
929fc08e73SShawn McCarney Rule rule("set_voltage_rule", std::move(actions));
939fc08e73SShawn McCarney EXPECT_EQ(rule.execute(env), false);
949fc08e73SShawn McCarney }
959fc08e73SShawn McCarney catch (const std::exception& error)
969fc08e73SShawn McCarney {
979fc08e73SShawn McCarney ADD_FAILURE() << "Should not have caught exception.";
989fc08e73SShawn McCarney }
999fc08e73SShawn McCarney }
1009fc08e73SShawn McCarney
TEST(RuleTests,GetActions)1019fc08e73SShawn McCarney TEST(RuleTests, GetActions)
1029fc08e73SShawn McCarney {
1039fc08e73SShawn McCarney std::vector<std::unique_ptr<Action>> actions{};
1049fc08e73SShawn McCarney
1059fc08e73SShawn McCarney MockAction* action1 = new MockAction{};
1069fc08e73SShawn McCarney actions.push_back(std::unique_ptr<MockAction>{action1});
1079fc08e73SShawn McCarney
1089fc08e73SShawn McCarney MockAction* action2 = new MockAction{};
1099fc08e73SShawn McCarney actions.push_back(std::unique_ptr<MockAction>{action2});
1109fc08e73SShawn McCarney
1119fc08e73SShawn McCarney Rule rule("set_voltage_rule", std::move(actions));
1129fc08e73SShawn McCarney EXPECT_EQ(rule.getActions().size(), 2);
1139fc08e73SShawn McCarney EXPECT_EQ(rule.getActions()[0].get(), action1);
1149fc08e73SShawn McCarney EXPECT_EQ(rule.getActions()[1].get(), action2);
115a2461b34SShawn McCarney }
116a2461b34SShawn McCarney
TEST(RuleTests,GetID)1174afb285eSShawn McCarney TEST(RuleTests, GetID)
118a2461b34SShawn McCarney {
1199fc08e73SShawn McCarney Rule rule("read_sensor_values", std::vector<std::unique_ptr<Action>>{});
1204afb285eSShawn McCarney EXPECT_EQ(rule.getID(), "read_sensor_values");
121a2461b34SShawn McCarney }
122