blob: 1cc77827f80db3842f6ba5d5a2ebda3799d59721 [file] [log] [blame]
/**
* Copyright © 2020 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_environment.hpp"
#include "action_error.hpp"
#include "compare_vpd_action.hpp"
#include "id_map.hpp"
#include "mock_services.hpp"
#include "mock_vpd.hpp"
#include <exception>
#include <memory>
#include <stdexcept>
#include <string>
#include <utility>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
using ::testing::Return;
using ::testing::Throw;
using namespace phosphor::power::regulators;
TEST(CompareVPDActionTests, Constructor)
{
CompareVPDAction action{
"/xyz/openbmc_project/inventory/system/chassis/disk_backplane", "CCIN",
"2D35"};
EXPECT_EQ(action.getFRU(),
"/xyz/openbmc_project/inventory/system/chassis/disk_backplane");
EXPECT_EQ(action.getKeyword(), "CCIN");
EXPECT_EQ(action.getValue(), "2D35");
}
TEST(CompareVPDActionTests, Execute)
{
// Test where works: Actual VPD value is not an empty string
{
std::string fru{"/xyz/openbmc_project/inventory/system"};
std::string keyword{"Model"};
// Create MockServices object. VPD service will return "ABCD" as VPD
// value 4 times.
MockServices services{};
MockVPD& vpd = services.getMockVPD();
EXPECT_CALL(vpd, getValue(fru, keyword))
.Times(4)
.WillRepeatedly(Return("ABCD"));
IDMap idMap{};
ActionEnvironment environment{idMap, "", services};
// Test where returns true: actual value == expected value
{
CompareVPDAction action{fru, keyword, "ABCD"};
EXPECT_TRUE(action.execute(environment));
}
// Test where returns false: actual value != expected value
{
CompareVPDAction action{fru, keyword, "BEEF"};
EXPECT_FALSE(action.execute(environment));
}
// Test where returns false: expected value differs by case
{
CompareVPDAction action{fru, keyword, "abcd"};
EXPECT_FALSE(action.execute(environment));
}
// Test where returns false: expected value is an empty string
{
CompareVPDAction action{fru, keyword, ""};
EXPECT_FALSE(action.execute(environment));
}
}
// Test where works: Actual VPD value is an empty string
{
std::string fru{"/xyz/openbmc_project/inventory/system"};
std::string keyword{"Model"};
// Create MockServices object. VPD service will return "" as VPD value
// 2 times.
MockServices services{};
MockVPD& vpd = services.getMockVPD();
EXPECT_CALL(vpd, getValue(fru, keyword))
.Times(2)
.WillRepeatedly(Return(""));
IDMap idMap{};
ActionEnvironment environment{idMap, "", services};
// Test where returns true: actual value == expected value
{
CompareVPDAction action{fru, keyword, ""};
EXPECT_TRUE(action.execute(environment));
}
// Test where returns false: actual value != expected value
{
CompareVPDAction action{fru, keyword, "ABCD"};
EXPECT_FALSE(action.execute(environment));
}
}
// Test where fails: Exception thrown when trying to get actual VPD value
{
std::string fru{"/xyz/openbmc_project/inventory/system"};
std::string keyword{"Model"};
// Create MockServices object. VPD service will throw an exception.
MockServices services{};
MockVPD& vpd = services.getMockVPD();
EXPECT_CALL(vpd, getValue(fru, keyword))
.Times(1)
.WillOnce(
Throw(std::runtime_error{"D-Bus error: Invalid object path"}));
IDMap idMap{};
ActionEnvironment environment{idMap, "", services};
try
{
CompareVPDAction action{fru, keyword, "ABCD"};
action.execute(environment);
ADD_FAILURE() << "Should not have reached this line.";
}
catch (const ActionError& e)
{
EXPECT_STREQ(e.what(), "ActionError: compare_vpd: { fru: "
"/xyz/openbmc_project/inventory/system, "
"keyword: Model, value: ABCD }");
try
{
// Re-throw inner exception
std::rethrow_if_nested(e);
ADD_FAILURE() << "Should not have reached this line.";
}
catch (const std::runtime_error& re)
{
EXPECT_STREQ(re.what(), "D-Bus error: Invalid object path");
}
catch (...)
{
ADD_FAILURE() << "Should not have caught exception.";
}
}
catch (...)
{
ADD_FAILURE() << "Should not have caught exception.";
}
}
}
TEST(CompareVPDActionTests, GetFRU)
{
CompareVPDAction action{
"/xyz/openbmc_project/inventory/system/chassis/disk_backplane", "CCIN",
"2D35"};
EXPECT_EQ(action.getFRU(),
"/xyz/openbmc_project/inventory/system/chassis/disk_backplane");
}
TEST(CompareVPDActionTests, GetKeyword)
{
CompareVPDAction action{
"/xyz/openbmc_project/inventory/system/chassis/disk_backplane", "CCIN",
"2D35"};
EXPECT_EQ(action.getKeyword(), "CCIN");
}
TEST(CompareVPDActionTests, GetValue)
{
CompareVPDAction action{
"/xyz/openbmc_project/inventory/system/chassis/disk_backplane", "CCIN",
"2D35"};
EXPECT_EQ(action.getValue(), "2D35");
}
TEST(CompareVPDActionTests, ToString)
{
CompareVPDAction action{
"/xyz/openbmc_project/inventory/system/chassis/disk_backplane", "CCIN",
"2D35"};
EXPECT_EQ(action.toString(), "compare_vpd: { fru: "
"/xyz/openbmc_project/inventory/system/"
"chassis/disk_backplane, keyword: "
"CCIN, value: 2D35 }");
}