//===---- MemoryManagerErrorTests.cpp - Test memory manager error paths ---===//
//
// 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 "JITLinkTestUtils.h"
#include "llvm/ExecutionEngine/JITLink/MachO_x86_64.h"

#include "llvm/Testing/Support/Error.h"
#include "gtest/gtest.h"

using namespace llvm;
using namespace llvm::orc;
using namespace llvm::jitlink;

TEST(MemoryManagerErrorTest, ErrorOnFirstAllocate) {
  // Check that we can get addresses for blocks, symbols, and edges.
  auto G = std::make_unique<LinkGraph>(
      "foo", std::make_shared<orc::SymbolStringPool>(),
      Triple("x86_64-apple-darwin"), SubtargetFeatures(),
      getGenericEdgeKindName);

  ArrayRef<char> Content = "hello, world!";
  auto &Sec =
      G->createSection("__data", orc::MemProt::Read | orc::MemProt::Write);
  orc::ExecutorAddr B1Addr(0x1000);
  auto &B = G->createContentBlock(Sec, Content, B1Addr, 8, 0);
  G->addDefinedSymbol(B, 4, "S", 4, Linkage::Strong, Scope::Default, false,
                      false);

  Error Err = Error::success();
  auto Ctx = makeMockContext(
      JoinErrorsInto(Err),
      [](MockJITLinkMemoryManager &MemMgr) {
        MemMgr.Allocate = [](const JITLinkDylib *JD, LinkGraph &G) {
          return make_error<StringError>("Failed to allocate",
                                         inconvertibleErrorCode());
        };
      },
      defaultCtxSetup);

  link_MachO_x86_64(std::move(G), std::move(Ctx));

  EXPECT_THAT_ERROR(std::move(Err), Failed());
}
