// 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 "hoth_update_unittest.hpp"

#include <string_view>

#include <gtest/gtest.h>

namespace ipmi_hoth
{

using ::testing::Return;

class HothUpdateOpenTest : public HothUpdateTest
{};

TEST_F(HothUpdateOpenTest, OpenWithBadFlagsFails)
{
    // Hoth update handler open requires the write flag.

    EXPECT_FALSE(hvn.open(session_, blobs::OpenFlags::read, legacyPath));
}

TEST_F(HothUpdateOpenTest, OpenEverythingSucceeds)
{
    // Hoth update handler open with everything correct.

    EXPECT_CALL(dbus, pingHothd(std::string_view(""))).WillOnce(Return(true));

    EXPECT_TRUE(hvn.open(session_, hvn.requiredFlags(), legacyPath));
}

TEST_F(HothUpdateOpenTest, OpenSecondSessionFails)
{
    // Hoth update handler only allows 1 open session, verify second one fails
    // regardless of whether the session ID is the same or not

    EXPECT_CALL(dbus, pingHothd(std::string_view("")))
        .WillRepeatedly(Return(true));

    EXPECT_TRUE(hvn.open(session_, hvn.requiredFlags(), legacyPath));

    EXPECT_FALSE(hvn.open(session_, hvn.requiredFlags(), legacyPath));

    EXPECT_FALSE(hvn.open(session_ + 1, hvn.requiredFlags(), legacyPath));
}

TEST_F(HothUpdateOpenTest, OpenCloseOpenSucceeds)
{
    // Hoth update handler should be able to open a session after closing an
    // open one

    EXPECT_CALL(dbus, pingHothd(std::string_view("")))
        .WillRepeatedly(Return(true));

    EXPECT_TRUE(hvn.open(session_, hvn.requiredFlags(), legacyPath));

    EXPECT_TRUE(hvn.close(session_));

    EXPECT_TRUE(hvn.open(session_, hvn.requiredFlags(), legacyPath));
}

} // namespace ipmi_hoth
