From 0ad5c57f6243a7dbfc15af04b87e88f59c65409c Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Thu, 23 Oct 2014 19:17:09 +0200 Subject: Switch integration testing config to a fixture The hack of storing the config on the class is left in; it would be too much work for too little gain at this time. https://fedorahosted.org/freeipa/ticket/4610 Reviewed-By: Tomas Babej --- ipatests/pytest.ini | 1 + ipatests/pytest_plugins/integration.py | 89 ++++++++++++++++++++++++++++++++++ ipatests/test_integration/base.py | 64 ++---------------------- 3 files changed, 94 insertions(+), 60 deletions(-) create mode 100644 ipatests/pytest_plugins/integration.py diff --git a/ipatests/pytest.ini b/ipatests/pytest.ini index 32dc858b0..38b0484c0 100644 --- a/ipatests/pytest.ini +++ b/ipatests/pytest.ini @@ -11,6 +11,7 @@ addopts = --doctest-modules -p ipatests.pytest_plugins.nose_compat -p ipatests.pytest_plugins.declarative -p ipatests.pytest_plugins.ordering + -p ipatests.pytest_plugins.integration # Ignore files for doc tests. # TODO: ideally, these should all use __name__=='__main__' guards --ignore=setup.py diff --git a/ipatests/pytest_plugins/integration.py b/ipatests/pytest_plugins/integration.py new file mode 100644 index 000000000..5a0e46845 --- /dev/null +++ b/ipatests/pytest_plugins/integration.py @@ -0,0 +1,89 @@ +# Authors: +# Petr Viktorin +# +# Copyright (C) 2011 Red Hat +# see file 'COPYING' for use and warranty information +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +"""Pytest plugin for IPA Integration tests""" + +import pytest + +from ipatests.test_integration.config import get_global_config + + +@pytest.yield_fixture(scope='class') +def integration_config(request): + cls = request.cls + + def get_resources(resource_container, resource_str, num_needed): + if len(resource_container) < num_needed: + raise pytest.skip( + 'Not enough %s available (have %s, need %s)' % + (resource_str, len(resource_container), num_needed)) + return resource_container[:num_needed] + + config = get_global_config() + if not config.domains: + raise pytest.skip('Integration testing not configured') + + cls.logs_to_collect = {} + + cls.domain = config.domains[0] + + # Check that we have enough resources available + cls.master = cls.domain.master + cls.replicas = get_resources(cls.domain.replicas, 'replicas', + cls.num_replicas) + cls.clients = get_resources(cls.domain.clients, 'clients', + cls.num_clients) + cls.ad_domains = get_resources(config.ad_domains, 'AD domains', + cls.num_ad_domains) + + # Check that we have all required extra hosts at our disposal + available_extra_roles = [role for domain in cls.get_domains() + for role in domain.extra_roles] + missing_extra_roles = list(set(cls.required_extra_roles) - + set(available_extra_roles)) + + if missing_extra_roles: + raise pytest.skip("Not all required extra hosts available, " + "missing: %s, available: %s" + % (missing_extra_roles, + available_extra_roles)) + + for host in cls.get_all_hosts(): + host.add_log_collector(cls.collect_log) + cls.prepare_host(host) + + try: + cls.install() + except: + cls.uninstall() + raise + + yield config + + for host in cls.get_all_hosts(): + host.remove_log_collector(collect_log) + + try: + cls.uninstall() + finally: + del cls.master + del cls.replicas + del cls.clients + del cls.ad_domains + del cls.domain diff --git a/ipatests/test_integration/base.py b/ipatests/test_integration/base.py index b07eab099..60b0f02a9 100644 --- a/ipatests/test_integration/base.py +++ b/ipatests/test_integration/base.py @@ -19,10 +19,9 @@ """Base class for FreeIPA integration tests""" -import nose +import pytest from ipapython.ipa_log_manager import log_mgr -from ipatests.test_integration.config import get_global_config from ipatests.test_integration import tasks from ipatests.pytest_plugins.ordering import ordered @@ -30,6 +29,7 @@ log = log_mgr.get_logger(__name__) @ordered +@pytest.mark.usefixtures('integration_config') class IntegrationTest(object): num_replicas = 0 num_clients = 0 @@ -39,52 +39,7 @@ class IntegrationTest(object): @classmethod def setup_class(cls): - - def get_resources(resource_container, resource_str, num_needed): - if len(resource_container) < num_needed: - raise nose.SkipTest( - 'Not enough %s available (have %s, need %s)' % - (resource_str, len(resource_container), num_needed)) - return resource_container[:num_needed] - - config = get_global_config() - if not config.domains: - raise nose.SkipTest('Integration testing not configured') - - cls.logs_to_collect = {} - - cls.domain = config.domains[0] - - # Check that we have enough resources available - cls.master = cls.domain.master - cls.replicas = get_resources(cls.domain.replicas, 'replicas', - cls.num_replicas) - cls.clients = get_resources(cls.domain.clients, 'clients', - cls.num_clients) - cls.ad_domains = get_resources(config.ad_domains, 'AD domains', - cls.num_ad_domains) - - # Check that we have all required extra hosts at our disposal - available_extra_roles = [role for domain in cls.get_domains() - for role in domain.extra_roles] - missing_extra_roles = list(set(cls.required_extra_roles) - - set(available_extra_roles)) - - if missing_extra_roles: - raise nose.SkipTest("Not all required extra hosts available, " - "missing: %s, available: %s" - % (missing_extra_roles, - available_extra_roles)) - - for host in cls.get_all_hosts(): - host.add_log_collector(cls.collect_log) - cls.prepare_host(host) - - try: - cls.install() - except: - cls.uninstall() - raise + pass @classmethod def host_by_role(cls, role): @@ -116,20 +71,9 @@ class IntegrationTest(object): else: tasks.install_topo(cls.topology, cls.master, cls.replicas, cls.clients) - @classmethod def teardown_class(cls): - for host in cls.get_all_hosts(): - host.remove_log_collector(cls.collect_log) - - try: - cls.uninstall() - finally: - del cls.master - del cls.replicas - del cls.clients - del cls.ad_domains - del cls.domain + pass @classmethod def uninstall(cls): -- cgit