diff options
| author | Theofilos Augoustis <theofilos.augoustis@gmail.com> | 2023-11-27 14:08:55 +0100 |
|---|---|---|
| committer | Theofilos Augoustis <theofilos.augoustis@gmail.com> | 2023-11-27 14:08:55 +0100 |
| commit | 836e42215fda0cbd330caef2dc5fc93336d4722c (patch) | |
| tree | 0b9ce5cca67c511b74b9ae91a8fda2fc0a35e65c /test/test_sparse_memory.py | |
| parent | 5d51b4fe0bb41bc9e86c5775de35a9aef023fec5 (diff) | |
| download | focaccia-836e42215fda0cbd330caef2dc5fc93336d4722c.tar.gz focaccia-836e42215fda0cbd330caef2dc5fc93336d4722c.zip | |
Add memory storage capabilities to `ProgramState`
The `SparseMemory` class represents a program's memory. While the user can read from and write to arbitrary memory addresses, it manages its memory in pages/chunks internally. This is a tradeoff between space consumption (this solution might have a memory overhead) and lookup speed of individual memory addresses. Add two small unit tests for `SparseMemory`.
Diffstat (limited to '')
| -rw-r--r-- | test/test_sparse_memory.py | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/test/test_sparse_memory.py b/test/test_sparse_memory.py new file mode 100644 index 0000000..87b4456 --- /dev/null +++ b/test/test_sparse_memory.py @@ -0,0 +1,33 @@ +import unittest + +from snapshot import SparseMemory, MemoryAccessError + +class TestSparseMemory(unittest.TestCase): + def test_oob_read(self): + mem = SparseMemory() + for addr in range(mem.page_size): + self.assertRaises(MemoryAccessError, mem.read, addr, 1) + self.assertRaises(MemoryAccessError, mem.read, addr, 30) + self.assertRaises(MemoryAccessError, mem.read, addr + 0x10, 30) + self.assertRaises(MemoryAccessError, mem.read, addr, mem.page_size) + self.assertRaises(MemoryAccessError, mem.read, addr, mem.page_size - 1) + self.assertRaises(MemoryAccessError, mem.read, addr, mem.page_size + 1) + + def test_basic_read_write(self): + mem = SparseMemory() + + data = b'a' * mem.page_size * 2 + mem.write(0x300, data) + self.assertEqual(mem.read(0x300, len(data)), data) + self.assertEqual(mem.read(0x300, 1), b'a') + self.assertEqual(mem.read(0x400, 1), b'a') + self.assertEqual(mem.read(0x299 + mem.page_size * 2, 1), b'a') + self.assertEqual(mem.read(0x321, 12), b'aaaaaaaaaaaa') + + mem.write(0x321, b'Hello World!') + self.assertEqual(mem.read(0x321, 12), b'Hello World!') + + self.assertRaises(MemoryAccessError, mem.read, 0x300, mem.page_size * 3) + +if __name__ == '__main__': + unittest.main() |