summaryrefslogtreecommitdiff
path: root/tests/analysis/contents/custom.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/analysis/contents/custom.py')
-rw-r--r--tests/analysis/contents/custom.py134
1 files changed, 134 insertions, 0 deletions
diff --git a/tests/analysis/contents/custom.py b/tests/analysis/contents/custom.py
new file mode 100644
index 0000000..2153967
--- /dev/null
+++ b/tests/analysis/contents/custom.py
@@ -0,0 +1,134 @@
+
+from chrysacase import ChrysalideTestCase
+from pychrysalide import SourceEndian
+from pychrysalide.analysis import BinContent
+from pychrysalide.arch import vmpa
+
+
+class CustomContent(BinContent):
+
+ def __init__(self, size):
+ super(CustomContent, self).__init__()
+ self._start = 10
+ self._size = size * 8
+
+ def _describe(self, full):
+ return 'my_desc' + ('_full' if full else '')
+
+ def _compute_checksum(self, checksum):
+ checksum.update(b'xxxxx')
+
+ def _compute_size(self):
+ return int(self._size / 8)
+
+ def _compute_start_pos(self):
+ return vmpa(self._start, vmpa.VmpaSpecialValue.NO_VIRTUAL)
+
+ def _compute_end_pos(self):
+ return vmpa(self._start + self._size, vmpa.VmpaSpecialValue.NO_VIRTUAL)
+
+ def _seek(self, addr, length):
+ addr += length
+ return True
+
+ def _read_uxxx(self, addr, sizeof):
+
+ assert(addr >= self.start_pos and addr < self.end_pos)
+
+ val = int((addr - self.start_pos).phys / sizeof)
+
+ addr += sizeof
+
+ return val
+
+ def _read_u8(self, addr):
+ return self._read_uxxx(addr, 1)
+
+ def _read_u16(self, addr, endian):
+ return self._read_uxxx(addr, 2)
+
+ def _read_u32(self, addr, endian):
+ return self._read_uxxx(addr, 4)
+
+ def _read_u64(self, addr, endian):
+ return self._read_uxxx(addr, 8)
+
+ def _read_uleb128(self, addr):
+ return 128
+
+ def _read_leb128(self, addr):
+ return -128
+
+
+class TestCustomContent(ChrysalideTestCase):
+ """TestCase for custom implementation of analysis.BinContent."""
+
+ def testBasicImplementations(self):
+ """Involve all implemented basic wrappers for a custom content."""
+
+ cnt = CustomContent(1)
+
+ self.assertEqual(cnt._describe(False), 'my_desc')
+
+ self.assertEqual(cnt._describe(True), 'my_desc_full')
+
+ # $ echo -n 'xxxxx' | sha256sum
+ # eaf16bc07968e013f3f94ab1342472434a39fc3475f11cf341a6c3965974f8e9 -
+
+ expected = 'eaf16bc07968e013f3f94ab1342472434a39fc3475f11cf341a6c3965974f8e9'
+
+ self.assertEqual(cnt.checksum, expected)
+
+ self.assertEqual(cnt.size, 1)
+
+ addr = cnt.start_pos
+ offset = 13
+
+ cnt.seek(addr, offset)
+
+ self.assertEqual(addr.phys, cnt.start_pos.phys + offset)
+
+
+ def testReadImplementations(self):
+ """Involve main implemented read wrappers for a custom content."""
+
+ cnt = CustomContent(8)
+
+ def _run_check_read_implem(fn, args):
+
+ last = None
+
+ pos = cnt.start_pos
+
+ while pos < cnt.end_pos:
+
+ val = fn(pos, *args)
+
+ if not(last is None):
+ self.assertEqual(last + 1, val)
+ else:
+ self.assertEqual(val, 0)
+
+ last = val
+
+ checks = [
+ [ cnt.read_u8, [] ],
+ [ cnt.read_u16, [ SourceEndian.LITTLE ] ],
+ [ cnt.read_u32, [ SourceEndian.LITTLE ] ],
+ [ cnt.read_u64, [ SourceEndian.LITTLE ] ],
+ ]
+
+ for f, a in checks:
+ _run_check_read_implem(f, a)
+
+
+ def testLEB128Implementations(self):
+ """Involve [U]LEB128 implemented wrappers for a custom content."""
+
+ cnt = CustomContent(1)
+
+ addr = cnt.start_pos
+
+ self.assertEqual(cnt.read_uleb128(addr), 128)
+
+ self.assertEqual(cnt.read_leb128(addr), -128)