Skip to content

Commit

Permalink
fix Bug21211 : reworked test/api/multithreaded/test_listener_event_de…
Browse files Browse the repository at this point in the history
…scription.cpp to work properly on Linux/FreeBSD

Issue D5632 fixed an issue where linux would dump spurious output to tty on startup (due to a broadcast stop event). After the checkin, it was noticed on FreeBSD a unit test was now failing. On closer investigation I found the test was using the C++ API to launch an inferior while using an SBListener to monitor the public state changes. As on OSx, it was expecting to see:

eStateRunning
eStateStopped

On Linux/FreeBSD, there is an extra state change

eStateLaunching
eStateRunning
eStateStopped

I reworked the test to work for both cases and re-enabled the test of FreeBSD.

Differential Revision: http://reviews.llvm.org/D5837

llvm-svn: 222511
  • Loading branch information
Shawn Best committed Nov 21, 2014
1 parent 44e5d7a commit d64bc4b
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 17 deletions.
1 change: 0 additions & 1 deletion lldb/test/api/multithreaded/TestMultithreaded.py
Expand Up @@ -28,7 +28,6 @@ def test_breakpoint_callback(self):
self.build_and_test('driver.cpp test_breakpoint_callback.cpp',
'test_breakpoint_callback')

@expectedFailureFreeBSD("llvm.org/21211")
@skipIfi386
@skipIfRemote
@skipIfLinuxClang # buildbot clang version unable to use libstdc++ with c++11
Expand Down
65 changes: 49 additions & 16 deletions lldb/test/api/multithreaded/test_listener_event_description.cpp
Expand Up @@ -16,16 +16,17 @@ using namespace lldb;
using namespace std;

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

multithreaded_queue<string> g_event_descriptions;

extern SBListener g_listener;
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");
Expand All @@ -38,27 +39,59 @@ void listener_func() {
}
}

void check_listener(SBDebugger &dbg) {
array<string, 2> expected_states = {"running", "stopped"};
for(string & state : expected_states) {
bool got_description = false;
string desc = g_event_descriptions.pop(5, got_description);

if (!got_description)
throw Exception("Did not get expected event description");
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)
throw Exception("Event description incorrect: missing 'state-changed'");
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)
throw Exception("Event description incorrect: expected state "
{
string errString = ("Event description incorrect: expected state "
+ state
+ " but desc was "
+ desc);
g_error_desc.append(errString);
}

if (desc.find("pid = ") == desc.npos)
throw Exception("Event description incorrect: missing process pid");
}
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);
}

0 comments on commit d64bc4b

Please sign in to comment.