Admin Panel

import logging
import pytest
from amitools.vamos.log import log_libmgr, log_exec
from amitools.vamos.libcore import LibCtx
from amitools.vamos.libmgr import LibManager, LibMgrCfg, LibCfg
from amitools.vamos.machine import Machine
from amitools.vamos.mem import MemoryAlloc
from amitools.vamos.lib.lexec.ExecLibCtx import ExecLibCtx
from amitools.vamos.lib.dos.DosLibCtx import DosLibCtx
from amitools.vamos.lib.ExecLibrary import ExecLibrary
from amitools.vamos.lib.DosLibrary import DosLibrary
from amitools.vamos.lib.VamosTestLibrary import VamosTestLibrary
from amitools.vamos.lib.VamosTestDevice import VamosTestDevice
from amitools.vamos.loader import SegmentLoader


def setup(path_mgr=None):
  log_libmgr.setLevel(logging.INFO)
  log_exec.setLevel(logging.INFO)
  machine = Machine()
  # machine.show_instr(True)
  sp = machine.get_ram_begin() - 4
  alloc = MemoryAlloc.for_machine(machine)
  segloader = SegmentLoader(alloc, path_mgr)
  cfg = LibMgrCfg()
  mgr = LibManager(machine, alloc, segloader, cfg)
  # setup ctx map
  cpu = machine.get_cpu()
  mem = machine.get_mem()
  cpu_type = machine.get_cpu_type()
  exec_ctx = ExecLibCtx(machine, alloc, segloader, path_mgr)
  mgr.add_ctx('exec.library', exec_ctx)
  mgr.add_impl_cls('exec.library', ExecLibrary)
  dos_ctx = DosLibCtx(machine, alloc, segloader, path_mgr, None, None)
  mgr.add_ctx('dos.library', dos_ctx)
  mgr.add_impl_cls('dos.library', DosLibrary)
  mgr.add_impl_cls('vamostest.library', VamosTestLibrary)
  mgr.add_impl_cls('vamostestdev.device', VamosTestDevice)
  return machine, alloc, mgr, sp, cfg


def libmgr_mgr_bootstrap_shutdown_test():
  machine, alloc, mgr, sp, cfg = 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
  vmgr = mgr.vlib_mgr
  assert vmgr.get_vlib_by_name('exec.library') == exec_vlib
  assert vmgr.get_vlib_by_addr(exec_base) == exec_vlib
  assert exec_vlib.get_ctx() == vmgr.ctx_map.get_ctx('exec.library')
  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_base)
  # shutdown
  left = mgr.shutdown()
  assert left == 0
  # exec is now gone and mem is sane
  assert alloc.is_all_free()


def libmgr_mgr_open_fail_test():
  class PathMgrMock:
    def ami_to_sys_path(self, lock, ami_path, mustExist=True):
      return None
  pm = PathMgrMock()
  machine, alloc, mgr, sp, cfg = setup(path_mgr=pm)
  mgr.bootstrap_exec()
  # open non-existing lib
  lib_base = mgr.open_lib("blubber.library")
  assert lib_base == 0
  # shutdown
  left = mgr.shutdown()
  assert left == 0
  # exec is now gone and mem is sane
  assert alloc.is_all_free()


def libmgr_mgr_open_vlib_test():
  machine, alloc, mgr, sp, cfg = setup()
  exec_vlib = mgr.bootstrap_exec()
  # make vamos test lib
  test_base = mgr.open_lib('vamostest.library')
  assert test_base > 0
  vmgr = mgr.vlib_mgr
  test_vlib = vmgr.get_vlib_by_addr(test_base)
  assert test_vlib
  assert type(test_vlib.get_ctx()) == LibCtx
  assert vmgr.get_vlib_by_name('vamostest.library') == test_vlib
  impl = test_vlib.get_impl()
  assert impl
  assert impl.get_cnt() == 1
  lib = test_vlib.get_library()
  assert lib.version == impl.get_version()
  mgr.close_lib(test_base)
  assert impl.get_cnt() is None
  # shutdown
  left = mgr.shutdown()
  assert left == 0
  assert alloc.is_all_free()


def libmgr_mgr_open_vlib_dev_test():
  machine, alloc, mgr, sp, cfg = setup()
  exec_vlib = mgr.bootstrap_exec()
  # make vamos test lib
  test_base = mgr.open_lib('vamostestdev.device')
  assert test_base > 0
  vmgr = mgr.vlib_mgr
  test_vlib = vmgr.get_vlib_by_addr(test_base)
  assert test_vlib
  assert type(test_vlib.get_ctx()) == LibCtx
  assert vmgr.get_vlib_by_name('vamostestdev.device') == test_vlib
  impl = test_vlib.get_impl()
  assert impl
  assert impl.get_cnt() == 1
  lib = test_vlib.get_library()
  assert lib.version == impl.get_version()
  mgr.close_lib(test_base)
  assert impl.get_cnt() is None
  # shutdown
  left = mgr.shutdown()
  assert left == 0
  assert alloc.is_all_free()


def libmgr_mgr_open_vlib_fake_fd_test():
  machine, alloc, mgr, sp, cfg = setup()
  exec_vlib = mgr.bootstrap_exec()
  # make vamos test lib
  cfg.add_lib_cfg('dos.library',
                  LibCfg(create_mode=LibCfg.CREATE_MODE_FAKE,
                         force_version=40))
  test_base = mgr.open_lib('dos.library', 36)
  assert test_base > 0
  vmgr = mgr.vlib_mgr
  test_vlib = vmgr.get_vlib_by_addr(test_base)
  assert test_vlib
  assert vmgr.get_vlib_by_name('dos.library') == test_vlib
  impl = test_vlib.get_impl()
  assert impl is None
  lib = test_vlib.get_library()
  assert lib.version == 40
  mgr.close_lib(test_base)
  # shutdown
  left = mgr.shutdown()
  assert left == 0
  assert alloc.is_all_free()


def libmgr_mgr_open_vlib_fake_no_fd_test():
  machine, alloc, mgr, sp, cfg = setup()
  exec_vlib = mgr.bootstrap_exec()
  # make vamos test lib
  cfg.add_lib_cfg('foo.library',
                  LibCfg(create_mode=LibCfg.CREATE_MODE_FAKE,
                         force_version=40, num_fake_funcs=10))
  test_base = mgr.open_lib('foo.library', 36)
  assert test_base > 0
  vmgr = mgr.vlib_mgr
  test_vlib = vmgr.get_vlib_by_addr(test_base)
  assert test_vlib
  assert vmgr.get_vlib_by_name('foo.library') == test_vlib
  impl = test_vlib.get_impl()
  assert impl is None
  lib = test_vlib.get_library()
  assert lib.version == 40
  assert lib.neg_size == 68
  mgr.close_lib(test_base)
  # shutdown
  left = mgr.shutdown()
  assert left == 0
  assert alloc.is_all_free()


def libmgr_mgr_open_vlib_too_new_test():
  machine, alloc, mgr, sp, cfg = setup()
  exec_vlib = mgr.bootstrap_exec()
  # make vamos test lib
  cfg.add_lib_cfg('dos.library',
                  LibCfg(create_mode=LibCfg.CREATE_MODE_FAKE,
                         force_version=40))
  test_base = mgr.open_lib('dos.library', 41)
  assert test_base == 0
  # shutdown
  left = mgr.shutdown()
  assert left == 0
  assert alloc.is_all_free()


class ALibHelper(object):
  def __init__(self, lib_file, lib_name):
    class PathMgrMock:
      def ami_to_sys_path(self, lock, ami_path, mustExist=True):
        if ami_path == 'LIBS:' + lib_name:
          return lib_file
    pm = PathMgrMock()
    self.machine, self.alloc, self.mgr, self.sp, self.cfg = setup(path_mgr=pm)
    self.mgr.bootstrap_exec()
    self.cfg.add_lib_cfg('dos.library',
                         LibCfg(create_mode=LibCfg.CREATE_MODE_FAKE,
                                force_version=40))
    self.dos_base = self.mgr.open_lib('dos.library')

  def shutdown(self):
    # close dos
    self.mgr.close_lib(self.dos_base)
    # expunge lib
    left = self.mgr.shutdown(run_sp=self.sp)
    assert left == 0
    assert self.alloc.is_all_free()


def open_alib(lib_file, lib_name, ok=True, version=0, mode=None):
  h = ALibHelper(lib_file, lib_name)
  mgr = h.mgr
  # setup config
  if mode:
    h.cfg.add_lib_cfg(lib_name, LibCfg(create_mode=mode))
  # open_lib
  lib_base = mgr.open_lib(lib_name, run_sp=h.sp, version=version)
  if not ok:
    assert lib_base == 0
    h.shutdown()
    return
  assert lib_base > 0
  amgr = mgr.alib_mgr
  assert amgr.is_base_addr(lib_base)
  lib_info = amgr.get_lib_info_for_name(lib_name)
  assert lib_info
  assert lib_info.is_base_addr(lib_base)
  # close lib
  seglist = mgr.close_lib(lib_base, run_sp=h.sp)
  assert not amgr.is_base_addr(lib_base)
  assert seglist == 0
  lib_info = amgr.get_lib_info_for_name(lib_name)
  assert lib_info
  assert not lib_info.is_base_addr(lib_base)
  # expunge lib
  load_addr = lib_info.get_load_addr()
  seglist = mgr.expunge_lib(load_addr, run_sp=h.sp)
  assert seglist > 0
  assert not amgr.is_load_addr(lib_base)
  lib_info = amgr.get_lib_info_for_name(lib_name)
  assert not lib_info
  # shutdown
  h.shutdown()


def libmgr_mgr_open_alib_libnix_test(buildlibnix):
  lib_file = buildlibnix.make_lib('testnix')
  lib_name = "testnix.library"
  open_alib(lib_file, lib_name)


def libmgr_mgr_open_alib_libsc_test(buildlibsc):
  lib_file = buildlibsc.make_lib("testsc")
  lib_name = "testsc.library"
  open_alib(lib_file, lib_name)


def libmgr_mgr_open_alib_libnix_ver_fail_test(buildlibnix):
  lib_file = buildlibnix.make_lib('testnix')
  lib_name = "testnix.library"
  open_alib(lib_file, lib_name, ok=False, version=99)


def libmgr_mgr_open_alib_libsc_ver_fail_test(buildlibsc):
  lib_file = buildlibsc.make_lib("testsc")
  lib_name = "testsc.library"
  open_alib(lib_file, lib_name, ok=False, version=99)


def libmgr_mgr_open_alib_libnix_mode_native_test(buildlibnix):
  lib_file = buildlibnix.make_lib('testnix')
  lib_name = "testnix.library"
  open_alib(lib_file, lib_name, mode=LibCfg.CREATE_MODE_AMIGA)


def libmgr_mgr_open_alib_libsc_mode_native_test(buildlibsc):
  lib_file = buildlibsc.make_lib("testsc")
  lib_name = "testsc.library"
  open_alib(lib_file, lib_name, mode=LibCfg.CREATE_MODE_AMIGA)


def libmgr_mgr_open_alib_libnix_mode_off_test(buildlibnix):
  lib_file = buildlibnix.make_lib('testnix')
  lib_name = "testnix.library"
  open_alib(lib_file, lib_name, ok=False, mode=LibCfg.CREATE_MODE_OFF)


def libmgr_mgr_open_alib_libsc_mode_off_test(buildlibsc):
  lib_file = buildlibsc.make_lib("testsc")
  lib_name = "testsc.library"
  open_alib(lib_file, lib_name, ok=False, mode=LibCfg.CREATE_MODE_OFF)