Admin Panel
import pytest
from amitools.vamos.libcore import LibJumpTable, NoJumpTableEntryError
from amitools.vamos.machine import MockMachine
from amitools.fd import read_lib_fd
def get_jump_table(with_fd=False, **kwargs):
machine = MockMachine()
mem = machine.get_mem()
name = 'vamostest.library'
fd = read_lib_fd(name)
neg_size = fd.get_neg_size()
lib_base = neg_size + 0x100
if not with_fd:
fd = None
jt = LibJumpTable(mem, lib_base, neg_size, fd=fd, **kwargs)
return jt
def libcore_jumptab_create_test():
jt = get_jump_table(create=True)
# set entry by index
jt[1] = 0xcafebabe
assert jt[1] == 0xcafebabe
# invalid key: string
with pytest.raises(KeyError):
jt['hello']
# invalid index: out of range
with pytest.raises(IndexError):
jt[99]
# set entry by lvo
jt[-42] = 0x12345678
assert jt[-42] == 0x12345678
# invalid index: not modulo 6
with pytest.raises(IndexError):
jt[-41]
# invalid index: out of range
with pytest.raises(IndexError):
jt[-99]
def libcore_jumptab_with_fd_test():
jt = get_jump_table(with_fd=True, create=True)
# set entry by name
jt.PrintHello = 0xdeadbeef
assert jt.PrintHello == 0xdeadbeef
with pytest.raises(AttributeError):
jt.Blubber
# set entry by index
jt[1] = 0xcafebabe
assert jt[1] == 0xcafebabe
assert jt[4] == 0xdeadbeef
# invalid key: string
with pytest.raises(KeyError):
jt['hello']
# invalid index: out of range
with pytest.raises(IndexError):
jt[99]
# set entry by lvo
jt[-42] = 0x12345678
assert jt[-42] == 0x12345678
assert jt[-30] == 0xdeadbeef
assert jt[-12] == 0xcafebabe
# invalid index: not modulo 6
with pytest.raises(IndexError):
jt[-41]
# invalid index: out of range
with pytest.raises(IndexError):
jt[-99]
def libcore_jumptab_no_create_test():
jt = get_jump_table(with_fd=True)
# set entry by name
with pytest.raises(NoJumpTableEntryError):
jt.PrintHello = 0xdeadbeef
# set entry by index
with pytest.raises(NoJumpTableEntryError):
jt[1] = 0xcafebabe
# set entry by lvo
with pytest.raises(NoJumpTableEntryError):
jt[-42] = 0x12345678
def libcore_jumptab_iter_test():
jt = get_jump_table(with_fd=True, create=True)
for entry in jt:
entry.set(0)
print(entry)