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