Admin Panel

import collections
from amitools.vamos.lib.ExecLibrary import ExecLibrary
from amitools.vamos.lib.VamosTestLibrary import VamosTestLibrary
from amitools.vamos.lib.VamosTestDevice import VamosTestDevice
from amitools.vamos.libcore import VLibManager, LibRegistry, LibCtxMap
from amitools.vamos.machine import Machine
from amitools.vamos.mem import MemoryAlloc
from amitools.vamos.lib.lexec.ExecLibCtx import ExecLibCtx
from amitools.vamos.loader import SegmentLoader


def setup(main_profiler=None, prof_names=None, prof_calls=False):
  machine = Machine()
  alloc = MemoryAlloc(machine.get_mem(), machine.get_ram_begin())
  mgr = VLibManager(machine, alloc,
                    main_profiler=main_profiler,
                    prof_names=prof_names, prof_calls=prof_calls)
  # setup ctx map
  cpu = machine.get_cpu()
  mem = machine.get_mem()
  cpu_type = machine.get_cpu_type()
  segloader = SegmentLoader(alloc)
  exec_ctx = ExecLibCtx(machine, alloc, segloader, None)
  mgr.add_ctx('exec.library', exec_ctx)
  mgr.add_impl_cls('exec.library', ExecLibrary)
  mgr.add_impl_cls('vamostest.library', VamosTestLibrary)
  mgr.add_impl_cls('vamostestdev.device', VamosTestDevice)
  return machine, alloc, mgr


def libcore_mgr_bootstrap_shutdown_test():
  machine, alloc, mgr = setup()
  # bootstrap exec
  exec_vlib = mgr.bootstrap_exec()
  exec_base = exec_vlib.get_addr()
  exec_lib = exec_vlib.get_library()
  # make sure exec is in place
  assert mgr.get_vlib_by_name('exec.library') == exec_vlib
  assert mgr.get_vlib_by_addr(exec_base) == exec_vlib
  assert exec_lib.open_cnt == 1
  assert machine.get_mem().r32(4) == exec_base
  # we can't expunge exec
  assert not mgr.expunge_lib(exec_vlib)
  # shutdown
  left = mgr.shutdown()
  assert left == 0
  # exec is now gone and mem is sane
  assert alloc.is_all_free()


def libcore_mgr_make_test():
  machine, alloc, mgr = setup()
  exec_vlib = mgr.bootstrap_exec()
  # make vamos test lib
  test_vlib = mgr.make_lib_name('vamostest.library')
  test_base = test_vlib.get_addr()
  assert test_vlib
  assert mgr.get_vlib_by_name('vamostest.library') == test_vlib
  assert mgr.get_vlib_by_addr(test_base) == test_vlib
  impl = test_vlib.get_impl()
  assert impl
  assert impl.get_cnt() == 0
  lib = test_vlib.get_library()
  assert lib.version == impl.get_version()
  # shutdown
  left = mgr.shutdown()
  assert left == 0
  assert alloc.is_all_free()


def libcore_mgr_make_version_revision_test():
  machine, alloc, mgr = setup()
  exec_vlib = mgr.bootstrap_exec()
  # make vamos test lib
  test_vlib = mgr.make_lib_name('vamostest.library', version=11, revision=23)
  test_base = test_vlib.get_addr()
  assert test_vlib
  assert mgr.get_vlib_by_name('vamostest.library') == test_vlib
  assert mgr.get_vlib_by_addr(test_base) == test_vlib
  impl = test_vlib.get_impl()
  assert impl
  assert impl.get_cnt() == 0
  lib = test_vlib.get_library()
  assert lib.version == 11
  assert lib.revision == 23
  # shutdown
  left = mgr.shutdown()
  assert left == 0
  assert alloc.is_all_free()


def libcore_mgr_make_profile_test():
  machine, alloc, mgr = setup(prof_names=['all'])
  profiler = mgr.get_profiler()
  assert profiler
  profiler.setup()
  exec_vlib = mgr.bootstrap_exec()
  # make vamos test lib
  test_vlib = mgr.make_lib_name('vamostest.library')
  test_base = test_vlib.get_addr()
  assert test_vlib
  assert mgr.get_vlib_by_name('vamostest.library') == test_vlib
  assert mgr.get_vlib_by_addr(test_base) == test_vlib
  impl = test_vlib.get_impl()
  assert impl
  assert impl.get_cnt() == 0
  prof = test_vlib.profile
  assert prof
  assert profiler.get_profile('vamostest.library') == prof
  # shutdown
  left = mgr.shutdown()
  assert left == 0
  assert alloc.is_all_free()
  # profile survives
  assert profiler.get_profile('vamostest.library') == prof


def libcore_mgr_make_fake_with_fd_test():
  machine, alloc, mgr = setup()
  exec_vlib = mgr.bootstrap_exec()
  # make vamos test lib
  test_vlib = mgr.make_lib_name('testnix.library')
  assert test_vlib is None
  test_vlib = mgr.make_lib_name('testnix.library', fake=True)
  test_base = test_vlib.get_addr()
  assert test_vlib
  assert mgr.get_vlib_by_name('testnix.library') == test_vlib
  assert mgr.get_vlib_by_addr(test_base) == test_vlib
  impl = test_vlib.get_impl()
  assert impl is None
  # shutdown
  left = mgr.shutdown()
  assert left == 0
  assert alloc.is_all_free()


def libcore_mgr_make_fake_without_fd_test():
  machine, alloc, mgr = setup()
  exec_vlib = mgr.bootstrap_exec()
  # make vamos test lib
  test_vlib = mgr.make_lib_name('foo.library')
  assert test_vlib is None
  test_vlib = mgr.make_lib_name('foo.library', fake=True)
  test_base = test_vlib.get_addr()
  assert test_vlib
  assert mgr.get_vlib_by_name('foo.library') == test_vlib
  assert mgr.get_vlib_by_addr(test_base) == test_vlib
  impl = test_vlib.get_impl()
  assert impl is None
  assert test_vlib.get_fd().get_neg_size() == 30
  assert test_vlib.get_library().neg_size == 32
  # shutdown
  left = mgr.shutdown()
  assert left == 0
  assert alloc.is_all_free()


def libcore_mgr_make_fake_without_fd_cfg_test():
  machine, alloc, mgr = setup()
  exec_vlib = mgr.bootstrap_exec()
  # lib_cfg
  Cfg = collections.namedtuple('Cfg', ['num_fake_funcs'])
  lib_cfg = Cfg(10)
  # make vamos test lib
  test_vlib = mgr.make_lib_name('foo.library', lib_cfg=lib_cfg)
  assert test_vlib is None
  test_vlib = mgr.make_lib_name('foo.library', fake=True, lib_cfg=lib_cfg)
  test_base = test_vlib.get_addr()
  assert test_vlib
  assert mgr.get_vlib_by_name('foo.library') == test_vlib
  assert mgr.get_vlib_by_addr(test_base) == test_vlib
  impl = test_vlib.get_impl()
  assert impl is None
  assert test_vlib.get_fd().get_neg_size() == 66
  assert test_vlib.get_library().neg_size == 68
  # shutdown
  left = mgr.shutdown()
  assert left == 0
  assert alloc.is_all_free()


def libcore_mgr_make_open_test():
  machine, alloc, mgr = setup()
  exec_vlib = mgr.bootstrap_exec()
  # make vamos test lib
  test_vlib = mgr.make_lib_name('vamostest.library')
  test_base = test_vlib.get_addr()
  impl = test_vlib.get_impl()
  lib = test_vlib.get_library()
  assert lib.version == impl.get_version()
  assert impl.get_cnt() == 0
  assert mgr.open_lib_name('vamostest.library') == test_vlib
  assert impl.get_cnt() == 1
  assert not mgr.expunge_lib(test_vlib)
  assert mgr.close_lib(test_vlib)
  assert impl.get_cnt() is None
  # shutdown
  left = mgr.shutdown()
  assert left == 0
  assert alloc.is_all_free()


def libcore_mgr_open_test():
  machine, alloc, mgr = setup()
  exec_vlib = mgr.bootstrap_exec()
  # make vamos test lib
  test_vlib = mgr.open_lib_name('vamostest.library')
  impl = test_vlib.get_impl()
  lib = test_vlib.get_library()
  assert lib.version == impl.get_version()
  assert impl.get_cnt() == 1
  assert mgr.close_lib(test_vlib)
  assert impl.get_cnt() is None
  # shutdown
  left = mgr.shutdown()
  assert left == 0
  assert alloc.is_all_free()


def libcore_mgr_make_open_dev_test():
  machine, alloc, mgr = setup()
  exec_vlib = mgr.bootstrap_exec()
  # make vamos test lib
  test_vlib = mgr.make_lib_name('vamostestdev.device')
  test_base = test_vlib.get_addr()
  impl = test_vlib.get_impl()
  lib = test_vlib.get_library()
  assert test_vlib.is_device()
  assert lib.version == impl.get_version()
  assert impl.get_cnt() == 0
  assert mgr.open_lib_name('vamostestdev.device') == test_vlib
  assert impl.get_cnt() == 1
  assert not mgr.expunge_lib(test_vlib)
  assert mgr.close_lib(test_vlib)
  assert impl.get_cnt() is None
  # shutdown
  left = mgr.shutdown()
  assert left == 0
  assert alloc.is_all_free()


def libcore_mgr_open_dev_test():
  machine, alloc, mgr = setup()
  exec_vlib = mgr.bootstrap_exec()
  # make vamos test lib
  test_vlib = mgr.open_lib_name('vamostestdev.device')
  impl = test_vlib.get_impl()
  lib = test_vlib.get_library()
  assert test_vlib.is_device()
  assert lib.version == impl.get_version()
  assert impl.get_cnt() == 1
  assert mgr.close_lib(test_vlib)
  assert impl.get_cnt() is None
  # shutdown
  left = mgr.shutdown()
  assert left == 0
  assert alloc.is_all_free()