//===---------------- SimpleExecutorMemoryManagerTest.cpp -----------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "llvm/ExecutionEngine/Orc/TargetProcess/SimpleExecutorMemoryManager.h"
#include "llvm/Testing/Support/Error.h"
#include "gtest/gtest.h"

#include <limits>
#include <vector>

using namespace llvm;
using namespace llvm::orc;
using namespace llvm::orc::shared;
using namespace llvm::orc::rt_bootstrap;

namespace {

orc::shared::CWrapperFunctionResult incrementWrapper(const char *ArgData,
                                                     size_t ArgSize) {
  return WrapperFunction<void(SPSExecutorAddr)>::handle(
             ArgData, ArgSize, [](ExecutorAddr A) { *A.toPtr<int *>() += 1; })
      .release();
}

TEST(SimpleExecutorMemoryManagerTest, AllocFinalizeFree) {
  SimpleExecutorMemoryManager MemMgr;

  constexpr unsigned AllocSize = 16384;
  auto Mem = MemMgr.allocate(AllocSize);
  EXPECT_THAT_ERROR(Mem.takeError(), Succeeded());

  std::string HW = "Hello, world!";

  int FinalizeCounter = 0;
  auto FinalizeCounterAddrArgBuffer =
      orc::shared::detail::serializeViaSPSToWrapperFunctionResult<
          SPSArgList<SPSExecutorAddr>>(ExecutorAddr::fromPtr(&FinalizeCounter));

  int DeallocateCounter = 0;
  auto DeallocateCounterAddrArgBuffer =
      orc::shared::detail::serializeViaSPSToWrapperFunctionResult<
          SPSArgList<SPSExecutorAddr>>(
          ExecutorAddr::fromPtr(&DeallocateCounter));

  tpctypes::FinalizeRequest FR;
  FR.Segments.push_back(
      tpctypes::SegFinalizeRequest{tpctypes::WPF_Read | tpctypes::WPF_Write,
                                   *Mem,
                                   AllocSize,
                                   {HW.data(), HW.size() + 1}});
  FR.Actions.push_back(
      {/* Finalize: */
       {ExecutorAddr::fromPtr(incrementWrapper),
        {ExecutorAddr::fromPtr(FinalizeCounterAddrArgBuffer.data()),
         ExecutorAddrDiff(FinalizeCounterAddrArgBuffer.size())}},
       /*  Deallocate: */
       {ExecutorAddr::fromPtr(incrementWrapper),
        {ExecutorAddr::fromPtr(DeallocateCounterAddrArgBuffer.data()),
         ExecutorAddrDiff(DeallocateCounterAddrArgBuffer.size())}}});

  EXPECT_EQ(FinalizeCounter, 0);
  EXPECT_EQ(DeallocateCounter, 0);

  auto FinalizeErr = MemMgr.finalize(FR);
  EXPECT_THAT_ERROR(std::move(FinalizeErr), Succeeded());

  EXPECT_EQ(FinalizeCounter, 1);
  EXPECT_EQ(DeallocateCounter, 0);

  EXPECT_EQ(HW, std::string(Mem->toPtr<const char *>()));

  auto DeallocateErr = MemMgr.deallocate({*Mem});
  EXPECT_THAT_ERROR(std::move(DeallocateErr), Succeeded());

  EXPECT_EQ(FinalizeCounter, 1);
  EXPECT_EQ(DeallocateCounter, 1);
}

} // namespace
