def mem_cache_rwx_read_test(): mem = MockMemory() # build main mem contents mem.w8(0x100, 42) assert mem.r8(0x100) == 42 mem.w16(0x200, 0xdead) assert mem.r16(0x200) == 0xdead mem.w32(0x300, 0xcafebabe) assert mem.r32(0x300) == 0xcafebabe mem.write(0, 0x101, 43) assert mem.read(0, 0x101) == 43 mem.write(1, 0x202, 0x1234) assert mem.read(1, 0x202) == 0x1234 mem.write(2, 0x304, 0x11223344) assert mem.read(2, 0x304) == 0x11223344 # write to cache cmem = MemoryCache(0x100, 0x210) cmem.read_cache(mem) # check cache mem assert cmem.r8(0x100) == 42 assert cmem.r16(0x200) == 0xdead assert cmem.r32(0x300) == 0xcafebabe assert cmem.read(0, 0x101) == 43 assert cmem.read(1, 0x202) == 0x1234 assert cmem.read(2, 0x304) == 0x11223344
def astructs_enum_inst_test(): mem = MockMemory() mem.w32(4, 3) # instance me = MyEnum(mem=mem, addr=4) assert me.get() == MyEnum.a assert str(me) == "a" assert repr(me) == "MyEnum('a')" assert int(me) == MyEnum.a # change me.set(MyEnum.c) assert me.get() == MyEnum.c assert str(me) == "c" assert int(me) == MyEnum.c assert mem.r32(4) == MyEnum.c me.set("b") assert me.get() == MyEnum.b assert str(me) == "b" assert int(me) == MyEnum.b assert mem.r32(4) == MyEnum.b
def make_functions_ptr_test(): mem = MockMemory() # build an offset array ptr = 0 fptrs = [0x100, 0x202, 0x404, 0x808, 0x10000] for fptr in fptrs: mem.w32(ptr, fptr) ptr += 4 mem.w32s(ptr, -1) # build func table lib_base = 0x800 mf = MakeFuncs(mem) size = mf.make_functions(lib_base, 0) assert size == len(fptrs) * 6 # check jump table ptr = lib_base - 6 for fptr in fptrs: assert mem.r16(ptr) == op_jmp assert mem.r32(ptr+2) == fptr ptr -= 6
def machine_mem_rw_test(): mem = MockMemory() mem.w8(0x100, 42) assert mem.r8(0x100) == 42 mem.w16(0x200, 0xDEAD) assert mem.r16(0x200) == 0xDEAD mem.w32(0x300, 0xCAFEBABE) assert mem.r32(0x300) == 0xCAFEBABE mem.write(0, 0x101, 43) assert mem.read(0, 0x101) == 43 mem.write(1, 0x202, 0x1234) assert mem.read(1, 0x202) == 0x1234 mem.write(2, 0x304, 0x11223344) assert mem.read(2, 0x304) == 0x11223344 # invalid values with pytest.raises(ValueError): mem.w8(0x100, 0x100) with pytest.raises(ValueError): mem.w8(0x100, -1) # invalid values with pytest.raises(struct.error): mem.w16(0x100, 0x10000) with pytest.raises(struct.error): mem.w16(0x100, -2) # invalid values with pytest.raises(struct.error): mem.w32(0x100, 0x100000000) with pytest.raises(struct.error): mem.w32(0x100, -3) # invalid type with pytest.raises(TypeError): mem.w8(0x100, "hello") # invalid type with pytest.raises(struct.error): mem.w16(0x100, "hello") # invalid type with pytest.raises(struct.error): mem.w32(0x100, "hello") # invalid width with pytest.raises(ValueError): mem.write(7, 0x202, 12) with pytest.raises(ValueError): mem.read(7, 0x202)
def machine_mem_rw_test(): mem = MockMemory() mem.w8(0x100, 42) assert mem.r8(0x100) == 42 mem.w16(0x200, 0xdead) assert mem.r16(0x200) == 0xdead mem.w32(0x300, 0xcafebabe) assert mem.r32(0x300) == 0xcafebabe mem.write(0, 0x101, 43) assert mem.read(0, 0x101) == 43 mem.write(1, 0x202, 0x1234) assert mem.read(1, 0x202) == 0x1234 mem.write(2, 0x304, 0x11223344) assert mem.read(2, 0x304) == 0x11223344 # invalid values with pytest.raises(ValueError): mem.w8(0x100, 0x100) with pytest.raises(ValueError): mem.w8(0x100, -1) # invalid values with pytest.raises(struct.error): mem.w16(0x100, 0x10000) with pytest.raises(struct.error): mem.w16(0x100, -2) # invalid values with pytest.raises(struct.error): mem.w32(0x100, 0x100000000) with pytest.raises(struct.error): mem.w32(0x100, -3) # invalid type with pytest.raises(ValueError): mem.w8(0x100, 'hello') # invalid type with pytest.raises(struct.error): mem.w16(0x100, 'hello') # invalid type with pytest.raises(struct.error): mem.w32(0x100, 'hello') # invalid width with pytest.raises(ValueError): mem.write(7, 0x202, 12) with pytest.raises(ValueError): mem.read(7, 0x202)
def atypes_library_sum_test(): mem = MockMemory() alloc = MemoryAlloc(mem) # alloc lib name = "my.library" id_str = "my.library 1.2" neg_size = 30 pos_size = LibraryStruct.get_size() lib = Library.alloc(alloc, name, id_str, neg_size) # assume rounded neg size assert lib.get_neg_size() == 32 mem.w32(lib.addr - 32, 0xdeadbeef) mem.w32(lib.addr - 28, 0xcafebabe) my_sum = (0xdeadbeef + 0xcafebabe) & 0xffffffff lib_sum = lib.calc_sum() assert lib_sum == my_sum lib.update_sum() assert lib.get_sum() == my_sum assert lib.check_sum() # done lib.free() assert alloc.is_all_free()
def astructs_bitfield_inst_test(): mem = MockMemory() mem.w32(4, 1) # instance bf = MyBF(mem=mem, addr=4) assert str(bf) == "a" assert repr(bf) == "MyBF('a')" assert int(bf) == MyBF.a assert bf.has_bits(MyBF.a) assert bf.has_bits("a") # set bit bf.set_bits(MyBF.c) assert str(bf) == "a|c" assert int(bf) == MyBF.c | MyBF.a assert bf.has_bits("c") assert bf.has_bits(MyBF.c) assert bf.has_bits("a") assert bf.has_bits(MyBF.a) assert mem.r32(4) == MyBF.c | MyBF.a # clr bit bf.clr_bits(MyBF.a) assert str(bf) == "c" assert int(bf) == MyBF.c assert bf.has_bits("c") assert bf.has_bits(MyBF.c) assert not bf.has_bits("a") assert not bf.has_bits(MyBF.a) assert mem.r32(4) == MyBF.c # set value bf.set(MyBF.a | MyBF.b) assert str(bf) == "a|b" assert int(bf) == MyBF.b | MyBF.a assert bf.has_bits("b") assert bf.has_bits(MyBF.b) assert bf.has_bits("a") assert bf.has_bits(MyBF.a) assert mem.r32(4) == MyBF.b | MyBF.a