1d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
2d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea// LLDB C++ API Test: verify the event description that is received by an
3d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea// SBListener object registered with a process with a breakpoint.
4d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
5d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea#include <atomic>
6d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea#include <array>
7d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea#include <iostream>
8d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea#include <string>
9d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea#include <thread>
10d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
11d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea#include "lldb-headers.h"
12d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
13d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea#include "common.h"
14d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
15d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Maleausing namespace lldb;
16d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Maleausing namespace std;
17d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
18d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea// listener thread control
19d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Maleaextern atomic<bool> g_done;
20d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
21d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Maleamultithreaded_queue<string> g_event_descriptions;
22d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
23d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Maleaextern SBListener g_listener;
24d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
25d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Maleavoid listener_func() {
26d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea  while (!g_done) {
27d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    SBEvent event;
28d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    bool got_event = g_listener.WaitForEvent(1, event);
29d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    if (got_event) {
30d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea      if (!event.IsValid())
31d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        throw Exception("event is not valid in listener thread");
32d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
33d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea      SBStream description;
34d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea      event.GetDescription(description);
35d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea      string str(description.GetData());
36d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea      g_event_descriptions.push(str);
37d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    }
38d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea  }
39d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea}
40d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
41d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Maleavoid check_listener(SBDebugger &dbg) {
42d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea  array<string, 2> expected_states = {"running", "stopped"};
43d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea  for(string & state : expected_states) {
44d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    bool got_description = false;
45d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    string desc = g_event_descriptions.pop(5, got_description);
46d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
47d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    if (!got_description)
48d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea      throw Exception("Did not get expected event description");
49d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
50d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
51d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    if (desc.find("state-changed") == desc.npos)
52d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea      throw Exception("Event description incorrect: missing 'state-changed'");
53d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
54d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    string state_search_str = "state = " + state;
55d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    if (desc.find(state_search_str) == desc.npos)
56d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea      throw Exception("Event description incorrect: expected state "
57d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea                      + state
58d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea                      + " but desc was "
59d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea                      + desc);
60d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
61d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    if (desc.find("pid = ") == desc.npos)
62d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea      throw Exception("Event description incorrect: missing process pid");
63d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea  }
64d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea}
65