
// LLDB C++ API Test: verify the event description that is received by an
// SBListener object registered with a process with a breakpoint.

#include <atomic>
#include <array>
#include <iostream>
#include <string>
#include <thread>

%include_SB_APIs%

#include "common.h"

using namespace lldb;
using namespace std;

// listener thread control
extern atomic<bool> g_done;
extern SBListener g_listener;

multithreaded_queue<string> g_event_descriptions;
string g_error_desc;

void listener_func() {
  while (!g_done) {
    SBEvent event;
    bool got_event = g_listener.WaitForEvent(1, event);

    if (got_event) {
      if (!event.IsValid())
        throw Exception("event is not valid in listener thread");

      SBStream description;
      event.GetDescription(description);
      string str(description.GetData());
      g_event_descriptions.push(str);
    }
  }
}

bool check_state(string &state, string &desc, bool got_description)
{
    g_error_desc.clear();

    if(!got_description)
    {
        g_error_desc.append("Did not get expected event description");
        return false;
    }

    if (desc.find("state-changed") == desc.npos)
        g_error_desc.append("Event description incorrect: missing 'state-changed' ");

    if (desc.find("pid = ") == desc.npos)
        g_error_desc.append("Event description incorrect: missing process pid ");

    string state_search_str = "state = " + state;
    if (desc.find(state_search_str) == desc.npos)
    {
        string errString = ("Event description incorrect: expected state "
                      + state
                      + " but desc was "
                      + desc);
        g_error_desc.append(errString);
    }

    if (g_error_desc.length() > 0)
        return false;

    cout << "check_state: " << state << "  OK\n";
    return true;
}

void check_listener(SBDebugger &dbg)
{
    bool got_description;
    string state;

    // check for "launching" state, this may or may not be present
    string desc = g_event_descriptions.pop(5, got_description);
    state = "launching";
    if (check_state(state, desc, got_description))
    {
        // found a 'launching' state, pop next one from queue
        desc = g_event_descriptions.pop(5, got_description);
    }

    state = "running";
    if( !check_state(state, desc, got_description) )
        throw Exception(g_error_desc);

    desc = g_event_descriptions.pop(5, got_description);
    state = "stopped";
    if( !check_state(state, desc, got_description) )
        throw Exception(g_error_desc);
}
