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