| # Copyright 2015 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import json |
| import re |
| import unittest |
| |
| import mock |
| import webapp2 |
| import webtest |
| |
| from dashboard import buildbucket_job_status |
| from dashboard import testing_common |
| |
| |
| SAMPLE_RESPONSE = r"""{ |
| "build": { |
| "status": "COMPLETED", |
| "created_ts": "1430771172999340", |
| "url": "http://build.chromium.org/p/tryserver.chromium.perf/builders\ |
| /linux_perf_bisector/builds/32", |
| "bucket": "master.tryserver.chromium.perf", |
| "result_details_json": "{\"properties\": {\ |
| \"got_nacl_revision\": \"660eb1e1c91349b53f0d60bbf9a92e31f4cf4e1d\", \ |
| \"got_swarming_client_revision\": \ |
| \"f222001cc23c7cdb574bf4cfb447f65c94bc6da3\", \ |
| \"got_revision\": \"d558f46c34085abfc9f59824fdc3466f45c40152\", \ |
| \"build_url\": \"gs://chrome-perf/Linux Bisector\", \ |
| \"recipe\": \"bisect\", \ |
| \"got_webrtc_revision_cp\": \"refs/heads/master@{#9128}\", \ |
| \"got_webkit_revision_git\": \"44bf01091874592828070dc26cbb5189da9b959b\", \ |
| \"append_deps_patch_sha\": true, \ |
| \"project\": \"\", \ |
| \"got_webkit_revision\": 194864, \ |
| \"slavename\": \"build74-m4\", \ |
| \"got_revision_cp\": \"refs/heads/master@{#328178}\", \ |
| \"blamelist\": [], \ |
| \"branch\": \"\", \ |
| \"revision\": \"\", \ |
| \"workdir\": \"/b/build/slave/linux_perf_bisector\", \ |
| \"repository\": \"\", \ |
| \"buildername\": \"linux_perf_bisector\", \ |
| \"got_webrtc_revision\": \"0d778c6af22767e9bcc92a278da08b5f82885977\", \ |
| \"mastername\": \"tryserver.chromium.perf\", \ |
| \"got_v8_revision\": \"a06f1b4e013812cc7ad1d52a0ea49206cafa7b67\", \ |
| \"got_v8_revision_cp\": \"refs/heads/4.4.50@{#1}\", \ |
| \"buildbotURL\": \"http://build.chromium.org/p/tryserver.chromium.perf/\", \ |
| \"bisect_config\": {\"good_revision\": \"328111\", \ |
| \"builder_host\": null, \ |
| \"metric\": \"record_time/record_time\", \ |
| \"max_time_minutes\": \"20\", \ |
| \"builder_port\": null, \ |
| \"bug_id\": null, \ |
| \"command\": \"src/tools/perf/run_benchmark -v --browser=release \ |
| rasterize_and_record_micro.key_mobile_sites_smooth\", \ |
| \"repeat_count\": \"20\", \ |
| \"test_type\": \"perf\", \ |
| \"gs_bucket\": \"chrome-perf\", \ |
| \"bad_revision\": \"328115\"}, \ |
| \"got_webkit_revision_cp\": \"refs/heads/master@{#194864}\", \ |
| \"buildnumber\": 32, \ |
| \"requestedAt\": 1430771180}}", |
| "status_changed_ts": "1430771433288620", |
| "created_by": "user:425761728072-pa1bs18esuhp2cp2qfa1u9vb6p1v6kfu\ |
| @developer.gserviceaccount.com", |
| "failure_reason": "BUILD_FAILURE", |
| "result": "FAILURE", |
| "utcnow_ts": "1430863009872910", |
| "id": "9046721402459257808", |
| "parameters_json": "{\"builder_name\": \"linux_perf_bisector\", \ |
| \"properties\": {\"bisect_config\": {\"bad_revision\": \"328115\", \ |
| \"bug_id\": null, \ |
| \"builder_host\": null, \ |
| \"builder_port\": null, \ |
| \"command\": \"src/tools/perf/run_benchmark -v --browser=release \ |
| rasterize_and_record_micro.key_mobile_sites_smooth\", \ |
| \"good_revision\": \"328111\", \ |
| \"gs_bucket\": \"chrome-perf\", \ |
| \"max_time_minutes\": \"20\", \ |
| \"metric\": \"record_time/record_time\", \ |
| \"repeat_count\": \"20\", \ |
| \"test_type\": \"perf\"}}}", |
| "completed_ts": "1430771433288680", |
| "updated_ts": "1430771433288850" |
| }, |
| "kind": "buildbucket#resourcesItem", |
| "etag": "\"mWAxLWqIHM8gXvavjiTVUApk92U/AaU08KGmhFQcdRWOCVgNYJBBlgI\"" |
| }""".replace('\\\n', '') |
| |
| SAMPLE_RESPONSE_NOT_FOUND = r"""{ |
| "error": { |
| "message": "", |
| "reason": "BUILD_NOT_FOUND" |
| }, |
| "kind": "buildbucket#resourcesItem", |
| "etag": "\"mWAxLWqIHM8gXvavjiTVUApk92U/vcsTyxWNZoEnszG8qWqlQLOhpl8\"" |
| }""" |
| |
| |
| |
| class BuildbucketJobStatusTest(testing_common.TestCase): |
| |
| def setUp(self): |
| super(BuildbucketJobStatusTest, self).setUp() |
| app = webapp2.WSGIApplication( |
| [(r'/buildbucket_job_status/(\d+)', |
| buildbucket_job_status.BuildbucketJobStatusHandler)]) |
| self.testapp = webtest.TestApp(app) |
| |
| @mock.patch.object( |
| buildbucket_job_status.buildbucket_service, 'GetJobStatus', |
| mock.MagicMock(return_value=json.loads(SAMPLE_RESPONSE))) |
| def testGet_ExistingJob(self): |
| response = self.testapp.get('/buildbucket_job_status/9046721402459257808') |
| # Verify that a human-readable creation time is presented. We check for the |
| # minute:second string to avoid localization from breaking this test. |
| self.assertIn('26:12', response.body) |
| # Verify that both the good and bad revisions are displayed somewhere. |
| self.assertIn('328115', response.body) |
| self.assertIn('328111', response.body) |
| # Verify that a link to buildbot is provided somewhere. |
| self.assertTrue( |
| re.search('href\\s*=\\s*[\'"]http://build.chromium.org/p/tryserver', |
| response.body, re.IGNORECASE)) |
| |
| @mock.patch.object( |
| buildbucket_job_status.buildbucket_service, 'GetJobStatus', |
| mock.MagicMock(return_value=json.loads(SAMPLE_RESPONSE_NOT_FOUND))) |
| def testGet_JobNotFound(self): |
| response = self.testapp.get('/buildbucket_job_status/9046721402459257808') |
| # If the error code is shown somewhere in the page and no exception is |
| # raised, that's good enough. |
| self.assertIn('BUILD_NOT_FOUND', response) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |