from __future__ import print_function

import gdbremote_testcase
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


class TestGdbRemoteThreadName(gdbremote_testcase.GdbRemoteTestCaseBase):

    mydir = TestBase.compute_mydir(__file__)

    def run_and_check_name(self, expected_name):
        self.test_sequence.add_log_lines(["read packet: $vCont;c#a8",
                                          {"direction": "send",
                                           "regex":
                                           r"^\$T([0-9a-fA-F]{2})([^#]+)#[0-9a-fA-F]{2}$",
                                           "capture": {
                                               1: "signal",
                                               2: "key_vals_text"}},
                                          ],
                                         True)

        context = self.expect_gdbremote_sequence()
        self.assertIsNotNone(context)

        sigint = lldbutil.get_signal_number("SIGINT")
        self.assertEqual(sigint, int(context.get("signal"), 16))
        kv_dict = self.parse_key_val_dict(context.get("key_vals_text"))
        self.assertEqual(expected_name, kv_dict.get("name"))

    @llgs_test
    def test(self):
        """ Make sure lldb-server can retrieve inferior thread name"""
        self.init_llgs_test()
        self.build()
        self.set_inferior_startup_launch()
        procs = self.prep_debug_monitor_and_inferior()

        self.run_and_check_name("hello world")
        self.run_and_check_name("goodbye world")
