1 # Test class and utilities for functional tests
3 # Copyright (c) 2018 Red Hat, Inc.
6 # Cleber Rosa <crosa@redhat.com>
8 # This work is licensed under the terms of the GNU GPL, version 2 or
9 # later. See the COPYING file in the top-level directory.
17 SRC_ROOT_DIR
= os
.path
.join(os
.path
.dirname(__file__
), '..', '..', '..')
18 sys
.path
.append(os
.path
.join(SRC_ROOT_DIR
, 'python'))
20 from qemu
.machine
import QEMUMachine
22 def is_readable_executable_file(path
):
23 return os
.path
.isfile(path
) and os
.access(path
, os
.R_OK | os
.X_OK
)
26 def pick_default_qemu_bin(arch
=None):
28 Picks the path of a QEMU binary, starting either in the current working
29 directory or in the source tree root directory.
31 :param arch: the arch to use when looking for a QEMU binary (the target
32 will match the arch given). If None (the default), arch
33 will be the current host system arch (as given by
36 :returns: the path to the default QEMU binary or None if one could not
42 # qemu binary path does not match arch for powerpc, handle it
45 qemu_bin_relative_path
= os
.path
.join("%s-softmmu" % arch
,
46 "qemu-system-%s" % arch
)
47 if is_readable_executable_file(qemu_bin_relative_path
):
48 return qemu_bin_relative_path
50 qemu_bin_from_src_dir_path
= os
.path
.join(SRC_ROOT_DIR
,
51 qemu_bin_relative_path
)
52 if is_readable_executable_file(qemu_bin_from_src_dir_path
):
53 return qemu_bin_from_src_dir_path
56 class Test(avocado
.Test
):
59 arches
= self
.tags
.get('arch', [])
64 self
.arch
= self
.params
.get('arch', default
=arch
)
65 default_qemu_bin
= pick_default_qemu_bin(arch
=self
.arch
)
66 self
.qemu_bin
= self
.params
.get('qemu_bin',
67 default
=default_qemu_bin
)
68 if self
.qemu_bin
is None:
69 self
.cancel("No QEMU binary defined or found in the source tree")
71 def _new_vm(self
, *args
):
72 vm
= QEMUMachine(self
.qemu_bin
)
79 return self
.get_vm(name
='default')
81 def get_vm(self
, *args
, name
=None):
83 name
= str(uuid
.uuid4())
84 if self
._vms
.get(name
) is None:
85 self
._vms
[name
] = self
._new
_vm
(*args
)
86 return self
._vms
[name
]
89 for vm
in self
._vms
.values():