"""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):
    NO_DEBUG_INFO_TESTCASE = True

    @requireNotWasm(
        "linear memory has no unmapped pages, so a bad in-range pointer still reads"
    )
    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.assertSuccess(err)
        self.assertNotEqual(empty_str_addr, lldb.LLDB_INVALID_ADDRESS)

        one_letter_str_addr = frame.FindVariable(
            "one_letter_string"
        ).GetValueAsUnsigned(err)
        self.assertSuccess(err)
        self.assertNotEqual(one_letter_str_addr, lldb.LLDB_INVALID_ADDRESS)

        invalid_memory_str_addr = frame.FindVariable(
            "invalid_memory_string"
        ).GetValueAsUnsigned(err)
        self.assertSuccess(err)
        self.assertNotEqual(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.assertSuccess(err)
        self.assertEqual(empty_str, "")

        one_letter_string = process.ReadCStringFromMemory(
            one_letter_str_addr, 2048, err
        )
        self.assertSuccess(err)
        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 is None)
