From f410cf54e1d1e7a633a7a7aeae0eba2a303d7f8c Mon Sep 17 00:00:00 2001 From: Dan Callaghan Date: Mar 29 2018 06:08:30 +0000 Subject: tests: run servers as subprocesses instead of as threads This fixes the tests, which were broken since WaiverDB no longer works with SQLite, it requires Postgres. This also avoids the issue of WaiverDB wanting Python 3 but ResultsDB wanting Python 2. And various other edge cases with running all three applications in the same address space. Plus it makes the tests more realistic. --- diff --git a/README.md b/README.md index 808832d..751191d 100644 --- a/README.md +++ b/README.md @@ -52,10 +52,14 @@ There are also functional tests in the `functional-tests` directory. The functional tests will start their own copy of the [ResultsDB](https://pagure.io/taskotron/resultsdb), [WaiverDB](https://pagure.io/waiverdb), and Greenwave applications and then -send HTTP requests to them. If you have a git checkout of all three projects, -you can run the functional tests like this (adjust the paths as appropriate): +send HTTP requests to them. You can run the functional tests like this: - $ TEST=true PYTHONPATH=../resultsdb:../waiverdb:. py.test functional-tests/ + $ TEST=true PYTHONPATH=. py.test functional-tests/ + +The functional tests assume you have ResultsDB and WaiverDB git checkouts in +`../resultsdb` and `../waiverdb` respectively. You can tell it to find them in +a different location by passing `RESULTSDB` or `WAIVERDB` environment +variables. ## Building the docs diff --git a/functional-tests/conftest.py b/functional-tests/conftest.py index e30a77d..3d3f648 100644 --- a/functional-tests/conftest.py +++ b/functional-tests/conftest.py @@ -1,108 +1,169 @@ # SPDX-License-Identifier: GPL-2.0+ import os +import time +import textwrap import itertools import json -import threading +import logging +import subprocess import socket -import wsgiref.simple_server import pytest import requests +from sqlalchemy import create_engine -import waiverdb.config -import waiverdb.app -import greenwave.app_factory + +log = logging.getLogger(__name__) # It's all local, and so should be fast enough. TEST_HTTP_TIMEOUT = int(os.environ.get('TEST_HTTP_TIMEOUT', 2)) -class WSGIServerThread(threading.Thread): - - def __init__(self, application, init_func, port): - self._server = wsgiref.simple_server.make_server('127.0.0.1', port, application) - self.init_func = init_func - name = '{}-server-thread'.format(application.name) - super(WSGIServerThread, self).__init__(name=name) - - def run(self): - # We call the init_func *inside* our new thread, because when the - # application is using a SQLite in-memory database with SQLAlchemy - # each thread gets its own separate db. So initialising the database in - # the main thread would not work. - self.init_func() - self._server.serve_forever() - - def stop(self): - self._server.shutdown() - self._server.socket.shutdown(socket.SHUT_RD) - self._server.server_close() - self.join() - - @property - def url(self): - host, port = self._server.server_address - return 'http://{}:{}/'.format(host, port) - - -@pytest.fixture(scope='session') -def resultsdb_server(request): - # Ideally ResultsDB would let us configure the app programmatically, - # instead of doing everything globally at import time... - os.environ['TEST'] = 'true' - import resultsdb - import resultsdb.cli - del os.environ['TEST'] - app = resultsdb.app - server = WSGIServerThread( - app, - init_func=lambda: resultsdb.cli.initialize_db(destructive=True), - port=5001) - server.start() - request.addfinalizer(server.stop) - return server - - -@pytest.fixture(scope='session') -def waiverdb_server(request): - class WaiverdbTestingConfig(waiverdb.config.TestingConfig): - AUTH_METHOD = 'dummy' - # As a workaround for https://github.com/mitsuhiko/flask-sqlalchemy/pull/364 - # WaiverDB patches flask_sqlalchemy.SignallingSession globally, which - # messes up ResultsDB. So let's just turn off the messaging support in - # WaiverDB entirely for now. - MESSAGE_BUS_PUBLISH = False - app = waiverdb.app.create_app(WaiverdbTestingConfig) - server = WSGIServerThread( - app, - init_func=lambda: waiverdb.app.init_db(app), - port=5004) - server.start() - request.addfinalizer(server.stop) - return server - - -@pytest.fixture(scope='session') -def greenwave_server(request): - app = greenwave.app_factory.create_app('greenwave.config.TestingConfig') - server = WSGIServerThread(app, init_func=lambda: None, port=app.config['PORT']) - server.start() - request.addfinalizer(server.stop) - return server +def drop_and_create_database(dbname): + """ + Drops (if exists) and re-creates the given database on the local Postgres instance. + """ + engine = create_engine('postgresql+psycopg2:///template1') + with engine.connect() as connection: + connection.execution_options(isolation_level='AUTOCOMMIT') + connection.execute('DROP DATABASE IF EXISTS {}'.format(dbname)) + connection.execute('CREATE DATABASE {}'.format(dbname)) + engine.dispose() +def wait_for_listen(port): + """ + Waits until something is listening on the given TCP port. + """ + for attempt in range(5): + try: + s = socket.create_connection(('127.0.0.1', port), timeout=1) + s.close() + return + except socket.error: + time.sleep(1) + raise RuntimeError('Gave up waiting for port %s' % port) + + +@pytest.yield_fixture(scope='session') +def resultsdb_server(tmpdir_factory): + if 'RESULTSDB_TEST_URL' in os.environ: + yield os.environ['RESULTSDB_TEST_URL'] + else: + # Start ResultsDB as a subprocess + resultsdb_source = os.environ.get('RESULTSDB', '../resultsdb') + if not os.path.isdir(resultsdb_source): + raise RuntimeError('ResultsDB source tree %s does not exist' % resultsdb_source) + dbname = 'resultsdb_for_greenwave_functest' + # Write out a config + settings_file = tmpdir_factory.mktemp('resultsdb').join('settings.py') + settings_file.write(textwrap.dedent("""\ + PORT = 5001 + SQLALCHEMY_DATABASE_URI = 'postgresql+psycopg2:///%s' + DEBUG = False + """ % dbname)) + env = dict(os.environ, + PYTHONPATH=resultsdb_source, + TEST='true', + RESULTSDB_CONFIG=settings_file.strpath) + # Create and populate the database + drop_and_create_database(dbname) + subprocess.check_call(['python', + os.path.join(resultsdb_source, 'run_cli.py'), + 'init_db'], + env=env) + # Start server + p = subprocess.Popen(['python', + os.path.join(resultsdb_source, 'runapp.py')], + env=env) + log.debug('Started resultsdb server as pid %s', p.pid) + wait_for_listen(5001) + yield 'http://localhost:5001/' + log.debug('Terminating resultsdb server pid %s', p.pid) + p.terminate() + p.wait() + + +@pytest.yield_fixture(scope='session') +def waiverdb_server(tmpdir_factory): + if 'WAIVERDB_TEST_URL' in os.environ: + yield os.environ['WAIVERDB_TEST_URL'] + else: + # Start WaiverDB as a subprocess + waiverdb_source = os.environ.get('WAIVERDB', '../waiverdb') + if not os.path.isdir(waiverdb_source): + raise RuntimeError('WaiverDB source tree %s does not exist' % waiverdb_source) + dbname = 'waiverdb_for_greenwave_functest' + # Write out a config + settings_file = tmpdir_factory.mktemp('waiverdb').join('settings.py') + settings_file.write(textwrap.dedent("""\ + AUTH_METHOD = 'dummy' + DATABASE_URI = 'postgresql+psycopg2:///%s' + """ % dbname)) + env = dict(os.environ, + PYTHONPATH=waiverdb_source, + TEST='true', + WAIVERDB_CONFIG=settings_file.strpath) + # Create and populate the database + drop_and_create_database(dbname) + subprocess.check_call(['python3', + os.path.join(waiverdb_source, 'waiverdb', 'manage.py'), + 'db', 'upgrade'], + env=env) + # Start server + p = subprocess.Popen(['python3-gunicorn', + '--bind=127.0.0.1:5004', + '--access-logfile=-', + 'waiverdb.wsgi:app'], + env=env) + log.debug('Started waiverdb server as pid %s', p.pid) + wait_for_listen(5004) + yield 'http://localhost:5004/' + log.debug('Terminating waiverdb server pid %s', p.pid) + p.terminate() + p.wait() + + +# This is only a fixture because some tests want to point the fedmsg consumers +# at the same cache that the server process is using. +# I would like to refactor those tests to send real messages to real consumers, +# so this becomes unnecessary. @pytest.fixture(scope='session') -def cached_greenwave_server(request): - app = greenwave.app_factory.create_app('greenwave.config.CachedTestingConfig') - server = WSGIServerThread(app, init_func=lambda: None, port=app.config['PORT']) - server.start() - request.addfinalizer(server.stop) - try: - yield server - finally: - # Remove the cache file so the next test can start afresh. - os.remove(app.config['CACHE']['arguments']['filename']) +def greenwave_cache_config(tmpdir_factory): + cache_file = tmpdir_factory.mktemp('greenwave-cache').join('cache.dbm') + return { + 'backend': 'dogpile.cache.dbm', + 'expiration_time': 300, + 'arguments': {'filename': cache_file.strpath}, + } + + +@pytest.yield_fixture(scope='session') +def greenwave_server(tmpdir_factory, resultsdb_server, waiverdb_server, greenwave_cache_config): + if 'GREENWAVE_TEST_URL' in os.environ: + yield os.environ['GREENWAVE_TEST_URL'] + else: + # Start Greenwave as a subprocess + settings_file = tmpdir_factory.mktemp('greenwave').join('settings.py') + settings_file.write(textwrap.dedent("""\ + CACHE = %r + """ % greenwave_cache_config)) + env = dict(os.environ, + PYTHONPATH='.', + TEST='true', + GREENWAVE_CONFIG=settings_file.strpath) + p = subprocess.Popen(['gunicorn', + '--bind=127.0.0.1:5005', + '--access-logfile=-', + 'greenwave.wsgi:app'], + env=env) + log.debug('Started greenwave server as pid %s', p.pid) + wait_for_listen(5005) + yield 'http://localhost:5005/' + log.debug('Terminating greenwave server pid %s', p.pid) + p.terminate() + p.wait() @pytest.fixture(scope='session') @@ -183,4 +244,4 @@ class TestDataBuilder(object): @pytest.fixture(scope='session') def testdatabuilder(requests_session, resultsdb_server, waiverdb_server): - return TestDataBuilder(requests_session, resultsdb_server.url, waiverdb_server.url) + return TestDataBuilder(requests_session, resultsdb_server, waiverdb_server) diff --git a/functional-tests/consumers/test_resultsdb.py b/functional-tests/consumers/test_resultsdb.py index fb09157..fc8f9cb 100644 --- a/functional-tests/consumers/test_resultsdb.py +++ b/functional-tests/consumers/test_resultsdb.py @@ -4,7 +4,6 @@ import json import mock import pprint -from greenwave.config import CachedTestingConfig from greenwave.consumers import resultsdb @@ -14,7 +13,7 @@ def test_consume_new_result( mock_fedmsg, load_config, requests_session, greenwave_server, testdatabuilder, monkeypatch): monkeypatch.setenv('TEST', 'true') - load_config.return_value = {'greenwave_api_url': greenwave_server.url + 'api/v1.0'} + load_config.return_value = {'greenwave_api_url': greenwave_server + 'api/v1.0'} nvr = testdatabuilder.unique_nvr() result = testdatabuilder.create_result(item=nvr, testcase_name='dist.rpmdeplint', @@ -52,7 +51,7 @@ def test_consume_new_result( 'subject': [{'item': nvr, 'type': 'koji_build'}], 'ignore_result': [result['id']] } - r = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 200 @@ -102,7 +101,7 @@ def test_consume_new_result( 'subject': [{'item': nvr, 'type': 'koji_build'}], 'ignore_result': [result['id']] } - r = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 200 @@ -131,7 +130,7 @@ def test_no_message_for_unchanged_decision( mock_fedmsg, load_config, requests_session, greenwave_server, testdatabuilder, monkeypatch): monkeypatch.setenv('TEST', 'true') - load_config.return_value = {'greenwave_api_url': greenwave_server.url + 'api/v1.0'} + load_config.return_value = {'greenwave_api_url': greenwave_server + 'api/v1.0'} nvr = testdatabuilder.unique_nvr() # One result gets the decision in a certain state. testdatabuilder.create_result(item=nvr, @@ -175,11 +174,11 @@ def test_no_message_for_unchanged_decision( @mock.patch('greenwave.consumers.resultsdb.fedmsg.config.load_config') @mock.patch('greenwave.consumers.resultsdb.fedmsg.publish') def test_invalidate_new_result_with_mocked_cache( - mock_fedmsg, load_config, requests_session, cached_greenwave_server, + mock_fedmsg, load_config, requests_session, greenwave_server, testdatabuilder, monkeypatch): """ Consume a result, and ensure that `delete` is called. """ monkeypatch.setenv('TEST', 'true') - load_config.return_value = {'greenwave_api_url': cached_greenwave_server.url + 'api/v1.0'} + load_config.return_value = {'greenwave_api_url': greenwave_server + 'api/v1.0'} nvr = testdatabuilder.unique_nvr() result = testdatabuilder.create_result( item=nvr, testcase_name='dist.rpmdeplint', outcome='PASSED') @@ -221,10 +220,10 @@ def test_invalidate_new_result_with_mocked_cache( @mock.patch('greenwave.consumers.resultsdb.fedmsg.config.load_config') @mock.patch('greenwave.consumers.resultsdb.fedmsg.publish') def test_invalidate_new_result_with_real_cache( - mock_fedmsg, load_config, requests_session, cached_greenwave_server, - testdatabuilder, monkeypatch): + mock_fedmsg, load_config, requests_session, greenwave_server, + testdatabuilder, monkeypatch, greenwave_cache_config): monkeypatch.setenv('TEST', 'true') - load_config.return_value = {'greenwave_api_url': cached_greenwave_server.url + 'api/v1.0'} + load_config.return_value = {'greenwave_api_url': greenwave_server + 'api/v1.0'} nvr = testdatabuilder.unique_nvr() for testcase_name in ['dist.rpmdeplint', 'dist.upgradepath', 'dist.abicheck']: testdatabuilder.create_result( @@ -236,7 +235,7 @@ def test_invalidate_new_result_with_real_cache( 'product_version': 'fedora-26', 'subject': [{'item': nvr, 'type': 'koji_build'}], } - r = requests_session.post(cached_greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(query)) assert r.status_code == 200 @@ -248,7 +247,7 @@ def test_invalidate_new_result_with_real_cache( # even though the new result fails, our decision still passes (bad) testdatabuilder.create_result( item=nvr, testcase_name='dist.abicheck', outcome='FAILED') - r = requests_session.post(cached_greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(query)) assert r.status_code == 200 @@ -277,7 +276,7 @@ def test_invalidate_new_result_with_real_cache( hub.config = { 'environment': 'environment', 'topic_prefix': 'topic_prefix', - 'greenwave_cache': CachedTestingConfig().CACHE, + 'greenwave_cache': greenwave_cache_config, } handler = resultsdb.ResultsDBHandler(hub) assert handler.topic == [ @@ -290,7 +289,7 @@ def test_invalidate_new_result_with_real_cache( # At this point, the invalidator should have invalidated the cache. If we # ask again, the decision should be correct now. It should be a stone cold # "no". - r = requests_session.post(cached_greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(query)) assert r.status_code == 200 @@ -302,11 +301,11 @@ def test_invalidate_new_result_with_real_cache( @mock.patch('greenwave.consumers.resultsdb.fedmsg.config.load_config') @mock.patch('greenwave.consumers.resultsdb.fedmsg.publish') def test_invalidate_new_result_with_no_preexisting_cache( - mock_fedmsg, load_config, requests_session, cached_greenwave_server, + mock_fedmsg, load_config, requests_session, greenwave_server, testdatabuilder, monkeypatch): """ Ensure that invalidating an unknown value is sane. """ monkeypatch.setenv('TEST', 'true') - load_config.return_value = {'greenwave_api_url': cached_greenwave_server.url + 'api/v1.0'} + load_config.return_value = {'greenwave_api_url': greenwave_server + 'api/v1.0'} nvr = testdatabuilder.unique_nvr() result = testdatabuilder.create_result( item=nvr, testcase_name='dist.rpmdeplint', outcome='PASSED') @@ -349,7 +348,7 @@ def test_consume_compose_id_result( mock_fedmsg, load_config, requests_session, greenwave_server, testdatabuilder, monkeypatch): monkeypatch.setenv('TEST', 'true') - load_config.return_value = {'greenwave_api_url': greenwave_server.url + 'api/v1.0'} + load_config.return_value = {'greenwave_api_url': greenwave_server + 'api/v1.0'} compose_id = testdatabuilder.unique_compose_id() result = testdatabuilder.create_compose_result( compose_id=compose_id, @@ -388,7 +387,7 @@ def test_consume_compose_id_result( 'subject': [{'productmd.compose.id': compose_id}], 'ignore_result': [result['id']] } - r = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 200 diff --git a/functional-tests/consumers/test_waiverdb.py b/functional-tests/consumers/test_waiverdb.py index cc8be44..7d0a7f3 100644 --- a/functional-tests/consumers/test_waiverdb.py +++ b/functional-tests/consumers/test_waiverdb.py @@ -18,7 +18,7 @@ TASKTRON_RELEASE_CRITICAL_TASKS = [ def test_consume_new_waiver( mock_fedmsg, load_config, requests_session, greenwave_server, testdatabuilder, monkeypatch): monkeypatch.setenv('TEST', 'true') - load_config.return_value = {'greenwave_api_url': greenwave_server.url + 'api/v1.0'} + load_config.return_value = {'greenwave_api_url': greenwave_server + 'api/v1.0'} nvr = testdatabuilder.unique_nvr() result = testdatabuilder.create_result(item=nvr, testcase_name='dist.abicheck', @@ -60,7 +60,7 @@ def test_consume_new_waiver( 'subject': [{'item': nvr, 'type': 'koji_build'}], 'ignore_waiver': [waiver['id']] } - r = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 200 diff --git a/functional-tests/test_api_v1.py b/functional-tests/test_api_v1.py index 72bf916..00bd107 100644 --- a/functional-tests/test_api_v1.py +++ b/functional-tests/test_api_v1.py @@ -90,7 +90,7 @@ OPENQA_SCENARIOS = [ def test_inspect_policies(requests_session, greenwave_server): - r = requests_session.get(greenwave_server.url + 'api/v1.0/policies', + r = requests_session.get(greenwave_server + 'api/v1.0/policies', headers={'Content-Type': 'application/json'}) assert r.status_code == 200 body = r.json() @@ -120,7 +120,7 @@ def test_cannot_make_decision_without_product_version(requests_session, greenwav 'decision_context': 'errata_newfile_to_qe', 'subject': [{'item': 'foo-1.0.0-1.el7', 'type': 'koji_build'}] } - r = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 400 @@ -132,7 +132,7 @@ def test_cannot_make_decision_without_decision_context(requests_session, greenwa 'product_version': 'rhel-7', 'subject': [{'item': 'foo-1.0.0-1.el7', 'type': 'koji_build'}] } - r = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 400 @@ -144,7 +144,7 @@ def test_cannot_make_decision_without_subject(requests_session, greenwave_server 'decision_context': 'errata_newfile_to_qe', 'product_version': 'rhel-7', } - r = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 400 @@ -157,7 +157,7 @@ def test_cannot_make_decision_with_invalid_subject(requests_session, greenwave_s 'product_version': 'rhel-7', 'subject': ['foo-1.0.0-1.el7'], } - r = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 400 @@ -170,7 +170,7 @@ def test_404_for_inapplicable_policies(requests_session, greenwave_server): 'product_version': 'rhel-7', 'subject': [{'item': 'foo-1.0.0-1.el7', 'type': 'koji_build'}] } - r = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 404 @@ -191,7 +191,7 @@ def test_make_a_decison_on_passed_result(requests_session, greenwave_server, tes 'subject': [{'item': nvr, 'type': 'koji_build'}] } - r = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 200 @@ -215,7 +215,7 @@ def test_make_a_decison_with_verbose_flag(requests_session, greenwave_server, te 'verbose': True, } - r = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 200 @@ -266,7 +266,7 @@ def test_make_a_decison_on_failed_result_with_waiver( 'product_version': 'rhel-7', 'subject': [{'item': nvr, 'type': 'koji_build'}] } - r = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 200 @@ -287,7 +287,7 @@ def test_make_a_decison_on_failed_result(requests_session, greenwave_server, tes 'product_version': 'rhel-7', 'subject': [{'item': nvr, 'type': 'koji_build'}] } - r = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 200 @@ -322,7 +322,7 @@ def test_make_a_decison_on_no_results(requests_session, greenwave_server, testda 'product_version': 'rhel-7', 'subject': [{'item': nvr, 'type': 'koji_build'}] } - r = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 200 @@ -350,7 +350,7 @@ def test_unrestricted_policy_is_always_satisfied( 'product_version': 'cdk-2', 'subject': [{'item': nvr, 'type': 'koji_build'}] } - r = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 200 @@ -374,7 +374,7 @@ def test_bodhi_push_update_stable_policy( 'product_version': 'fedora-26', 'subject': [{'item': nvr, 'type': 'koji_build'}] } - r = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 200 @@ -411,7 +411,7 @@ def test_multiple_results_in_a_subject( 'product_version': 'fedora-26', 'subject': [{'item': nvr, 'type': 'koji_build'}] } - r = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 200 @@ -451,7 +451,7 @@ def test_ignore_result(requests_session, greenwave_server, testdatabuilder): 'product_version': 'fedora-26', 'subject': [{'item': nvr, 'type': 'koji_build'}] } - r = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 200 @@ -461,7 +461,7 @@ def test_ignore_result(requests_session, greenwave_server, testdatabuilder): data.update({ 'ignore_result': [result['id']] }) - r = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) expected_unsatisfied_requirements = [ @@ -496,7 +496,7 @@ def test_make_a_decison_on_passed_result_with_scenario( 'product_version': 'fedora-rawhide', 'subject': [{'productmd.compose.id': compose_id}], } - r = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 200 @@ -532,7 +532,7 @@ def test_make_a_decison_on_failing_result_with_scenario( 'product_version': 'fedora-rawhide', 'subject': [{'productmd.compose.id': compose_id}], } - r = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 200 @@ -572,7 +572,7 @@ def test_ignore_waiver(requests_session, greenwave_server, testdatabuilder): 'product_version': 'rhel-7', 'subject': [{'item': nvr, 'type': 'koji_build'}] } - r_ = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r_ = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r_.status_code == 200 @@ -582,7 +582,7 @@ def test_ignore_waiver(requests_session, greenwave_server, testdatabuilder): data.update({ 'ignore_waiver': [waiver['id']] }) - r_ = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r_ = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r_.status_code == 200 @@ -600,7 +600,7 @@ def test_ignore_waiver(requests_session, greenwave_server, testdatabuilder): assert res_data['unsatisfied_requirements'] == expected_unsatisfied_requirements -def test_cached_false_positive(requests_session, cached_greenwave_server, testdatabuilder): +def test_cached_false_positive(requests_session, greenwave_server, testdatabuilder): """ Test that caching without invalidation produces false positives. This just tests that our caching works in the first place. @@ -620,7 +620,7 @@ def test_cached_false_positive(requests_session, cached_greenwave_server, testda 'product_version': 'rhel-7', 'subject': [{'item': nvr, 'type': 'koji_build'}] } - r = requests_session.post(cached_greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 200 @@ -632,7 +632,7 @@ def test_cached_false_positive(requests_session, cached_greenwave_server, testda testdatabuilder.create_result(item=nvr, testcase_name=testcase_name, outcome='FAILED') - r = requests_session.post(cached_greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 200 @@ -657,7 +657,7 @@ def test_blacklist(requests_session, greenwave_server, testdatabuilder): 'product_version': 'fedora-26', 'subject': [{'item': nvr, 'type': 'koji_build'}] } - r = requests_session.post(greenwave_server.url + 'api/v1.0/decision', + r = requests_session.post(greenwave_server + 'api/v1.0/decision', headers={'Content-Type': 'application/json'}, data=json.dumps(data)) assert r.status_code == 200 diff --git a/functional-tests/test_healthcheck.py b/functional-tests/test_healthcheck.py index e27ff90..499137e 100644 --- a/functional-tests/test_healthcheck.py +++ b/functional-tests/test_healthcheck.py @@ -2,6 +2,6 @@ def test_healthcheck(requests_session, greenwave_server): - r = requests_session.get(greenwave_server.url + 'healthcheck') + r = requests_session.get(greenwave_server + 'healthcheck') assert r.status_code == 200 assert r.text == 'Health check OK' diff --git a/greenwave/config.py b/greenwave/config.py index 70863da..d82da85 100644 --- a/greenwave/config.py +++ b/greenwave/config.py @@ -50,13 +50,3 @@ class TestingConfig(Config): os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'conf', 'policies' ) - - -class CachedTestingConfig(TestingConfig): - PORT = 6005 - # Cache in memory - CACHE = dict( - backend="dogpile.cache.dbm", - expiration_time=300, - arguments={"filename": "greenwave-test-cache.dbm"} - ) diff --git a/greenwave/consumers/resultsdb.py b/greenwave/consumers/resultsdb.py index a3cbf56..55e9b61 100644 --- a/greenwave/consumers/resultsdb.py +++ b/greenwave/consumers/resultsdb.py @@ -49,7 +49,7 @@ class ResultsDBHandler(fedmsg.consumers.FedmsgConsumer): prefix = hub.config.get('topic_prefix') env = hub.config.get('environment') suffix = hub.config.get('resultsdb_topic_suffix', 'taskotron.result.new') - self.topic = '.'.join([prefix, env, suffix]) + self.topic = ['.'.join([prefix, env, suffix])] self.fedmsg_config = fedmsg.config.load_config() super(ResultsDBHandler, self).__init__(hub, *args, **kwargs) diff --git a/greenwave/consumers/waiverdb.py b/greenwave/consumers/waiverdb.py index 87fa047..de1e28a 100644 --- a/greenwave/consumers/waiverdb.py +++ b/greenwave/consumers/waiverdb.py @@ -44,7 +44,7 @@ class WaiverDBHandler(fedmsg.consumers.FedmsgConsumer): prefix = hub.config.get('topic_prefix') env = hub.config.get('environment') suffix = hub.config.get('waiverdb_topic_suffix', 'waiver.new') - self.topic = '.'.join([prefix, env, suffix]) + self.topic = ['.'.join([prefix, env, suffix])] self.fedmsg_config = fedmsg.config.load_config() super(WaiverDBHandler, self).__init__(hub, *args, **kwargs)