From nobody Fri May 3 04:48:33 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1521742971738897.6046256683419; Thu, 22 Mar 2018 11:22:51 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 008BEC036740; Thu, 22 Mar 2018 18:22:50 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 1106A17484; Thu, 22 Mar 2018 18:22:49 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id C6B6E4CA9A; Thu, 22 Mar 2018 18:22:46 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w2MIMiwq013161 for ; Thu, 22 Mar 2018 14:22:45 -0400 Received: by smtp.corp.redhat.com (Postfix) id CDAD76F9E2; Thu, 22 Mar 2018 18:22:44 +0000 (UTC) Received: from katerina.brq.redhat.com (unknown [10.40.205.26]) by smtp.corp.redhat.com (Postfix) with ESMTP id 55EAA8442D for ; Thu, 22 Mar 2018 18:22:42 +0000 (UTC) From: Katerina Koukiou To: libvir-list@redhat.com Date: Thu, 22 Mar 2018 19:22:40 +0100 Message-Id: <20180322182240.5408-1-kkoukiou@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-loop: libvir-list@redhat.com Subject: [libvirt] [dbus PATCH v2] Convert testsuite from unittest to pytest X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Thu, 22 Mar 2018 18:22:50 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Move to pytest to take advantage of: * tests parametrization * pdb support * more compact tests - not forcing large test classes Signed-off-by: Katerina Koukiou --- HACKING.md | 2 +- test/Makefile.am | 7 ++++--- test/conftest.py | 15 +++++++++++++++ test/libvirttest.py | 49 +++++++++++++++++++++++++++++-------------------- test/test_connect.py | 33 +++++++++++++++++---------------- test/test_domain.py | 37 +++++++++++++++++++------------------ test/travis-run | 2 +- 7 files changed, 86 insertions(+), 59 deletions(-) create mode 100644 test/conftest.py diff --git a/HACKING.md b/HACKING.md index 75aa6d0..bb22fd6 100644 --- a/HACKING.md +++ b/HACKING.md @@ -35,7 +35,7 @@ Running from git repository make check ``` =20 - The test tool requires python3 and python3-dbus. + The test tool requires python3, python3-pytest and python3-dbus. =20 =20 * To run libvirt-dbus directly from the build dir without installing it diff --git a/test/Makefile.am b/test/Makefile.am index d3997f3..acb2d33 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,17 +1,18 @@ test_helpers =3D \ - libvirttest.py + libvirttest.py \ + conftest.py =20 test_programs =3D \ test_connect.py \ test_domain.py =20 -TESTS =3D $(test_programs) - EXTRA_DIST =3D \ $(test_helpers) \ $(test_programs) \ travis-run =20 +TESTS =3D $(test_programs) + TESTS_ENVIRONMENT =3D \ abs_top_builddir=3D$(abs_top_builddir) \ VIRT_DBUS_INTERFACES_DIR=3D$(abs_top_srcdir)/data diff --git a/test/conftest.py b/test/conftest.py new file mode 100644 index 0000000..3bce7b7 --- /dev/null +++ b/test/conftest.py @@ -0,0 +1,15 @@ +import os +import pytest +import subprocess + + +@pytest.fixture(scope=3D"session", autouse=3DTrue) +def dbus_daemon_session(): + """Fixture to start D-Bus message bus session daemon for use in the wh= ole test suite. + """ + dbus_daemon =3D subprocess.Popen(['dbus-daemon', '--session', '--print= -address'], + stdout=3Dsubprocess.PIPE, universal_new= lines=3DTrue) + os.environ['DBUS_SESSION_BUS_ADDRESS'] =3D dbus_daemon.stdout.readline= ().strip() + yield + dbus_daemon.terminate() + dbus_daemon.wait(timeout=3D10) diff --git a/test/libvirttest.py b/test/libvirttest.py index 6a00aea..23fe536 100644 --- a/test/libvirttest.py +++ b/test/libvirttest.py @@ -1,34 +1,37 @@ -#!/usr/bin/python3 - from dbus.mainloop.glib import DBusGMainLoop from gi.repository import GLib import dbus import os +import pytest import subprocess +import sys import time -import unittest + =20 root =3D os.environ.get('abs_top_builddir', os.path.dirname(os.path.dirnam= e(__file__))) exe =3D os.path.join(root, 'src', 'libvirt-dbus') =20 DBusGMainLoop(set_as_default=3DTrue) =20 -class TestCase(unittest.TestCase): - @classmethod - def setUpClass(cls): - cls.bus =3D subprocess.Popen(['dbus-daemon', '--session', '--print= -address'], - stdout=3Dsubprocess.PIPE, universal_newlines=3DTrue) - os.environ['DBUS_SESSION_BUS_ADDRESS'] =3D cls.bus.stdout.readline= ().strip() =20 - @classmethod - def tearDownClass(cls): - cls.bus.terminate() - cls.bus.wait(timeout=3D10) +def run(): + exit(pytest.main(sys.argv)) =20 - def setUp(self): - os.environ['LIBVIRT_DEBUG'] =3D '3' =20 - self.daemon =3D subprocess.Popen([exe]) +class BaseTestClass(): + """ Base test class for whole test suite + """ + connect =3D None + bus =3D None + libvirt_dbus =3D None + loop =3D False + + @pytest.fixture(autouse=3DTrue) + def libvirt_dbus_setup(self, request): + """Start libvirt-dbus for each test function + """ + os.environ['LIBVIRT_DEBUG'] =3D '3' + self.libvirt_dbus =3D subprocess.Popen([exe]) self.bus =3D dbus.SessionBus() =20 for i in range(10): @@ -41,12 +44,18 @@ class TestCase(unittest.TestCase): obj =3D self.bus.get_object('org.libvirt', '/org/libvirt/Test') self.connect =3D dbus.Interface(obj, 'org.libvirt.Connect') =20 - def tearDown(self): - self.daemon.terminate() - self.daemon.wait(timeout=3D10) + @pytest.fixture(autouse=3DTrue) + def libvirt_dbus_teardown(self): + """Terminate libvirt-dbus at the teardown of each test + """ + yield + self.libvirt_dbus.terminate() + self.libvirt_dbus.wait(timeout=3D10) =20 def main_loop(self): - self.assertFalse(getattr(self, 'loop', False)) + """Initializes the mainloop + """ + assert getattr(self, 'loop', False) is False =20 def timeout(): self.loop.quit() diff --git a/test/test_connect.py b/test/test_connect.py index 4ec3fe0..a52140c 100755 --- a/test/test_connect.py +++ b/test/test_connect.py @@ -2,9 +2,10 @@ =20 import dbus import libvirttest -import unittest =20 -minimal_xml =3D ''' + +class TestConnect(libvirttest.BaseTestClass): + minimal_xml =3D ''' foo 1024 @@ -12,16 +13,15 @@ minimal_xml =3D ''' hvm -''' + ''' =20 -class TestConnect(libvirttest.TestCase): def test_list_domains(self): domains =3D self.connect.ListDomains(0) - self.assertEqual(type(domains), dbus.Array) - self.assertEqual(len(domains), 1) + assert isinstance(domains, dbus.Array) + assert len(domains) =3D=3D 1 =20 for path in domains: - self.assertEqual(type(path), dbus.ObjectPath) + assert isinstance(path, dbus.ObjectPath) domain =3D self.bus.get_object('org.libvirt', path) =20 # ensure the path exists by calling Introspect on it @@ -29,29 +29,30 @@ class TestConnect(libvirttest.TestCase): =20 def test_create(self): def domain_started(name, path): - self.assertEqual(name, 'foo') - self.assertEqual(type(path), dbus.ObjectPath) + assert name =3D=3D 'foo' + assert isinstance(path, dbus.ObjectPath) self.loop.quit() =20 self.connect.connect_to_signal('DomainStarted', domain_started) =20 - path =3D self.connect.CreateXML(minimal_xml, 0) - self.assertEqual(type(path), dbus.ObjectPath) + path =3D self.connect.CreateXML(self.minimal_xml, 0) + assert isinstance(path, dbus.ObjectPath) =20 self.main_loop() =20 def test_define(self): def domain_defined(name, path): - self.assertEqual(name, 'foo') - self.assertEqual(type(path), dbus.ObjectPath) + assert name =3D=3D 'foo' + assert isinstance(path, dbus.ObjectPath) self.loop.quit() =20 self.connect.connect_to_signal('DomainDefined', domain_defined) =20 - path =3D self.connect.DefineXML(minimal_xml) - self.assertEqual(type(path), dbus.ObjectPath) + path =3D self.connect.DefineXML(self.minimal_xml) + assert isinstance(path, dbus.ObjectPath) =20 self.main_loop() =20 + if __name__ =3D=3D '__main__': - unittest.main(verbosity=3D2) + libvirttest.run() diff --git a/test/test_domain.py b/test/test_domain.py index b1ab7a5..1bf9c1b 100755 --- a/test/test_domain.py +++ b/test/test_domain.py @@ -2,9 +2,9 @@ =20 import dbus import libvirttest -import unittest =20 -class TestDomain(libvirttest.TestCase): + +class TestDomain(libvirttest.BaseTestClass): def domain(self): path =3D self.connect.ListDomains(0)[0] obj =3D self.bus.get_object('org.libvirt', path) @@ -14,21 +14,21 @@ class TestDomain(libvirttest.TestCase): obj, domain =3D self.domain() =20 props =3D obj.GetAll('org.libvirt.Domain', dbus_interface=3Ddbus.P= ROPERTIES_IFACE) - self.assertEqual(type(props['Name']), dbus.String) - self.assertEqual(type(props['UUID']), dbus.String) - self.assertEqual(type(props['Id']), dbus.UInt32) - self.assertEqual(type(props['Vcpus']), dbus.UInt32) - self.assertEqual(type(props['OSType']), dbus.String) - self.assertEqual(type(props['Active']), dbus.Boolean) - self.assertEqual(type(props['Persistent']), dbus.Boolean) - self.assertEqual(type(props['State']), dbus.String) - self.assertEqual(type(props['Autostart']), dbus.Boolean) + assert isinstance(props['Name'], dbus.String) + assert isinstance(props['UUID'], dbus.String) + assert isinstance(props['Id'], dbus.UInt32) + assert isinstance(props['Vcpus'], dbus.UInt32) + assert isinstance(props['OSType'], dbus.String) + assert isinstance(props['Active'], dbus.Boolean) + assert isinstance(props['Persistent'], dbus.Boolean) + assert isinstance(props['State'], dbus.String) + assert isinstance(props['Autostart'], dbus.Boolean) =20 # Call all methods except Reset and GetStats, because the test bac= kend # doesn't support those =20 xml =3D domain.GetXMLDesc(0) - self.assertEqual(type(xml), dbus.String) + assert isinstance(xml, dbus.String) =20 domain.Reboot(0) domain.Shutdown() @@ -38,8 +38,8 @@ class TestDomain(libvirttest.TestCase): =20 def test_shutdown(self): def domain_stopped(name, path): - self.assertEqual(name, 'test') - self.assertEqual(type(path), dbus.ObjectPath) + assert name =3D=3D 'test' + assert isinstance(path, dbus.ObjectPath) self.loop.quit() =20 self.connect.connect_to_signal('DomainStopped', domain_stopped) @@ -48,14 +48,14 @@ class TestDomain(libvirttest.TestCase): domain.Shutdown() =20 state =3D obj.Get('org.libvirt.Domain', 'State', dbus_interface=3D= dbus.PROPERTIES_IFACE) - self.assertEqual(state, 'shutoff') + assert state =3D=3D 'shutoff' =20 self.main_loop() =20 def test_undefine(self): def domain_undefined(name, path): - self.assertEqual(name, 'test') - self.assertEqual(type(path), dbus.ObjectPath) + assert name =3D=3D 'test' + assert isinstance(path, dbus.ObjectPath) self.loop.quit() =20 self.connect.connect_to_signal('DomainUndefined', domain_undefined) @@ -66,5 +66,6 @@ class TestDomain(libvirttest.TestCase): =20 self.main_loop() =20 + if __name__ =3D=3D '__main__': - unittest.main(verbosity=3D2) + libvirttest.run() diff --git a/test/travis-run b/test/travis-run index 7577253..80b6dec 100755 --- a/test/travis-run +++ b/test/travis-run @@ -22,7 +22,7 @@ sudo chroot "$CHROOT" << EOF set -ex # install build deps apt-get update -apt-get install -y dh-autoreconf pkg-config libvirt-dev libglib2.0-dev lib= tool python3-gi python3-dbus dbus +apt-get install -y dh-autoreconf pkg-config libvirt-dev libglib2.0-dev lib= tool python3-gi python3-dbus python3-pytest dbus =20 # run build and tests as user chown -R buildd:buildd /build --=20 2.15.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list