1# Copyright 2013 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5from __future__ import print_function
6
7from extensions_paths import SERVER2
8import logging
9import os
10import sys
11
12
13def CaptureLogging(f):
14  '''Call the function |f|, capturing any logging output generated. |f| must
15  take no arguments. Returns a list of LogRecords that were emitted.
16  '''
17  output = []
18  class Capture(object):
19    def filter(self, record):
20      output.append(record)
21
22  cf = Capture()
23  logging.getLogger('').addFilter(cf)
24  f()
25  logging.getLogger('').removeFilter(cf)
26
27  return output
28
29
30def EnableLogging(name):
31  '''Returns the output of the log with |name| to stdout.
32  '''
33
34  return _ReplaceLogging(name, lambda message, *args: print(message % args))
35
36
37def DisableLogging(name):
38  '''Disables the log with |name| for the duration of the decorated function.
39  '''
40  return _ReplaceLogging(name, lambda _, *args: None)
41
42
43def _ReplaceLogging(name, replacement):
44  def decorator(fn):
45    def impl(*args, **optargs):
46      saved = getattr(logging, name)
47      setattr(logging, name, replacement)
48      try:
49        return fn(*args, **optargs)
50      finally:
51        setattr(logging, name, saved)
52    return impl
53  return decorator
54
55
56def ChromiumPath(*path):
57  abspath = os.path.join(
58      sys.path[0], '..', '..', '..', '..', '..', *path)
59  # os.path.relpath kills any trailing '/'.
60  return os.path.relpath(abspath) + ('/' if abspath.endswith('/') else '')
61
62
63def Server2Path(*path):
64  return ChromiumPath(SERVER2, *path)
65
66
67def ReadFile(*path, **read_args):
68  with open(ChromiumPath(*path), **read_args) as f:
69    return f.read()
70