
// LLDB C++ API Test: verify that the function registered with
// SBBreakpoint.SetCallback() is invoked when a breakpoint is hit.

#include <iostream>
#include <mutex>
#include <string>
#include <vector>

#include "lldb/API/SBBreakpoint.h"
#include "lldb/API/SBBreakpointLocation.h"
#include "lldb/API/SBDebugger.h"
#include "lldb/API/SBProcess.h"
#include "lldb/API/SBTarget.h"
#include "lldb/API/SBThread.h"

#include "common.h"

using namespace std;
using namespace lldb;

mutex g_mutex;
condition_variable g_condition;
int g_breakpoint_hit_count = 0;

bool BPCallback(void *baton, SBProcess &process, SBThread &thread,
                SBBreakpointLocation &location) {
  lock_guard<mutex> lock(g_mutex);
  g_breakpoint_hit_count += 1;
  g_condition.notify_all();
  return true;
}

void test(SBDebugger &dbg, vector<string> args) {
  dbg.SetAsync(false);
  SBTarget target = dbg.CreateTarget(args.at(0).c_str());
  if (!target.IsValid())
    throw Exception("invalid target");

  SBBreakpoint breakpoint = target.BreakpointCreateByName("next");
  if (!breakpoint.IsValid())
    throw Exception("invalid breakpoint");
  breakpoint.SetCallback(BPCallback, 0);

  std::string working_dir = get_working_dir();
  SBProcess process = target.LaunchSimple(0, 0, working_dir.c_str());

  {
    unique_lock<mutex> lock(g_mutex);
    g_condition.wait_for(lock, chrono::seconds(5));
    if (g_breakpoint_hit_count != 1)
      throw Exception("Breakpoint hit count expected to be 1");
  }
}
