1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)from __future__ import print_function 6b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from extensions_paths import SERVER2 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import logging 9b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)import os 10b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)import sys 11b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)def CaptureLogging(f): 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) '''Call the function |f|, capturing any logging output generated. |f| must 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) take no arguments. Returns a list of LogRecords that were emitted. 1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ''' 1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) output = [] 1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) class Capture(object): 1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) def filter(self, record): 2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) output.append(record) 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) cf = Capture() 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) logging.getLogger('').addFilter(cf) 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) f() 2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) logging.getLogger('').removeFilter(cf) 2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return output 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 30b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)def EnableLogging(name): 31b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) '''Returns the output of the log with |name| to stdout. 32b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ''' 3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return _ReplaceLogging(name, lambda message, *args: print(message % args)) 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)def DisableLogging(name): 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) '''Disables the log with |name| for the duration of the decorated function. 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ''' 403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return _ReplaceLogging(name, lambda _, *args: None) 41b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 43b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)def _ReplaceLogging(name, replacement): 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) def decorator(fn): 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) def impl(*args, **optargs): 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) saved = getattr(logging, name) 47b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) setattr(logging, name, replacement) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) try: 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return fn(*args, **optargs) 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) finally: 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) setattr(logging, name, saved) 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return impl 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return decorator 54b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)def ChromiumPath(*path): 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) abspath = os.path.join( 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sys.path[0], '..', '..', '..', '..', '..', *path) 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) # os.path.relpath kills any trailing '/'. 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return os.path.relpath(abspath) + ('/' if abspath.endswith('/') else '') 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)def Server2Path(*path): 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ChromiumPath(SERVER2, *path) 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)def ReadFile(*path, **read_args): 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) with open(ChromiumPath(*path), **read_args) as f: 69b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return f.read() 70