"""
Test that we obey thread conditioned breakpoints and expression
conditioned breakpoints simultaneously
"""

from __future__ import print_function


import os
import time
import re
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


class ThreadSpecificBreakPlusConditionTestCase(TestBase):

    mydir = TestBase.compute_mydir(__file__)

    # test frequently times out or hangs
    @skipIf(oslist=['windows', 'freebsd'])
    @skipIfDarwin
    # hits break in another thread in testrun
    @expectedFailureAll(oslist=['freebsd'], bugnumber='llvm.org/pr18522')
    @add_test_categories(['pyapi'])
    @expectedFailureAll(oslist=['ios', 'watchos', 'tvos', 'bridgeos'], archs=['armv7', 'armv7k'], bugnumber='rdar://problem/34563348') # Two threads seem to end up with the same my_value when built for armv7.
    def test_python(self):
        """Test that we obey thread conditioned breakpoints."""
        self.build()
        exe = self.getBuildArtifact("a.out")

        target = self.dbg.CreateTarget(exe)
        self.assertTrue(target, VALID_TARGET)

        main_source_spec = lldb.SBFileSpec("main.cpp")

        # Set a breakpoint in the thread body, and make it active for only the
        # first thread.
        break_thread_body = target.BreakpointCreateBySourceRegex(
            "Break here in thread body.", main_source_spec)
        self.assertTrue(
            break_thread_body.IsValid() and break_thread_body.GetNumLocations() > 0,
            "Failed to set thread body breakpoint.")

        process = target.LaunchSimple(
            None, None, self.get_process_working_directory())

        self.assertTrue(process, PROCESS_IS_VALID)

        threads = lldbutil.get_threads_stopped_at_breakpoint(
            process, break_thread_body)

        victim_thread = threads[0]

        # Pick one of the threads, and change the breakpoint so it ONLY stops for this thread,
        # but add a condition that it won't stop for this thread's my_value.  The other threads
        # pass the condition, so they should stop, but if the thread-specification is working
        # they should not stop.  So nobody should hit the breakpoint anymore, and we should
        # just exit cleanly.

        frame = victim_thread.GetFrameAtIndex(0)
        value = frame.FindVariable("my_value").GetValueAsSigned(0)
        self.assertTrue(
            value > 0 and value < 11,
            "Got a reasonable value for my_value.")

        cond_string = "my_value != %d" % (value)

        break_thread_body.SetThreadID(victim_thread.GetThreadID())
        break_thread_body.SetCondition(cond_string)

        process.Continue()

        next_stop_state = process.GetState()
        self.assertTrue(
            next_stop_state == lldb.eStateExited,
            "We should have not hit the breakpoint again.")
