78 lines
2.8 KiB
Python
78 lines
2.8 KiB
Python
import re
|
|
|
|
import gdbremote_testcase
|
|
from lldbsuite.test.decorators import *
|
|
from lldbsuite.test.lldbtest import *
|
|
|
|
|
|
class TestPartialResume(gdbremote_testcase.GdbRemoteTestCaseBase):
|
|
THREAD_MATCH_RE = re.compile(r"thread ([0-9a-f]+) running")
|
|
|
|
def start_vCont_run_subset_of_threads_test(self):
|
|
self.build()
|
|
self.set_inferior_startup_launch()
|
|
|
|
procs = self.prep_debug_monitor_and_inferior(inferior_args=["3"])
|
|
# grab the main thread id
|
|
self.add_threadinfo_collection_packets()
|
|
main_thread = self.parse_threadinfo_packets(
|
|
self.expect_gdbremote_sequence())
|
|
self.assertEqual(len(main_thread), 1)
|
|
self.reset_test_sequence()
|
|
|
|
# run until threads start, then grab full thread list
|
|
self.test_sequence.add_log_lines([
|
|
"read packet: $c#63",
|
|
{"direction": "send", "regex": "[$]T.*;reason:signal.*"},
|
|
], True)
|
|
self.add_threadinfo_collection_packets()
|
|
|
|
all_threads = self.parse_threadinfo_packets(
|
|
self.expect_gdbremote_sequence())
|
|
self.assertEqual(len(all_threads), 4)
|
|
self.assertIn(main_thread[0], all_threads)
|
|
self.reset_test_sequence()
|
|
|
|
all_subthreads = set(all_threads) - set(main_thread)
|
|
self.assertEqual(len(all_subthreads), 3)
|
|
|
|
return (main_thread[0], list(all_subthreads))
|
|
|
|
def continue_and_get_threads_running(self, main_thread, vCont_req):
|
|
self.test_sequence.add_log_lines(
|
|
["read packet: $vCont;c:{:x};{}#00".format(main_thread, vCont_req),
|
|
"send packet: $W00#00",
|
|
], True)
|
|
exp = self.expect_gdbremote_sequence()
|
|
self.reset_test_sequence()
|
|
found = set()
|
|
for line in exp["O_content"].decode().splitlines():
|
|
m = self.THREAD_MATCH_RE.match(line)
|
|
if m is not None:
|
|
found.add(int(m.group(1), 16))
|
|
return found
|
|
|
|
@skipIfWindows
|
|
@add_test_categories(["llgs"])
|
|
def test_vCont_cxcx(self):
|
|
main_thread, all_subthreads_list = (
|
|
self.start_vCont_run_subset_of_threads_test())
|
|
# resume two threads explicitly, stop the third one implicitly
|
|
self.assertEqual(
|
|
self.continue_and_get_threads_running(
|
|
main_thread,
|
|
"c:{:x};c:{:x}".format(*all_subthreads_list[:2])),
|
|
set(all_subthreads_list[:2]))
|
|
|
|
@skipIfWindows
|
|
@add_test_categories(["llgs"])
|
|
def test_vCont_cxcxt(self):
|
|
main_thread, all_subthreads_list = (
|
|
self.start_vCont_run_subset_of_threads_test())
|
|
# resume two threads explicitly, stop others explicitly
|
|
self.assertEqual(
|
|
self.continue_and_get_threads_running(
|
|
main_thread,
|
|
"c:{:x};c:{:x};t".format(*all_subthreads_list[:2])),
|
|
set(all_subthreads_list[:2]))
|