15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/python 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import sys 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import time 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RPCListener(object): 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def __init__(self, shutdown_callback): 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.shutdown_callback = shutdown_callback 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.prefix = '|||| ' 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.ever_failed = False 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.start_time = time.time() 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def Log(self, message): 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Display the number of milliseconds since startup. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # This gives us additional data for debugging bot behavior. 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefix = '[%6s ms] ' % int((time.time()-self.start_time)*1000) + self.prefix 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lines = [line.rstrip() for line in message.split('\n')] 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text = ''.join(['%s%s\n' % (prefix, line) for line in lines]) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sys.stdout.write(text) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def TestLog(self, message): 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.Log(message) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 'OK' 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Something went very wrong on the server side, everything is horked? 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Only called locally. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def ServerError(self, message): 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.Log('\n[SERVER_ERROR] %s' % (message,)) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.ever_failed = True 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._TestingDone() 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 'OK' 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Does nothing. Called to prevent timeouts. (The server resets the timeout 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # every time it receives a GET request.) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def Ping(self): 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 'OK' 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # This happens automatically, as long as the renderer process has not crashed. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def JavaScriptIsAlive(self): 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 'OK' 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def Shutdown(self, message, passed): 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.Log(message) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # This check looks slightly backwards, but this is intentional. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Everything but passed.lower() == 'true' is considered a failure. This 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # means that if the test runner sends garbage, it will be a failure. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # NOTE in interactive mode this function may be called multiple times. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # ever_failed is designed to be set and never reset - if any of the runs 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # fail, the an error code will be returned to the command line. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # In summary, the tester is biased towards failure - it should scream "FAIL" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # if things are not 100% correct. False positives must be avoided. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if passed.lower() != 'true': 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.ever_failed = True 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) close_browser = self._TestingDone() 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if close_browser: 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 'Die, please' 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 'OK' 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def _TestingDone(self): 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return self.shutdown_callback() 68