diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2019-03-28 16:19:59 +0100 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2019-03-28 16:19:59 +0100 |
commit | 6d4d67e773911fd0b1902bc837f46aace0e06151 (patch) | |
tree | c6b04029c6472d28c179e6eba57ec4ce6b272760 | |
parent | 86825701fc869bc15d4b2aa4e0161c83a180246b (diff) | |
download | drminfo-6d4d67e773911fd0b1902bc837f46aace0e06151.tar.gz |
refactor, add edid
-rw-r--r-- | tests/basic.py | 113 | ||||
-rw-r--r-- | tests/drminfo/__init__.py | 139 | ||||
-rw-r--r-- | tests/edid.py | 52 |
3 files changed, 184 insertions, 120 deletions
diff --git a/tests/basic.py b/tests/basic.py index 4666734..38b84c3 100644 --- a/tests/basic.py +++ b/tests/basic.py @@ -4,13 +4,10 @@ # stdlib import os -import time -import logging -import tempfile +from shutil import copyfile # avocado import avocado -from avocado.utils.process import run # my bits from drminfo import TestDRM @@ -22,99 +19,16 @@ class BaseDRM(TestDRM): :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" - files = [ - "/usr/bin/drminfo", - "/usr/bin/drmtest", - "/usr/bin/fbinfo", - "/usr/bin/fbtest", - "/usr/bin/virtiotest", - "/usr/bin/prime", - "/usr/share/fontconfig/conf.avail/59-liberation-mono.conf", - "/usr/share/fonts/liberation/LiberationMono-Regular.ttf", - ] - - cmdline = "dracut" - cmdline += " --force" - cmdline += " --modules \"%s\"" % modules - cmdline += " --drivers \"%s\"" % drivers - for item in files: - cmdline += " --install %s" % item - 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 write_text(self, device, name, content): - outfile = '%s/%s-%s.txt' % (self.outputdir, name, device) - f = open(outfile, "w") - f.write(content) - f.close() - - 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') + def run_one_test(self, vga): + self.boot_gfx_vm(vga); self.console_wait('Entering emergency mode') self.console_run('PS1=---\\\\u---\\\\n') self.console_wait('---root---') self.console_run('drminfo -a') txt = self.console_wait('---root---') - self.write_text(device, "drminfo", txt) + self.write_text(vga, "drminfo", txt) self.console_run('drminfo -F') formats = self.console_wait('---root---') @@ -124,38 +38,41 @@ class BaseDRM(TestDRM): self.console_run('drmtest -a -s 10 -m 640x480 -f %s' % format) self.console_wait('---ok---', '---root---', 'drmtest error (%s)' % format) - self.screen_dump(device, "drm-%s" % format) + self.screen_dump(vga, "drm-%s" % format) self.console_wait('---root---') fcount += 1; if fcount == 0: self.fail("no drm formats"); - if device == 'virtio-vga': + if vga == 'virtio-vga': self.console_run('virtiotest -i') self.console_wait('---root---') self.console_run('virtiotest -a -s 10') self.console_wait('---ok---', '---root---', 'virtiotest error') - self.screen_dump(device, 'virtio') + self.screen_dump(vga, 'virtio') self.console_wait('---root---') self.console_run('fbinfo') txt = self.console_wait('---root---') - self.write_text(device, "fbinfo", txt) + self.write_text(vga, "fbinfo", txt) self.console_run('fbtest -a -s 10') self.console_wait('---ok---', '---root---', 'fbtest error') - self.screen_dump(device, 'fbdev') + self.screen_dump(vga, '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") + @avocado.skipUnless(os.path.exists('/usr/bin/edid-decode'), "no edid-decode") def setUp(self): - version = os.uname()[2] - self.dracut = tempfile.NamedTemporaryFile() - self.create_initrd(self.dracut.name, version) TestDRM.setUp(self); + version = os.uname()[2] + if not os.path.isfile(self.initrd): + self.create_initrd(self.initrd, version) + if not os.path.isfile(self.kernel): + copyfile("/boot/vmlinuz-%s" % version, self.kernel) def test_stdvga(self): self.run_one_test('VGA') diff --git a/tests/drminfo/__init__.py b/tests/drminfo/__init__.py index 629afd5..2ae0413 100644 --- a/tests/drminfo/__init__.py +++ b/tests/drminfo/__init__.py @@ -1,35 +1,130 @@ +# stdlib import os import sys +import time +import logging + +# avocado import avocado +from avocado.utils.process import run +# qemu QEMU_BUILD_DIR = os.environ.get("QEMU_BUILD_DIR"); sys.path.append(os.path.join(QEMU_BUILD_DIR, 'python')) from qemu import QEMUMachine -def find_qemu_binary(): - """ - Picks the path of a QEMU binary, starting either in the current working - directory or in the source tree root directory. - """ - arch = os.uname()[4] - qemu_build = os.path.join(QEMU_BUILD_DIR, - "%s-softmmu" % arch, - "qemu-system-%s" % arch) - qemu_path = [ - qemu_build, - "/usr/local/bin/qemu-system-%s" % arch, - "/usr/bin/qemu-system-%s" % arch, - "/usr/bin/qemu-kvm", - "/usr/libexec/qemu-kvm", - ] - for item in qemu_path: - if os.path.isfile(item): - return item; - return None - class TestDRM(avocado.Test): + def find_qemu_binary(self): + """ + Picks the path of a QEMU binary, starting either in the current working + directory or in the source tree root directory. + """ + arch = os.uname()[4] + qemu_build = os.path.join(QEMU_BUILD_DIR, + "%s-softmmu" % arch, + "qemu-system-%s" % arch) + qemu_path = [ + qemu_build, + "/usr/local/bin/qemu-system-%s" % arch, + "/usr/bin/qemu-system-%s" % arch, + "/usr/bin/qemu-kvm", + "/usr/libexec/qemu-kvm", + ] + for item in qemu_path: + if os.path.isfile(item): + return item; + return None + + def create_initrd(self, outfile, kversion): + modules = "base systemd bash drm" + drivers = "cirrus bochs-drm qxl virtio-pci virtio-gpu vgem vkms" + files = [ + "/usr/bin/drminfo", + "/usr/bin/drmtest", + "/usr/bin/fbinfo", + "/usr/bin/fbtest", + "/usr/bin/virtiotest", + "/usr/bin/prime", + "/usr/bin/edid-decode", + "/usr/share/fontconfig/conf.avail/59-liberation-mono.conf", + "/usr/share/fonts/liberation/LiberationMono-Regular.ttf", + ] + + cmdline = "dracut" + cmdline += " --force" + cmdline += " --modules \"%s\"" % modules + cmdline += " --drivers \"%s\"" % drivers + for item in files: + cmdline += " --install %s" % item + cmdline += " \"%s\" \"%s\"" % (outfile, kversion) + run(cmdline) + + def boot_gfx_vm(self, vga): + 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', vga) + self.vm.add_args('-kernel', self.kernel) + self.vm.add_args('-initrd', self.initrd) + 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') + + 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 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 screen_dump(self, vga, name): + if vga == 'qxl-vga': + self.vm.qmp('screendump', filename = '/dev/null'); + time.sleep(0.1) + outfile = '%s/%s-%s.ppm' % (self.outputdir, name, vga) + self.vm.qmp('screendump', filename = outfile); + self.wconsole.write('\n') + self.wconsole.flush() + + def write_text(self, vga, name, content): + outfile = '%s/%s-%s.txt' % (self.outputdir, name, vga) + f = open(outfile, "w") + f.write(content) + f.close() + def setUp(self): - self.vm = QEMUMachine(find_qemu_binary()) + self.jobdir = os.path.dirname(self.workdir) + self.kernel = os.path.join(self.jobdir, "drminfo.kernel"); + self.initrd = os.path.join(self.jobdir, "drminfo.initrd"); + self.vm = QEMUMachine(self.find_qemu_binary()) def tearDown(self): self.vm.shutdown() diff --git a/tests/edid.py b/tests/edid.py new file mode 100644 index 0000000..d206871 --- /dev/null +++ b/tests/edid.py @@ -0,0 +1,52 @@ +# +# edid tests +# + +# stdlib +import os +import time +from shutil import copyfile + +# avocado +import avocado + +# my bits +from drminfo import TestDRM + +class EDID(TestDRM): + """ + basic qemu display device tests + + :avocado: tags=x86_64 + """ + + def run_one_test(self, vga): + + self.boot_gfx_vm(vga); + self.console_wait('Entering emergency mode') + self.console_run('PS1=---\\\\u---\\\\n') + self.console_wait('---root---') + + self.console_run('edid-decode /sys/class/drm/card0-Virtual-1/edid') + edid = self.console_wait('---root---') + vganame = vga.split(",")[0]; + self.write_text(vganame, "edid", edid) + if edid.find("QEMU Monitor") < 0: + self.fail("edid not valid") + + @avocado.skipUnless(os.path.exists('/usr/bin/dracut'), "no dracut") + @avocado.skipUnless(os.path.exists('/usr/bin/drminfo'), "no drminfo") + @avocado.skipUnless(os.path.exists('/usr/bin/edid-decode'), "no edid-decode") + def setUp(self): + TestDRM.setUp(self); + version = os.uname()[2] + if not os.path.isfile(self.initrd): + self.create_initrd(self.initrd, version) + if not os.path.isfile(self.kernel): + copyfile("/boot/vmlinuz-%s" % version, self.kernel) + + def test_stdvga(self): + self.run_one_test('VGA,edid=on') + + def test_virtio(self): + self.run_one_test('virtio-vga,edid=on') |