#include <cstdint>
#include <filesystem>  //NOLINT
#include <memory>
#include <string>
#include <system_error>  // NOLINT
#include <utility>
#include <vector>

#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "absl/functional/any_invocable.h"
#include "http_request.hpp"
#include "http_response.hpp"
#include "async_resp.hpp"
#include "dbus_utility.hpp"
#include "managers.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"

namespace redfish
{
namespace
{

using ::dbus::utility::DBusPropertiesMap;
using ::dbus::utility::DbusVariantType;
using ::dbus::utility::MapperGetSubTreeResponse;
using ::dbus::utility::MapperServiceMap;
using ::managedStore::KeyType;
using ::managedStore::ManagedType;
using ::managedStore::ValueType;

constexpr char kClassType[] = "Temperature";
constexpr char kSensor[] = "sensor0";
constexpr double kInput = 43.0;
constexpr double kOutput = 4000.0;
constexpr double kSetpoint = 65.0;
constexpr uint8_t kTestData = 15;

// std::shared_ptr<ValueType> CreateMockSubtreeResponse()
// {
//     MapperGetSubTreeResponse mockSubtreeResponse{{std::make_pair(
//         "/xyz/openbmc_project/inventory/system/component/BMC_flash",
//         MapperServiceMap{{std::make_pair(
//             "xyz.openbmc_project.EntityManager",
//             std::vector<std::string>{
//                 "xyz.openbmc_project.Inventory.Decorator.LocationCode"})}})}};
//     return managedStore::MockManagedStoreTest::CreateValueType(
//         std::move(mockSubtreeResponse));
// }

// TODO(edwarddl): Uncomment after handleManagerGet is updated
// TEST_F(SnapshotFixture, handleManagerGetTest)
// {
//     KeyType key(ManagedType::kManagedSubtree,
//                 "/xyz/openbmc_project/inventory", 0,
//                 {"xyz.openbmc_project.Inventory.Item.Bmc"});
//     ASSERT_TRUE(
//         dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
//             managedStore::GetManagedObjectStore())
//             ->upsertMockObjectIntoManagedStore(
//                 key, CreateMockSubtreeResponse())
//             .ok());
//     handleManagerGet(app_, CreateRequest(), share_async_resp_);
//
//     RunIoUntilDone();
//
//     nlohmann::json& json = share_async_resp_->res.jsonValue;
//
//     LOG(INFO) << json.dump(2);
//     EXPECT_EQ(json["@odata.id"], "/redfish/v1/Managers/bmc");
//     EXPECT_EQ(json["Location"]["PartLocation"]["ServiceLabel"], "BMC");
//     EXPECT_EQ(json["Location"]["PartLocation"]["LocationType"], "Embedded");
//     EXPECT_EQ(json["Location"]["PartLocationContext"], "DC_SCM");
//     EXPECT_EQ(json["Location"]["Oem"]["Google"]["EmbeddedLocationContext"],
//               "openbmc_manager");
//     EXPECT_EQ(json["Links"]["ManagerForServers@odata.count"], 1);
//     EXPECT_EQ(json["Links"]["ManagerForServers"][0]["@odata.id"],
//               "/redfish/v1/Systems/system");
//     EXPECT_EQ(share_async_resp_->res.result(),
//               boost::beast::http::status::ok);
// }

std::shared_ptr<ValueType> CreatePidDebugInfoProperty()
{
    DBusPropertiesMap pidDebugInfoProperty{
        {std::make_pair("ClassType", DbusVariantType(kClassType))},
        {std::make_pair("Input", DbusVariantType(kInput))},
        {std::make_pair("Leader", DbusVariantType(kSensor))},
        {std::make_pair("Output", DbusVariantType(kOutput))},
        {std::make_pair("Setpoint", DbusVariantType(kSetpoint))},
        {std::make_pair("TestData", DbusVariantType(kTestData))}};
    return managedStore::MockManagedStoreTest::CreateValueType(
        std::move(pidDebugInfoProperty));
}

TEST_F(SnapshotFixture, updateZoneLeaderInfoGetNull)
{
    const std::string zoneIndex = "0";
    const std::string name = "Zone_0";
    const std::string leader = "sensor_PID";
    const std::string pidDebugInfoPath =
        "/xyz/openbmc_project/settings/fanctrl/zone" + zoneIndex + "/" + leader;

    auto response = std::make_shared<bmcweb::AsyncResp>();
    nlohmann::json& json = response->res.jsonValue;
    managedStore::ManagedObjectStoreContext context(response);

    // Test for null dbus response
    updateZoneLeaderInfo(response, zoneIndex, name, leader, context);

    RunIoUntilDone();

    EXPECT_TRUE(
        json["Oem"]["OpenBmc"]["Fan"]["FanZones"][name]["Leader"]["ClassType"]
            .is_null());
    EXPECT_TRUE(
        json["Oem"]["OpenBmc"]["Fan"]["FanZones"][name]["Leader"]["Input"]
            .is_null());
    EXPECT_TRUE(
        json["Oem"]["OpenBmc"]["Fan"]["FanZones"][name]["Leader"]["Output"]
            .is_null());
    EXPECT_TRUE(
        json["Oem"]["OpenBmc"]["Fan"]["FanZones"][name]["Leader"]["Sensor"]
            .is_null());
    EXPECT_TRUE(
        json["Oem"]["OpenBmc"]["Fan"]["FanZones"][name]["Leader"]["Setpoint"]
            .is_null());
}

TEST_F(SnapshotFixture, updateZoneLeaderInfoSuccess)
{
    const std::string zoneIndex = "0";
    const std::string name = "Zone_0";
    const std::string leader = "sensor_PID";
    const std::string pidDebugInfoPath =
        "/xyz/openbmc_project/settings/fanctrl/zone" + zoneIndex + "/" + leader;

    auto response = std::make_shared<bmcweb::AsyncResp>();
    nlohmann::json& json = response->res.jsonValue;
    managedStore::ManagedObjectStoreContext context(response);

    // kManagedPropertyMap
    KeyType key(ManagedType::kManagedPropertyMap,
                "xyz.openbmc_project.State.FanCtrl", pidDebugInfoPath,
                "xyz.openbmc_project.Debug.Pid.ThermalPower");

    ASSERT_TRUE(dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
                    managedStore::GetManagedObjectStore())
                    ->upsertMockObjectIntoManagedStore(
                        key, CreatePidDebugInfoProperty())
                    .ok());

    updateZoneLeaderInfo(response, zoneIndex, name, leader, context);

    RunIoUntilDone();

    EXPECT_EQ(
        json["Oem"]["OpenBmc"]["Fan"]["FanZones"][name]["Leader"]["ClassType"],
        kClassType);
    EXPECT_EQ(
        json["Oem"]["OpenBmc"]["Fan"]["FanZones"][name]["Leader"]["Input"],
        kInput);
    EXPECT_EQ(
        json["Oem"]["OpenBmc"]["Fan"]["FanZones"][name]["Leader"]["Sensor"],
        kSensor);
    EXPECT_EQ(
        json["Oem"]["OpenBmc"]["Fan"]["FanZones"][name]["Leader"]["Output"],
        kOutput);
    EXPECT_EQ(
        json["Oem"]["OpenBmc"]["Fan"]["FanZones"][name]["Leader"]["Setpoint"],
        kSetpoint);
    EXPECT_EQ(
        json["Oem"]["OpenBmc"]["Fan"]["FanZones"][name]["Leader"]["TestData"],
        "n/a");
}

TEST_F(SnapshotFixture, PostManagerResetActionGood)
{
    // using expected call to mitigate the memory issue in valgrind
    // https://b.corp.google.com/issues/416295689
    // https://b.corp.google.com/issues/416608762
    EXPECT_CALL(
        *dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
            managedStore::GetManagedObjectStore()),
        PostDbusCallToIoContextThreadSafe(
            testing::_,
            testing::An<
                absl::AnyInvocable<void(const boost::system::error_code&)>&&>(),
            "xyz.openbmc_project.State.Chassis",
            testing::An<const std::string&>(),
            "org.freedesktop.DBus.Properties", "Set",
            "xyz.openbmc_project.State.Chassis", "RequestedPowerTransition",
            dbus::utility::DbusVariantType(
                "xyz.openbmc_project.State.Chassis.Transition.PowerCycle")))
        .WillOnce(
            managedStore::SimulateSuccessfulAsyncPostDbusCallThreadSafeAction::
                SimulateSuccessfulAsyncPostDbusCall());

    handlePostManagerResetAction(
        app_, CreateRequest("{\"ResetType\":\"TrayPowerCycle\"} "),
        share_async_resp_);

    RunIoUntilDone();

    EXPECT_EQ(share_async_resp_->res.result(), boost::beast::http::status::ok);
}

TEST_F(SnapshotFixture, PostManagerResetActionBadResetType)
{
    handlePostManagerResetAction(
        app_, CreateRequest("{\"ResetType\":\"Typo\"} "), share_async_resp_);

    RunIoUntilDone();

    EXPECT_EQ(share_async_resp_->res.result(),
              boost::beast::http::status::bad_request);
}

TEST_F(SnapshotFixture, handleManagerResetActionInfoAllowableValues)
{
    handleManagerResetActionInfo(app_, CreateRequest(""), share_async_resp_);

    RunIoUntilDone();

    EXPECT_EQ(share_async_resp_->res.result(), boost::beast::http::status::ok);

    auto allowable_values =
        share_async_resp_->res.jsonValue["Parameters"][0]["AllowableValues"];
    EXPECT_THAT(allowable_values,
                testing::ElementsAre("GracefulRestart", "ForceRestart",
                                     "TrayPowerCycle"));
}

// TODO(edwarddl): Uncomment after handleManagerGet is updated
// TEST_F(SnapshotFixture, handleManagerGetMultiSystem)
// {
//     KeyType key(ManagedType::kManagedSubtreePaths, "/", 0,
//                 {"xyz.openbmc_project.Inventory.Item.System"});
//
//     std::vector<std::string> path = {
//         "/xyz/system1",
//         "/xyz/system2",
//     };
//     std::shared_ptr<ValueType> test_value = CreateValueType(path);
//     ASSERT_TRUE(dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
//                     managedStore::GetManagedObjectStore())
//                     ->upsertMockObjectIntoManagedStore(key, test_value)
//                     .ok());
//
//     handleManagerGet(app_, CreateRequest(), share_async_resp_);
//
//     RunIoUntilDone();
//
//     nlohmann::json& json = share_async_resp_->res.jsonValue;
//
//     EXPECT_EQ(json["Links"]["ManagerForServers@odata.count"], 2);
//     EXPECT_EQ(json["Links"]["ManagerForServers"][0]["@odata.id"],
//               "/redfish/v1/Systems/system1");
//     EXPECT_EQ(json["Links"]["ManagerForServers"][1]["@odata.id"],
//               "/redfish/v1/Systems/system2");
//     EXPECT_EQ(share_async_resp_->res.result(),
//               boost::beast::http::status::ok);
// }

TEST_F(SnapshotFixture, handleManagerGetFruDeviceOemLink) {
  std::error_code ec;
  auto origPath = std::filesystem::current_path(ec);
  std::filesystem::current_path(std::filesystem::temp_directory_path(ec), ec);

  handleManagerGet(app_, CreateRequest(), share_async_resp_, "bmc");

  RunIoUntilDone();

  std::filesystem::current_path(origPath, ec);

  nlohmann::json& json = share_async_resp_->res.jsonValue;
  EXPECT_EQ(json["Oem"]["Google"]["FruDevice"]["@odata.id"],
            "/redfish/v1/Managers/bmc/Oem/Google/FruDevice");
}

TEST_F(SnapshotFixture, handleFruDeviceGet) {
  handleFruDeviceGet(app_, CreateRequest(), share_async_resp_);

  RunIoUntilDone();

  nlohmann::json& json = share_async_resp_->res.jsonValue;
  EXPECT_EQ(json, nlohmann::json::parse(R"({
    "@odata.id": "/redfish/v1/Managers/bmc/Oem/Google/FruDevice",
    "@odata.type": "#GoogleFruDevice.v1_0_0.GoogleFruDeviceService",
    "Id": "FruDevice",
    "IpmiFrus": {
      "@odata.id": "/redfish/v1/Managers/bmc/Oem/Google/FruDevice/IpmiFrus"
    },
    "Name": "Google FRU Device Service",
    "RawEeproms": {
      "@odata.id": "/redfish/v1/Managers/bmc/Oem/Google/FruDevice/RawEeproms"
    }
  })"));
  EXPECT_EQ(share_async_resp_->res.result(), boost::beast::http::status::ok);
}

TEST_F(SnapshotFixture, handleIpmiFruCollectionGet) {
  KeyType key(ManagedType::kManagedSubtreePaths,
              "/xyz/openbmc_project/FruDevice", 0,
              {"xyz.openbmc_project.FruDevice"});

  std::vector<std::string> paths = {
      "/xyz/openbmc_project/FruDevice/TestFru1",
      "/xyz/openbmc_project/FruDevice/TestFru2",
  };
  ASSERT_TRUE(
      dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
          managedStore::GetManagedObjectStore())
          ->upsertMockObjectIntoManagedStore(
              key, managedStore::MockManagedStoreTest::CreateValueType(paths))
          .ok());

  handleIpmiFruCollectionGet(app_, CreateRequest(), share_async_resp_);

  RunIoUntilDone();

  nlohmann::json& json = share_async_resp_->res.jsonValue;
  EXPECT_EQ(json, nlohmann::json::parse(R"({
    "@odata.id": "/redfish/v1/Managers/bmc/Oem/Google/FruDevice/IpmiFrus",
    "@odata.type": "#GoogleFruDevice.v1_0_0.GoogleIpmiFruCollection",
    "Id": "IpmiFrus",
    "Members": [
      {
        "@odata.id": "/redfish/v1/Managers/bmc/Oem/Google/FruDevice/IpmiFrus/TestFru1"
      },
      {
        "@odata.id": "/redfish/v1/Managers/bmc/Oem/Google/FruDevice/IpmiFrus/TestFru2"
      }
    ],
    "Members@odata.count": 2,
    "Name": "Google IPMI FRU Collection"
  })"));
  EXPECT_EQ(share_async_resp_->res.result(), boost::beast::http::status::ok);
}

TEST_F(SnapshotFixture, handleRawEepromCollectionGet) {
  KeyType key(ManagedType::kManagedSubtreePaths,
              "/xyz/openbmc_project/FruDevice", 0,
              {"xyz.openbmc_project.Inventory.Item.I2CDevice"});

  std::vector<std::string> paths = {
      "/xyz/openbmc_project/FruDevice/Eeprom1",
  };
  ASSERT_TRUE(
      dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
          managedStore::GetManagedObjectStore())
          ->upsertMockObjectIntoManagedStore(
              key, managedStore::MockManagedStoreTest::CreateValueType(paths))
          .ok());

  handleRawEepromCollectionGet(app_, CreateRequest(), share_async_resp_);

  RunIoUntilDone();

  nlohmann::json& json = share_async_resp_->res.jsonValue;
  EXPECT_EQ(json, nlohmann::json::parse(R"({
    "@odata.id": "/redfish/v1/Managers/bmc/Oem/Google/FruDevice/RawEeproms",
    "@odata.type": "#GoogleFruDevice.v1_0_0.GoogleRawEepromCollection",
    "Id": "RawEeproms",
    "Members": [
      {
        "@odata.id": "/redfish/v1/Managers/bmc/Oem/Google/FruDevice/RawEeproms/Eeprom1"
      }
    ],
    "Members@odata.count": 1,
    "Name": "Google Raw EEPROM Collection"
  })"));
  EXPECT_EQ(share_async_resp_->res.result(), boost::beast::http::status::ok);
}

TEST(ToTitleCaseTest, ConvertsPropertyNamesToTitleCase) {
  EXPECT_EQ(toTitleCase("BOARD_PRODUCT_NAME"), "BoardProductName");
  EXPECT_EQ(toTitleCase("BUS"), "Bus");
  EXPECT_EQ(toTitleCase("ADDRESS"), "Address");
  EXPECT_EQ(toTitleCase("PRODUCT_MANUFACTURER"), "ProductManufacturer");
  EXPECT_EQ(toTitleCase("PRODUCT_SERIAL_NUMBER"), "ProductSerialNumber");
  EXPECT_EQ(toTitleCase("foo_bar_baz"), "FooBarBaz");
  EXPECT_EQ(toTitleCase(""), "");
}

TEST_F(SnapshotFixture, handleIpmiFruMemberGet) {
  std::string fruId = "TestFru1";
  KeyType key(ManagedType::kManagedPropertyMap, "xyz.openbmc_project.FruDevice",
              "/xyz/openbmc_project/FruDevice/" + fruId,
              "xyz.openbmc_project.FruDevice");

  DBusPropertiesMap props = {
      {std::make_pair("BUS", DbusVariantType(static_cast<uint32_t>(1)))},
      {std::make_pair("ADDRESS", DbusVariantType(static_cast<uint32_t>(80)))},
      {std::make_pair("BOARD_PRODUCT_NAME", DbusVariantType("BoardName"))}};

  ASSERT_TRUE(
      dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
          managedStore::GetManagedObjectStore())
          ->upsertMockObjectIntoManagedStore(
              key, managedStore::MockManagedStoreTest::CreateValueType(props))
          .ok());

  handleIpmiFruMemberGet(app_, CreateRequest(), share_async_resp_, fruId);

  RunIoUntilDone();

  nlohmann::json& json = share_async_resp_->res.jsonValue;
  EXPECT_EQ(json, nlohmann::json::parse(R"({
    "@odata.id": "/redfish/v1/Managers/bmc/Oem/Google/FruDevice/IpmiFrus/TestFru1",
    "@odata.type": "#GoogleFruDevice.v1_0_0.IpmiFru",
    "Id": "TestFru1",
    "Name": "Google IPMI FRU",
    "Bus": 1,
    "Address": 80,
    "BoardProductName": "BoardName"
  })"));
  EXPECT_EQ(share_async_resp_->res.result(), boost::beast::http::status::ok);
}

TEST_F(SnapshotFixture, handleIpmiFruMemberGetNotFound) {
  handleIpmiFruMemberGet(app_, CreateRequest(), share_async_resp_,
                         "NonExistentFru");

  RunIoUntilDone();

  EXPECT_EQ(share_async_resp_->res.result(),
            boost::beast::http::status::not_found);
}

TEST_F(SnapshotFixture, handleRawEepromMemberGet) {
  std::string rawId = "Eeprom1";
  KeyType key(ManagedType::kManagedPropertyMap, "xyz.openbmc_project.FruDevice",
              "/xyz/openbmc_project/FruDevice/" + rawId,
              "xyz.openbmc_project.Inventory.Item.I2CDevice");

  DBusPropertiesMap props = {
      {std::make_pair("Bus", DbusVariantType(static_cast<uint32_t>(2)))},
      {std::make_pair("Address", DbusVariantType(static_cast<uint32_t>(81)))},
  };

  ASSERT_TRUE(
      dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
          managedStore::GetManagedObjectStore())
          ->upsertMockObjectIntoManagedStore(
              key, managedStore::MockManagedStoreTest::CreateValueType(props))
          .ok());

  EXPECT_CALL(
      *dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
          managedStore::GetManagedObjectStore()),
      PostDbusCallToIoContextThreadSafe(
          testing::_,
          testing::An<
              absl::AnyInvocable<void(const boost::system::error_code&,
                                      const std::vector<uint8_t>&)>&&>(),
          "xyz.openbmc_project.FruDevice", "/xyz/openbmc_project/FruDevice",
          "xyz.openbmc_project.FruDeviceManager", "GetRawFru",
          testing::Eq(static_cast<uint16_t>(2)),
          testing::Eq(static_cast<uint8_t>(81))))
      .WillOnce(
          managedStore::
              SimulateSuccessfulAsyncPostDbusCallThreadSafeWithValueAction<
                  std::vector<uint8_t>>::
                  SimulateSuccessfulAsyncPostDbusCallWithValue(
                      std::make_shared<std::vector<uint8_t>>(
                          std::vector<uint8_t>{1, 2, 3})));

  handleRawEepromMemberGet(app_, CreateRequest(), share_async_resp_, rawId);

  RunIoUntilDone();

  nlohmann::json& json = share_async_resp_->res.jsonValue;
  EXPECT_EQ(json, nlohmann::json::parse(R"({
    "@odata.id": "/redfish/v1/Managers/bmc/Oem/Google/FruDevice/RawEeproms/Eeprom1",
    "@odata.type": "#GoogleFruDevice.v1_0_0.RawEeprom",
    "Id": "Eeprom1",
    "Name": "Google Raw EEPROM",
    "Bus": 2,
    "Address": 81,
    "RawData": [1, 2, 3]
  })"));
  EXPECT_EQ(share_async_resp_->res.result(), boost::beast::http::status::ok);
}

TEST_F(SnapshotFixture, handleRawEepromMemberGetNotFound) {
  handleRawEepromMemberGet(app_, CreateRequest(), share_async_resp_,
                           "NonExistentEeprom");

  RunIoUntilDone();

  EXPECT_EQ(share_async_resp_->res.result(),
            boost::beast::http::status::not_found);
}

TEST_F(SnapshotFixture, handleIpmiFruCollectionGetInvalidOdataVersion) {
  boost::beast::http::request<boost::beast::http::string_body> reqIn;
  reqIn.set("OData-Version", "3.0");
  std::error_code ec;
  crow::Request req(reqIn, ec);
  handleIpmiFruCollectionGet(app_, req, share_async_resp_);
  RunIoUntilDone();
  EXPECT_EQ(share_async_resp_->res.result(),
            boost::beast::http::status::precondition_failed);
}

TEST_F(SnapshotFixture, handleRawEepromCollectionGetInvalidOdataVersion) {
  boost::beast::http::request<boost::beast::http::string_body> reqIn;
  reqIn.set("OData-Version", "3.0");
  std::error_code ec;
  crow::Request req(reqIn, ec);
  handleRawEepromCollectionGet(app_, req, share_async_resp_);
  RunIoUntilDone();
  EXPECT_EQ(share_async_resp_->res.result(),
            boost::beast::http::status::precondition_failed);
}

TEST_F(SnapshotFixture, handleIpmiFruMemberGetInvalidId) {
  std::string fruId = "Test-Fru";
  handleIpmiFruMemberGet(app_, CreateRequest(), share_async_resp_, fruId);
  RunIoUntilDone();
  EXPECT_EQ(share_async_resp_->res.result(),
            boost::beast::http::status::not_found);
}

TEST_F(SnapshotFixture, handleRawEepromMemberGetInvalidId) {
  std::string rawId = "Eeprom.1";
  handleRawEepromMemberGet(app_, CreateRequest(), share_async_resp_, rawId);
  RunIoUntilDone();
  EXPECT_EQ(share_async_resp_->res.result(),
            boost::beast::http::status::not_found);
}

TEST_F(SnapshotFixture, asyncPopulatePidZoneChassisValid) {
  const std::string connection = "xyz.openbmc_project.EntityManager";
  const std::string path = "/xyz/openbmc_project/inventory";
  const std::string zoneName = "Zone_0";
  const std::string chassisName = "TestChassis";

  // Mock ManagedObjectType for asyncPopulatePid
  dbus::utility::ManagedObjectType managedObj = {
      {sdbusplus::message::object_path(
           "/xyz/openbmc_project/inventory/system/chassis/" + chassisName +
           "/" + zoneName),
       {{"xyz.openbmc_project.Configuration.Pid.Zone",
         {{"Name", DbusVariantType(zoneName)},
          {"Class", DbusVariantType("temp")},
          {"ZoneIndex", DbusVariantType(0.0)},
          {"MinThermalOutput", DbusVariantType(3000.0)}}}}}};

  KeyType objKey(ManagedType::kManagedObject, connection, path);
  ASSERT_TRUE(dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
                  managedStore::GetManagedObjectStore())
                  ->upsertMockObjectIntoManagedStore(
                      objKey, managedStore::MockManagedStoreTest::CreateValueType(
                                  managedObj))
                  .ok());

  // Mock chassis subtree paths containing the matching chassis
  std::vector<std::string> chassisPaths = {
      "/xyz/openbmc_project/inventory/system/chassis/" + chassisName,
  };
  KeyType chassisSubtreeKey(
      ManagedType::kManagedSubtreePaths, "/xyz/openbmc_project/inventory", 0,
      {"xyz.openbmc_project.Inventory.Item.Board",
       "xyz.openbmc_project.Inventory.Item.Chassis"});
  ASSERT_TRUE(dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
                  managedStore::GetManagedObjectStore())
                  ->upsertMockObjectIntoManagedStore(
                      chassisSubtreeKey,
                      managedStore::MockManagedStoreTest::CreateValueType(
                          chassisPaths))
                  .ok());

  asyncPopulatePid(connection, path, "", {}, share_async_resp_);
  RunIoUntilDone();

  nlohmann::json& json = share_async_resp_->res.jsonValue;
  EXPECT_EQ(
      json["Oem"]["OpenBmc"]["Fan"]["FanZones"][zoneName]["Chassis"]["@odata.id"],
      "/redfish/v1/Chassis/" + chassisName);
}

TEST_F(SnapshotFixture, asyncPopulatePidZoneChassisInvalid) {
  const std::string connection = "xyz.openbmc_project.EntityManager";
  const std::string path = "/xyz/openbmc_project/inventory";
  const std::string zoneName = "Zone_0";
  const std::string chassisName = "InvalidChassis";

  // Mock ManagedObjectType with an invalid chassis name in the path
  dbus::utility::ManagedObjectType managedObj = {
      {sdbusplus::message::object_path(
           "/xyz/openbmc_project/inventory/system/chassis/" + chassisName +
           "/" + zoneName),
       {{"xyz.openbmc_project.Configuration.Pid.Zone",
         {{"Name", DbusVariantType(zoneName)},
          {"Class", DbusVariantType("temp")},
          {"ZoneIndex", DbusVariantType(0.0)},
          {"MinThermalOutput", DbusVariantType(3000.0)}}}}}};

  KeyType objKey(ManagedType::kManagedObject, connection, path);
  ASSERT_TRUE(dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
                  managedStore::GetManagedObjectStore())
                  ->upsertMockObjectIntoManagedStore(
                      objKey, managedStore::MockManagedStoreTest::CreateValueType(
                                  managedObj))
                  .ok());

  // Mock chassis subtree paths containing only OtherChassis (not InvalidChassis)
  std::vector<std::string> chassisPaths = {
      "/xyz/openbmc_project/inventory/system/chassis/OtherChassis",
  };
  KeyType chassisSubtreeKey(
      ManagedType::kManagedSubtreePaths, "/xyz/openbmc_project/inventory", 0,
      {"xyz.openbmc_project.Inventory.Item.Board",
       "xyz.openbmc_project.Inventory.Item.Chassis"});
  ASSERT_TRUE(dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
                  managedStore::GetManagedObjectStore())
                  ->upsertMockObjectIntoManagedStore(
                      chassisSubtreeKey,
                      managedStore::MockManagedStoreTest::CreateValueType(
                          chassisPaths))
                  .ok());

  asyncPopulatePid(connection, path, "", {}, share_async_resp_);
  RunIoUntilDone();

  nlohmann::json& json = share_async_resp_->res.jsonValue;
  // When chassis is invalid, Chassis property should not be reported
  EXPECT_FALSE(
      json["Oem"]["OpenBmc"]["Fan"]["FanZones"][zoneName].contains("Chassis"));
}

}  // namespace
}  // namespace redfish
