clean up NRWT logging/metering, be less verbose
[WebKit-https.git] / Tools / Scripts / webkitpy / layout_tests / views / metered_stream_unittest.py
1 #!/usr/bin/python
2 # Copyright (C) 2010, 2012 Google Inc. All rights reserved.
3 #
4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions are
6 # met:
7 #
8 #     * Redistributions of source code must retain the above copyright
9 # notice, this list of conditions and the following disclaimer.
10 #     * Redistributions in binary form must reproduce the above
11 # copyright notice, this list of conditions and the following disclaimer
12 # in the documentation and/or other materials provided with the
13 # distribution.
14 #     * Neither the name of Google Inc. nor the names of its
15 # contributors may be used to endorse or promote products derived from
16 # this software without specific prior written permission.
17 #
18 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30 import logging
31 import re
32 import StringIO
33 import unittest
34
35 from webkitpy.layout_tests.views.metered_stream import MeteredStream
36
37
38 class RegularTest(unittest.TestCase):
39     verbose = False
40     isatty = False
41
42     def setUp(self):
43         self.stream = StringIO.StringIO()
44         self.buflist = self.stream.buflist
45         self.stream.isatty = lambda: self.isatty
46
47         # configure a logger to test that log calls do normally get included.
48         self.logger = logging.getLogger(__name__)
49         self.logger.setLevel(logging.DEBUG)
50         self.logger.propagate = False
51
52         # add a dummy time counter for a default behavior.
53         self.times = range(10)
54
55         self.meter = MeteredStream(self.stream, self.verbose, self.logger, self.time_fn, 8675)
56
57     def tearDown(self):
58         if self.meter:
59             self.meter.cleanup()
60             self.meter = None
61
62     def time_fn(self):
63         return self.times.pop(0)
64
65     def test_logging_not_included(self):
66         # This tests that if we don't hand a logger to the MeteredStream,
67         # nothing is logged.
68         logging_stream = StringIO.StringIO()
69         handler = logging.StreamHandler(logging_stream)
70         root_logger = logging.getLogger()
71         orig_level = root_logger.level
72         root_logger.addHandler(handler)
73         root_logger.setLevel(logging.DEBUG)
74         try:
75             self.meter = MeteredStream(self.stream, self.verbose, None, self.time_fn, 8675)
76             self.meter.write_throttled_update('foo')
77             self.meter.write_update('bar')
78             self.meter.write('baz')
79             self.assertEquals(logging_stream.buflist, [])
80         finally:
81             root_logger.removeHandler(handler)
82             root_logger.setLevel(orig_level)
83
84     def _basic(self, times):
85         self.times = times
86         self.meter.write_update('foo')
87         self.meter.write_update('bar')
88         self.meter.write_throttled_update('baz')
89         self.meter.write_throttled_update('baz 2')
90         self.meter.writeln('done')
91         self.assertEquals(self.times, [])
92         return self.buflist
93
94     def test_basic(self):
95         buflist = self._basic([0, 1, 2, 13, 14])
96         self.assertEquals(buflist, ['foo\n', 'bar\n', 'baz 2\n', 'done\n'])
97
98     def _log_after_update(self):
99         self.meter.write_update('foo')
100         self.logger.info('bar')
101         return self.buflist
102
103     def test_log_after_update(self):
104         buflist = self._log_after_update()
105         self.assertEquals(buflist, ['foo\n', 'bar\n'])
106
107
108 class TtyTest(RegularTest):
109     verbose = False
110     isatty = True
111
112     def test_basic(self):
113         buflist = self._basic([0, 1, 1.05, 1.1, 2])
114         self.assertEquals(buflist, ['foo',
115                                      MeteredStream._erasure('foo'), 'bar',
116                                      MeteredStream._erasure('bar'), 'baz 2',
117                                      MeteredStream._erasure('baz 2'), 'done\n'])
118
119     def test_log_after_update(self):
120         buflist = self._log_after_update()
121         self.assertEquals(buflist, ['foo',
122                                      MeteredStream._erasure('foo'), 'bar\n'])
123
124
125 class VerboseTest(RegularTest):
126     isatty = False
127     verbose = True
128
129     def test_basic(self):
130         buflist = self._basic([0, 1, 2.1, 13, 14.1234])
131         self.assertEquals(buflist, ['16:00:00.000 8675 foo\n', '16:00:01.000 8675 bar\n', '16:00:13.000 8675 baz 2\n', '16:00:14.123 8675 done\n'])
132
133     def test_log_after_update(self):
134         buflist = self._log_after_update()
135         self.assertEquals(buflist[0], '16:00:00.000 8675 foo\n')
136
137         # The second argument should have a real timestamp and pid, so we just check the format.
138         self.assertEquals(len(buflist), 2)
139         self.assertTrue(re.match('\d\d:\d\d:\d\d.\d\d\d \d+ bar\n', buflist[1]))
140
141
142 if __name__ == '__main__':
143     unittest.main()