//===-- ProcessTraceTest.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 "lldb/Target/ProcessTrace.h"
#include "Plugins/Platform/Linux/PlatformLinux.h"
#include "lldb/Core/Debugger.h"
#include "lldb/Host/HostInfo.h"
#include "gtest/gtest.h"

using namespace lldb_private;
using namespace lldb;
using namespace platform_linux;

// This is needed for the tests that create a trace process.
class ProcessTraceTest : public ::testing::Test {
public:
  void SetUp() override {
    ProcessTrace::Initialize();
    FileSystem::Initialize();
    HostInfo::Initialize();
    PlatformLinux::Initialize();
  }
  void TearDown() override {
    PlatformLinux::Terminate();
    HostInfo::Terminate();
    FileSystem::Terminate();
    ProcessTrace::Terminate();
  }
};

TargetSP CreateTarget(DebuggerSP &debugger_sp, const ArchSpec &arch) {
  PlatformSP platform_sp;
  TargetSP target_sp;
  debugger_sp->GetTargetList().CreateTarget(
      *debugger_sp, "", arch, eLoadDependentsNo, platform_sp, target_sp);
  return target_sp;
}

// Test that we can create a process trace with a nullptr core file.
TEST_F(ProcessTraceTest, ConstructorWithNullptrCoreFile) {
  ArchSpec arch("i386-pc-linux");

  Platform::SetHostPlatform(PlatformLinux::CreateInstance(true, &arch));
  ASSERT_NE(Platform::GetHostPlatform(), nullptr);

  DebuggerSP debugger_sp = Debugger::CreateInstance();
  ASSERT_TRUE(debugger_sp);

  TargetSP target_sp = CreateTarget(debugger_sp, arch);
  ASSERT_TRUE(target_sp);

  ProcessSP process_sp = target_sp->CreateProcess(
      /*listener*/ nullptr, "trace",
      /*crash_file*/ nullptr,
      /*can_connect*/ false);

  ASSERT_NE(process_sp, nullptr);
}

// Test that a trace process stops after attaching.
TEST_F(ProcessTraceTest, DidAttach) {
  ArchSpec arch("i386-pc-linux");

  Platform::SetHostPlatform(PlatformLinux::CreateInstance(true, &arch));
  ASSERT_NE(Platform::GetHostPlatform(), nullptr);

  DebuggerSP debugger_sp = Debugger::CreateInstance();
  ASSERT_TRUE(debugger_sp);

  TargetSP target_sp = CreateTarget(debugger_sp, arch);
  ASSERT_TRUE(target_sp);

  ProcessSP process_sp = target_sp->CreateProcess(
      /*listener*/ nullptr, "trace",
      /*crash_file*/ nullptr,
      /*can_connect*/ false);

  ASSERT_NE(process_sp, nullptr);

  process_sp->DidAttach(arch);

  ASSERT_EQ(process_sp->GetState(), lldb::eStateStopped);
}
