summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--.testr.conf4
-rw-r--r--setup.cfg7
-rw-r--r--test-requirements.txt6
-rw-r--r--tests/test_layoutvalidator.py7
-rw-r--r--tests/test_scheduler.py413
-rw-r--r--tox.ini7
7 files changed, 244 insertions, 201 deletions
diff --git a/.gitignore b/.gitignore
index 14a4de713..65a48c7c6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,7 @@
*.egg-info
*.pyc
.test
+.testrepository
.tox
AUTHORS
build/*
diff --git a/.testr.conf b/.testr.conf
new file mode 100644
index 000000000..c4ecf2c5d
--- /dev/null
+++ b/.testr.conf
@@ -0,0 +1,4 @@
+[DEFAULT]
+test_command=OS_STDOUT_CAPTURE=1 OS_STDERR_CAPTURE=1 ${PYTHON:-python} -m subunit.run discover -t ./ tests $LISTOPT $IDOPTION
+test_id_option=--load-list $IDFILE
+test_list_option=--list
diff --git a/setup.cfg b/setup.cfg
index 5169a4d7c..caa15d69f 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -28,10 +28,3 @@ console_scripts =
source-dir = doc/source
build-dir = doc/build
all_files = 1
-
-[nosetests]
-verbosity=2
-detailed-errors=1
-cover-package = zuul
-cover-html = true
-cover-erase = true
diff --git a/test-requirements.txt b/test-requirements.txt
index ef6d24e0f..65b91f01b 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -1,7 +1,9 @@
hacking>=0.5.3,<0.6
coverage
-nose
-nosehtmloutput
sphinx
docutils==0.9.1
+fixtures>=0.3.12
+python-subunit
+testrepository>=0.0.13
+testtools>=0.9.27
diff --git a/tests/test_layoutvalidator.py b/tests/test_layoutvalidator.py
index 343dc47c4..f8225467f 100644
--- a/tests/test_layoutvalidator.py
+++ b/tests/test_layoutvalidator.py
@@ -14,11 +14,12 @@
# License for the specific language governing permissions and limitations
# under the License.
-import unittest
import os
import re
-import yaml
+
+import testtools
import voluptuous
+import yaml
import zuul.layoutvalidator
@@ -27,7 +28,7 @@ FIXTURE_DIR = os.path.join(os.path.dirname(__file__),
LAYOUT_RE = re.compile(r'^(good|bad)_.*\.yaml$')
-class testScheduler(unittest.TestCase):
+class testScheduler(testtools.TestCase):
def test_layouts(self):
"""Test layout file validation"""
print
diff --git a/tests/test_scheduler.py b/tests/test_scheduler.py
index a880b7493..da9b4318a 100644
--- a/tests/test_scheduler.py
+++ b/tests/test_scheduler.py
@@ -14,28 +14,32 @@
# License for the specific language governing permissions and limitations
# under the License.
-import unittest
import ConfigParser
-import os
-import Queue
+from cStringIO import StringIO
import hashlib
-import logging
-import random
import json
-import threading
-import time
+import logging
+import os
import pprint
+import Queue
+import random
import re
-import urllib2
-import urlparse
import select
-import statsd
import shutil
import socket
import string
-from cStringIO import StringIO
+import subprocess
+import tempfile
+import threading
+import time
+import urllib2
+import urlparse
+
import git
import gear
+import fixtures
+import statsd
+import testtools
import zuul.scheduler
import zuul.launcher.gearman
@@ -49,18 +53,21 @@ CONFIG.read(os.path.join(FIXTURE_DIR, "zuul.conf"))
CONFIG.set('zuul', 'layout_config',
os.path.join(FIXTURE_DIR, "layout.yaml"))
-TMP_ROOT = os.environ.get("ZUUL_TEST_ROOT", "/tmp")
-TEST_ROOT = os.path.join(TMP_ROOT, "zuul-test")
-UPSTREAM_ROOT = os.path.join(TEST_ROOT, "upstream")
-GIT_ROOT = os.path.join(TEST_ROOT, "git")
-
-CONFIG.set('zuul', 'git_dir', GIT_ROOT)
-
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(name)-32s '
'%(levelname)-8s %(message)s')
+def repack_repo(path):
+ output = subprocess.Popen(
+ ['git', '--git-dir=%s/.git' % path, 'repack', '-afd'],
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ out = output.communicate()
+ if output.returncode:
+ raise Exception("git repack returned %d" % output.returncode)
+ return out
+
+
def random_sha1():
return hashlib.sha1(str(random.random())).hexdigest()
@@ -70,108 +77,13 @@ class ChangeReference(git.Reference):
_points_to_commits_only = True
-def init_repo(project):
- parts = project.split('/')
- path = os.path.join(UPSTREAM_ROOT, *parts[:-1])
- if not os.path.exists(path):
- os.makedirs(path)
- path = os.path.join(UPSTREAM_ROOT, project)
- repo = git.Repo.init(path)
-
- repo.config_writer().set_value('user', 'email', 'user@example.com')
- repo.config_writer().set_value('user', 'name', 'User Name')
- repo.config_writer().write()
-
- fn = os.path.join(path, 'README')
- f = open(fn, 'w')
- f.write("test\n")
- f.close()
- repo.index.add([fn])
- repo.index.commit('initial commit')
- master = repo.create_head('master')
- repo.create_tag('init')
-
- mp = repo.create_head('mp')
- repo.head.reference = mp
- f = open(fn, 'a')
- f.write("test mp\n")
- f.close()
- repo.index.add([fn])
- repo.index.commit('mp commit')
-
- repo.head.reference = master
- repo.head.reset(index=True, working_tree=True)
- repo.git.clean('-x', '-f', '-d')
-
-
-def add_fake_change_to_repo(project, branch, change_num, patchset, msg, fn,
- large):
- path = os.path.join(UPSTREAM_ROOT, project)
- repo = git.Repo(path)
- ref = ChangeReference.create(repo, '1/%s/%s' % (change_num,
- patchset),
- 'refs/tags/init')
- repo.head.reference = ref
- repo.head.reset(index=True, working_tree=True)
- repo.git.clean('-x', '-f', '-d')
-
- path = os.path.join(UPSTREAM_ROOT, project)
- if not large:
- fn = os.path.join(path, fn)
- f = open(fn, 'w')
- f.write("test %s %s %s\n" % (branch, change_num, patchset))
- f.close()
- repo.index.add([fn])
- else:
- for fni in range(100):
- fn = os.path.join(path, str(fni))
- f = open(fn, 'w')
- for ci in range(4096):
- f.write(random.choice(string.printable))
- f.close()
- repo.index.add([fn])
-
- return repo.index.commit(msg)
-
-
-def ref_has_change(ref, change):
- path = os.path.join(GIT_ROOT, change.project)
- repo = git.Repo(path)
- for commit in repo.iter_commits(ref):
- if commit.message.strip() == ('%s-1' % change.subject):
- return True
- return False
-
-
-def job_has_changes(*args):
- job = args[0]
- commits = args[1:]
- if isinstance(job, FakeBuild):
- parameters = job.parameters
- else:
- parameters = json.loads(job.arguments)
- project = parameters['ZUUL_PROJECT']
- path = os.path.join(GIT_ROOT, project)
- repo = git.Repo(path)
- ref = parameters['ZUUL_REF']
- sha = parameters['ZUUL_COMMIT']
- repo_messages = [c.message.strip() for c in repo.iter_commits(ref)]
- repo_shas = [c.hexsha for c in repo.iter_commits(ref)]
- commit_messages = ['%s-1' % commit.subject for commit in commits]
- for msg in commit_messages:
- if msg not in repo_messages:
- return False
- if repo_shas[0] != sha:
- return False
- return True
-
-
class FakeChange(object):
categories = {'APRV': ('Approved', -1, 1),
'CRVW': ('Code-Review', -2, 2),
'VRFY': ('Verified', -2, 2)}
- def __init__(self, gerrit, number, project, branch, subject, status='NEW'):
+ def __init__(self, gerrit, number, project, branch, subject,
+ status='NEW', upstream_root=None):
self.gerrit = gerrit
self.reported = 0
self.queried = 0
@@ -204,9 +116,39 @@ class FakeChange(object):
'submitRecords': [],
'url': 'https://hostname/%s' % number}
+ self.upstream_root = upstream_root
self.addPatchset()
self.data['submitRecords'] = self.getSubmitRecords()
+ def add_fake_change_to_repo(self, msg, fn, large):
+ path = os.path.join(self.upstream_root, self.project)
+ repo = git.Repo(path)
+ ref = ChangeReference.create(repo, '1/%s/%s' % (self.number,
+ self.latest_patchset),
+ 'refs/tags/init')
+ repo.head.reference = ref
+ repo.head.reset(index=True, working_tree=True)
+ repo.git.clean('-x', '-f', '-d')
+
+ path = os.path.join(self.upstream_root, self.project)
+ if not large:
+ fn = os.path.join(path, fn)
+ f = open(fn, 'w')
+ f.write("test %s %s %s\n" %
+ (self.branch, self.number, self.latest_patchset))
+ f.close()
+ repo.index.add([fn])
+ else:
+ for fni in range(100):
+ fn = os.path.join(path, str(fni))
+ f = open(fn, 'w')
+ for ci in range(4096):
+ f.write(random.choice(string.printable))
+ f.close()
+ repo.index.add([fn])
+
+ return repo.index.commit(msg)
+
def addPatchset(self, files=[], large=False):
self.latest_patchset += 1
if files:
@@ -214,9 +156,7 @@ class FakeChange(object):
else:
fn = '%s-%s' % (self.branch, self.number)
msg = self.subject + '-' + str(self.latest_patchset)
- c = add_fake_change_to_repo(self.project, self.branch,
- self.number, self.latest_patchset,
- msg, fn, large)
+ c = self.add_fake_change_to_repo(msg, fn, large)
ps_files = [{'file': '/COMMIT_MSG',
'type': 'ADDED'},
{'file': 'README',
@@ -360,7 +300,7 @@ class FakeChange(object):
self.data['status'] = 'MERGED'
self.open = False
- path = os.path.join(UPSTREAM_ROOT, self.project)
+ path = os.path.join(self.upstream_root, self.project)
repo = git.Repo(path)
repo.heads[self.branch].commit = \
repo.commit(self.patchsets[-1]['revision'])
@@ -378,7 +318,8 @@ class FakeGerrit(object):
def addFakeChange(self, project, branch, subject):
self.change_number += 1
- c = FakeChange(self, self.change_number, project, branch, subject)
+ c = FakeChange(self, self.change_number, project, branch, subject,
+ upstream_root=self.upstream_root)
self.changes[self.change_number] = c
return c
@@ -418,7 +359,8 @@ class BuildHistory(object):
class FakeURLOpener(object):
- def __init__(self, fake_gerrit, url):
+ def __init__(self, upstream_root, fake_gerrit, url):
+ self.upstream_root = upstream_root
self.fake_gerrit = fake_gerrit
self.url = url
@@ -430,7 +372,7 @@ class FakeURLOpener(object):
ret += ('000000a31270149696713ba7e06f1beb760f20d359c4abed HEAD\x00'
'multi_ack thin-pack side-band side-band-64k ofs-delta '
'shallow no-progress include-tag multi_ack_detailed no-done\n')
- path = os.path.join(UPSTREAM_ROOT, project)
+ path = os.path.join(self.upstream_root, project)
repo = git.Repo(path)
for ref in repo.refs:
r = ref.object.hexsha + ' ' + ref.path + '\n'
@@ -440,8 +382,12 @@ class FakeURLOpener(object):
class FakeGerritTrigger(zuul.trigger.gerrit.Gerrit):
+ def __init__(self, upstream_root, *args):
+ super(FakeGerritTrigger, self).__init__(*args)
+ self.upstream_root = upstream_root
+
def getGitUrl(self, project):
- return os.path.join(UPSTREAM_ROOT, project.name)
+ return os.path.join(self.upstream_root, project.name)
class FakeStatsd(threading.Thread):
@@ -556,13 +502,14 @@ class FakeBuild(threading.Thread):
class FakeWorker(gear.Worker):
- def __init__(self, worker_id):
+ def __init__(self, worker_id, test):
super(FakeWorker, self).__init__(worker_id)
self.gearman_jobs = {}
self.build_history = []
self.running_builds = []
self.build_counter = 0
self.fail_tests = {}
+ self.test = test
self.hold_jobs_in_build = False
self.lock = threading.Lock()
@@ -643,7 +590,7 @@ class FakeWorker(gear.Worker):
def shouldFailTest(self, name, ref):
l = self.fail_tests.get(name, [])
for change in l:
- if ref_has_change(ref, change):
+ if self.test.ref_has_change(ref, change):
return True
return False
@@ -710,25 +657,52 @@ class FakeGearmanServer(gear.Server):
self.log.debug("done releasing queued jobs %s (%s)" % (regex, qlen))
-class testScheduler(unittest.TestCase):
+class TestScheduler(testtools.TestCase):
log = logging.getLogger("zuul.test")
def setUp(self):
- if os.path.exists(TEST_ROOT):
- shutil.rmtree(TEST_ROOT)
- os.makedirs(TEST_ROOT)
- os.makedirs(UPSTREAM_ROOT)
- os.makedirs(GIT_ROOT)
+ super(TestScheduler, self).setUp()
+ test_timeout = os.environ.get('OS_TEST_TIMEOUT', 0)
+ try:
+ test_timeout = int(test_timeout)
+ except ValueError:
+ # If timeout value is invalid do not set a timeout.
+ test_timeout = 0
+ if test_timeout > 0:
+ self.useFixture(fixtures.Timeout(test_timeout, gentle=True))
+
+ if (os.environ.get('OS_STDOUT_CAPTURE') == 'True' or
+ os.environ.get('OS_STDOUT_CAPTURE') == '1'):
+ stdout = self.useFixture(fixtures.StringStream('stdout')).stream
+ self.useFixture(fixtures.MonkeyPatch('sys.stdout', stdout))
+ if (os.environ.get('OS_STDERR_CAPTURE') == 'True' or
+ os.environ.get('OS_STDERR_CAPTURE') == '1'):
+ stderr = self.useFixture(fixtures.StringStream('stderr')).stream
+ self.useFixture(fixtures.MonkeyPatch('sys.stderr', stderr))
+ self.useFixture(fixtures.NestedTempfile())
+ self.log_fixture = self.useFixture(fixtures.FakeLogger())
+
+ tmp_root = os.environ.get("ZUUL_TEST_ROOT", tempfile.mkdtemp())
+ self.test_root = os.path.join(tmp_root, "zuul-test")
+ self.upstream_root = os.path.join(self.test_root, "upstream")
+ self.git_root = os.path.join(self.test_root, "git")
+
+ CONFIG.set('zuul', 'git_dir', self.git_root)
+ if os.path.exists(self.test_root):
+ shutil.rmtree(self.test_root)
+ os.makedirs(self.test_root)
+ os.makedirs(self.upstream_root)
+ os.makedirs(self.git_root)
# For each project in config:
- init_repo("org/project")
- init_repo("org/project1")
- init_repo("org/project2")
- init_repo("org/project3")
- init_repo("org/one-job-project")
- init_repo("org/nonvoting-project")
- init_repo("org/templated-project")
- init_repo("org/node-project")
+ self.init_repo("org/project")
+ self.init_repo("org/project1")
+ self.init_repo("org/project2")
+ self.init_repo("org/project3")
+ self.init_repo("org/one-job-project")
+ self.init_repo("org/nonvoting-project")
+ self.init_repo("org/templated-project")
+ self.init_repo("org/node-project")
self.statsd = FakeStatsd()
os.environ['STATSD_HOST'] = 'localhost'
@@ -747,7 +721,7 @@ class testScheduler(unittest.TestCase):
self.config.readfp(cfg)
self.config.set('gearman', 'port', str(self.gearman_server.port))
- self.worker = FakeWorker('fake_worker')
+ self.worker = FakeWorker('fake_worker', self)
self.worker.addServer('127.0.0.1', self.gearman_server.port)
self.gearman_server.worker = self.worker
@@ -755,17 +729,19 @@ class testScheduler(unittest.TestCase):
def URLOpenerFactory(*args, **kw):
args = [self.fake_gerrit] + list(args)
- return FakeURLOpener(*args, **kw)
+ return FakeURLOpener(self.upstream_root, *args, **kw)
urllib2.urlopen = URLOpenerFactory
self.launcher = zuul.launcher.gearman.Gearman(self.config, self.sched)
zuul.lib.gerrit.Gerrit = FakeGerrit
- self.gerrit = FakeGerritTrigger(self.config, self.sched)
+ self.gerrit = FakeGerritTrigger(
+ self.upstream_root, self.config, self.sched)
self.gerrit.replication_timeout = 1.5
self.gerrit.replication_retry_interval = 0.5
self.fake_gerrit = self.gerrit.gerrit
+ self.fake_gerrit.upstream_root = self.upstream_root
self.sched.setLauncher(self.launcher)
self.sched.setTrigger(self.gerrit)
@@ -790,7 +766,70 @@ class testScheduler(unittest.TestCase):
threads = threading.enumerate()
if len(threads) > 1:
self.log.error("More than one thread is running: %s" % threads)
- #shutil.rmtree(TEST_ROOT)
+ super(TestScheduler, self).tearDown()
+
+ def init_repo(self, project):
+ parts = project.split('/')
+ path = os.path.join(self.upstream_root, *parts[:-1])
+ if not os.path.exists(path):
+ os.makedirs(path)
+ path = os.path.join(self.upstream_root, project)
+ repo = git.Repo.init(path)
+
+ repo.config_writer().set_value('user', 'email', 'user@example.com')
+ repo.config_writer().set_value('user', 'name', 'User Name')
+ repo.config_writer().write()
+
+ fn = os.path.join(path, 'README')
+ f = open(fn, 'w')
+ f.write("test\n")
+ f.close()
+ repo.index.add([fn])
+ repo.index.commit('initial commit')
+ master = repo.create_head('master')
+ repo.create_tag('init')
+
+ mp = repo.create_head('mp')
+ repo.head.reference = mp
+ f = open(fn, 'a')
+ f.write("test mp\n")
+ f.close()
+ repo.index.add([fn])
+ repo.index.commit('mp commit')
+
+ repo.head.reference = master
+ repo.head.reset(index=True, working_tree=True)
+ repo.git.clean('-x', '-f', '-d')
+
+ def ref_has_change(self, ref, change):
+ path = os.path.join(self.git_root, change.project)
+ repo = git.Repo(path)
+ for commit in repo.iter_commits(ref):
+ if commit.message.strip() == ('%s-1' % change.subject):
+ return True
+ return False
+
+ def job_has_changes(self, *args):
+ job = args[0]
+ commits = args[1:]
+ if isinstance(job, FakeBuild):
+ parameters = job.parameters
+ else:
+ parameters = json.loads(job.arguments)
+ project = parameters['ZUUL_PROJECT']
+ path = os.path.join(self.git_root, project)
+ repo = git.Repo(path)
+ ref = parameters['ZUUL_REF']
+ sha = parameters['ZUUL_COMMIT']
+ repo_messages = [c.message.strip() for c in repo.iter_commits(ref)]
+ repo_shas = [c.hexsha for c in repo.iter_commits(ref)]
+ commit_messages = ['%s-1' % commit.subject for commit in commits]
+ for msg in commit_messages:
+ if msg not in repo_messages:
+ return False
+ if repo_shas[0] != sha:
+ return False
+ return True
def registerJobs(self):
count = 0
@@ -1032,51 +1071,51 @@ class testScheduler(unittest.TestCase):
self.waitUntilSettled()
assert len(self.builds) == 1
assert self.builds[0].name == 'project-merge'
- assert job_has_changes(self.builds[0], A)
+ assert self.job_has_changes(self.builds[0], A)
self.worker.release('.*-merge')
self.waitUntilSettled()
assert len(self.builds) == 3
assert self.builds[0].name == 'project-test1'
- assert job_has_changes(self.builds[0], A)
+ assert self.job_has_changes(self.builds[0], A)
assert self.builds[1].name == 'project-test2'
- assert job_has_changes(self.builds[1], A)
+ assert self.job_has_changes(self.builds[1], A)
assert self.builds[2].name == 'project-merge'
- assert job_has_changes(self.builds[2], A, B)
+ assert self.job_has_changes(self.builds[2], A, B)
self.worker.release('.*-merge')
self.waitUntilSettled()
assert len(self.builds) == 5
assert self.builds[0].name == 'project-test1'
- assert job_has_changes(self.builds[0], A)
+ assert self.job_has_changes(self.builds[0], A)
assert self.builds[1].name == 'project-test2'
- assert job_has_changes(self.builds[1], A)
+ assert self.job_has_changes(self.builds[1], A)
assert self.builds[2].name == 'project-test1'
- assert job_has_changes(self.builds[2], A, B)
+ assert self.job_has_changes(self.builds[2], A, B)
assert self.builds[3].name == 'project-test2'
- assert job_has_changes(self.builds[3], A, B)
+ assert self.job_has_changes(self.builds[3], A, B)
assert self.builds[4].name == 'project-merge'
- assert job_has_changes(self.builds[4], A, B, C)
+ assert self.job_has_changes(self.builds[4], A, B, C)
self.worker.release('.*-merge')
self.waitUntilSettled()
assert len(self.builds) == 6
assert self.builds[0].name == 'project-test1'
- assert job_has_changes(self.builds[0], A)
+ assert self.job_has_changes(self.builds[0], A)
assert self.builds[1].name == 'project-test2'
- assert job_has_changes(self.builds[1], A)
+ assert self.job_has_changes(self.builds[1], A)
assert self.builds[2].name == 'project-test1'
- assert job_has_changes(self.builds[2], A, B)
+ assert self.job_has_changes(self.builds[2], A, B)
assert self.builds[3].name == 'project-test2'
- assert job_has_changes(self.builds[3], A, B)
+ assert self.job_has_changes(self.builds[3], A, B)
assert self.builds[4].name == 'project-test1'
- assert job_has_changes(self.builds[4], A, B, C)
+ assert self.job_has_changes(self.builds[4], A, B, C)
assert self.builds[5].name == 'project-test2'
- assert job_has_changes(self.builds[5], A, B, C)
+ assert self.job_has_changes(self.builds[5], A, B, C)
self.worker.hold_jobs_in_build = False
self.worker.release()
@@ -1133,9 +1172,9 @@ class testScheduler(unittest.TestCase):
# There should be one merge job at the head of each queue running
assert len(self.builds) == 2
assert self.builds[0].name == 'project-merge'
- assert job_has_changes(self.builds[0], A)
+ assert self.job_has_changes(self.builds[0], A)
assert self.builds[1].name == 'project1-merge'
- assert job_has_changes(self.builds[1], B)
+ assert self.job_has_changes(self.builds[1], B)
# Release the current merge builds
self.worker.release('.*-merge')
@@ -1182,7 +1221,7 @@ class testScheduler(unittest.TestCase):
assert len(self.builds) == 1
assert self.builds[0].name == 'project-merge'
- assert job_has_changes(self.builds[0], A)
+ assert self.job_has_changes(self.builds[0], A)
self.worker.release('.*-merge')
self.waitUntilSettled()
@@ -1241,7 +1280,7 @@ class testScheduler(unittest.TestCase):
assert len(self.builds) == 0
assert len(queue) == 1
assert queue[0].name == 'build:project-merge'
- assert job_has_changes(queue[0], A)
+ assert self.job_has_changes(queue[0], A)
self.gearman_server.release('.*-merge')
self.waitUntilSettled()
@@ -1371,7 +1410,7 @@ class testScheduler(unittest.TestCase):
self.gearman_server.release()
self.waitUntilSettled()
- path = os.path.join(GIT_ROOT, "org/project")
+ path = os.path.join(self.git_root, "org/project")
repo = git.Repo(path)
repo_messages = [c.message.strip() for c in repo.iter_commits(ref)]
repo_messages.reverse()
@@ -1466,7 +1505,7 @@ class testScheduler(unittest.TestCase):
self.gearman_server.release()
self.waitUntilSettled()
- path = os.path.join(GIT_ROOT, "org/project")
+ path = os.path.join(self.git_root, "org/project")
repo = git.Repo(path)
repo_messages = [c.message.strip() for c in repo.iter_commits(ref)]
repo_messages.reverse()
@@ -1479,7 +1518,7 @@ class testScheduler(unittest.TestCase):
self.test_build_configuration()
self.test_build_configuration_branch()
# C has been merged, undo that
- path = os.path.join(UPSTREAM_ROOT, "org/project")
+ path = os.path.join(self.upstream_root, "org/project")
repo = git.Repo(path)
repo.heads.master.commit = repo.commit('init')
self.test_build_configuration()
@@ -1514,7 +1553,7 @@ class testScheduler(unittest.TestCase):
self.gearman_server.release()
self.waitUntilSettled()
- path = os.path.join(GIT_ROOT, "org/project")
+ path = os.path.join(self.git_root, "org/project")
repo = git.Repo(path)
repo_messages = [c.message.strip()
@@ -1620,7 +1659,7 @@ class testScheduler(unittest.TestCase):
assert len(self.builds) == 1
assert self.builds[0].name == 'project1-merge'
- assert job_has_changes(self.builds[0], A)
+ assert self.job_has_changes(self.builds[0], A)
self.worker.release('.*-merge')
self.waitUntilSettled()
@@ -1815,8 +1854,8 @@ class testScheduler(unittest.TestCase):
self.assertEmptyQueues()
self.worker.build_history = []
- path = os.path.join(GIT_ROOT, "org/project")
- os.system('git --git-dir=%s/.git repack -afd' % path)
+ path = os.path.join(self.git_root, "org/project")
+ print repack_repo(path)
A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
A.addApproval('CRVW', 2)
@@ -1834,10 +1873,10 @@ class testScheduler(unittest.TestCase):
# https://bugs.launchpad.net/zuul/+bug/1078946
A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
A.addPatchset(large=True)
- path = os.path.join(UPSTREAM_ROOT, "org/project1")
- os.system('git --git-dir=%s/.git repack -afd' % path)
- path = os.path.join(GIT_ROOT, "org/project1")
- os.system('git --git-dir=%s/.git repack -afd' % path)
+ path = os.path.join(self.upstream_root, "org/project1")
+ print repack_repo(path)
+ path = os.path.join(self.git_root, "org/project1")
+ print repack_repo(path)
A.addApproval('CRVW', 2)
self.fake_gerrit.addEvent(A.addApproval('APRV', 1))
@@ -2107,26 +2146,26 @@ class testScheduler(unittest.TestCase):
assert len(refs) == 4
# a ref should have a, not b, and should not be in project2
- assert ref_has_change(a_zref, A)
- assert not ref_has_change(a_zref, B)
- assert not ref_has_change(a_zref, M2)
+ assert self.ref_has_change(a_zref, A)
+ assert not self.ref_has_change(a_zref, B)
+ assert not self.ref_has_change(a_zref, M2)
# b ref should have a and b, and should not be in project2
- assert ref_has_change(b_zref, A)
- assert ref_has_change(b_zref, B)
- assert not ref_has_change(b_zref, M2)
+ assert self.ref_has_change(b_zref, A)
+ assert self.ref_has_change(b_zref, B)
+ assert not self.ref_has_change(b_zref, M2)
# c ref should have a and b in 1, c in 2
- assert ref_has_change(c_zref, A)
- assert ref_has_change(c_zref, B)
- assert ref_has_change(c_zref, C)
- assert not ref_has_change(c_zref, D)
+ assert self.ref_has_change(c_zref, A)
+ assert self.ref_has_change(c_zref, B)
+ assert self.ref_has_change(c_zref, C)
+ assert not self.ref_has_change(c_zref, D)
# d ref should have a and b in 1, c and d in 2
- assert ref_has_change(d_zref, A)
- assert ref_has_change(d_zref, B)
- assert ref_has_change(d_zref, C)
- assert ref_has_change(d_zref, D)
+ assert self.ref_has_change(d_zref, A)
+ assert self.ref_has_change(d_zref, B)
+ assert self.ref_has_change(d_zref, C)
+ assert self.ref_has_change(d_zref, D)
self.worker.hold_jobs_in_build = False
self.worker.release()
diff --git a/tox.ini b/tox.ini
index 8633c8d18..90003e717 100644
--- a/tox.ini
+++ b/tox.ini
@@ -5,9 +5,11 @@ envlist = pep8, pyflakes, py27
# Set STATSD env variables so that statsd code paths are tested.
setenv = STATSD_HOST=localhost
STATSD_PORT=8125
+ VIRTUAL_ENV={envdir}
deps = -r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
-commands = nosetests --logging-format="%(asctime)s %(name)-32s %(levelname)-8s %(message)s" {posargs}
+commands =
+ python setup.py testr --slowest --testr-args='{posargs}'
[tox:jenkins]
downloadcache = ~/cache/pip
@@ -16,7 +18,8 @@ downloadcache = ~/cache/pip
commands = flake8
[testenv:cover]
-setenv = NOSE_WITH_COVERAGE=1
+commands =
+ python setup.py testr --coverage
[testenv:pyflakes]
deps = pyflakes