Index: scripts/slave/unittests/gatekeeper_ng_test.py |
diff --git a/scripts/slave/unittests/gatekeeper_ng_test.py b/scripts/slave/unittests/gatekeeper_ng_test.py |
index 3055995ca6ec22122c4ca28357d17866c5a98a79..4f74fc296c791bf9755fdf585db77bfdfb844283 100755 |
--- a/scripts/slave/unittests/gatekeeper_ng_test.py |
+++ b/scripts/slave/unittests/gatekeeper_ng_test.py |
@@ -27,6 +27,7 @@ import urlparse |
import test_env # pylint: disable=W0403,W0611 |
from slave import gatekeeper_ng |
+from slave import gatekeeper_ng_db |
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) |
@@ -136,6 +137,7 @@ class GatekeeperTest(unittest.TestCase): |
self.masters = [self.create_generic_build_tree('Chromium FYI', |
'chromium.fyi')] |
+ self.build_db_file = self.fill_tempfile('{}') |
self.gatekeeper_file = self.fill_tempfile('{}') |
self.email_secret_file = self.fill_tempfile('seekrit') |
self.status_secret_file = self.fill_tempfile('reindeerflotilla') |
@@ -230,18 +232,54 @@ class GatekeeperTest(unittest.TestCase): |
return Master(master_title, self.master_url_root + master_url_chunk, |
[builder]) |
- def call_gatekeeper(self): |
+ def call_gatekeeper(self, build_db=None, json=None): # pylint: disable=W0621 |
"""Sets up handlers for all the json and actually calls gatekeeper.""" |
+ self.url_calls = [] |
self.handle_build_tree(self.masters) |
- ret = gatekeeper_ng.main() |
+ json = json or self.gatekeeper_file |
+ self._gatekeeper_config = self._gatekeeper_config or {} |
+ if not build_db: |
+ build_db = gatekeeper_ng_db.gen_db(masters={ |
+ self.masters[0].url: { |
+ 'mybuilder': { |
+ 0: gatekeeper_ng_db.gen_build(finished=True) |
+ } |
+ } |
+ }) |
+ |
+ with open(self.build_db_file, 'w') as f: |
+ gatekeeper_ng_db.convert_db_to_json(build_db, self._gatekeeper_config, f) |
+ |
+ old_argv = sys.argv[:] |
+ sys.argv.extend(['--build-db=%s' % self.build_db_file, |
+ '--json', json]) |
+ |
+ try: |
+ ret = gatekeeper_ng.main() |
+ finally: |
+ sys.argv = old_argv |
+ |
if ret != 0: |
raise ValueError('return code was %d' % ret) |
# Return urls as a convenience. |
return [call['url'] for call in self.url_calls] |
+ |
+ def process_build_db(self, master, builder): |
+ """Reads the build_db from a file and splits out finished/unfinished.""" |
+ new_build_db = gatekeeper_ng_db.get_build_db(self.build_db_file) |
+ builds = new_build_db.masters[master][builder] |
+ finished_new_builds = dict( |
+ (k, v) for k, v in builds.iteritems() if v.finished) |
+ unfinished_new_builds = dict( |
+ (k, v) for k, v in builds.iteritems() if not v.finished) |
+ return unfinished_new_builds, finished_new_builds |
+ |
+ |
@contextlib.contextmanager |
def gatekeeper_config_editor(self): |
+ """Wrapper to edit the gatekeeper_config, then reserialize it.""" |
if not self._gatekeeper_config: |
with open(self.gatekeeper_file) as f: |
self._gatekeeper_config = json.load(f) |
@@ -327,22 +365,11 @@ class GatekeeperTest(unittest.TestCase): |
#### Email and status. |
- def testBasicURLQuery(self): |
- """Check that things are basically sane.""" |
- sys.argv.extend([m.url for m in self.masters]) |
- sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
- '--no-email-app']) |
- |
- self.handle_build_tree([self.masters[0]]) |
- gatekeeper_ng.main() |
- |
def testIgnoreNoGatekeeper(self): |
"""Check that logs aren't read unless the builder is noted in the config.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--no-email-app']) |
self.add_gatekeeper_section(self.masters[0].url, |
@@ -352,24 +379,10 @@ class GatekeeperTest(unittest.TestCase): |
urls = self.call_gatekeeper() |
self.assertEquals(urls, [self.masters[0].url + '/json']) |
- def testIgnoreSuccessfulBuildNoGatekeeperSteps(self): |
- """If gatekeeper_spec doesn't have any annotations, don't fail build.""" |
- sys.argv.extend([m.url for m in self.masters]) |
- sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
- '--email-app-secret-file=%s' % self.email_secret_file]) |
- |
- |
- self.handle_build_tree([self.masters[0]]) |
- gatekeeper_ng.main() |
- urls = [call['url'] for call in self.url_calls] |
- self.assertNotIn(self.mailer_url, urls) |
- |
def testFailedBuildDetected(self): |
"""Test that an erroneous build result closes the tree.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.masters[0].builders[0].builds[0].results = 3 |
@@ -380,10 +393,7 @@ class GatekeeperTest(unittest.TestCase): |
{}, |
idx=0) |
- self.handle_url_str(self.mailer_url, '') |
- |
- self.handle_build_tree([self.masters[0]]) |
- gatekeeper_ng.main() |
+ self.call_gatekeeper() |
self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
mailer_data = GatekeeperTest.decode_param_json( |
@@ -394,7 +404,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that no email is sent if there are no watchers.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
@@ -416,7 +425,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that a non-closing failure is ignored.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.masters[0].builders[0].builds[0].steps[2].results = [2, None] |
@@ -431,7 +439,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that a failed closing step closes the tree.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
@@ -451,7 +458,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that a failed closing_optional step closes the tree.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
@@ -471,7 +477,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that a failed closing_optional * step closes the tree.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
@@ -491,7 +496,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that the lack of a closing step closes the tree.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.add_gatekeeper_section(self.masters[0].url, |
@@ -509,7 +513,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that the lack of a closing_optional step doesn't close the tree.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.add_gatekeeper_section(self.masters[0].url, |
@@ -525,7 +528,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that the lack of a forgiving_optional step doesn't close tree.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.add_gatekeeper_section(self.masters[0].url, |
@@ -542,7 +544,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that a skipped closing step closes the tree.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.add_gatekeeper_section(self.masters[0].url, |
@@ -564,7 +565,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that gatekeeper_spec works even if not the first step.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.add_gatekeeper_section(self.masters[0].url, |
@@ -588,7 +588,6 @@ class GatekeeperTest(unittest.TestCase): |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
'--no-email-app', '--set-status', |
- '--json', self.gatekeeper_file, |
'--password-file', self.status_secret_file]) |
self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
@@ -604,7 +603,6 @@ class GatekeeperTest(unittest.TestCase): |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
'--no-email-app', '--set-status', |
- '--json', self.gatekeeper_file, |
'--password-file', self.status_secret_file]) |
self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
@@ -621,7 +619,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that the subject template is set by default.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.add_gatekeeper_section(self.masters[0].url, |
@@ -642,7 +639,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that the email json is formatted correctly.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
subject_template = 'build %(result)s, oh no!' |
@@ -700,15 +696,13 @@ class GatekeeperTest(unittest.TestCase): |
def testIncrementalScanning(self): |
"""Test that builds in the build DB are skipped.""" |
- fd, dbfilename = tempfile.mkstemp() |
- build_db = {self.masters[0].url: { 'mybuilder': 1 }} |
- os.write(fd, json.dumps(build_db)) |
- os.close(fd) |
+ build_db = gatekeeper_ng_db.gen_db(masters={ |
+ self.masters[0].url: { |
+ 'mybuilder': { |
+ 1: gatekeeper_ng_db.gen_build(finished=True)}}}) |
sys.argv.extend([m.url for m in self.masters]) |
- sys.argv.extend(['--build-db=%s' % dbfilename, |
- '--json', self.gatekeeper_file, |
- '--email-app-secret-file=%s' % self.email_secret_file]) |
+ sys.argv.extend(['--email-app-secret-file=%s' % self.email_secret_file]) |
self.add_gatekeeper_section(self.masters[0].url, |
@@ -721,18 +715,15 @@ class GatekeeperTest(unittest.TestCase): |
'a_second_committer@chromium.org'])) |
self.masters[0].builders[0].builds[1].steps[1].results = [2, None] |
- @contextlib.contextmanager |
- def delfile(filename): |
- yield |
- os.unlink(filename) |
+ self.call_gatekeeper(build_db=build_db) |
+ _, finished_new_builds = self.process_build_db( |
+ self.masters[0].url, 'mybuilder') |
+ self.assertEquals(finished_new_builds, |
+ {2: gatekeeper_ng_db.gen_build(finished=True, triggered=[ |
+ '0e321975189099b8f623a4dc29602e76' |
+ 'f33fd8f5bacf3c7018d0499214372e5b'])}) |
- with delfile(dbfilename): |
- self.call_gatekeeper() |
- with open(dbfilename) as f: |
- new_build_db = json.load(f) |
- self.assertEquals(new_build_db, {self.masters[0].url: {'mybuilder': 2}}) |
- |
- #check that gatekeeper indeed sent an email. |
+ # Check that gatekeeper indeed sent an email. |
self.assertEquals(self.url_calls[-1]['url'], self.mailer_url) |
mailer_data = GatekeeperTest.decode_param_json( |
self.url_calls[-1]['params']) |
@@ -748,7 +739,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that sheriff annotations are properly parsed.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
@@ -780,7 +770,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that a no-sheriff condition works OK (weekends).""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.masters[0].builders[0].builds[0].blame = [] |
@@ -806,7 +795,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that no-sheriff works ok with a blamelist.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
@@ -831,7 +819,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that multiple sheriff lists can be merged.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
self.add_gatekeeper_section(self.masters[0].url, |
@@ -868,7 +855,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that additional watchers can be merged to the mailing list.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
@@ -896,7 +882,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that notify works with no blamelist.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.masters[0].builders[0].builds[0].blame = [] |
@@ -919,7 +904,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that forgiving steps set status but don't email blamelist.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file, |
'--set-status', '--password-file', self.status_secret_file |
]) |
@@ -937,7 +921,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that forgiving_optional steps set status but don't email.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file, |
'--set-status', '--password-file', self.status_secret_file |
]) |
@@ -955,7 +938,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that forgiving_optional * sets status but doesn't email.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file, |
'--set-status', '--password-file', self.status_secret_file |
]) |
@@ -973,7 +955,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that setting forgive_all prevents emailing the blamelist.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file, |
'--set-status', '--password-file', self.status_secret_file |
]) |
@@ -992,7 +973,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that setting forgive_all prevents emailing the blamelist.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file, |
'--set-status', '--password-file', self.status_secret_file |
]) |
@@ -1013,7 +993,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that the status app is only hit once if many failures are seen.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file, |
'--set-status', '--password-file', self.status_secret_file |
]) |
@@ -1046,7 +1025,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that failing builds aren't mixed with good ones.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file, |
'--set-status', '--password-file', self.status_secret_file |
]) |
@@ -1075,7 +1053,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that * captures failures across all builders.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.add_gatekeeper_section(self.masters[0].url, |
@@ -1093,7 +1070,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that * can be explicitly overridden.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
# step3 won't fail the build. |
@@ -1118,7 +1094,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that * doesn't propagate to other builders.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
# step4 will fail the build. |
@@ -1140,11 +1115,18 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that failure in one build doesn't affect another.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file, |
'--set-status', '--password-file', self.status_secret_file |
]) |
+ build_db = gatekeeper_ng_db.gen_db(masters={ |
+ self.masters[0].url: { |
+ 'mybuilder': { |
+ 0: gatekeeper_ng_db.gen_build(finished=True)}, |
+ 'mybuilder2': { |
+ 0: gatekeeper_ng_db.gen_build(finished=True)}, |
+ }}) |
+ |
new_build = self.create_generic_build(2, |
['a_second_committer@chromium.org']) |
self.masters[0].builders.append(Builder('mybuilder2', [new_build])) |
@@ -1159,7 +1141,7 @@ class GatekeeperTest(unittest.TestCase): |
{'closing_steps': ['step1']}, |
idx=0) |
- urls = self.call_gatekeeper() |
+ urls = self.call_gatekeeper(build_db=build_db) |
self.assertEquals(urls.count(self.status_url), 1) |
self.assertEquals(urls.count(self.mailer_url), 1) |
@@ -1174,11 +1156,18 @@ class GatekeeperTest(unittest.TestCase): |
master_url = 'http://build.chromium.org/p/chromium.fyi' |
sys.argv.extend([master_url, |
'--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file, |
'--set-status', '--password-file', self.status_secret_file |
]) |
+ build_db = gatekeeper_ng_db.gen_db(masters={ |
+ self.masters[0].url: { |
+ 'mybuilder': { |
+ 0: gatekeeper_ng_db.gen_build(finished=True)}, |
+ 'mybuilder2': { |
+ 0: gatekeeper_ng_db.gen_build(finished=True)}, |
+ }}) |
+ |
new_build = self.create_generic_build(2, |
['a_second_committer@chromium.org']) |
self.masters[0].builders.append(Builder('mybuilder2', [new_build])) |
@@ -1194,7 +1183,7 @@ class GatekeeperTest(unittest.TestCase): |
{'closing_steps': ['step1']}, |
idx=0) |
- urls = self.call_gatekeeper() |
+ urls = self.call_gatekeeper(build_db=build_db) |
self.assertEquals(urls.count(self.status_url), 1) |
self.assertEquals(self.url_calls[-2]['url'], self.mailer_url) |
@@ -1214,11 +1203,21 @@ class GatekeeperTest(unittest.TestCase): |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file, |
'--set-status', '--password-file', self.status_secret_file |
]) |
+ build_db = gatekeeper_ng_db.gen_db(masters={ |
+ self.masters[0].url: { |
+ 'mybuilder': { |
+ 0: gatekeeper_ng_db.gen_build(finished=True)}, |
+ }, |
+ self.masters[1].url: { |
+ 'mybuilder': { |
+ 0: gatekeeper_ng_db.gen_build(finished=True)}, |
+ }, |
+ }) |
+ |
self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
self.add_gatekeeper_section(self.masters[0].url, |
self.masters[0].builders[0].name, |
@@ -1231,7 +1230,7 @@ class GatekeeperTest(unittest.TestCase): |
self.masters[0].builders[0].name, |
{'closing_steps': ['step1']}) |
- urls = self.call_gatekeeper() |
+ urls = self.call_gatekeeper(build_db) |
self.assertEquals(urls.count(self.status_url), 1) |
self.assertEquals(urls[-1], self.mailer_url) |
@@ -1251,7 +1250,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Don't fail a running build because of omitted steps.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--no-email-app', '--set-status', |
'--password-file', self.status_secret_file]) |
@@ -1271,7 +1269,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that a still-running build can close the tree.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--no-email-app', '--set-status', |
'--password-file', self.status_secret_file]) |
@@ -1288,15 +1285,13 @@ class GatekeeperTest(unittest.TestCase): |
def testUpdateBuildDBNotCompletedButFailed(self): |
"""Test that partial builds increment the DB if they failed.""" |
- fd, dbfilename = tempfile.mkstemp() |
- build_db = {self.masters[0].url: { 'mybuilder': 1 }} |
- os.write(fd, json.dumps(build_db)) |
- os.close(fd) |
+ build_db = gatekeeper_ng_db.gen_db(masters={ |
+ self.masters[0].url: { |
+ 'mybuilder': { |
+ 1: gatekeeper_ng_db.gen_build(finished=True)}}}) |
sys.argv.extend([m.url for m in self.masters]) |
- sys.argv.extend(['--build-db=%s' % dbfilename, |
- '--json', self.gatekeeper_file, |
- '--no-email-app', '--set-status', |
+ sys.argv.extend(['--no-email-app', '--set-status', |
'--password-file', self.status_secret_file]) |
mybuild = self.create_generic_build(2, ['a_second_committer@chromium.org']) |
@@ -1307,29 +1302,29 @@ class GatekeeperTest(unittest.TestCase): |
self.masters[0].builders[0].name, |
{'closing_steps': ['step1']}) |
- @contextlib.contextmanager |
- def delfile(filename): |
- yield |
- os.unlink(filename) |
+ urls = self.call_gatekeeper(build_db=build_db) |
+ unfinished_new_builds, finished_new_builds = self.process_build_db( |
+ self.masters[0].url, 'mybuilder') |
+ |
+ self.assertEquals(finished_new_builds, |
+ {1: gatekeeper_ng_db.gen_build(finished=True)}) |
+ self.assertEquals(unfinished_new_builds, |
+ {2: gatekeeper_ng_db.gen_build(triggered=[ |
+ '0e321975189099b8f623a4dc29602e76' |
+ 'f33fd8f5bacf3c7018d0499214372e5b'])}) |
- with delfile(dbfilename): |
- urls = self.call_gatekeeper() |
- with open(dbfilename) as f: |
- new_build_db = json.load(f) |
- self.assertEquals(new_build_db, {self.masters[0].url: {'mybuilder': 2}}) |
self.assertIn(self.status_url, urls) |
def testDontUpdateBuildDBIfNotCompleted(self): |
- """Test that partial builds don't increment the DB if still running.""" |
- fd, dbfilename = tempfile.mkstemp() |
- build_db = {self.masters[0].url: { 'mybuilder': 1 }} |
- os.write(fd, json.dumps(build_db)) |
- os.close(fd) |
+ """Test that partial builds aren't marked as finished.""" |
+ build_db = gatekeeper_ng_db.gen_db(masters={ |
+ self.masters[0].url: { |
+ 'mybuilder': { |
+ 1: gatekeeper_ng_db.gen_build(finished=True), |
+ 2: gatekeeper_ng_db.gen_build()}}}) |
sys.argv.extend([m.url for m in self.masters]) |
- sys.argv.extend(['--build-db=%s' % dbfilename, |
- '--json', self.gatekeeper_file, |
- '--no-email-app', '--set-status', |
+ sys.argv.extend(['--no-email-app', '--set-status', |
'--password-file', self.status_secret_file]) |
mybuild = self.create_generic_build(2, ['a_second_committer@chromium.org']) |
@@ -1339,25 +1334,86 @@ class GatekeeperTest(unittest.TestCase): |
self.masters[0].builders[0].name, |
{'closing_steps': ['step4']}) |
- @contextlib.contextmanager |
- def delfile(filename): |
- yield |
- os.unlink(filename) |
+ urls = self.call_gatekeeper(build_db=build_db) |
+ unfinished_new_builds, finished_new_builds = self.process_build_db( |
+ self.masters[0].url, 'mybuilder') |
- with delfile(dbfilename): |
- urls = self.call_gatekeeper() |
- with open(dbfilename) as f: |
- new_build_db = json.load(f) |
- self.assertEquals(new_build_db, {self.masters[0].url: {'mybuilder': 1}}) |
+ self.assertEquals(finished_new_builds, |
+ {1: gatekeeper_ng_db.gen_build(finished=True)}) |
+ self.assertEquals(unfinished_new_builds, |
+ {2: gatekeeper_ng_db.gen_build()}) |
self.assertNotIn(self.status_url, urls) |
+ def testTriggeringDoesntTriggerOnSameBuild(self): |
+ """Test that a section won't fire twice on a build.""" |
+ sys.argv.extend([m.url for m in self.masters]) |
+ sys.argv.extend(['--no-email-app', '--set-status', |
+ '--password-file', self.status_secret_file]) |
+ |
+ self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
+ self.masters[0].builders[0].builds[0].finished = False |
+ self.add_gatekeeper_section(self.masters[0].url, |
+ self.masters[0].builders[0].name, |
+ {'closing_steps': ['step1']}) |
+ |
+ urls = self.call_gatekeeper() |
+ build_db = gatekeeper_ng_db.get_build_db(self.build_db_file) |
+ urls += self.call_gatekeeper(build_db=build_db) |
+ unfinished_new_builds, finished_new_builds = self.process_build_db( |
+ self.masters[0].url, 'mybuilder') |
+ self.assertEquals(finished_new_builds, |
+ {0: gatekeeper_ng_db.gen_build(finished=True)}) |
+ self.assertEquals(unfinished_new_builds, |
+ {1: gatekeeper_ng_db.gen_build(triggered=[ |
+ '0e321975189099b8f623a4dc29602e76' |
+ 'f33fd8f5bacf3c7018d0499214372e5b'])}) |
+ self.assertEquals(1, len([u for u in urls if u == self.status_url])) |
+ |
+ def testTriggeringOneHashDoesntStopAnother(self): |
+ """Test that firing on one hash doesn't prevent another hash triggering.""" |
+ build_db = gatekeeper_ng_db.gen_db(masters={ |
+ self.masters[0].url: { |
+ 'mybuilder': { |
+ 1: gatekeeper_ng_db.gen_build(finished=True)}}}) |
+ |
+ sys.argv.extend([m.url for m in self.masters]) |
+ sys.argv.extend(['--no-email-app', '--set-status', |
+ '--password-file', self.status_secret_file]) |
+ |
+ mybuild = self.create_generic_build(2, ['a_second_committer@chromium.org']) |
+ mybuild.finished = False |
+ self.masters[0].builders[0].builds.append(mybuild) |
+ self.masters[0].builders[0].builds[1].steps[1].results = [2, None] |
+ self.add_gatekeeper_section(self.masters[0].url, |
+ self.masters[0].builders[0].name, |
+ {'closing_steps': ['step1']}) |
+ |
+ urls = self.call_gatekeeper(build_db=build_db) |
+ self.add_gatekeeper_section(self.masters[0].url, |
+ self.masters[0].builders[0].name, |
+ {'closing_steps': ['step2']}) |
+ self.masters[0].builders[0].builds[1].steps[2].results = [2, None] |
+ build_db = gatekeeper_ng_db.get_build_db(self.build_db_file) |
+ urls += self.call_gatekeeper(build_db=build_db) |
+ unfinished_new_builds, finished_new_builds = self.process_build_db( |
+ self.masters[0].url, 'mybuilder') |
+ self.assertEquals(finished_new_builds, |
+ {1: gatekeeper_ng_db.gen_build(finished=True)}) |
+ self.assertEquals(unfinished_new_builds, |
+ {2: gatekeeper_ng_db.gen_build(triggered=[ |
+ '0e321975189099b8f623a4dc29602e76' |
+ 'f33fd8f5bacf3c7018d0499214372e5b', |
+ |
+ 'fbe3ad95b8cb242309b17896ad2c3ba0' |
+ '2999a22ca5f7b8c7887878b611679cd5'])}) |
+ self.assertEquals(2, len([u for u in urls if u == self.status_url])) |
+ |
### JSON config file tests. |
def testInheritFromCategory(self): |
"""Check that steps in categories are inherited by builders.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
@@ -1378,7 +1434,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Check that steps in categories are inherited by builders.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.masters[0].builders[0].builds[0].steps[2].results = [2, None] |
@@ -1400,7 +1455,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Check that builders can add-on to categories.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
@@ -1422,7 +1476,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Check that steps in masters are inherited by builders.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
@@ -1455,7 +1508,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Check that steps in masters can be added by builders.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
@@ -1496,7 +1548,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Check that steps can inherit categories from masters.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
@@ -1520,7 +1571,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Check that master sections work correctly.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
@@ -1549,7 +1599,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Check that master section handles email properly.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file]) |
self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
@@ -1580,7 +1629,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that no email is sent if the email isn't in the domain filter.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file, |
'--filter-domain=squirrels.net,squirrels.com']) |
@@ -1596,7 +1644,6 @@ class GatekeeperTest(unittest.TestCase): |
"""Test that no email is sent if the email isn't in the domain filter.""" |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--email-app-secret-file=%s' % self.email_secret_file, |
'--disable-domain-filter', |
'--filter-domain=squirrels.net,squirrels.com']) |
@@ -1619,7 +1666,6 @@ class GatekeeperTest(unittest.TestCase): |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
- '--json', self.gatekeeper_file, |
'--no-email-app']) |
with self.assertRaises(ValueError): |
self.call_gatekeeper() |
@@ -1629,7 +1675,6 @@ class GatekeeperTest(unittest.TestCase): |
sys.argv.extend([m.url for m in self.masters]) |
sys.argv.extend(['--skip-build-db-update', |
'--no-email-app', '--set-status', |
- '--json', self.gatekeeper_file, |
'--password-file', self.status_secret_file]) |
self.masters[0].builders[0].builds[0].steps[1].results = [2, None] |
@@ -1646,8 +1691,7 @@ class GatekeeperTest(unittest.TestCase): |
self.assertNotIn(self.status_url, urls) |
def testInvalidConfigIsCaught(self): |
- sys.argv.extend(['--verify', |
- '--json', self.gatekeeper_file]) |
+ sys.argv.extend(['--verify']) |
self.add_gatekeeper_section(self.masters[0].url, |
self.masters[0].builders[0].name, |
@@ -1657,10 +1701,9 @@ class GatekeeperTest(unittest.TestCase): |
# Check that the checked in gatekeeper.json is valid. |
def testCheckedInConfigIsValid(self): |
- sys.argv.extend(['--verify', |
- '--json', |
- os.path.join(SCRIPT_DIR, os.pardir, 'gatekeeper.json')]) |
- self.call_gatekeeper() |
+ sys.argv.extend(['--verify']) |
+ self.call_gatekeeper( |
+ json=os.path.join(SCRIPT_DIR, os.pardir, 'gatekeeper.json')) |
if __name__ == '__main__': |