1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
2a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// LLDB C++ API Test: verify the event description that is received by an
3a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// SBListener object registered with a process with a breakpoint.
4a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
5a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <atomic>
6a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <array>
7a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <iostream>
8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <string>
9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <thread>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lldb-headers.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "common.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochusing namespace lldb;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using namespace std;
17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// listener thread control
19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochextern atomic<bool> g_done;
20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochmultithreaded_queue<string> g_event_descriptions;
22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochextern SBListener g_listener;
24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid listener_func() {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!g_done) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SBEvent event;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool got_event = g_listener.WaitForEvent(1, event);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (got_event) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!event.IsValid())
31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        throw Exception("event is not valid in listener thread");
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      SBStream description;
34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      event.GetDescription(description);
35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      string str(description.GetData());
36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      g_event_descriptions.push(str);
37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    }
38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid check_listener(SBDebugger &dbg) {
42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  array<string, 2> expected_states = {"running", "stopped"};
43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  for(string & state : expected_states) {
44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    bool got_description = false;
45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    string desc = g_event_descriptions.pop(5, got_description);
46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    if (!got_description)
48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      throw Exception("Did not get expected event description");
49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (desc.find("state-changed") == desc.npos)
52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      throw Exception("Event description incorrect: missing 'state-changed'");
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    string state_search_str = "state = " + state;
55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    if (desc.find(state_search_str) == desc.npos)
56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      throw Exception("Event description incorrect: expected state "
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      + state
58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                      + " but desc was "
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      + desc);
60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    if (desc.find("pid = ") == desc.npos)
62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      throw Exception("Event description incorrect: missing process pid");
63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch