"""Test reading c-strings from memory via SB API."""


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


class TestReadMemCString(TestBase):

    mydir = TestBase.compute_mydir(__file__)
    NO_DEBUG_INFO_TESTCASE = True

    def test_read_memory_c_string(self):
        """Test corner case behavior of SBProcess::ReadCStringFromMemory"""
        self.build()
        self.dbg.SetAsync(False)

        self.main_source = "main.c"
        self.main_source_path = os.path.join(self.getSourceDir(),
                                             self.main_source)
        self.main_source_spec = lldb.SBFileSpec(self.main_source_path)
        self.exe = self.getBuildArtifact("read-mem-cstring")

        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
            self, 'breakpoint here', self.main_source_spec, None, self.exe)

        frame = thread.GetFrameAtIndex(0)

        err = lldb.SBError()

        empty_str_addr = frame.FindVariable("empty_string").GetValueAsUnsigned(err)
        self.assertTrue(err.Success())
        self.assertTrue(empty_str_addr != lldb.LLDB_INVALID_ADDRESS)

        one_letter_str_addr = frame.FindVariable("one_letter_string").GetValueAsUnsigned(err)
        self.assertTrue(err.Success())
        self.assertTrue(one_letter_str_addr != lldb.LLDB_INVALID_ADDRESS)

        invalid_memory_str_addr = frame.FindVariable("invalid_memory_string").GetValueAsUnsigned(err)
        self.assertTrue(err.Success())
        self.assertTrue(invalid_memory_str_addr != lldb.LLDB_INVALID_ADDRESS)

        # Important:  An empty (0-length) c-string must come back as a Python string, not a
        # None object.
        empty_str = process.ReadCStringFromMemory(empty_str_addr, 2048, err)
        self.assertTrue(err.Success())
        self.assertEqual(empty_str, "")

        one_letter_string = process.ReadCStringFromMemory(one_letter_str_addr, 2048, err)
        self.assertTrue(err.Success())
        self.assertEqual(one_letter_string, "1")

        invalid_memory_string = process.ReadCStringFromMemory(invalid_memory_str_addr, 2048, err)
        self.assertTrue(err.Fail())
        self.assertTrue(invalid_memory_string == "" or invalid_memory_string == None)
