test_util.py revision f2477e01787aa58f445919b809d89e252beef54f
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
7import logging
8import os
9import sys
10
11
12def CaptureLogging(f):
13  '''Call the function |f|, capturing any logging output generated. |f| must
14  take no arguments. Returns a list of LogRecords that were emitted.
15  '''
16  output = []
17  class Capture(object):
18    def filter(self, record):
19      output.append(record)
20
21  cf = Capture()
22  logging.getLogger('').addFilter(cf)
23  f()
24  logging.getLogger('').removeFilter(cf)
25
26  return output
27
28
29def EnableLogging(name):
30  '''Returns the output of the log with |name| to stdout.
31  '''
32
33  return _ReplaceLogging(name, lambda message, *args: print(message % args))
34
35
36def DisableLogging(name):
37  '''Disables the log with |name| for the duration of the decorated function.
38  '''
39  return _ReplaceLogging(name, lambda _, *args: None)
40
41
42def _ReplaceLogging(name, replacement):
43  def decorator(fn):
44    def impl(*args, **optargs):
45      saved = getattr(logging, name)
46      setattr(logging, name, replacement)
47      try:
48        return fn(*args, **optargs)
49      finally:
50        setattr(logging, name, saved)
51    return impl
52  return decorator
53
54
55def ChromiumPath(*path):
56  return os.path.join(
57      sys.path[0], '..', '..', '..', '..', '..', *path)
58
59
60def ReadFile(*path, **read_args):
61  with open(ChromiumPath(*path), **read_args) as f:
62    return f.read()
63