"""
Test lldb Python API object's default constructor and make sure it is invalid
after initial construction.

There are also some cases of boundary condition testings sprinkled throughout
the tests where None is passed to SB API which expects (const char *) in the
C++ API counterpart.  Passing None should not crash lldb!

There are three exceptions to the above general rules, though; API objects
SBCommadnReturnObject, SBStream, and SBSymbolContextList, are all valid objects
after default construction.
"""

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 APIDefaultConstructorTestCase(TestBase):

    mydir = TestBase.compute_mydir(__file__)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBAddress(self):
        obj = lldb.SBAddress()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_address
        sb_address.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBBlock(self):
        obj = lldb.SBBlock()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_block
        sb_block.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBBreakpoint(self):
        obj = lldb.SBBreakpoint()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_breakpoint
        sb_breakpoint.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBBreakpointLocation(self):
        obj = lldb.SBBreakpointLocation()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_breakpointlocation
        sb_breakpointlocation.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBBreakpointName(self):
        obj = lldb.SBBreakpointName()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_breakpointname
        sb_breakpointname.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBBroadcaster(self):
        obj = lldb.SBBroadcaster()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_broadcaster
        sb_broadcaster.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBCommandReturnObject(self):
        """SBCommandReturnObject object is valid after default construction."""
        obj = lldb.SBCommandReturnObject()
        if self.TraceOn():
            print(obj)
        self.assertTrue(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBCommunication(self):
        obj = lldb.SBCommunication()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_communication
        sb_communication.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBCompileUnit(self):
        obj = lldb.SBCompileUnit()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_compileunit
        sb_compileunit.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBDebugger(self):
        obj = lldb.SBDebugger()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_debugger
        sb_debugger.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    # darwin: This test passes with swig 3.0.2, fails w/3.0.5 other tests fail
    # with 2.0.12 http://llvm.org/pr23488
    def test_SBError(self):
        obj = lldb.SBError()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_error
        sb_error.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBEvent(self):
        obj = lldb.SBEvent()
        # This is just to test that typemap, as defined in lldb.swig, works.
        obj2 = lldb.SBEvent(0, "abc")
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_event
        sb_event.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    def test_SBFileSpec(self):
        obj = lldb.SBFileSpec()
        # This is just to test that FileSpec(None) does not crash.
        obj2 = lldb.SBFileSpec(None, True)
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_filespec
        sb_filespec.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBFrame(self):
        obj = lldb.SBFrame()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_frame
        sb_frame.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBFunction(self):
        obj = lldb.SBFunction()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_function
        sb_function.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBInstruction(self):
        obj = lldb.SBInstruction()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_instruction
        sb_instruction.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBInstructionList(self):
        obj = lldb.SBInstructionList()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_instructionlist
        sb_instructionlist.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBLineEntry(self):
        obj = lldb.SBLineEntry()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_lineentry
        sb_lineentry.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBListener(self):
        obj = lldb.SBListener()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_listener
        sb_listener.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    # Py3 asserts due to a bug in SWIG.  Trying to upstream a patch to fix
    # this in 3.0.8
    @skipIf(py_version=['>=', (3, 0)], swig_version=['<', (3, 0, 8)])
    def test_SBModule(self):
        obj = lldb.SBModule()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_module
        sb_module.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBProcess(self):
        obj = lldb.SBProcess()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_process
        sb_process.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBProcessInfo(self):
        obj = lldb.SBProcessInfo()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_process_info
        sb_process_info.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBSection(self):
        obj = lldb.SBSection()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_section
        sb_section.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBStream(self):
        """SBStream object is valid after default construction."""
        obj = lldb.SBStream()
        if self.TraceOn():
            print(obj)
        self.assertTrue(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBStringList(self):
        obj = lldb.SBStringList()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_stringlist
        sb_stringlist.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBSymbol(self):
        obj = lldb.SBSymbol()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_symbol
        sb_symbol.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBSymbolContext(self):
        obj = lldb.SBSymbolContext()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_symbolcontext
        sb_symbolcontext.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBSymbolContextList(self):
        """SBSymbolContextList object is valid after default construction."""
        obj = lldb.SBSymbolContextList()
        if self.TraceOn():
            print(obj)
        self.assertTrue(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBTarget(self):
        obj = lldb.SBTarget()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_target
        sb_target.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBThread(self):
        obj = lldb.SBThread()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_thread
        sb_thread.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBType(self):
        try:
            obj = lldb.SBType()
            if self.TraceOn():
                print(obj)
            self.assertFalse(obj)
            # If we reach here, the test fails.
            self.fail("lldb.SBType() should fail, not succeed!")
        except:
            # Exception is expected.
            return

        # Unreachable code because lldb.SBType() should fail.
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_type
        sb_type.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBTypeList(self):
        """SBTypeList object is valid after default construction."""
        obj = lldb.SBTypeList()
        if self.TraceOn():
            print(obj)
        self.assertTrue(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBValue(self):
        obj = lldb.SBValue()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_value
        sb_value.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBValueList(self):
        obj = lldb.SBValueList()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_valuelist
        sb_valuelist.fuzz_obj(obj)

    @add_test_categories(['pyapi'])
    @no_debug_info_test
    def test_SBWatchpoint(self):
        obj = lldb.SBWatchpoint()
        if self.TraceOn():
            print(obj)
        self.assertFalse(obj)
        # Do fuzz testing on the invalid obj, it should not crash lldb.
        import sb_watchpoint
        sb_watchpoint.fuzz_obj(obj)
