// Copyright 2024 Google LLC
//
// 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 "google3/host_commands.h"

#include "firmware_spi_updater.hpp"
#include "host_command_mock.hpp"
#include "message_util.hpp"

#include <xyz/openbmc_project/Control/Hoth/error.hpp>

#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include <cstring>

using namespace google::hoth;
using namespace google::hoth::internal;
using namespace sdbusplus::error::xyz::openbmc_project::control::hoth;

using ::testing::_;
using ::testing::Return;

class FirmwareSpiUpdaterTest : public ::testing::Test
{
  protected:
    // Host Command interface handle
    internal::HostCommandMock hostCmd;

    std::vector<uint8_t> hothGetRegionResponse = {
        0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, // Header
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
        0x01 // Data
    };

    std::vector<uint8_t> hothSpiEmptyResponse = {
        0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // Header
    };

    std::vector<uint8_t> hothSpiReadResponse = {
        0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // RspHeader
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00,             // Padding
        0x01, 0x01, 0x01, 0x01, 0x01                    // Data
    };

    std::vector<uint8_t> hothSpiEnter4BResponse = {
        0x03, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xd2, 0x4e, 0x00,
        0xe8, 0xcf, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    };

    std::vector<uint8_t> hothSpiExit4BResponse = {
        0x03, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xd2, 0x4e, 0x00,
        0xe8, 0xcf, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    };

    std::vector<uint8_t> hothGetSpsPassthoughEnabledResponse = {
        0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, // Header
        0x01,                                           // Enabled
        0x00, 0x00, 0x00,                               // Padding
    };

    std::vector<uint8_t> hothGetSpsPassthoughDisabledResponse = {
        0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, // Header
        0x00,                                           // Enabled
        0x00, 0x00, 0x00,                               // Padding
    };

    std::vector<uint8_t> hothCommandFailedResponse = {
        0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // Header
    };
};

TEST_F(FirmwareSpiUpdaterTest, SuccessEmptyData)
{
    EXPECT_CALL(hostCmd, sendCommand(_, _, _, _))
        .WillOnce(Return(hothGetRegionResponse))
        .WillOnce(Return(hothSpiEnter4BResponse));
    FirmwareSpiUpdater updater(&hostCmd);
    ASSERT_NO_THROW(updater.update({}));
}

TEST_F(FirmwareSpiUpdaterTest, SuccessEmptyData3BytesAddress)
{
    EXPECT_CALL(hostCmd, sendCommand(_, _, _, _))
        .WillOnce(Return(hothGetRegionResponse))
        .WillOnce(Return(hothSpiEnter4BResponse));
    FirmwareSpiUpdater updater(&hostCmd, 3, ResetMode::never);
    ASSERT_NO_THROW(updater.update({}));
}

TEST_F(FirmwareSpiUpdaterTest, SuccessNonEmptyData)
{
    EXPECT_CALL(hostCmd, sendCommand(_, _, _, _))
        .WillOnce(Return(hothGetRegionResponse))
        .WillOnce(Return(hothSpiEnter4BResponse))
        .WillOnce(Return(hothSpiEmptyResponse))
        .WillOnce(Return(hothSpiEmptyResponse))
        .WillOnce(Return(hothSpiReadResponse));
    FirmwareSpiUpdater updater(&hostCmd);
    std::vector<uint8_t> firmwareData(5, 0x01);
    ASSERT_NO_THROW(updater.update(firmwareData));
}

TEST_F(FirmwareSpiUpdaterTest, InvalidGetRegionResponse)
{
    FirmwareSpiUpdater updater(&hostCmd);
    // Invalid GetRegionResponse in Hoth response
    hothGetRegionResponse.pop_back();
    EXPECT_CALL(hostCmd, sendCommand(_, _, _, _))
        .WillOnce(Return(hothGetRegionResponse));
    EXPECT_THROW(updater.update({}), std::runtime_error);
}

TEST_F(FirmwareSpiUpdaterTest, GetRegionResponseFlagOff)
{
    FirmwareSpiUpdater updater(&hostCmd);
    // Flag off
    hothGetRegionResponse.back() = 0x00;
    EXPECT_CALL(hostCmd, sendCommand(_, _, _, _))
        .WillOnce(Return(hothGetRegionResponse));
    EXPECT_THROW(updater.update({}), FirmwareFailure);
}

TEST_F(FirmwareSpiUpdaterTest, SuccessSpiWriteNonEmptyData)
{
    EXPECT_CALL(hostCmd, sendCommand(_, _, _, _))
        .WillOnce(Return(hothSpiEnter4BResponse))
        .WillOnce(Return(hothSpiEmptyResponse))
        .WillOnce(Return(hothSpiEmptyResponse))
        .WillOnce(Return(hothSpiReadResponse));
    FirmwareSpiUpdater updater(&hostCmd);
    std::vector<uint8_t> firmwareData(5, 0x01);
    ASSERT_NO_THROW(updater.spiWrite(0, firmwareData));
}

TEST_F(FirmwareSpiUpdaterTest, SpiWriteSpsPassthroughDisabled)
{
    EXPECT_CALL(hostCmd, sendCommand(_, _, _, _))
        .WillOnce([this](uint16_t cmd, auto&&...){
            EXPECT_EQ(cmd, EC_CMD_BOARD_SPECIFIC_BASE | EC_PRV_CMD_HOTH_GET_SPS_PASSTHROUGH_STATUS);
            return hothGetSpsPassthoughDisabledResponse;
         })
        .WillOnce(Return(hothSpiEnter4BResponse))
        .WillOnce(Return(hothSpiEmptyResponse))
        .WillOnce(Return(hothSpiEmptyResponse))
        .WillOnce(Return(hothSpiReadResponse));
    FirmwareSpiUpdater updater(&hostCmd, /* addressSize = */ 4, ResetMode::needed);
    std::vector<uint8_t> firmwareData(5, 0x01);
    ASSERT_NO_THROW(updater.spiWrite(0, firmwareData));
}

TEST_F(FirmwareSpiUpdaterTest, SpiWriteSpsPassthroughEnabled)
{
    EXPECT_CALL(hostCmd, sendCommand(_, _, _, _))
        .WillOnce([this](uint16_t cmd, auto&&...){
            EXPECT_EQ(cmd, EC_CMD_BOARD_SPECIFIC_BASE | EC_PRV_CMD_HOTH_GET_SPS_PASSTHROUGH_STATUS);
            return hothGetSpsPassthoughEnabledResponse;
         })
        .WillOnce([this](uint16_t cmd, auto&&, const void* requestPtr, size_t requestSize) {
            ec_request_reset_target request = {};
            EXPECT_EQ(requestSize, sizeof(request));
            EXPECT_EQ(cmd, EC_CMD_BOARD_SPECIFIC_BASE | EC_PRV_CMD_HOTH_RESET_TARGET);
            std::memcpy(&request, requestPtr, std::min(requestSize, sizeof(request)));
            EXPECT_EQ(request.reset_option, EC_TARGET_RESET_OPTION_SET);
            return hothSpiEmptyResponse;
         })
        .WillOnce(Return(hothSpiEnter4BResponse))
        .WillOnce(Return(hothSpiEmptyResponse))
        .WillOnce(Return(hothSpiEmptyResponse))
        .WillOnce(Return(hothSpiReadResponse))
        .WillOnce([this](uint16_t cmd, auto&&, const void* requestPtr, size_t requestSize) {
            ec_request_reset_target request = {};
            EXPECT_EQ(requestSize, sizeof(request));
            EXPECT_EQ(cmd, EC_CMD_BOARD_SPECIFIC_BASE | EC_PRV_CMD_HOTH_RESET_TARGET);
            std::memcpy(&request, requestPtr, std::min(requestSize, sizeof(request)));
            EXPECT_EQ(request.reset_option, EC_TARGET_RESET_OPTION_RELEASE);
            return hothSpiEmptyResponse;
         });
    FirmwareSpiUpdater updater(&hostCmd, /* addressSize = */ 4, ResetMode::needed);
    std::vector<uint8_t> firmwareData(5, 0x01);
    ASSERT_NO_THROW(updater.spiWrite(0, firmwareData));
}

TEST_F(FirmwareSpiUpdaterTest, SpiWriteActivelyDisablePassthrough)
{
    EXPECT_CALL(hostCmd, sendCommand(_, _, _, _))
        .WillOnce([this](uint16_t cmd, auto&&...){
            EXPECT_EQ(cmd, EC_CMD_BOARD_SPECIFIC_BASE | EC_PRV_CMD_HOTH_GET_SPS_PASSTHROUGH_STATUS);
            return hothGetSpsPassthoughEnabledResponse;
         })
        .WillOnce([this](uint16_t cmd, auto&&...){
            EXPECT_EQ(cmd, EC_CMD_BOARD_SPECIFIC_BASE | EC_PRV_CMD_HOTH_SPS_PASSTHROUGH_DISABLE);
            return hothSpiEmptyResponse;
         })
        .WillOnce(Return(hothSpiEnter4BResponse))
        .WillOnce(Return(hothSpiEmptyResponse))
        .WillOnce(Return(hothSpiEmptyResponse))
        .WillOnce(Return(hothSpiReadResponse))
        .WillOnce([this](uint16_t cmd, auto&&...){
            EXPECT_EQ(cmd, EC_CMD_BOARD_SPECIFIC_BASE | EC_PRV_CMD_HOTH_SPS_PASSTHROUGH_ENABLE);
            return hothSpiEmptyResponse;
         });
    FirmwareSpiUpdater updater(&hostCmd, /* addressSize = */ 4, ResetMode::needed_active);
    std::vector<uint8_t> firmwareData(5, 0x01);
    ASSERT_NO_THROW(updater.spiWrite(0, firmwareData));
}

TEST_F(FirmwareSpiUpdaterTest, SpiWriteDisablePassthroughFailed)
{
    EXPECT_CALL(hostCmd, sendCommand(_, _, _, _))
        .WillOnce([this](uint16_t cmd, auto&&...){
            EXPECT_EQ(cmd, EC_CMD_BOARD_SPECIFIC_BASE | EC_PRV_CMD_HOTH_GET_SPS_PASSTHROUGH_STATUS);
            return hothGetSpsPassthoughEnabledResponse;
         })
        .WillOnce([this](uint16_t cmd, auto&&...){
            EXPECT_EQ(cmd, EC_CMD_BOARD_SPECIFIC_BASE | EC_PRV_CMD_HOTH_SPS_PASSTHROUGH_DISABLE);
            return hothCommandFailedResponse;
         })
        .WillOnce([this](uint16_t cmd, auto&&, const void* requestPtr, size_t requestSize) {
            ec_request_reset_target request = {};
            EXPECT_EQ(requestSize, sizeof(request));
            EXPECT_EQ(cmd, EC_CMD_BOARD_SPECIFIC_BASE | EC_PRV_CMD_HOTH_RESET_TARGET);
            std::memcpy(&request, requestPtr, std::min(requestSize, sizeof(request)));
            EXPECT_EQ(request.reset_option, EC_TARGET_RESET_OPTION_SET);
            return hothSpiEmptyResponse;
         })
        .WillOnce(Return(hothSpiEnter4BResponse))
        .WillOnce(Return(hothSpiEmptyResponse))
        .WillOnce(Return(hothSpiEmptyResponse))
        .WillOnce(Return(hothSpiReadResponse))
        .WillOnce([this](uint16_t cmd, auto&&, const void* requestPtr, size_t requestSize) {
            ec_request_reset_target request = {};
            EXPECT_EQ(requestSize, sizeof(request));
            EXPECT_EQ(cmd, EC_CMD_BOARD_SPECIFIC_BASE | EC_PRV_CMD_HOTH_RESET_TARGET);
            std::memcpy(&request, requestPtr, std::min(requestSize, sizeof(request)));
            EXPECT_EQ(request.reset_option, EC_TARGET_RESET_OPTION_RELEASE);
            return hothSpiEmptyResponse;
         });
    FirmwareSpiUpdater updater(&hostCmd, /* addressSize = */ 4, ResetMode::needed_active);
    std::vector<uint8_t> firmwareData(5, 0x01);
    ASSERT_NO_THROW(updater.spiWrite(0, firmwareData));
}
