Coverage for tests/test_memory.py: 100%
87 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-02-20 16:25 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-02-20 16:25 +0000
1import unittest
3from wasmtime import *
6class TestMemory(unittest.TestCase):
7 def test_new(self):
8 store = Store()
9 ty = MemoryType(Limits(1, None))
10 assert(not ty.is_64)
11 memory = Memory(store, ty)
12 self.assertEqual(memory.type(store).limits, Limits(1, None))
13 self.assertEqual(memory.size(store), 1)
14 self.assertTrue(memory.grow(store, 1))
15 self.assertEqual(memory.size(store), 2)
16 self.assertTrue(memory.grow(store, 0))
17 self.assertEqual(memory.size(store), 2)
18 with self.assertRaises(TypeError):
19 memory.grow(store, '') # type: ignore
20 with self.assertRaises(WasmtimeError):
21 memory.grow(store, -1)
22 self.assertEqual(memory.data_ptr(store)[0], 0)
23 self.assertEqual(memory.data_len(store), 65536 * 2)
24 self.assertTrue(isinstance(memory.type(store), MemoryType))
26 def test_grow(self):
27 store = Store()
28 ty = MemoryType(Limits(1, 2))
29 memory = Memory(store, ty)
30 assert(memory.grow(store, 1) == 1)
31 assert(memory.grow(store, 0) == 2)
32 with self.assertRaises(WasmtimeError):
33 memory.grow(store, 1)
35 def test_errors(self):
36 store = Store()
37 ty = MemoryType(Limits(1, 2))
38 with self.assertRaises(AttributeError):
39 Memory(1, ty) # type: ignore
40 with self.assertRaises(AttributeError):
41 Memory(store, 1) # type: ignore
43 def test_large(self):
44 ty = MemoryType(Limits(0x100000000, None), is_64=True)
45 assert(ty.limits.min == 0x100000000)
46 assert(ty.limits.max is None)
47 assert(ty.is_64)
48 ty = MemoryType(Limits(0x100000000, 0x100000000), is_64=True)
49 assert(ty.limits.min == 0x100000000)
50 assert(ty.limits.max == 0x100000000)
52 with self.assertRaises(WasmtimeError):
53 MemoryType(Limits(0x100000000, None))
54 with self.assertRaises(WasmtimeError):
55 MemoryType(Limits(1, 0x100000000))
57 def test_slices(self):
58 store = Store()
59 ty = MemoryType(Limits(1, None))
60 memory = Memory(store, ty)
61 memory.grow(store, 2)
62 data_ptr = memory.data_ptr(store)
63 ba = bytearray([i for i in range(200)])
64 size_bytes = memory.data_len(store)
65 # happy cases
66 offset = 2048
67 ba_size = len(ba)
68 # write with start and ommit stop
69 memory.write(store, ba, offset)
70 # check write success byte by byte, whole is asserted with read
71 self.assertEqual(data_ptr[offset], 0)
72 self.assertEqual(data_ptr[offset + 1], 1)
73 self.assertEqual(data_ptr[offset + 199], 199)
74 # read while and assert whole area
75 out = memory.read(store, offset, offset + ba_size)
76 self.assertEqual(ba, out)
77 self.assertEqual(len(memory.read(store, -10)), 10)
78 # write with start and stop
79 memory.write(store, ba, offset + ba_size)
80 out = memory.read(store, offset + ba_size, offset + ba_size + ba_size)
81 self.assertEqual(ba, out)
82 # assert old
83 self.assertEqual(data_ptr[offset], 0)
84 self.assertEqual(data_ptr[offset + 1], 1)
85 self.assertEqual(data_ptr[offset + 199], 199)
86 # assert new
87 self.assertEqual(data_ptr[offset + ba_size], 0)
88 self.assertEqual(data_ptr[offset + ba_size + 1], 1)
89 self.assertEqual(data_ptr[offset + ba_size + 199], 199)
90 # edge cases
91 # empty slices
92 self.assertEqual(len(memory.read(store, 0, 0)), 0)
93 self.assertEqual(len(memory.read(store, offset, offset)), 0)
94 self.assertEqual(len(memory.read(store, offset, offset - 1)), 0)
95 # out of bound access returns empty array similar to list slice
96 self.assertEqual(len(memory.read(store, size_bytes + 1)), 0)
97 # write empty
98 self.assertEqual(memory.write(store, bytearray(0), offset), 0)
99 self.assertEqual(memory.write(store, bytearray(b""), offset), 0)
100 with self.assertRaises(IndexError):
101 memory.write(store, ba, size_bytes)
102 with self.assertRaises(IndexError):
103 memory.write(store, ba, size_bytes - ba_size + 1)
104 self.assertEqual(memory.write(store, ba, -ba_size), ba_size)
105 out = memory.read(store, -ba_size)
106 self.assertEqual(ba, out)