mirror of
https://git.launchpad.net/~ubuntu-release/britney/+git/britney2-ubuntu
synced 2025-02-10 05:57:28 +00:00
merge trunk
This commit is contained in:
commit
4e5ed1739d
@ -30,7 +30,7 @@ from urllib import urlencode, urlopen
|
||||
import apt_pkg
|
||||
import kombu
|
||||
|
||||
from consts import (AUTOPKGTEST, BINARIES, RDEPENDS, SOURCE, VERSION)
|
||||
from consts import (AUTOPKGTEST, BINARIES, DEPENDS, RDEPENDS, SOURCE, VERSION)
|
||||
|
||||
|
||||
ADT_EXCUSES_LABELS = {
|
||||
@ -122,6 +122,22 @@ class AutoPackageTest(object):
|
||||
def log_error(self, msg):
|
||||
print('E: [%s] - %s' % (time.asctime(), msg))
|
||||
|
||||
def has_autodep8(self, srcinfo):
|
||||
'''Check if package is covered by autodep8
|
||||
|
||||
srcinfo is an item from self.britney.sources
|
||||
'''
|
||||
# DKMS: some binary depends on "dkms"
|
||||
for bin_arch in srcinfo[BINARIES]:
|
||||
binpkg = bin_arch.split('/')[0] # chop off arch
|
||||
try:
|
||||
bininfo = self.britney.binaries['unstable']['amd64'][0][binpkg]
|
||||
except KeyError:
|
||||
continue
|
||||
if 'dkms' in (bininfo[DEPENDS] or ''):
|
||||
return True
|
||||
return False
|
||||
|
||||
def tests_for_source(self, src, ver):
|
||||
'''Iterate over all tests that should be run for given source'''
|
||||
|
||||
@ -137,7 +153,7 @@ class AutoPackageTest(object):
|
||||
srcinfo = sources_info[src]
|
||||
# we want to test the package itself, if it still has a test in
|
||||
# unstable
|
||||
if srcinfo[AUTOPKGTEST]:
|
||||
if srcinfo[AUTOPKGTEST] or self.has_autodep8(srcinfo):
|
||||
reported_pkgs.add(src)
|
||||
tests.append((src, ver))
|
||||
|
||||
@ -152,7 +168,8 @@ class AutoPackageTest(object):
|
||||
continue
|
||||
for rdep in rdeps:
|
||||
rdep_src = binaries_info[rdep][SOURCE]
|
||||
if sources_info[rdep_src][AUTOPKGTEST]:
|
||||
rdep_src_info = sources_info[rdep_src]
|
||||
if rdep_src_info[AUTOPKGTEST] or self.has_autodep8(rdep_src_info):
|
||||
if rdep_src not in reported_pkgs:
|
||||
# we don't care about the version of rdep
|
||||
tests.append((rdep_src, sources_info[rdep_src][VERSION]))
|
||||
@ -254,9 +271,7 @@ class AutoPackageTest(object):
|
||||
query = {'delimiter': '@',
|
||||
'prefix': '%s/%s/%s/%s/' % (self.series, arch, srchash(src), src)}
|
||||
try:
|
||||
# don't include the last run again, so make the marker
|
||||
# "infinitesimally later" by appending 'zz'
|
||||
query['marker'] = self.test_results[src][arch][0] + 'zz'
|
||||
query['marker'] = query['prefix'] + self.test_results[src][arch][0]
|
||||
except KeyError:
|
||||
# no stamp yet, download all results
|
||||
pass
|
||||
@ -325,8 +340,8 @@ class AutoPackageTest(object):
|
||||
# allow some skipped tests, but nothing else
|
||||
passed = exitcode in [0, 2]
|
||||
|
||||
self.log_verbose('Fetched test result for %s/%s on %s: %s' % (
|
||||
src, ver, arch, passed and 'pass' or 'fail'))
|
||||
self.log_verbose('Fetched test result for %s/%s/%s %s: %s' % (
|
||||
src, ver, arch, stamp, passed and 'pass' or 'fail'))
|
||||
|
||||
# remove matching test requests, remember triggers
|
||||
satisfied_triggers = set()
|
||||
@ -486,11 +501,16 @@ class AutoPackageTest(object):
|
||||
arch_status = {}
|
||||
for arch in self.britney.options.adt_arches.split():
|
||||
try:
|
||||
if self.test_results[testsrc][arch][1][testver][0]:
|
||||
(_, ver_map, ever_passed) = self.test_results[testsrc][arch]
|
||||
(status, triggers) = ver_map[testver]
|
||||
# triggers might contain tuples or lists
|
||||
if (trigsrc, trigver) not in triggers and [trigsrc, trigver] not in triggers:
|
||||
raise KeyError('No result for trigger %s/%s yet' % (trigsrc, trigver))
|
||||
if status:
|
||||
arch_status[arch] = 'PASS'
|
||||
else:
|
||||
# test failed, check ever_passed flag for that src/arch
|
||||
if self.test_results[testsrc][arch][2]:
|
||||
if ever_passed:
|
||||
arch_status[arch] = 'REGRESSION'
|
||||
passed = False
|
||||
else:
|
||||
|
@ -76,15 +76,15 @@ class SwiftHTTPRequestHandler(BaseHTTPRequestHandler):
|
||||
if 'prefix' in query:
|
||||
p = query['prefix'][-1]
|
||||
objs = set([o for o in objs if o.startswith(p)])
|
||||
if 'marker' in query:
|
||||
m = query['marker'][-1]
|
||||
objs = set([o for o in objs if o >= m])
|
||||
if 'delimiter' in query:
|
||||
d = query['delimiter'][-1]
|
||||
# if find() returns a value, we want to include the delimiter, thus
|
||||
# bump its result; for "not found" return None
|
||||
find_adapter = lambda i: (i >= 0) and (i + 1) or None
|
||||
objs = set([o[:find_adapter(o.find(d))] for o in objs])
|
||||
if 'marker' in query:
|
||||
m = query['marker'][-1]
|
||||
objs = set([o for o in objs if o > m])
|
||||
|
||||
self.send_response(objs and 200 or 204) # 204: "No Content"
|
||||
self.send_header('Content-type', 'text/plain')
|
||||
@ -138,3 +138,18 @@ class AutoPkgTestSwiftServer:
|
||||
os.kill(self.server_pid, 15)
|
||||
os.waitpid(self.server_pid, 0)
|
||||
self.server_pid = None
|
||||
|
||||
if __name__ == '__main__':
|
||||
srv = AutoPkgTestSwiftServer()
|
||||
srv.set_results({'autopkgtest-series': {
|
||||
'series/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1'),
|
||||
'series/i386/g/green/20150101_100000@': (0, 'green 1'),
|
||||
'series/i386/l/lightgreen/20150101_100000@': (0, 'lightgreen 1'),
|
||||
'series/i386/l/lightgreen/20150101_100101@': (4, 'lightgreen 2'),
|
||||
'series/i386/l/lightgreen/20150101_100102@': (0, 'lightgreen 3'),
|
||||
}})
|
||||
srv.start()
|
||||
print('Running on http://localhost:8080/autopkgtest-series')
|
||||
print('Press Enter to quit.')
|
||||
sys.stdin.readline()
|
||||
srv.stop()
|
||||
|
@ -520,6 +520,130 @@ newgreen 2 i386 newgreen 2
|
||||
[r'\bdarkgreen\b.*>1</a> to .*>2<',
|
||||
r'autopkgtest for darkgreen 2: .*amd64.*in progress.*i386.*in progress'])
|
||||
|
||||
self.assertEqual(
|
||||
self.amqp_requests,
|
||||
set(['debci-series-i386:darkgreen', 'debci-series-amd64:darkgreen']))
|
||||
self.assertEqual(self.pending_requests,
|
||||
'darkgreen 2 amd64 darkgreen 2\ndarkgreen 2 i386 darkgreen 2\n')
|
||||
os.unlink(self.fake_amqp)
|
||||
|
||||
# second run gets the results for darkgreen 2
|
||||
self.swift.set_results({'autopkgtest-series': {
|
||||
'series/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1'),
|
||||
'series/amd64/d/darkgreen/20150101_100000@': (0, 'darkgreen 1'),
|
||||
'series/i386/d/darkgreen/20150101_100010@': (0, 'darkgreen 2'),
|
||||
'series/amd64/d/darkgreen/20150101_100010@': (0, 'darkgreen 2'),
|
||||
}})
|
||||
self.do_test(
|
||||
[],
|
||||
VALID_CANDIDATE,
|
||||
[r'\bdarkgreen\b.*>1</a> to .*>2<',
|
||||
r'autopkgtest for darkgreen 2: .*amd64.*Pass.*i386.*Pass'])
|
||||
self.assertEqual(self.amqp_requests, set())
|
||||
self.assertEqual(self.pending_requests, '')
|
||||
|
||||
# next run sees a newer darkgreen, should re-run tests
|
||||
self.data.remove_all(True)
|
||||
self.do_test(
|
||||
[('darkgreen', {'Version': '3', 'Depends': 'libc6 (>= 0.9), libgreen1'}, 'autopkgtest')],
|
||||
NOT_CONSIDERED,
|
||||
[r'\bdarkgreen\b.*>1</a> to .*>3<',
|
||||
r'autopkgtest for darkgreen 3: .*amd64.*in progress.*i386.*in progress'])
|
||||
self.assertEqual(
|
||||
self.amqp_requests,
|
||||
set(['debci-series-i386:darkgreen', 'debci-series-amd64:darkgreen']))
|
||||
self.assertEqual(self.pending_requests,
|
||||
'darkgreen 3 amd64 darkgreen 3\ndarkgreen 3 i386 darkgreen 3\n')
|
||||
|
||||
def test_old_result_from_rdep_version(self):
|
||||
'''re-runs reverse dependency test on new versions'''
|
||||
|
||||
self.swift.set_results({'autopkgtest-series': {
|
||||
'series/i386/g/green/20150101_100000@': (0, 'green 1'),
|
||||
'series/amd64/g/green/20150101_100000@': (0, 'green 1'),
|
||||
'series/i386/g/green/20150101_100010@': (0, 'green 2'),
|
||||
'series/amd64/g/green/20150101_100010@': (0, 'green 2'),
|
||||
'series/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1'),
|
||||
'series/amd64/d/darkgreen/20150101_100000@': (0, 'darkgreen 1'),
|
||||
'series/i386/l/lightgreen/20150101_100000@': (0, 'lightgreen 1'),
|
||||
'series/amd64/l/lightgreen/20150101_100000@': (0, 'lightgreen 1'),
|
||||
}})
|
||||
|
||||
self.do_test(
|
||||
[('libgreen1', {'Version': '2', 'Source': 'green', 'Depends': 'libc6'}, 'autopkgtest')],
|
||||
VALID_CANDIDATE,
|
||||
[r'\green\b.*>1</a> to .*>2<',
|
||||
r'autopkgtest for green 2: .*amd64.*Pass.*i386.*Pass',
|
||||
r'autopkgtest for darkgreen 1: .*amd64.*Pass.*i386.*Pass'])
|
||||
|
||||
self.assertEqual(
|
||||
self.amqp_requests,
|
||||
set(['debci-series-i386:green', 'debci-series-amd64:green',
|
||||
'debci-series-i386:lightgreen', 'debci-series-amd64:lightgreen',
|
||||
'debci-series-i386:darkgreen', 'debci-series-amd64:darkgreen']))
|
||||
self.assertEqual(self.pending_requests, '')
|
||||
os.unlink(self.fake_amqp)
|
||||
self.data.remove_all(True)
|
||||
|
||||
# second run: new version re-triggers all tests
|
||||
self.do_test(
|
||||
[('libgreen1', {'Version': '3', 'Source': 'green', 'Depends': 'libc6'}, 'autopkgtest')],
|
||||
NOT_CONSIDERED,
|
||||
[r'\green\b.*>1</a> to .*>3<',
|
||||
r'autopkgtest for green 3: .*amd64.*in progress.*i386.*in progress',
|
||||
r'autopkgtest for lightgreen 1: .*amd64.*in progress.*i386.*in progress',
|
||||
r'autopkgtest for darkgreen 1: .*amd64.*in progress.*i386.*in progress'])
|
||||
|
||||
self.assertEqual(
|
||||
self.amqp_requests,
|
||||
set(['debci-series-i386:green', 'debci-series-amd64:green',
|
||||
'debci-series-i386:lightgreen', 'debci-series-amd64:lightgreen',
|
||||
'debci-series-i386:darkgreen', 'debci-series-amd64:darkgreen']))
|
||||
|
||||
expected_pending = '''darkgreen 1 amd64 green 3
|
||||
darkgreen 1 i386 green 3
|
||||
green 3 amd64 green 3
|
||||
green 3 i386 green 3
|
||||
lightgreen 1 amd64 green 3
|
||||
lightgreen 1 i386 green 3
|
||||
'''
|
||||
self.assertEqual(self.pending_requests, expected_pending)
|
||||
os.unlink(self.fake_amqp)
|
||||
|
||||
# third run gets the results for green and lightgreen, darkgreen is
|
||||
# still running
|
||||
self.swift.set_results({'autopkgtest-series': {
|
||||
'series/i386/g/green/20150101_100020@': (0, 'green 3'),
|
||||
'series/amd64/g/green/20150101_100020@': (0, 'green 3'),
|
||||
'series/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1'),
|
||||
'series/amd64/d/darkgreen/20150101_100000@': (0, 'darkgreen 1'),
|
||||
'series/i386/l/lightgreen/20150101_100010@': (0, 'lightgreen 1'),
|
||||
'series/amd64/l/lightgreen/20150101_100010@': (0, 'lightgreen 1'),
|
||||
}})
|
||||
self.do_test(
|
||||
[], NOT_CONSIDERED,
|
||||
[r'\green\b.*>1</a> to .*>3<',
|
||||
r'autopkgtest for green 3: .*amd64.*Pass.*i386.*Pass',
|
||||
r'autopkgtest for lightgreen 1: .*amd64.*Pass.*i386.*Pass',
|
||||
r'autopkgtest for darkgreen 1: .*amd64.*in progress.*i386.*in progress'])
|
||||
self.assertEqual(self.amqp_requests, set())
|
||||
self.assertEqual(self.pending_requests,
|
||||
'darkgreen 1 amd64 green 3\ndarkgreen 1 i386 green 3\n')
|
||||
|
||||
# fourth run finally gets the new darkgreen result
|
||||
self.swift.set_results({'autopkgtest-series': {
|
||||
'series/i386/d/darkgreen/20150101_100010@': (0, 'darkgreen 1'),
|
||||
'series/amd64/d/darkgreen/20150101_100010@': (0, 'darkgreen 1'),
|
||||
}})
|
||||
self.do_test(
|
||||
[], VALID_CANDIDATE,
|
||||
[r'\green\b.*>1</a> to .*>3<',
|
||||
r'autopkgtest for green 3: .*amd64.*Pass.*i386.*Pass',
|
||||
r'autopkgtest for lightgreen 1: .*amd64.*Pass.*i386.*Pass',
|
||||
r'autopkgtest for darkgreen 1: .*amd64.*Pass.*i386.*Pass'])
|
||||
self.assertEqual(self.amqp_requests, set())
|
||||
self.assertEqual(self.pending_requests, '')
|
||||
|
||||
def test_tmpfail(self):
|
||||
'''tmpfail result is considered a failure'''
|
||||
|
||||
@ -620,6 +744,22 @@ newgreen 2 i386 newgreen 2
|
||||
# green
|
||||
self.data.remove_all(True)
|
||||
|
||||
self.swift.set_results({'autopkgtest-series': {
|
||||
'series/i386/g/green/20150101_100101@': (0, 'green 1'),
|
||||
'series/amd64/g/green/20150101_100101@': (0, 'green 1'),
|
||||
'series/i386/g/green/20150101_100201@': (0, 'green 2'),
|
||||
'series/amd64/g/green/20150101_100201@': (0, 'green 2'),
|
||||
'series/i386/l/lightgreen/20150101_100101@': (0, 'lightgreen 1'),
|
||||
'series/amd64/l/lightgreen/20150101_100101@': (0, 'lightgreen 1'),
|
||||
'series/i386/l/lightgreen/20150101_100201@': (4, 'lightgreen 2'),
|
||||
'series/amd64/l/lightgreen/20150101_100201@': (4, 'lightgreen 2'),
|
||||
# add new result for lightgreen 1
|
||||
'series/i386/l/lightgreen/20150101_100301@': (0, 'lightgreen 1'),
|
||||
'series/amd64/l/lightgreen/20150101_100301@': (0, 'lightgreen 1'),
|
||||
'series/i386/d/darkgreen/20150101_100000@': (0, 'darkgreen 1'),
|
||||
'series/amd64/d/darkgreen/20150101_100001@': (0, 'darkgreen 1'),
|
||||
}})
|
||||
|
||||
# next run should re-trigger lightgreen 1 to test against green/2
|
||||
self.do_test(
|
||||
[('libgreen1', {'Version': '2', 'Source': 'green', 'Depends': 'libc6'}, 'autopkgtest')],
|
||||
@ -659,6 +799,18 @@ newgreen 2 i386 newgreen 2
|
||||
r'autopkgtest for lightgreen 2: .*amd64.*in progress.*i386.*in progress',
|
||||
r'autopkgtest for rainbow 1: .*amd64.*in progress.*i386.*in progress'])
|
||||
|
||||
def test_dkms(self):
|
||||
'''DKMS packages are autopkgtested (via autodep8)'''
|
||||
|
||||
self.data.add('dkms', False, {})
|
||||
self.data.add('fancy-dkms', False, {'Source': 'fancy', 'Depends': 'dkms (>= 1)'})
|
||||
|
||||
self.do_test(
|
||||
[('dkms', {'Version': '2'}, None)],
|
||||
NOT_CONSIDERED,
|
||||
[r'\bdkms\b.*>1</a> to .*>2<',
|
||||
r'autopkgtest for fancy 1: .*amd64.*in progress.*i386.*in progress'])
|
||||
|
||||
def test_no_amqp_config(self):
|
||||
'''Run without autopkgtest requests'''
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user