summaryrefslogtreecommitdiffstats
path: root/lldb
diff options
context:
space:
mode:
authorShawn Best <sbest@blueshiftinc.com>2014-11-21 06:49:39 +0000
committerShawn Best <sbest@blueshiftinc.com>2014-11-21 06:49:39 +0000
commitd64bc4bee6eab912b3a02ab9cab13f13045ba0ea (patch)
treebd9c6db31c48f8e031d908fbbed4bf0f55eda0af /lldb
parent44e5d7a131d300ce6ba023551e3658e714db0a5a (diff)
downloadbcm5719-llvm-d64bc4bee6eab912b3a02ab9cab13f13045ba0ea.tar.gz
bcm5719-llvm-d64bc4bee6eab912b3a02ab9cab13f13045ba0ea.zip
fix Bug21211 : reworked test/api/multithreaded/test_listener_event_description.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
Diffstat (limited to 'lldb')
-rw-r--r--lldb/test/api/multithreaded/TestMultithreaded.py1
-rw-r--r--lldb/test/api/multithreaded/test_listener_event_description.cpp65
2 files changed, 49 insertions, 17 deletions
diff --git a/lldb/test/api/multithreaded/TestMultithreaded.py b/lldb/test/api/multithreaded/TestMultithreaded.py
index 972ecd75a6e..a00e57408fe 100644
--- a/lldb/test/api/multithreaded/TestMultithreaded.py
+++ b/lldb/test/api/multithreaded/TestMultithreaded.py
@@ -28,7 +28,6 @@ class SBBreakpointCallbackCase(TestBase):
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
diff --git a/lldb/test/api/multithreaded/test_listener_event_description.cpp b/lldb/test/api/multithreaded/test_listener_event_description.cpp
index b0a10c3999c..0d7844dce6d 100644
--- a/lldb/test/api/multithreaded/test_listener_event_description.cpp
+++ b/lldb/test/api/multithreaded/test_listener_event_description.cpp
@@ -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");
@@ -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);
}
OpenPOWER on IntegriCloud