from __future__ import print_function
import lldb
from lldbsuite.test.lldbtest import *
from lldbsuite.test.decorators import *
from gdbclientutils import *


class TestThreadSelectionBug(GDBRemoteTestBase):
    def test(self):
        class MyResponder(MockGDBServerResponder):
            def cont(self):
                # Simulate process stopping due to a raise(SIGINT)
                return "T01reason:signal"

        self.server.responder = MyResponder()
        target = self.createTarget("a.yaml")
        process = self.connect(target)
        python_os_plugin_path = os.path.join(self.getSourceDir(),
                                             'operating_system.py')
        command = "settings set target.process.python-os-plugin-path '{}'".format(
            python_os_plugin_path)
        self.dbg.HandleCommand(command)

        self.assertTrue(process, PROCESS_IS_VALID)
        self.assertEqual(process.GetNumThreads(), 3)

        # Verify our OS plug-in threads showed up
        thread = process.GetThreadByID(0x1)
        self.assertTrue(
            thread.IsValid(),
            "Make sure there is a thread 0x1 after we load the python OS plug-in")
        thread = process.GetThreadByID(0x2)
        self.assertTrue(
            thread.IsValid(),
            "Make sure there is a thread 0x2 after we load the python OS plug-in")
        thread = process.GetThreadByID(0x3)
        self.assertTrue(
            thread.IsValid(),
            "Make sure there is a thread 0x3 after we load the python OS plug-in")

        # Verify that a thread other than 3 is selected.
        thread = process.GetSelectedThread()
        self.assertNotEqual(thread.GetThreadID(), 0x3)

        # Verify that we select the thread backed by physical thread 1, rather
        # than virtual thread 1. The mapping comes from the OS plugin, where we
        # specified that thread 3 is backed by real thread 1.
        process.Continue()
        thread = process.GetSelectedThread()
        self.assertEqual(thread.GetThreadID(), 0x3)
