diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2019-03-28 11:11:02 +0100 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2019-03-28 11:11:02 +0100 |
commit | ecf497920d1f72949d093fa29fb1527bebe6a2e4 (patch) | |
tree | 71a1a472e7743aceb3960f4524a9057fde8b88b8 | |
parent | f4d987151869df14886f1df3e6e3161751776853 (diff) | |
download | drminfo-ecf497920d1f72949d093fa29fb1527bebe6a2e4.tar.gz |
add avocado tests
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | drminfo.spec | 3 | ||||
-rw-r--r-- | tests/README | 6 | ||||
-rw-r--r-- | tests/basic.py | 159 | ||||
-rw-r--r-- | tests/drminfo/__init__.py | 15 |
5 files changed, 185 insertions, 0 deletions
@@ -1,3 +1,5 @@ build-meson-* *.o !.tito/ +*.pyc +__pycache__ diff --git a/drminfo.spec b/drminfo.spec index e3b9fe7..e5ebe5a 100644 --- a/drminfo.spec +++ b/drminfo.spec @@ -33,6 +33,8 @@ ninja-build -C build-rpm %install export DESTDIR=%{buildroot} ninja-build -C build-rpm install +mkdir -p %{buildroot}%{_datadir} +cp -a tests %{buildroot}%{_datadir} %files %{_bindir}/drm* @@ -40,3 +42,4 @@ ninja-build -C build-rpm install %{_bindir}/virtiotest %{_bindir}/fb* %{_mandir}/man1/drm*.1* +%{_datadir}/tests diff --git a/tests/README b/tests/README new file mode 100644 index 0000000..0ad5ccb --- /dev/null +++ b/tests/README @@ -0,0 +1,6 @@ + +avocado framework tests for qemu display devices + +usage: + export QEMU_BUILD_DIR=/path/to/qemu/build/tree + avocado run . diff --git a/tests/basic.py b/tests/basic.py new file mode 100644 index 0000000..a7f5ca1 --- /dev/null +++ b/tests/basic.py @@ -0,0 +1,159 @@ +# +# basic qemu display device tests +# + +# stdlib +import os +import time +import logging +import tempfile + +# avocado +import avocado +from avocado.utils.process import run + +# my bits +from drminfo import TestDRM + +class BaseDRM(TestDRM): + """ + basic qemu display device tests + + :avocado: tags=x86_64 + """ + + def create_initrd(self, outfile, kversion): + modules = "base systemd bash drm" + drivers = "cirrus bochs-drm qxl virtio-pci virtio-gpu vgem vkms" + + cmdline = "dracut" + cmdline += " --force" + cmdline += " --modules \"%s\"" % modules + cmdline += " --drivers \"%s\"" % drivers + cmdline += " --install /usr/bin/drminfo" + cmdline += " --install /usr/bin/drmtest" + cmdline += " --install /usr/bin/fbinfo" + cmdline += " --install /usr/bin/fbtest" + cmdline += " --install /usr/bin/virtiotest" + cmdline += " --install /usr/bin/prime" + cmdline += " --install /usr/share/fontconfig/conf.avail/59-liberation-mono.conf" + cmdline += " --install /usr/share/fonts/liberation/LiberationMono-Regular.ttf" + cmdline += " \"%s\" \"%s\"" % (outfile, kversion) + run(cmdline) + + def console_wait(self, good, bad = None, errmsg = None): + output = "" + counter = 1 + while True: + msg = self.rconsole.readline() + self.lconsole.debug("%3d: %s" % (counter, msg.rstrip())) + counter += 1 + if good in msg: + break + if not bad is None: + if bad in msg: + if errmsg is None: + errmsg = "unexpected output (%s)" % bad + self.fail(errmsg) + if 'Kernel panic - not syncing' in msg: + self.fail("kernel panic") + output += msg + return output + + def console_run(self, command): + self.lcommand.debug(command) + self.wconsole.write(command) + self.wconsole.write('\n') + self.wconsole.flush() + self.rconsole.readline() # newline + self.rconsole.readline() # command line echo + + def screen_dump(self, device, name): + if device == 'qxl-vga': + self.vm.qmp('screendump', filename = '/dev/null'); + time.sleep(1) + outfile = '%s/%s-%s.ppm' % (self.outputdir, name, device) + self.vm.qmp('screendump', filename = outfile); + self.wconsole.write('\n') + self.wconsole.flush() + + def run_one_test(self, device): + version = os.uname()[2] + kernel = "/boot/vmlinuz-%s" % version + append = "console=ttyS0" + + self.vm.set_machine('pc') + self.vm.set_console() + self.vm.add_args('-enable-kvm') + self.vm.add_args('-m', '1G') + self.vm.add_args('-vga', 'none') + self.vm.add_args('-device', device) + self.vm.add_args('-kernel', kernel) + self.vm.add_args('-initrd', self.dracut.name) + self.vm.add_args('-append', append) + self.vm.launch() + + self.rconsole = self.vm.console_socket.makefile('r') + self.wconsole = self.vm.console_socket.makefile('w') + self.lconsole = logging.getLogger('console') + self.lcommand = logging.getLogger('command') + + self.console_wait('Entering emergency mode') + + self.console_run('PS1=---\\\\u---\\\\n') + self.console_wait('---root---') + + self.console_run('drminfo -a') + self.console_wait('---root---') + + self.console_run('drminfo -F') + formats = self.console_wait('---root---') + + fcount = 0; + for format in formats.split(): + self.console_run('drmtest -a -s 10 -m 640x480 -f %s' % format) + self.console_wait('---ok---', '---root---', + 'drmtest failed (%s)' % format) + self.screen_dump(device, "drm-%s" % format) + self.console_wait('---root---') + fcount += 1; + + if fcount == 0: + self.fail("no drm formats"); + + if device == 'virtio-vga': + self.console_run('virtiotest -i') + self.console_wait('---root---') + + self.console_run('virtiotest -a -s 10') + self.console_wait('---ok---', '---root---', 'virtiotest failed') + self.screen_dump(device, 'virtio') + self.console_wait('---root---') + + self.console_run('fbinfo -a') + self.console_wait('---root---') + + self.console_run('fbtest -a -s 10') + self.console_wait('---ok---', '---root---', 'fbtest failed') + self.screen_dump(device, 'fbdev') + self.console_wait('---root---') + + @avocado.skipUnless(os.path.exists('/usr/bin/dracut'), "no dracut") + @avocado.skipUnless(os.path.exists('/usr/bin/drminfo'), "no drminfo") + def setUp(self): + version = os.uname()[2] + self.dracut = tempfile.NamedTemporaryFile() + self.create_initrd(self.dracut.name, version) + TestDRM.setUp(self); + + def test_stdvga(self): + self.run_one_test('VGA') + + def test_cirrus(self): + self.run_one_test('cirrus-vga') + + def test_qxl(self): + self.run_one_test('qxl-vga') + + def test_virtio(self): + self.run_one_test('virtio-vga') diff --git a/tests/drminfo/__init__.py b/tests/drminfo/__init__.py new file mode 100644 index 0000000..015cd03 --- /dev/null +++ b/tests/drminfo/__init__.py @@ -0,0 +1,15 @@ +import os +import sys +import avocado + +QEMU_BUILD_DIR = os.environ.get("QEMU_BUILD_DIR"); +sys.path.append(os.path.join(QEMU_BUILD_DIR, 'python')) +from qemu import QEMUMachine + +class TestDRM(avocado.Test): + def setUp(self): + self.vm = QEMUMachine("/usr/local/bin/qemu-system-x86_64") + + def tearDown(self): + self.vm.shutdown() + |