summaryrefslogtreecommitdiff
path: root/tools/findbuildbotwarnings.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/findbuildbotwarnings.py')
-rwxr-xr-xtools/findbuildbotwarnings.py96
1 files changed, 96 insertions, 0 deletions
diff --git a/tools/findbuildbotwarnings.py b/tools/findbuildbotwarnings.py
new file mode 100755
index 0000000000..a172dd6d71
--- /dev/null
+++ b/tools/findbuildbotwarnings.py
@@ -0,0 +1,96 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Outputs the warnings that are common to all builders.
+
+Suppressed tests that are nonetheless passing are output as warnings
+by vogar. Any tests that generate warnings in every builder are good
+candidates for no longer being suppressed, since they're passing on
+a regular basis."""
+
+import collections
+import json
+import requests
+
+# The number of recent builds to check for each builder
+NUM_BUILDS = 5
+# The buildbot step to check for warnings
+BUILDBOT_STEP = 'test libcore'
+
+
+def main():
+ # Dict from builder+build_num combination to the list of warnings
+ # in that build
+ warnings = collections.defaultdict(list)
+ r = requests.get('https://build.chromium.org/p/client.art/json/builders')
+ if r.status_code != 200:
+ print r.text
+ return
+ builders = json.loads(r.text)
+ for builder_name in sorted(builders):
+ # Build -1 is the currently-running build (if there is one), so we
+ # start with -2, which should be the most or second-most
+ # recently-completed build.
+ for build_num in range(-2, -2 - NUM_BUILDS, -1):
+ print ('Loading data for %s, build %d...'
+ % (builder_name, build_num))
+ r = requests.get(
+ 'https://build.chromium.org/p/client.art'
+ '/json/builders/%s/builds/%d' % (
+ builder_name, build_num))
+ if r.status_code != 200:
+ print r.text
+ return
+ builder = json.loads(r.text)
+ libcore_steps = [x for x in builder['steps']
+ if x['name'] == BUILDBOT_STEP]
+ for ls in libcore_steps:
+ stdio_logs = [x for x in ls['logs'] if x[0] == 'stdio']
+ for sl in stdio_logs:
+ # The default link is HTML, so append /text to get the
+ # text version
+ r = requests.get(sl[1] + '/text')
+ if r.status_code != 200:
+ print r.text
+ return
+ stdio = r.text.splitlines()
+
+ # Walk from the back of the list to find the start of the
+ # warnings summary
+ i = -1
+ try:
+ while not stdio[i].startswith('Warnings summary:'):
+ i -= 1
+ i += 1 # Ignore the "Warnings summary:" line
+ while i < -1:
+ warnings['%s:%d' % (builder_name, build_num)].append(stdio[i])
+ i += 1
+ except IndexError:
+ # Some builds don't have any
+ print ' No warnings section found.'
+ # sharedwarnings will build up the intersection of all the lists of
+ # warnings. We seed it with an arbitrary starting point (which is fine
+ # since intersection is commutative).
+ sharedwarnings = set(warnings.popitem()[1])
+ for warning_list in warnings.itervalues():
+ sharedwarnings = sharedwarnings & set(warning_list)
+ print 'Warnings shared across all builders:'
+ for warning in sorted(list(sharedwarnings)):
+ print warning
+
+
+if __name__ == '__main__':
+ main()