#!/usr/bin/env python # # Copyright (C) 2012 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. """ Executes WebView CTS tests and verifies results against known failures. """ import re import signal import subprocess import sys # Eventually this list will be empty! # If you add or remove tests from this lists please update the CTS # spreadsheet! EXPECTED_FAILURES = set([ 'android.webkit.cts.WebViewClientTest#testOnScaleChanged', 'android.webkit.cts.WebViewTest#testCapturePicture', # BUG=crbug.com/162967 'android.webkit.cts.WebViewTest#testPageScroll', 'android.webkit.cts.WebViewTest#testRequestChildRectangleOnScreen', 'android.webkit.cts.WebViewTest#testScrollBarOverlay', 'android.webkit.cts.WebViewTest#testSetInitialScale', 'android.webkit.cts.WebViewTest#testSetScrollBarStyle', 'android.webkit.cts.WebViewTest#testSetWebViewClient', 'android.webkit.cts.WebViewTest#testZoom', # b/8763845 'android.webkit.cts.WebViewTest#testFindAll', # b/8763944 'android.webkit.cts.WebViewTest#testGetContentHeight', # See b/8231433 for Geolocation test failures. 'android.webkit.cts.GeolocationTest#testSimpleGeolocationRequestAcceptAlways', 'android.webkit.cts.GeolocationTest#testSimpleGeolocationRequestReject', 'android.webkit.cts.GeolocationTest#testSimpleGeolocationRequestAcceptOnce', # b/9159785 'android.webkit.cts.WebViewTest#testFindNext', # b/5006389 'android.webkit.cts.WebViewTest#testFlingScroll', # b/9103603 'android.webkit.cts.WebViewTest#testRequestImageRef', # b/9121594 'android.webkit.cts.WebHistoryItemTest#testWebHistoryItem', # Don't forget to update the spreadsheet! :) ]) def main(): proc = None # Send INT signal to test runner and exit gracefully so not to lose all # output information in a run. def handler(signum, frame): if proc: proc.send_signal(signum) signal.signal(signal.SIGINT, handler) proc = subprocess.Popen( ['cts-tradefed', 'run', 'singleCommand', 'cts', '-p', 'android.webkit', '--screenshot-on-failure'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) (stdout, stderr) = proc.communicate(); passes = set(re.findall(r'.*: (.*) PASS', stdout)) failures = set(re.findall(r'.*: (.*) FAIL', stdout)) test_results = '%d passes; %d failures' % (len(passes), len(failures)) unexpected_passes = EXPECTED_FAILURES.difference(failures) if len(unexpected_passes) > 0: test_results += '\n' + 'UNEXPECTED PASSES (update expectations!):' for test in unexpected_passes: test_results += '\n' + '\t%s' % (test) unexpected_failures = failures.difference(EXPECTED_FAILURES) if len(unexpected_failures) > 0: test_results += '\n' + 'UNEXPECTED FAILURES (please fix!):' for test in unexpected_failures: test_results += '\n' + '\t%s' % (test) unexpected_failures_count = len(unexpected_failures) unexpected_passes_count = len(unexpected_passes) # on the buildbot this is most useful at the start print test_results print '\nstdout dump follows...' print stdout print '\n' # on the cmd line this is most useful at the end print test_results # Allow buildbot script to distinguish failures and possibly out of date # test expectations. if len(passes) + len(failures) < 100: print 'Ran less than 100 cts tests? Something must be wrong' return 2 elif unexpected_failures_count > 0: return 1 elif unexpected_passes_count >= 5: print ('More than 5 new passes? Either you''re running webview classic, or ' 'it really is time to fix failure expectations.') return 2 elif unexpected_passes_count > 0: return 3 # STEP_WARNINGS else: return 0 if __name__ == '__main__': sys.exit(main())