// 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 "message_intf.hpp"
#include "message_reinit.hpp"

#include <memory>
#include <stdexcept>

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

namespace google
{
namespace hoth
{

static size_t init_count = 0;
static uint8_t valid_data = 0;

class MessageCounter : public MessageIntf
{
  public:
    MessageCounter()
    {
        init_count++;
    }

    void send(const uint8_t* data, size_t, size_t) override
    {
        if (data == nullptr)
        {
            throw std::runtime_error("Send Failed");
        }
    }

    void recv(uint8_t* data, size_t, size_t) override
    {
        if (data == nullptr)
        {
            throw std::runtime_error("Recv Failed");
        }
    }
};

class MessageReinitTest : public ::testing::Test
{
  protected:
    MessageReinitTest()
    {
        init_count = 0;
        mc = std::make_unique<MessageReinit<MessageCounter>>();
    }
    std::unique_ptr<MessageReinit<MessageCounter>> mc;
};

TEST_F(MessageReinitTest, ImmediateInit)
{
    EXPECT_EQ(1, init_count);
    mc.reset();
    EXPECT_EQ(1, init_count);
}

TEST_F(MessageReinitTest, SuccessInitOnce)
{
    mc->send(&valid_data, 0, 0);
    EXPECT_EQ(1, init_count);
    mc->send(&valid_data, 0, 0);
    EXPECT_EQ(1, init_count);
}

TEST_F(MessageReinitTest, FailReinitOnce)
{
    EXPECT_THROW(mc->send(nullptr, 0, 0), std::runtime_error);
    EXPECT_EQ(1, init_count);
    mc->send(&valid_data, 0, 0);
    EXPECT_EQ(2, init_count);
    mc->send(&valid_data, 0, 0);
    EXPECT_EQ(2, init_count);
    EXPECT_THROW(mc->send(nullptr, 0, 0), std::runtime_error);
    EXPECT_EQ(2, init_count);
}

} // namespace hoth
} // namespace google
