//===- unittest/Support/BitstreamRemarksSerializerTest.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/Bitcode/BitcodeAnalyzer.h"
#include "llvm/Remarks/Remark.h"
#include "llvm/Remarks/RemarkSerializer.h"
#include "llvm/Support/raw_ostream.h"
#include "gtest/gtest.h"
#include <optional>
#include <string>

// We need to supprt Windows paths as well. In order to have paths with the same
// length, use a different path according to the platform.
#ifdef _WIN32
#define EXTERNALFILETESTPATH "C:/externalfi"
#else
#define EXTERNALFILETESTPATH "/externalfile"
#endif

using namespace llvm;

static void checkAnalyze(StringRef Input, StringRef Expected) {
  std::string OutputBuf;
  raw_string_ostream OutputOS(OutputBuf);
  BCDumpOptions O(OutputOS);
  O.ShowBinaryBlobs = true;
  BitcodeAnalyzer BA(Input);
  EXPECT_FALSE(BA.analyze(O)); // Expect no errors.
  EXPECT_EQ(OutputOS.str(), Expected);
}

static void check(const remarks::Remark &R, StringRef ExpectedR,
                  std::optional<StringRef> ExpectedMeta = std::nullopt,
                  std::optional<remarks::StringTable> StrTab = std::nullopt) {
  // Emit the remark.
  std::string InputBuf;
  raw_string_ostream InputOS(InputBuf);
  Expected<std::unique_ptr<remarks::RemarkSerializer>> MaybeSerializer = [&] {
    if (StrTab)
      return createRemarkSerializer(remarks::Format::Bitstream, InputOS,
                                    std::move(*StrTab));
    else
      return createRemarkSerializer(remarks::Format::Bitstream, InputOS);
  }();
  EXPECT_FALSE(errorToBool(MaybeSerializer.takeError()));
  std::unique_ptr<remarks::RemarkSerializer> Serializer =
      std::move(*MaybeSerializer);
  Serializer->emit(R);
  Serializer->finalize();

  // Analyze the serialized remark.
  checkAnalyze(InputOS.str(), ExpectedR);

  // Analyze the serialized metadata if it's not in standalone mode.
  if (ExpectedMeta) {
    std::string MetaBuf;
    raw_string_ostream MetaOS(MetaBuf);
    std::unique_ptr<remarks::MetaSerializer> MetaSerializer =
        Serializer->metaSerializer(MetaOS, StringRef(EXTERNALFILETESTPATH));
    MetaSerializer->emit();
    checkAnalyze(MetaOS.str(), *ExpectedMeta);
  }
}

TEST(BitstreamRemarkSerializer, SeparateRemarkFileNoOptionals) {
  remarks::Remark R;
  R.RemarkType = remarks::Type::Missed;
  R.PassName = "pass";
  R.RemarkName = "remark";
  R.FunctionName = "function";
  check(R,
        "<BLOCKINFO_BLOCK/>\n"
        "<Meta BlockID=8 NumWords=3 BlockCodeSize=3>\n"
        "  <Container info codeid=1 abbrevid=4 op0=1 op1=1/>\n"
        "  <Remark version codeid=2 abbrevid=5 op0=0/>\n"
        "</Meta>\n"
        "<Remark BlockID=9 NumWords=1 BlockCodeSize=4>\n"
        "  <Remark header codeid=5 abbrevid=4 op0=2 op1=0 op2=1 op3=2/>\n"
        "</Remark>\n"
        "<Meta BlockID=8 NumWords=8 BlockCodeSize=3>\n"
        "  <String table codeid=3 abbrevid=6/> blob data = "
        "'remark\\x00pass\\x00function\\x00'\n"
        "</Meta>\n",
        "<BLOCKINFO_BLOCK/>\n"
        "<Meta BlockID=8 NumWords=7 BlockCodeSize=3>\n"
        "  <Container info codeid=1 abbrevid=4 op0=1 op1=0/>\n"
        "  <External File codeid=4 abbrevid=5/> blob data = "
        "'" EXTERNALFILETESTPATH "'\n"
        "</Meta>\n");
}

TEST(BitstreamRemarkSerializer, SeparateRemarkFileNoOptionalsSeparateStrTab) {
  remarks::StringTable StrTab;
  StrTab.add("function");
  StrTab.add("pass");
  StrTab.add("remark");
  remarks::Remark R;
  R.RemarkType = remarks::Type::Missed;
  R.PassName = "pass";
  R.RemarkName = "remark";
  R.FunctionName = "function";
  check(R,
        "<BLOCKINFO_BLOCK/>\n"
        "<Meta BlockID=8 NumWords=3 BlockCodeSize=3>\n"
        "  <Container info codeid=1 abbrevid=4 op0=1 op1=1/>\n"
        "  <Remark version codeid=2 abbrevid=5 op0=0/>\n"
        "</Meta>\n"
        "<Remark BlockID=9 NumWords=1 BlockCodeSize=4>\n"
        "  <Remark header codeid=5 abbrevid=4 op0=2 op1=2 op2=1 op3=0/>\n"
        "</Remark>\n"
        "<Meta BlockID=8 NumWords=8 BlockCodeSize=3>\n"
        "  <String table codeid=3 abbrevid=6/> blob data = "
        "'function\\x00pass\\x00remark\\x00'\n"
        "</Meta>\n",
        "<BLOCKINFO_BLOCK/>\n"
        "<Meta BlockID=8 NumWords=7 BlockCodeSize=3>\n"
        "  <Container info codeid=1 abbrevid=4 op0=1 op1=0/>\n"
        "  <External File codeid=4 abbrevid=5/> blob data = "
        "'" EXTERNALFILETESTPATH "'\n"
        "</Meta>\n",
        std::move(StrTab));
}

TEST(BitstreamRemarkSerializer, SeparateRemarkFileDebugLoc) {
  remarks::Remark R;
  R.RemarkType = remarks::Type::Missed;
  R.PassName = "pass";
  R.RemarkName = "remark";
  R.FunctionName = "function";
  R.Loc.emplace();
  R.Loc->SourceFilePath = "path";
  R.Loc->SourceLine = 99;
  R.Loc->SourceColumn = 55;
  check(R,
        "<BLOCKINFO_BLOCK/>\n"
        "<Meta BlockID=8 NumWords=3 BlockCodeSize=3>\n"
        "  <Container info codeid=1 abbrevid=4 op0=1 op1=1/>\n"
        "  <Remark version codeid=2 abbrevid=5 op0=0/>\n"
        "</Meta>\n"
        "<Remark BlockID=9 NumWords=4 BlockCodeSize=4>\n"
        "  <Remark header codeid=5 abbrevid=4 op0=2 op1=0 op2=1 op3=2/>\n"
        "  <Remark debug location codeid=6 abbrevid=5 op0=3 op1=99 op2=55/>\n"
        "</Remark>\n"
        "<Meta BlockID=8 NumWords=9 BlockCodeSize=3>\n"
        "  <String table codeid=3 abbrevid=6/> blob data = "
        "'remark\\x00pass\\x00function\\x00path\\x00'\n"
        "</Meta>\n",
        "<BLOCKINFO_BLOCK/>\n"
        "<Meta BlockID=8 NumWords=7 BlockCodeSize=3>\n"
        "  <Container info codeid=1 abbrevid=4 op0=1 op1=0/>\n"
        "  <External File codeid=4 abbrevid=5/> blob data = "
        "'" EXTERNALFILETESTPATH "'\n"
        "</Meta>\n");
}

TEST(BitstreamRemarkSerializer, SeparateRemarkFileHotness) {
  remarks::Remark R;
  R.RemarkType = remarks::Type::Missed;
  R.PassName = "pass";
  R.RemarkName = "remark";
  R.FunctionName = "function";
  R.Hotness.emplace(999999999);
  check(R,
        "<BLOCKINFO_BLOCK/>\n"
        "<Meta BlockID=8 NumWords=3 BlockCodeSize=3>\n"
        "  <Container info codeid=1 abbrevid=4 op0=1 op1=1/>\n"
        "  <Remark version codeid=2 abbrevid=5 op0=0/>\n"
        "</Meta>\n"
        "<Remark BlockID=9 NumWords=3 BlockCodeSize=4>\n"
        "  <Remark header codeid=5 abbrevid=4 op0=2 op1=0 op2=1 op3=2/>\n"
        "  <Remark hotness codeid=7 abbrevid=6 op0=999999999/>\n"
        "</Remark>\n"
        "<Meta BlockID=8 NumWords=8 BlockCodeSize=3>\n"
        "  <String table codeid=3 abbrevid=6/> blob data = "
        "'remark\\x00pass\\x00function\\x00'\n"
        "</Meta>\n",
        "<BLOCKINFO_BLOCK/>\n"
        "<Meta BlockID=8 NumWords=7 BlockCodeSize=3>\n"
        "  <Container info codeid=1 abbrevid=4 op0=1 op1=0/>\n"
        "  <External File codeid=4 abbrevid=5/> blob data = "
        "'" EXTERNALFILETESTPATH "'\n"
        "</Meta>\n");
}

TEST(BitstreamRemarkSerializer, SeparateRemarkFileArgNoDebugLoc) {
  remarks::Remark R;
  R.RemarkType = remarks::Type::Missed;
  R.PassName = "pass";
  R.RemarkName = "remark";
  R.FunctionName = "function";
  R.Args.emplace_back();
  R.Args.back().Key = "key";
  R.Args.back().Val = "value";
  check(R,
        "<BLOCKINFO_BLOCK/>\n"
        "<Meta BlockID=8 NumWords=3 BlockCodeSize=3>\n"
        "  <Container info codeid=1 abbrevid=4 op0=1 op1=1/>\n"
        "  <Remark version codeid=2 abbrevid=5 op0=0/>\n"
        "</Meta>\n"
        "<Remark BlockID=9 NumWords=2 BlockCodeSize=4>\n"
        "  <Remark header codeid=5 abbrevid=4 op0=2 op1=0 op2=1 op3=2/>\n"
        "  <Argument codeid=9 abbrevid=8 op0=3 op1=4/>\n"
        "</Remark>\n"
        "<Meta BlockID=8 NumWords=10 BlockCodeSize=3>\n"
        "  <String table codeid=3 abbrevid=6/> blob data = "
        "'remark\\x00pass\\x00function\\x00key\\x00value\\x00'\n"
        "</Meta>\n",
        "<BLOCKINFO_BLOCK/>\n"
        "<Meta BlockID=8 NumWords=7 BlockCodeSize=3>\n"
        "  <Container info codeid=1 abbrevid=4 op0=1 op1=0/>\n"
        "  <External File codeid=4 abbrevid=5/> blob data = "
        "'" EXTERNALFILETESTPATH "'\n"
        "</Meta>\n");
}

TEST(BitstreamRemarkSerializer, SeparateRemarkFileArgDebugLoc) {
  remarks::Remark R;
  R.RemarkType = remarks::Type::Missed;
  R.PassName = "pass";
  R.RemarkName = "remark";
  R.FunctionName = "function";
  R.Args.emplace_back();
  R.Args.back().Key = "key";
  R.Args.back().Val = "value";
  R.Args.back().Loc.emplace();
  R.Args.back().Loc->SourceFilePath = "path";
  R.Args.back().Loc->SourceLine = 99;
  R.Args.back().Loc->SourceColumn = 55;
  check(R,
        "<BLOCKINFO_BLOCK/>\n"
        "<Meta BlockID=8 NumWords=3 BlockCodeSize=3>\n"
        "  <Container info codeid=1 abbrevid=4 op0=1 op1=1/>\n"
        "  <Remark version codeid=2 abbrevid=5 op0=0/>\n"
        "</Meta>\n"
        "<Remark BlockID=9 NumWords=4 BlockCodeSize=4>\n"
        "  <Remark header codeid=5 abbrevid=4 op0=2 op1=0 op2=1 op3=2/>\n"
        "  <Argument with debug location codeid=8 abbrevid=7 op0=3 op1=4 op2=5 "
        "op3=99 op4=55/>\n"
        "</Remark>\n"
        "<Meta BlockID=8 NumWords=11 BlockCodeSize=3>\n"
        "  <String table codeid=3 abbrevid=6/> blob data = "
        "'remark\\x00pass\\x00function\\x00key\\x00value\\x00path\\x00'\n"
        "</Meta>\n",
        "<BLOCKINFO_BLOCK/>\n"
        "<Meta BlockID=8 NumWords=7 BlockCodeSize=3>\n"
        "  <Container info codeid=1 abbrevid=4 op0=1 op1=0/>\n"
        "  <External File codeid=4 abbrevid=5/> blob data = "
        "'" EXTERNALFILETESTPATH "'\n"
        "</Meta>\n");
}

TEST(BitstreamRemarkSerializer, SeparateRemarkFileAll) {
  remarks::Remark R;
  R.RemarkType = remarks::Type::Missed;
  R.PassName = "pass";
  R.RemarkName = "remark";
  R.FunctionName = "function";
  R.Loc.emplace();
  R.Loc->SourceFilePath = "path";
  R.Loc->SourceLine = 99;
  R.Loc->SourceColumn = 55;
  R.Hotness.emplace(999999999);
  R.Args.emplace_back();
  R.Args.back().Key = "key";
  R.Args.back().Val = "value";
  R.Args.back().Loc.emplace();
  R.Args.back().Loc->SourceFilePath = "argpath";
  R.Args.back().Loc->SourceLine = 11;
  R.Args.back().Loc->SourceColumn = 66;
  check(R,
        "<BLOCKINFO_BLOCK/>\n"
        "<Meta BlockID=8 NumWords=3 BlockCodeSize=3>\n"
        "  <Container info codeid=1 abbrevid=4 op0=1 op1=1/>\n"
        "  <Remark version codeid=2 abbrevid=5 op0=0/>\n"
        "</Meta>\n"
        "<Remark BlockID=9 NumWords=8 BlockCodeSize=4>\n"
        "  <Remark header codeid=5 abbrevid=4 op0=2 op1=0 op2=1 op3=2/>\n"
        "  <Remark debug location codeid=6 abbrevid=5 op0=3 op1=99 op2=55/>\n"
        "  <Remark hotness codeid=7 abbrevid=6 op0=999999999/>\n"
        "  <Argument with debug location codeid=8 abbrevid=7 op0=4 op1=5 op2=6 "
        "op3=11 op4=66/>\n"
        "</Remark>\n"
        "<Meta BlockID=8 NumWords=13 BlockCodeSize=3>\n"
        "  <String table codeid=3 abbrevid=6/> blob data = "
        "'remark\\x00pass\\x00function\\x00path\\x00key\\x00value\\x00argpa"
        "th\\x00'\n"
        "</Meta>\n",
        "<BLOCKINFO_BLOCK/>\n"
        "<Meta BlockID=8 NumWords=7 BlockCodeSize=3>\n"
        "  <Container info codeid=1 abbrevid=4 op0=1 op1=0/>\n"
        "  <External File codeid=4 abbrevid=5/> blob data = "
        "'" EXTERNALFILETESTPATH "'\n"
        "</Meta>\n");
}

TEST(BitstreamRemarkSerializer, Standalone) {
  // Pre-populate the string table.
  remarks::StringTable StrTab;
  StrTab.add("pass");
  StrTab.add("remark");
  StrTab.add("function");
  StrTab.add("path");
  StrTab.add("key");
  StrTab.add("value");
  StrTab.add("argpath");
  remarks::Remark R;
  R.RemarkType = remarks::Type::Missed;
  R.PassName = "pass";
  R.RemarkName = "remark";
  R.FunctionName = "function";
  R.Loc.emplace();
  R.Loc->SourceFilePath = "path";
  R.Loc->SourceLine = 99;
  R.Loc->SourceColumn = 55;
  R.Hotness.emplace(999999999);
  R.Args.emplace_back();
  R.Args.back().Key = "key";
  R.Args.back().Val = "value";
  R.Args.back().Loc.emplace();
  R.Args.back().Loc->SourceFilePath = "argpath";
  R.Args.back().Loc->SourceLine = 11;
  R.Args.back().Loc->SourceColumn = 66;
  check(
      R,
      "<BLOCKINFO_BLOCK/>\n"
      "<Meta BlockID=8 NumWords=3 BlockCodeSize=3>\n"
      "  <Container info codeid=1 abbrevid=4 op0=1 op1=1/>\n"
      "  <Remark version codeid=2 abbrevid=5 op0=0/>\n"
      "</Meta>\n"
      "<Remark BlockID=9 NumWords=8 BlockCodeSize=4>\n"
      "  <Remark header codeid=5 abbrevid=4 op0=2 op1=1 op2=0 op3=2/>\n"
      "  <Remark debug location codeid=6 abbrevid=5 op0=3 op1=99 op2=55/>\n"
      "  <Remark hotness codeid=7 abbrevid=6 op0=999999999/>\n"
      "  <Argument with debug location codeid=8 abbrevid=7 op0=4 op1=5 op2=6 "
      "op3=11 op4=66/>\n"
      "</Remark>\n"
      "<Meta BlockID=8 NumWords=13 BlockCodeSize=3>\n"
      "  <String table codeid=3 abbrevid=6/> blob data = "
      "'pass\\x00remark\\x00function\\x00path\\x00key\\x00value\\x00argpath\\x0"
      "0'\n"
      "</Meta>\n",
      std::nullopt, std::move(StrTab));
}
