blob: 65f91e629e37fa730de58ef2de4f024cc67a8610 [file] [log] [blame]
Shawn McCarney74538a62019-11-13 11:24:17 -06001/**
2 * Copyright © 2019 IBM Corporation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#include "action.hpp"
17#include "action_environment.hpp"
18#include "and_action.hpp"
19#include "id_map.hpp"
20#include "mock_action.hpp"
21
22#include <exception>
23#include <memory>
24#include <stdexcept>
25#include <utility>
26#include <vector>
27
28#include <gmock/gmock.h>
29#include <gtest/gtest.h>
30
31using namespace phosphor::power::regulators;
32
33using ::testing::Return;
34using ::testing::Throw;
35
36TEST(AndActionTests, Constructor)
37{
38 std::vector<std::unique_ptr<Action>> actions{};
39 actions.push_back(std::make_unique<MockAction>());
40 actions.push_back(std::make_unique<MockAction>());
41
42 AndAction andAction{std::move(actions)};
43 EXPECT_EQ(andAction.getActions().size(), 2);
44}
45
46TEST(AndActionTests, Execute)
47{
48 // Create ActionEnvironment
49 IDMap idMap{};
50 ActionEnvironment env{idMap, ""};
51
52 // Test where empty vector of actions is specified
53 try
54 {
55 std::vector<std::unique_ptr<Action>> actions{};
56 AndAction andAction{std::move(actions)};
57 EXPECT_EQ(andAction.execute(env), true);
58 }
59 catch (const std::exception& error)
60 {
61 ADD_FAILURE() << "Should not have caught exception.";
62 }
63
64 // Test where action throws an exception
65 try
66 {
67 std::vector<std::unique_ptr<Action>> actions{};
68 std::unique_ptr<MockAction> action;
69
70 // First action will throw an exception
71 action = std::make_unique<MockAction>();
72 EXPECT_CALL(*action, execute)
73 .Times(1)
74 .WillOnce(Throw(std::logic_error{"Communication error"}));
75 actions.push_back(std::move(action));
76
77 // Second action should not get executed
78 action = std::make_unique<MockAction>();
79 EXPECT_CALL(*action, execute).Times(0);
80 actions.push_back(std::move(action));
81
82 AndAction andAction{std::move(actions)};
83 andAction.execute(env);
84 ADD_FAILURE() << "Should not have reached this line.";
85 }
86 catch (const std::exception& error)
87 {
88 EXPECT_STREQ(error.what(), "Communication error");
89 }
90
91 // Test where middle action returns false
92 try
93 {
94 std::vector<std::unique_ptr<Action>> actions{};
95 std::unique_ptr<MockAction> action;
96
97 // First action will return true
98 action = std::make_unique<MockAction>();
99 EXPECT_CALL(*action, execute).Times(1).WillOnce(Return(true));
100 actions.push_back(std::move(action));
101
102 // Second action will return false
103 action = std::make_unique<MockAction>();
104 EXPECT_CALL(*action, execute).Times(1).WillOnce(Return(false));
105 actions.push_back(std::move(action));
106
107 // Third action will return true
108 action = std::make_unique<MockAction>();
109 EXPECT_CALL(*action, execute).Times(1).WillOnce(Return(true));
110 actions.push_back(std::move(action));
111
112 AndAction andAction{std::move(actions)};
113 EXPECT_EQ(andAction.execute(env), false);
114 }
115 catch (const std::exception& error)
116 {
117 ADD_FAILURE() << "Should not have caught exception.";
118 }
119
120 // Test where all actions return true
121 try
122 {
123 std::vector<std::unique_ptr<Action>> actions{};
124 std::unique_ptr<MockAction> action;
125
126 // First action will return true
127 action = std::make_unique<MockAction>();
128 EXPECT_CALL(*action, execute).Times(1).WillOnce(Return(true));
129 actions.push_back(std::move(action));
130
131 // Second action will return true
132 action = std::make_unique<MockAction>();
133 EXPECT_CALL(*action, execute).Times(1).WillOnce(Return(true));
134 actions.push_back(std::move(action));
135
136 // Third action will return true
137 action = std::make_unique<MockAction>();
138 EXPECT_CALL(*action, execute).Times(1).WillOnce(Return(true));
139 actions.push_back(std::move(action));
140
141 AndAction andAction{std::move(actions)};
142 EXPECT_EQ(andAction.execute(env), true);
143 }
144 catch (const std::exception& error)
145 {
146 ADD_FAILURE() << "Should not have caught exception.";
147 }
148}
149
150TEST(AndActionTests, GetActions)
151{
152 std::vector<std::unique_ptr<Action>> actions{};
153
154 MockAction* action1 = new MockAction{};
155 actions.push_back(std::unique_ptr<MockAction>{action1});
156
157 MockAction* action2 = new MockAction{};
158 actions.push_back(std::unique_ptr<MockAction>{action2});
159
160 AndAction andAction{std::move(actions)};
161 EXPECT_EQ(andAction.getActions().size(), 2);
162 EXPECT_EQ(andAction.getActions()[0].get(), action1);
163 EXPECT_EQ(andAction.getActions()[1].get(), action2);
164}