import lldb
from lldbsuite.test.lldbtest import *
from lldbsuite.test.decorators import *
from lldbsuite.test.gdbclientutils import *
from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase

class TestThreadInfoTrailingComma(GDBRemoteTestBase):

    mydir = TestBase.compute_mydir(__file__)

    def test(self):
        class MyResponder(MockGDBServerResponder):
            def haltReason(self):
                return "T02thread:1"

            def qfThreadInfo(self):
                return "m1,2,3,4,"

        self.server.responder = MyResponder()
        target = self.dbg.CreateTarget('')
        if self.TraceOn():
          self.runCmd("log enable gdb-remote packets")
          self.addTearDownHook(
                lambda: self.runCmd("log disable gdb-remote packets"))
        process = self.connect(target)
        self.assertEqual(process.GetThreadAtIndex(0).GetThreadID(), 1)
        self.assertEqual(process.GetThreadAtIndex(1).GetThreadID(), 2)
        self.assertEqual(process.GetThreadAtIndex(2).GetThreadID(), 3)
        self.assertEqual(process.GetThreadAtIndex(3).GetThreadID(), 4)
