"""
Test that breakpoints set on a bad address say they are bad.
"""

from __future__ import print_function


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


class BadAddressBreakpointTestCase(TestBase):

    mydir = TestBase.compute_mydir(__file__)

    NO_DEBUG_INFO_TESTCASE = True

    def test_bad_address_breakpoints(self):
        """Test that breakpoints set on a bad address say they are bad."""
        self.build()
        self.address_breakpoints()

    def setUp(self):
        # Call super's setUp().
        TestBase.setUp(self)

    def address_breakpoints(self):
        """Test that breakpoints set on a bad address say they are bad."""
        target, process, thread, bkpt = \
            lldbutil.run_to_source_breakpoint(self,
                                              "Set a breakpoint here",
                                              lldb.SBFileSpec("main.c"))

        # Now see if we can read from 0.  If I can't do that, I don't
        # have a good way to know what an illegal address is...
        error = lldb.SBError()

        ptr = process.ReadPointerFromMemory(0x0, error)

        if not error.Success():
            bkpt = target.BreakpointCreateByAddress(0x0)
            for bp_loc in bkpt:
                self.assertTrue(bp_loc.IsResolved() == False)
        else:
            self.fail(
                "Could not find an illegal address at which to set a bad breakpoint.")
