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