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