/** * Copyright © 2019 IBM Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "action.hpp" #include "action_environment.hpp" #include "action_utils.hpp" #include "id_map.hpp" #include "mock_action.hpp" #include "mock_services.hpp" #include #include #include #include #include #include #include using namespace phosphor::power::regulators; using ::testing::Return; using ::testing::Throw; TEST(ActionUtilsTests, Execute) { // Create ActionEnvironment IDMap idMap{}; // Create mock services. MockServices services{}; ActionEnvironment env{idMap, "", services}; // Test where vector is empty try { std::vector> actions{}; EXPECT_EQ(action_utils::execute(actions, env), true); } catch (const std::exception& error) { ADD_FAILURE() << "Should not have caught exception."; } // Test where action throws an exception try { std::vector> actions{}; std::unique_ptr action; // First action will throw an exception action = std::make_unique(); EXPECT_CALL(*action, execute) .Times(1) .WillOnce(Throw(std::logic_error{"Communication error"})); actions.push_back(std::move(action)); // Second action should not get executed action = std::make_unique(); EXPECT_CALL(*action, execute).Times(0); actions.push_back(std::move(action)); action_utils::execute(actions, env); ADD_FAILURE() << "Should not have reached this line."; } catch (const std::exception& error) { EXPECT_STREQ(error.what(), "Communication error"); } // Test where last action returns false try { std::vector> actions{}; std::unique_ptr action; // First action will return true action = std::make_unique(); EXPECT_CALL(*action, execute).Times(1).WillOnce(Return(true)); actions.push_back(std::move(action)); // Second action will return false action = std::make_unique(); EXPECT_CALL(*action, execute).Times(1).WillOnce(Return(false)); actions.push_back(std::move(action)); EXPECT_EQ(action_utils::execute(actions, env), false); } catch (const std::exception& error) { ADD_FAILURE() << "Should not have caught exception."; } // Test where last action returns true try { std::vector> actions{}; std::unique_ptr action; // First action will return false action = std::make_unique(); EXPECT_CALL(*action, execute).Times(1).WillOnce(Return(false)); actions.push_back(std::move(action)); // Second action will return true action = std::make_unique(); EXPECT_CALL(*action, execute).Times(1).WillOnce(Return(true)); actions.push_back(std::move(action)); EXPECT_EQ(action_utils::execute(actions, env), true); } catch (const std::exception& error) { ADD_FAILURE() << "Should not have caught exception."; } }