xref: /openbmc/phosphor-power/phosphor-regulators/test/rule_tests.cpp (revision 73eaceeba59657db9a25811cb7f14d6a7df14069)
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