drgn/tests/test_corereader.py
Omar Sandoval 98a26ad610 corereader: add CoreReader.read_c_string()
And replace the Python implementation in ProgramObject.string_(). The
CoreReader implementation is still naive in that it reads byte-by-byte,
but this could always be improved in the future.
2018-07-23 18:19:41 -07:00

94 lines
3.7 KiB
Python

import contextlib
import tempfile
import unittest
from drgn.internal.corereader import CoreReader
@contextlib.contextmanager
def tmpfile(data):
file = tempfile.TemporaryFile()
try:
file.write(data)
file.flush()
yield file
finally:
file.close()
class TestCoreReader(unittest.TestCase):
def test_bad_segments(self):
with tmpfile(b'') as file:
self.assertRaises(TypeError, CoreReader, file, 0)
self.assertRaises(TypeError, CoreReader, file, [0])
self.assertRaises(ValueError, CoreReader, file, [()])
self.assertRaises(OverflowError, CoreReader, file,
[(2**64, 0, 0, 0, 0)])
def test_simple_read(self):
data = b'hello, world!'
segments = [(0, 0xffff0000, 0x0, len(data), len(data))]
with tmpfile(data) as file:
core_reader = CoreReader(file, segments)
self.assertEqual(core_reader.read(0xffff0000, len(data)), data)
def test_c_string(self):
data = b'hello\0world!'
segments = [(0, 0xffff0000, 0x0, len(data), len(data))]
with tmpfile(data) as file:
core_reader = CoreReader(file, segments)
self.assertEqual(core_reader.read_c_string(0xffff0000), b'hello')
self.assertEqual(core_reader.read_c_string(0xffff0000, 4), b'hell')
self.assertEqual(core_reader.read_c_string(0xffff0000, 5), b'hello')
self.assertEqual(core_reader.read_c_string(0xffff0000, 6), b'hello')
self.assertEqual(core_reader.read_c_string(0xffff0000, 7), b'hello')
self.assertEqual(core_reader.read_c_string(0x0, 0), b'')
self.assertEqual(core_reader.read_c_string(0xffff0000, 0), b'')
self.assertEqual(core_reader.read_c_string(0xffff0008, 2), b'rl')
self.assertRaisesRegex(ValueError, 'could not find memory segment',
core_reader.read_c_string, 0xffff0008)
self.assertRaisesRegex(ValueError, 'could not find memory segment',
core_reader.read_c_string, 0xffff0008, 8)
def test_bad_address(self):
data = b'hello, world!'
segments = [(0, 0xffff0000, 0x0, len(data), len(data))]
with tmpfile(data) as file:
core_reader = CoreReader(file, segments)
self.assertRaisesRegex(ValueError, 'could not find memory segment',
core_reader.read, 0xdeadbeef, 4)
def test_segment_overflow(self):
data = b'hello, world!'
segments = [(0, 0xffff0000, 0x0, len(data), len(data))]
with tmpfile(data) as file:
core_reader = CoreReader(file, segments)
self.assertRaisesRegex(ValueError, 'could not find memory segment',
core_reader.read, 0xffff0000, len(data) + 1)
def test_contiguous_segments(self):
data = b'hello, world!\0foobar'
segments = [
(0, 0xffff0000, 0x0, 4, 4),
(14, 0xfffff000, 0x0, 6, 6),
(4, 0xffff0004, 0x0, 10, 10),
]
with tmpfile(data) as file:
core_reader = CoreReader(file, segments)
self.assertEqual(core_reader.read(0xffff0000, 14), data[:14])
def test_zero_filled_segment(self):
data = b'hello, world!'
segments = [
(0, 0xffff0000, 0x0, 13, 17),
]
with tmpfile(data) as file:
core_reader = CoreReader(file, segments)
self.assertEqual(core_reader.read(0xffff0000, len(data) + 4),
data + bytes(4))
self.assertEqual(core_reader.read(0xffff0000 + len(data), 4),
bytes(4))