blob: 242222833c106d6816850e7a4e494b496c40c1d6 [file]
#include <cstdint>
#include <iostream>
#include <memory>
#include <optional>
#include <string>
#include <utility>
#include <vector>
#include <gtest/gtest.h>
#include "absl/cleanup/cleanup.h"
#include "absl/status/statusor.h"
#include "dbus_utility.hpp"
#include "systems.hpp"
#include "test/redfish-core/lib/snapshot_fixture.hpp"
#include <nlohmann/json.hpp>
#include "managed_store.hpp"
#include "managed_store_types.hpp"
#include "test/g3/mock_managed_store.hpp"
#include "test/g3/mock_managed_store_test.hpp"
#include "sdbusplus/message/native_types.hpp"
namespace redfish {
namespace {
using ::dbus::utility::DbusVariantType;
using ::managedStore::KeyType;
using ::managedStore::ManagedType;
using ::managedStore::ValueType;
std::shared_ptr<ValueType> CreateBadMockAssociatedSubtreeForMultiSystem() {
dbus::utility::MapperGetSubTreeResponse mockAssociatedSubtree = {
std::make_pair(
"/xyz/openbmc_project/state/chassis1",
dbus::utility::MapperServiceMap{
{std::make_pair("xyz.openbmc_project.Chassis.Buttons1",
std::vector<std::string>{
"org.freedesktop.DBus.Introspectable",
"org.freedesktop.DBus.Peer",
"org.freedesktop.DBus.Properties",
"xyz.openbmc_project.State.Chassis",
}),
std::make_pair("xyz.openbmc_project.Control.Host.RestartCause1",
std::vector<std::string>{
"org.freedesktop.DBus.Introspectable",
"org.freedesktop.DBus.Peer",
"org.freedesktop.DBus.Properties",
"xyz.openbmc_project.State.Chassis",
})}}),
std::make_pair(
"/xyz/openbmc_project/state/chassis2",
dbus::utility::MapperServiceMap{
{std::make_pair("xyz.openbmc_project.Chassis.Buttons1",
std::vector<std::string>{
"org.freedesktop.DBus.Introspectable",
"org.freedesktop.DBus.Peer",
"org.freedesktop.DBus.Properties",
"xyz.openbmc_project.State.Chassis",
}),
std::make_pair("xyz.openbmc_project.Control.Host.RestartCause1",
std::vector<std::string>{
"org.freedesktop.DBus.Introspectable",
"org.freedesktop.DBus.Peer",
"org.freedesktop.DBus.Properties",
"xyz.openbmc_project.State.Chassis",
})}}),
};
return managedStore::MockManagedStoreTest::CreateValueType(
std::move(mockAssociatedSubtree));
}
TEST_F(SnapshotFixture_Platform23,
GetSystemHostPowerAssociatedSubTreeHasMoreThanOneObjectsForMultiSystem) {
// Looking for
// kManagedAssociatedSubtree|/xyz/openbmc_project/state|0|xyz.openbmc_project.State.Chassis|/xyz/openbmc_project/inventory/system/board/platform23/system1/chassis_power
KeyType key(ManagedType::kManagedAssociatedSubtree,
"/xyz/openbmc_project/inventory/system/board/platform23/system1/"
"chassis_power",
"/xyz/openbmc_project/state", 0,
{"xyz.openbmc_project.State.Chassis"});
absl::StatusOr<std::shared_ptr<ValueType>>
chassisPowerAssociatedSubtreeStatusOr =
dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
managedStore::GetManagedObjectStore())
->getMockObjectFromManagedStore(key);
ASSERT_TRUE(chassisPowerAssociatedSubtreeStatusOr.ok());
// TODO(b/416746677): Uncomment after the bug is fixed
// ASSERT_EQ(systemObjectsPathsStatusOr.value()->managedType,
// ManagedType::kManagedSubtreePaths);
std::optional<dbus::utility::MapperGetSubTreeResponse>
originalAssociatedSubtree =
chassisPowerAssociatedSubtreeStatusOr.value()->managedSubtree;
ASSERT_TRUE(originalAssociatedSubtree.has_value());
ASSERT_TRUE(dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
managedStore::GetManagedObjectStore())
->upsertMockObjectIntoManagedStore(
key, CreateBadMockAssociatedSubtreeForMultiSystem())
.ok());
absl::Cleanup mockManagedStoreResetter = [key, originalAssociatedSubtree]() {
ASSERT_TRUE(
dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
managedStore::GetManagedObjectStore())
->upsertMockObjectIntoManagedStore(
key, managedStore::MockManagedStoreTest::CreateValueType(
originalAssociatedSubtree.value()))
.ok());
};
handleComputerSystem(
share_async_resp_,
"/xyz/openbmc_project/inventory/system/board/platform23/system1",
"system1", true);
RunIoUntilDone();
EXPECT_EQ(share_async_resp_->res.result(),
boost::beast::http::status::internal_server_error);
}
TEST_F(SnapshotFixture_Platform23, GetSystemHostPowerAssociatedSubTreeSuccess) {
std::cerr << "Hao: start \n";
handleComputerSystem(
share_async_resp_,
"/xyz/openbmc_project/inventory/system/board/platform23/system1",
"system1", true);
RunIoUntilDone();
EXPECT_EQ(share_async_resp_->res.result(), boost::beast::http::status::ok);
std::cerr << "Hao: Done \n";
}
TEST_F(SnapshotFixture_Platform23, MultiHostPlatformIncludesBios) {
handleComputerSystem(share_async_resp_, "", "system1", false);
RunIoUntilDone();
nlohmann::json& json = share_async_resp_->res.jsonValue;
EXPECT_TRUE(json.contains("Bios"));
EXPECT_EQ(json["Bios"]["@odata.id"], "/redfish/v1/Systems/system1/Bios");
}
TEST_F(SnapshotFixture_Platform23, HandleGetBootNumber) {
KeyType key(
ManagedType::kManagedProperty, "xyz.openbmc_project.Smbios.MDR_V2",
sdbusplus::message::object_path(
"/xyz/openbmc_project/inventory/system/board/platform23/system1/"
"chassis/motherboard/bios"),
"xyz.openbmc_project.State.Host", "BootCount");
uint32_t num = 1000;
std::shared_ptr<ValueType> bootCountValue =
managedStore::MockManagedStoreTest::CreateValueType(std::move(num));
ASSERT_TRUE(dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
managedStore::GetManagedObjectStore())
->upsertMockObjectIntoManagedStore(key, bootCountValue)
.ok());
handleGetBootNumber(app_, CreateRequest(""), share_async_resp_, "system1");
RunIoUntilDone();
nlohmann::json& json = share_async_resp_->res.jsonValue;
EXPECT_EQ(json["@odata.id"],
"/redfish/v1/Systems/system1/Oem/Google/BootNumber");
EXPECT_EQ(json["@odata.type"], "#GoogleBootNumber.v1_0_0.GoogleBootNumber");
EXPECT_TRUE(json.contains("BootNumber"));
EXPECT_EQ(json["BootNumber"], 1000);
}
} // namespace
} // namespace redfish