2015-08-10 01:02:37 +03:00
|
|
|
import json
|
2013-03-12 00:01:17 +04:00
|
|
|
import os
|
2013-03-19 23:03:26 +04:00
|
|
|
import sys
|
2015-08-10 01:02:37 +03:00
|
|
|
from os.path import dirname
|
2014-07-03 17:56:45 +04:00
|
|
|
|
2015-02-14 12:27:13 +03:00
|
|
|
import kombu
|
2013-03-19 23:03:26 +04:00
|
|
|
import pytest
|
2015-08-10 01:02:37 +03:00
|
|
|
import responses
|
2014-07-03 17:56:45 +04:00
|
|
|
from django.core.management import call_command
|
2015-07-15 19:16:59 +03:00
|
|
|
from requests import Request
|
2015-09-30 14:01:38 +03:00
|
|
|
from requests_hawk import HawkAuth
|
2015-08-10 01:02:37 +03:00
|
|
|
from webtest.app import TestApp
|
2014-07-03 17:56:45 +04:00
|
|
|
|
|
|
|
from tests.sampledata import SampleData
|
2015-09-30 14:01:38 +03:00
|
|
|
from treeherder.client import TreeherderClient
|
2015-10-08 16:21:17 +03:00
|
|
|
from treeherder.config.wsgi import application
|
2014-07-03 17:56:45 +04:00
|
|
|
from treeherder.etl.oauth_utils import OAuthCredentials
|
|
|
|
|
2013-03-12 00:01:17 +04:00
|
|
|
|
2013-04-26 22:18:18 +04:00
|
|
|
def pytest_addoption(parser):
|
|
|
|
parser.addoption(
|
|
|
|
"--runslow",
|
|
|
|
action="store_true",
|
|
|
|
help="run slow tests",
|
|
|
|
)
|
|
|
|
|
2013-03-20 17:59:48 +04:00
|
|
|
|
2013-03-12 00:01:17 +04:00
|
|
|
def pytest_sessionstart(session):
|
|
|
|
"""
|
2013-04-16 22:00:34 +04:00
|
|
|
Set up the test environment.
|
2013-03-12 00:01:17 +04:00
|
|
|
|
2013-04-16 22:00:34 +04:00
|
|
|
Set DJANGO_SETTINGS_MODULE and sets up a test database.
|
2013-03-12 00:01:17 +04:00
|
|
|
|
2013-04-16 22:00:34 +04:00
|
|
|
"""
|
2013-03-19 23:03:26 +04:00
|
|
|
sys.path.append(dirname(dirname(__file__)))
|
2015-10-08 17:18:40 +03:00
|
|
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "treeherder.config.settings")
|
2013-03-12 00:01:17 +04:00
|
|
|
from django.conf import settings
|
2015-01-30 01:20:37 +03:00
|
|
|
from django.test.runner import DiscoverRunner
|
2013-03-19 23:03:26 +04:00
|
|
|
|
2013-03-12 00:01:17 +04:00
|
|
|
# we don't actually let Django run the tests, but we need to use some
|
|
|
|
# methods of its runner for setup/teardown of dbs and some other things
|
2015-01-30 01:20:37 +03:00
|
|
|
session.django_runner = DiscoverRunner()
|
2013-03-12 00:01:17 +04:00
|
|
|
# this provides templates-rendered debugging info and locmem mail storage
|
|
|
|
session.django_runner.setup_test_environment()
|
2015-05-27 20:33:23 +03:00
|
|
|
|
|
|
|
settings.DATABASES["default"]["TEST_NAME"] = "test_treeherder"
|
2013-05-13 21:19:19 +04:00
|
|
|
|
|
|
|
# this makes celery calls synchronous, useful for unit testing
|
|
|
|
settings.CELERY_ALWAYS_EAGER = True
|
2013-05-15 16:54:42 +04:00
|
|
|
settings.CELERY_EAGER_PROPAGATES_EXCEPTIONS = True
|
2013-05-13 21:19:19 +04:00
|
|
|
|
2015-07-01 17:55:13 +03:00
|
|
|
# Don't attempt to submit bug associations to Elasticsearch.
|
2015-04-10 15:47:16 +03:00
|
|
|
settings.MIRROR_CLASSIFICATIONS = False
|
2014-06-03 20:46:20 +04:00
|
|
|
|
2015-02-14 12:27:13 +03:00
|
|
|
# Reconfigure pulse to operate on default vhost of rabbitmq
|
|
|
|
settings.PULSE_URI = settings.BROKER_URL
|
|
|
|
settings.PULSE_EXCHANGE_NAMESPACE = 'test'
|
2013-03-28 04:40:42 +04:00
|
|
|
|
Bug 1059814 - Non-whitespace pep8 fixes using autopep8 aggressive mode
Generated using:
autopep8 --in-place --recursive --aggressive --aggressive
--max-line-length 999 --exclude='.git,__pycache__,.vagrant,build,vendor,
0001_initial.py,models.py,test_note_api.py,test_bug_job_map_api.py' .
autopep8's aggressive mode, unlike standard mode, makes non-whitespace
changes. It also uses lib2to3 to correct deprecated code (W690), some of
which aren't pep8 failures. Some of these changes are more dubious, but
rather than disable W690 completely, I've just excluded the files where
the unwanted changes would have been made, so we can benefit from the
rest.
2015-02-26 18:16:02 +03:00
|
|
|
|
2013-03-12 00:01:17 +04:00
|
|
|
def pytest_sessionfinish(session):
|
|
|
|
"""Tear down the test environment, including databases."""
|
|
|
|
session.django_runner.teardown_test_environment()
|
|
|
|
|
|
|
|
|
|
|
|
def pytest_runtest_setup(item):
|
|
|
|
"""
|
2013-04-16 22:00:34 +04:00
|
|
|
Per-test setup.
|
2013-05-01 14:50:55 +04:00
|
|
|
- Add an option to run those tests marked as 'slow'
|
|
|
|
- Provide cache isolation incrementing the cache key prefix
|
|
|
|
- Drop and recreate tables in the master db
|
2013-04-16 22:00:34 +04:00
|
|
|
"""
|
2013-03-12 00:01:17 +04:00
|
|
|
|
2013-05-01 14:50:55 +04:00
|
|
|
if 'slow' in item.keywords and not item.config.getoption("--runslow"):
|
|
|
|
pytest.skip("need --runslow option to run")
|
2013-03-12 00:01:17 +04:00
|
|
|
|
2013-03-28 04:40:42 +04:00
|
|
|
increment_cache_key_prefix()
|
|
|
|
|
2013-05-01 14:50:55 +04:00
|
|
|
# this should provide isolation between tests.
|
|
|
|
call_command("init_master_db", interactive=False, skip_fixtures=True)
|
2013-04-26 22:18:18 +04:00
|
|
|
|
2013-03-12 00:01:17 +04:00
|
|
|
|
|
|
|
def pytest_runtest_teardown(item):
|
|
|
|
"""
|
2013-04-16 22:00:34 +04:00
|
|
|
Per-test teardown.
|
2013-03-12 00:01:17 +04:00
|
|
|
|
2013-04-18 19:49:19 +04:00
|
|
|
Roll back the Django ORM transaction and delete all the dbs created
|
|
|
|
between tests
|
2013-03-12 00:01:17 +04:00
|
|
|
|
2013-04-16 22:00:34 +04:00
|
|
|
"""
|
2014-03-06 14:08:29 +04:00
|
|
|
|
2013-04-02 21:02:14 +04:00
|
|
|
from treeherder.model.models import Datasource
|
2013-03-19 23:03:26 +04:00
|
|
|
|
|
|
|
ds_list = Datasource.objects.all()
|
|
|
|
for ds in ds_list:
|
|
|
|
ds.delete()
|
2013-03-12 00:01:17 +04:00
|
|
|
|
2015-06-30 13:20:03 +03:00
|
|
|
call_command("migrate", 'model', '0001_initial', interactive=False)
|
2014-04-10 18:05:39 +04:00
|
|
|
|
2013-03-28 04:40:42 +04:00
|
|
|
|
|
|
|
def increment_cache_key_prefix():
|
|
|
|
"""Increment a cache prefix to effectively clear the cache."""
|
|
|
|
from django.core.cache import cache
|
|
|
|
cache.key_prefix = ""
|
|
|
|
prefix_counter_cache_key = "treeherder-tests-key-prefix-counter"
|
|
|
|
try:
|
|
|
|
key_prefix_counter = cache.incr(prefix_counter_cache_key)
|
|
|
|
except ValueError:
|
|
|
|
key_prefix_counter = 0
|
|
|
|
cache.set(prefix_counter_cache_key, key_prefix_counter)
|
|
|
|
cache.key_prefix = "t{0}".format(key_prefix_counter)
|
2013-04-19 03:23:58 +04:00
|
|
|
|
2013-05-01 14:50:55 +04:00
|
|
|
|
|
|
|
@pytest.fixture()
|
|
|
|
def initial_data():
|
|
|
|
call_command('load_initial_data')
|
|
|
|
|
2015-02-15 17:52:31 +03:00
|
|
|
|
2014-06-02 23:15:13 +04:00
|
|
|
@pytest.fixture(scope='function')
|
2014-06-03 19:51:15 +04:00
|
|
|
def jm(request):
|
2013-04-18 19:49:19 +04:00
|
|
|
""" Give a test access to a JobsModel instance. """
|
|
|
|
from django.conf import settings
|
2013-04-16 22:00:34 +04:00
|
|
|
from treeherder.model.derived.jobs import JobsModel
|
2013-05-01 01:07:13 +04:00
|
|
|
model = JobsModel.create(settings.DATABASES["default"]["TEST_NAME"])
|
2013-04-19 21:58:46 +04:00
|
|
|
|
2013-04-20 04:35:59 +04:00
|
|
|
# patch in additional test-only procs on the datasources
|
|
|
|
add_test_procs_file(
|
2015-06-18 22:50:50 +03:00
|
|
|
model.get_dhub(),
|
|
|
|
model.get_datasource().key,
|
2013-04-20 04:35:59 +04:00
|
|
|
"jobs_test.json",
|
|
|
|
)
|
|
|
|
|
2013-09-04 18:38:59 +04:00
|
|
|
def fin():
|
|
|
|
model.disconnect()
|
|
|
|
|
2014-06-03 19:51:15 +04:00
|
|
|
request.addfinalizer(fin)
|
|
|
|
|
2013-04-20 04:35:59 +04:00
|
|
|
return model
|
2013-04-17 20:38:40 +04:00
|
|
|
|
2013-04-26 04:41:24 +04:00
|
|
|
|
2013-04-20 04:35:59 +04:00
|
|
|
def add_test_procs_file(dhub, key, filename):
|
|
|
|
"""Add an extra procs file in for testing purposes."""
|
|
|
|
test_proc_file = os.path.join(
|
|
|
|
os.path.abspath(os.path.dirname(__file__)),
|
|
|
|
filename,
|
|
|
|
)
|
|
|
|
del dhub.procs[key]
|
|
|
|
proclist = dhub.data_sources[key]["procs"]
|
Bug 1059814 - Non-whitespace pep8 fixes using autopep8 aggressive mode
Generated using:
autopep8 --in-place --recursive --aggressive --aggressive
--max-line-length 999 --exclude='.git,__pycache__,.vagrant,build,vendor,
0001_initial.py,models.py,test_note_api.py,test_bug_job_map_api.py' .
autopep8's aggressive mode, unlike standard mode, makes non-whitespace
changes. It also uses lib2to3 to correct deprecated code (W690), some of
which aren't pep8 failures. Some of these changes are more dubious, but
rather than disable W690 completely, I've just excluded the files where
the unwanted changes would have been made, so we can benefit from the
rest.
2015-02-26 18:16:02 +03:00
|
|
|
if test_proc_file not in proclist:
|
2013-04-20 04:35:59 +04:00
|
|
|
proclist.append(test_proc_file)
|
|
|
|
dhub.data_sources[key]["procs"] = proclist
|
|
|
|
dhub.load_procs(key)
|
2013-04-17 20:13:24 +04:00
|
|
|
|
2013-05-01 14:50:55 +04:00
|
|
|
|
2013-04-19 16:02:18 +04:00
|
|
|
@pytest.fixture()
|
2013-04-17 20:13:24 +04:00
|
|
|
def jobs_ds():
|
|
|
|
from django.conf import settings
|
|
|
|
from treeherder.model.models import Datasource
|
2015-07-21 15:58:51 +03:00
|
|
|
return Datasource.objects.create(project=settings.DATABASES["default"]["TEST_NAME"])
|
2013-04-20 05:06:00 +04:00
|
|
|
|
2013-05-01 14:50:55 +04:00
|
|
|
|
2013-04-19 03:47:10 +04:00
|
|
|
@pytest.fixture(scope='session')
|
2013-04-19 03:23:58 +04:00
|
|
|
def sample_data():
|
|
|
|
"""Returns a SampleData() object"""
|
|
|
|
from sampledata import SampleData
|
|
|
|
return SampleData()
|
2013-09-04 18:38:59 +04:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture(scope='session')
|
|
|
|
def test_base_dir():
|
|
|
|
return os.path.dirname(__file__)
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
2013-11-14 05:24:24 +04:00
|
|
|
def sample_resultset(sample_data):
|
|
|
|
return sample_data.resultset_data
|
2013-09-16 17:58:03 +04:00
|
|
|
|
|
|
|
|
2015-04-15 00:49:03 +03:00
|
|
|
@pytest.fixture
|
|
|
|
def test_project():
|
|
|
|
from django.conf import settings
|
|
|
|
return settings.DATABASES["default"]["TEST_NAME"]
|
|
|
|
|
|
|
|
|
2013-09-16 17:58:03 +04:00
|
|
|
@pytest.fixture
|
|
|
|
def test_repository():
|
|
|
|
from django.conf import settings
|
2014-08-27 01:05:17 +04:00
|
|
|
from treeherder.model.models import Repository, RepositoryGroup
|
|
|
|
|
|
|
|
RepositoryGroup.objects.create(
|
2015-02-15 17:52:31 +03:00
|
|
|
name="development",
|
|
|
|
active_status="active",
|
|
|
|
description=""
|
2014-08-27 01:05:17 +04:00
|
|
|
)
|
2013-09-16 17:58:03 +04:00
|
|
|
|
|
|
|
return Repository.objects.create(
|
2015-02-15 17:52:31 +03:00
|
|
|
dvcs_type="hg",
|
|
|
|
name=settings.DATABASES["default"]["TEST_NAME"],
|
|
|
|
url="https://hg.mozilla.org/mozilla-central",
|
|
|
|
active_status="active",
|
|
|
|
codebase="gecko",
|
|
|
|
repository_group_id=1,
|
|
|
|
description=""
|
2013-09-16 17:58:03 +04:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def mock_log_parser(monkeypatch):
|
|
|
|
from celery import task
|
|
|
|
from treeherder.log_parser import tasks
|
|
|
|
|
|
|
|
@task
|
|
|
|
def task_mock(*args, **kwargs):
|
|
|
|
pass
|
|
|
|
|
|
|
|
monkeypatch.setattr(tasks,
|
|
|
|
'parse_log',
|
|
|
|
task_mock)
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def result_set_stored(jm, initial_data, sample_resultset):
|
|
|
|
|
2013-11-05 21:09:26 +04:00
|
|
|
jm.store_result_set_data(sample_resultset)
|
|
|
|
|
2013-09-16 17:58:03 +04:00
|
|
|
return sample_resultset
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture(scope='function')
|
|
|
|
def mock_get_resultset(monkeypatch, result_set_stored):
|
|
|
|
from treeherder.etl import common
|
|
|
|
|
2013-11-08 01:00:15 +04:00
|
|
|
def _get_resultset(params):
|
|
|
|
for k in params:
|
|
|
|
rev = params[k][0]
|
|
|
|
params[k] = {
|
|
|
|
rev: {
|
|
|
|
'id': 1,
|
|
|
|
'revision_hash': result_set_stored[0]['revision_hash']
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return params
|
|
|
|
|
|
|
|
monkeypatch.setattr(common, 'lookup_revisions', _get_resultset)
|
2013-11-05 21:09:26 +04:00
|
|
|
|
2015-02-15 17:52:31 +03:00
|
|
|
|
2014-06-02 23:15:13 +04:00
|
|
|
@pytest.fixture(scope='function')
|
2014-06-03 19:51:15 +04:00
|
|
|
def refdata(request):
|
2013-11-05 21:09:26 +04:00
|
|
|
"""returns a patched RefDataManager for testing purpose"""
|
|
|
|
from treeherder.model.derived import RefDataManager
|
|
|
|
from tests.conftest import add_test_procs_file
|
|
|
|
|
|
|
|
refdata = RefDataManager()
|
|
|
|
|
|
|
|
proc_path = os.path.join(
|
|
|
|
os.path.abspath(os.path.dirname(__file__)),
|
2013-11-13 00:35:32 +04:00
|
|
|
'refdata_test.json'
|
2013-11-05 21:09:26 +04:00
|
|
|
)
|
|
|
|
|
|
|
|
add_test_procs_file(refdata.dhub, 'reference', proc_path)
|
2014-06-02 07:00:52 +04:00
|
|
|
|
|
|
|
def fin():
|
|
|
|
refdata.disconnect()
|
|
|
|
|
2014-06-03 19:51:15 +04:00
|
|
|
request.addfinalizer(fin)
|
|
|
|
|
2013-11-05 21:09:26 +04:00
|
|
|
return refdata
|
2014-03-13 18:17:34 +04:00
|
|
|
|
2015-02-15 17:52:31 +03:00
|
|
|
|
2014-03-13 18:17:34 +04:00
|
|
|
@pytest.fixture
|
|
|
|
def mock_message_broker(monkeypatch):
|
|
|
|
from django.conf import settings
|
2014-06-02 07:00:52 +04:00
|
|
|
monkeypatch.setattr(settings, 'BROKER_URL', 'memory://')
|
2014-06-03 20:46:20 +04:00
|
|
|
|
Bug 1059814 - Non-whitespace pep8 fixes using autopep8 aggressive mode
Generated using:
autopep8 --in-place --recursive --aggressive --aggressive
--max-line-length 999 --exclude='.git,__pycache__,.vagrant,build,vendor,
0001_initial.py,models.py,test_note_api.py,test_bug_job_map_api.py' .
autopep8's aggressive mode, unlike standard mode, makes non-whitespace
changes. It also uses lib2to3 to correct deprecated code (W690), some of
which aren't pep8 failures. Some of these changes are more dubious, but
rather than disable W690 completely, I've just excluded the files where
the unwanted changes would have been made, so we can benefit from the
rest.
2015-02-26 18:16:02 +03:00
|
|
|
|
2015-02-14 12:27:13 +03:00
|
|
|
@pytest.fixture
|
|
|
|
def resultset_with_three_jobs(jm, sample_data, sample_resultset):
|
|
|
|
"""
|
|
|
|
Stores a number of jobs in the same resultset.
|
|
|
|
"""
|
|
|
|
num_jobs = 3
|
|
|
|
resultset = sample_resultset[0]
|
|
|
|
jobs = sample_data.job_data[0:num_jobs]
|
|
|
|
|
|
|
|
# Only store data for the first resultset....
|
|
|
|
resultset_creation = jm.store_result_set_data([resultset])
|
|
|
|
|
|
|
|
blobs = []
|
|
|
|
for index, blob in enumerate(jobs):
|
|
|
|
# Modify job structure to sync with the resultset sample data
|
|
|
|
if 'sources' in blob:
|
|
|
|
del blob['sources']
|
|
|
|
|
|
|
|
# Skip log references since they do not work correctly in pending state.
|
|
|
|
if 'log_references' in blob['job']:
|
|
|
|
del blob['job']['log_references']
|
|
|
|
|
|
|
|
blob['revision_hash'] = resultset['revision_hash']
|
|
|
|
blob['job']['state'] = 'pending'
|
|
|
|
blobs.append(blob)
|
|
|
|
|
|
|
|
# Store and process the jobs so they are present in the tables.
|
|
|
|
jm.store_job_data(blobs)
|
|
|
|
return resultset_creation['inserted_result_set_ids'][0]
|
|
|
|
|
|
|
|
|
2014-06-03 20:46:20 +04:00
|
|
|
@pytest.fixture
|
2015-06-18 22:50:50 +03:00
|
|
|
def eleven_jobs_stored(jm, sample_data, sample_resultset, mock_log_parser):
|
2014-06-03 20:46:20 +04:00
|
|
|
"""stores a list of 11 job samples"""
|
|
|
|
|
|
|
|
jm.store_result_set_data(sample_resultset)
|
|
|
|
|
|
|
|
num_jobs = 11
|
|
|
|
jobs = sample_data.job_data[0:num_jobs]
|
|
|
|
|
|
|
|
max_index = len(sample_resultset) - 1
|
|
|
|
resultset_index = 0
|
|
|
|
|
|
|
|
blobs = []
|
|
|
|
for index, blob in enumerate(jobs):
|
|
|
|
|
|
|
|
if resultset_index > max_index:
|
|
|
|
resultset_index = 0
|
|
|
|
|
|
|
|
# Modify job structure to sync with the resultset sample data
|
|
|
|
if 'sources' in blob:
|
|
|
|
del blob['sources']
|
|
|
|
|
|
|
|
blob['revision_hash'] = sample_resultset[resultset_index]['revision_hash']
|
|
|
|
|
|
|
|
blobs.append(blob)
|
|
|
|
|
|
|
|
resultset_index += 1
|
|
|
|
|
|
|
|
jm.store_job_data(blobs)
|
|
|
|
|
|
|
|
|
2014-07-03 17:56:45 +04:00
|
|
|
@pytest.fixture
|
2014-10-14 19:25:37 +04:00
|
|
|
def set_oauth_credentials():
|
|
|
|
OAuthCredentials.set_credentials(SampleData.get_credentials())
|
2014-07-03 17:56:45 +04:00
|
|
|
|
2015-02-15 17:52:31 +03:00
|
|
|
|
2014-10-14 19:25:37 +04:00
|
|
|
@pytest.fixture
|
2015-09-30 14:01:38 +03:00
|
|
|
def mock_post_json(monkeypatch, client_credentials):
|
2015-07-15 19:16:59 +03:00
|
|
|
def _post_json(th_client, project, endpoint, data,
|
|
|
|
timeout=None, auth=None):
|
2014-07-03 17:56:45 +04:00
|
|
|
|
2015-09-30 14:01:38 +03:00
|
|
|
auth = auth or th_client.auth
|
|
|
|
if not auth:
|
|
|
|
auth = HawkAuth(credentials={
|
|
|
|
'id': client_credentials.client_id,
|
|
|
|
'key': str(client_credentials.secret),
|
|
|
|
'algorithm': 'sha256'
|
|
|
|
})
|
|
|
|
app = TestApp(application)
|
2015-07-15 19:16:59 +03:00
|
|
|
uri = th_client._get_project_uri(project, endpoint)
|
|
|
|
req = Request('POST', uri, json=data, auth=auth)
|
|
|
|
prepped_request = req.prepare()
|
2015-05-14 23:47:06 +03:00
|
|
|
|
2015-09-30 14:01:38 +03:00
|
|
|
getattr(app, 'post')(
|
2015-07-15 19:16:59 +03:00
|
|
|
prepped_request.url,
|
|
|
|
params=json.dumps(data),
|
2015-09-30 14:01:38 +03:00
|
|
|
content_type='application/json',
|
|
|
|
extra_environ={
|
|
|
|
'HTTP_AUTHORIZATION': str(prepped_request.headers['Authorization'])
|
|
|
|
}
|
2014-07-03 17:56:45 +04:00
|
|
|
)
|
|
|
|
|
2015-07-15 19:16:59 +03:00
|
|
|
monkeypatch.setattr(TreeherderClient, '_post_json', _post_json)
|
2014-07-16 20:39:31 +04:00
|
|
|
|
2014-07-16 20:56:13 +04:00
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def mock_get_remote_content(monkeypatch):
|
2015-08-03 20:22:47 +03:00
|
|
|
def _get_remote_content(url, params=None):
|
|
|
|
response = TestApp(application).get(url, params=params, status=200)
|
|
|
|
return response.json
|
2014-07-16 20:56:13 +04:00
|
|
|
|
2014-07-17 01:14:23 +04:00
|
|
|
import treeherder.etl.common
|
2014-10-14 19:25:37 +04:00
|
|
|
monkeypatch.setattr(treeherder.etl.common,
|
|
|
|
'get_remote_content', _get_remote_content)
|
2014-09-26 20:08:28 +04:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def activate_responses(request):
|
|
|
|
|
|
|
|
responses.start()
|
|
|
|
|
|
|
|
def fin():
|
2014-10-08 21:54:36 +04:00
|
|
|
responses.reset()
|
2014-09-26 20:08:28 +04:00
|
|
|
responses.stop()
|
|
|
|
|
|
|
|
request.addfinalizer(fin)
|
2015-02-14 12:27:13 +03:00
|
|
|
|
Bug 1059814 - Non-whitespace pep8 fixes using autopep8 aggressive mode
Generated using:
autopep8 --in-place --recursive --aggressive --aggressive
--max-line-length 999 --exclude='.git,__pycache__,.vagrant,build,vendor,
0001_initial.py,models.py,test_note_api.py,test_bug_job_map_api.py' .
autopep8's aggressive mode, unlike standard mode, makes non-whitespace
changes. It also uses lib2to3 to correct deprecated code (W690), some of
which aren't pep8 failures. Some of these changes are more dubious, but
rather than disable W690 completely, I've just excluded the files where
the unwanted changes would have been made, so we can benefit from the
rest.
2015-02-26 18:16:02 +03:00
|
|
|
|
2015-02-14 12:27:13 +03:00
|
|
|
def pulse_consumer(exchange, request):
|
|
|
|
from django.conf import settings
|
|
|
|
|
|
|
|
exchange_name = 'exchange/{}/v1/{}'.format(
|
|
|
|
settings.PULSE_EXCHANGE_NAMESPACE,
|
|
|
|
exchange
|
|
|
|
)
|
|
|
|
|
|
|
|
connection = kombu.Connection(settings.PULSE_URI)
|
|
|
|
|
|
|
|
exchange = kombu.Exchange(
|
Bug 1059814 - Non-whitespace pep8 fixes using autopep8 aggressive mode
Generated using:
autopep8 --in-place --recursive --aggressive --aggressive
--max-line-length 999 --exclude='.git,__pycache__,.vagrant,build,vendor,
0001_initial.py,models.py,test_note_api.py,test_bug_job_map_api.py' .
autopep8's aggressive mode, unlike standard mode, makes non-whitespace
changes. It also uses lib2to3 to correct deprecated code (W690), some of
which aren't pep8 failures. Some of these changes are more dubious, but
rather than disable W690 completely, I've just excluded the files where
the unwanted changes would have been made, so we can benefit from the
rest.
2015-02-26 18:16:02 +03:00
|
|
|
name=exchange_name,
|
2015-02-14 12:27:13 +03:00
|
|
|
type='topic'
|
|
|
|
)
|
|
|
|
|
|
|
|
queue = kombu.Queue(
|
|
|
|
no_ack=True,
|
Bug 1059814 - Non-whitespace pep8 fixes using autopep8 aggressive mode
Generated using:
autopep8 --in-place --recursive --aggressive --aggressive
--max-line-length 999 --exclude='.git,__pycache__,.vagrant,build,vendor,
0001_initial.py,models.py,test_note_api.py,test_bug_job_map_api.py' .
autopep8's aggressive mode, unlike standard mode, makes non-whitespace
changes. It also uses lib2to3 to correct deprecated code (W690), some of
which aren't pep8 failures. Some of these changes are more dubious, but
rather than disable W690 completely, I've just excluded the files where
the unwanted changes would have been made, so we can benefit from the
rest.
2015-02-26 18:16:02 +03:00
|
|
|
exchange=exchange, # Exchange name
|
|
|
|
routing_key='#', # Bind to all messages
|
|
|
|
auto_delete=True, # Delete after each test
|
|
|
|
exclusive=False) # Disallow multiple consumers
|
2015-02-14 12:27:13 +03:00
|
|
|
|
|
|
|
simpleQueue = connection.SimpleQueue(
|
Bug 1059814 - Non-whitespace pep8 fixes using autopep8 aggressive mode
Generated using:
autopep8 --in-place --recursive --aggressive --aggressive
--max-line-length 999 --exclude='.git,__pycache__,.vagrant,build,vendor,
0001_initial.py,models.py,test_note_api.py,test_bug_job_map_api.py' .
autopep8's aggressive mode, unlike standard mode, makes non-whitespace
changes. It also uses lib2to3 to correct deprecated code (W690), some of
which aren't pep8 failures. Some of these changes are more dubious, but
rather than disable W690 completely, I've just excluded the files where
the unwanted changes would have been made, so we can benefit from the
rest.
2015-02-26 18:16:02 +03:00
|
|
|
name=queue,
|
2015-02-14 12:27:13 +03:00
|
|
|
channel=connection,
|
|
|
|
no_ack=True)
|
|
|
|
|
|
|
|
def fin():
|
|
|
|
connection.release()
|
|
|
|
|
|
|
|
request.addfinalizer(fin)
|
|
|
|
return simpleQueue
|
|
|
|
|
Bug 1059814 - Non-whitespace pep8 fixes using autopep8 aggressive mode
Generated using:
autopep8 --in-place --recursive --aggressive --aggressive
--max-line-length 999 --exclude='.git,__pycache__,.vagrant,build,vendor,
0001_initial.py,models.py,test_note_api.py,test_bug_job_map_api.py' .
autopep8's aggressive mode, unlike standard mode, makes non-whitespace
changes. It also uses lib2to3 to correct deprecated code (W690), some of
which aren't pep8 failures. Some of these changes are more dubious, but
rather than disable W690 completely, I've just excluded the files where
the unwanted changes would have been made, so we can benefit from the
rest.
2015-02-26 18:16:02 +03:00
|
|
|
|
2015-02-14 12:27:13 +03:00
|
|
|
@pytest.fixture
|
|
|
|
def pulse_resultset_consumer(request):
|
|
|
|
return pulse_consumer('new-result-set', request)
|
|
|
|
|
Bug 1059814 - Non-whitespace pep8 fixes using autopep8 aggressive mode
Generated using:
autopep8 --in-place --recursive --aggressive --aggressive
--max-line-length 999 --exclude='.git,__pycache__,.vagrant,build,vendor,
0001_initial.py,models.py,test_note_api.py,test_bug_job_map_api.py' .
autopep8's aggressive mode, unlike standard mode, makes non-whitespace
changes. It also uses lib2to3 to correct deprecated code (W690), some of
which aren't pep8 failures. Some of these changes are more dubious, but
rather than disable W690 completely, I've just excluded the files where
the unwanted changes would have been made, so we can benefit from the
rest.
2015-02-26 18:16:02 +03:00
|
|
|
|
2015-02-14 12:27:13 +03:00
|
|
|
@pytest.fixture
|
|
|
|
def pulse_action_consumer(request):
|
|
|
|
return pulse_consumer('job-actions', request)
|
2015-05-22 00:29:05 +03:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def mock_error_summary(monkeypatch):
|
|
|
|
bs_obj = ["foo", "bar"]
|
|
|
|
|
|
|
|
from treeherder.model import error_summary
|
|
|
|
|
|
|
|
def _get_error_summary(params):
|
|
|
|
return bs_obj
|
|
|
|
|
|
|
|
monkeypatch.setattr(error_summary, "get_error_summary", _get_error_summary)
|
|
|
|
|
|
|
|
return bs_obj
|
2015-08-17 20:01:39 +03:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
2015-10-09 20:24:22 +03:00
|
|
|
def failure_lines(jm, test_repository, eleven_jobs_stored, initial_data):
|
2015-08-17 20:01:39 +03:00
|
|
|
from tests.autoclassify.utils import test_line, create_failure_lines
|
|
|
|
|
2015-10-09 20:24:22 +03:00
|
|
|
test_repository.save()
|
2015-08-17 20:01:39 +03:00
|
|
|
|
2015-10-09 20:24:22 +03:00
|
|
|
job = jm.get_job(1)[0]
|
|
|
|
return create_failure_lines(test_repository,
|
2015-08-17 20:01:39 +03:00
|
|
|
job["job_guid"],
|
|
|
|
[(test_line, {}),
|
|
|
|
(test_line, {"subtest": "subtest2"})])
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def classified_failures(request, jm, eleven_jobs_stored, initial_data, failure_lines):
|
2015-10-09 20:24:22 +03:00
|
|
|
from treeherder.model.models import ClassifiedFailure, FailureMatch, MatcherManager
|
2015-08-17 20:01:39 +03:00
|
|
|
from treeherder.autoclassify import detectors
|
|
|
|
|
|
|
|
job_1 = jm.get_job(1)[0]
|
|
|
|
|
|
|
|
class TreeherderUnitTestDetector(detectors.Detector):
|
|
|
|
def __call__(self, failure_lines):
|
|
|
|
pass
|
|
|
|
|
2015-10-09 20:24:22 +03:00
|
|
|
test_matcher = MatcherManager._detector_funcs = {}
|
|
|
|
test_matcher = MatcherManager._matcher_funcs = {}
|
|
|
|
test_matcher = MatcherManager.register_detector(TreeherderUnitTestDetector)
|
2015-08-17 20:01:39 +03:00
|
|
|
|
|
|
|
def finalize():
|
2015-10-09 20:24:22 +03:00
|
|
|
MatcherManager._detector_funcs = {}
|
|
|
|
MatcherManager._matcher_funcs = {}
|
2015-08-17 20:01:39 +03:00
|
|
|
request.addfinalizer(finalize)
|
|
|
|
|
|
|
|
classified_failures = []
|
|
|
|
|
|
|
|
for failure_line in failure_lines:
|
|
|
|
if failure_line.job_guid == job_1["job_guid"]:
|
|
|
|
classified_failure = ClassifiedFailure()
|
|
|
|
classified_failure.save()
|
|
|
|
match = FailureMatch(failure_line=failure_line,
|
|
|
|
classified_failure=classified_failure,
|
|
|
|
matcher=test_matcher.db_object,
|
|
|
|
score=1.0,
|
|
|
|
is_best=True)
|
|
|
|
match.save()
|
|
|
|
classified_failures.append(classified_failure)
|
|
|
|
|
|
|
|
return classified_failures
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def retriggers(jm, eleven_jobs_stored):
|
|
|
|
original = jm.get_job(2)[0]
|
|
|
|
retrigger = original.copy()
|
|
|
|
retrigger['job_guid'] = "f1c75261017c7c5ce3000931dce4c442fe0a1298"
|
|
|
|
|
|
|
|
jm.execute(proc="jobs_test.inserts.duplicate_job",
|
|
|
|
placeholders=[retrigger['job_guid'], original['job_guid']])
|
|
|
|
|
|
|
|
return [retrigger]
|
2015-09-30 14:01:38 +03:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def api_user(request):
|
|
|
|
from django.contrib.auth.models import User
|
|
|
|
user = User.objects.create_user('MyUser')
|
|
|
|
|
|
|
|
def fin():
|
|
|
|
user.delete()
|
|
|
|
request.addfinalizer(fin)
|
|
|
|
|
|
|
|
return user
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def client_credentials(request, api_user):
|
|
|
|
from django.conf import settings
|
|
|
|
from treeherder.credentials.models import Credentials
|
|
|
|
|
|
|
|
# We need to get_or_create here because of bug 1133273.
|
|
|
|
# It can be a straight create once that bug is solved.
|
|
|
|
client_credentials, _ = Credentials.objects.get_or_create(
|
|
|
|
client_id=settings.ETL_CLIENT_ID,
|
|
|
|
defaults={'owner': api_user, 'authorized': True}
|
|
|
|
)
|
|
|
|
|
|
|
|
def fin():
|
|
|
|
client_credentials.delete()
|
|
|
|
request.addfinalizer(fin)
|
|
|
|
|
|
|
|
return client_credentials
|