| #!/usr/bin/python |
| # Copyright 2018 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import logging |
| import unittest |
| |
| import common |
| |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.client.cros.video import histogram_verifier |
| import mock |
| |
| |
| class HistogramVerifierTest(unittest.TestCase): |
| """ |
| Tests histogram_verifier's module methods. |
| """ |
| |
| HISTOGRAM_TEXT_1 = '\n'.join([ |
| 'Histogram: Media.Engagement.ScoreAtPlayback recorded 29 samples, ' |
| 'mean = 44.8 (flags = 0x41)', |
| '0 ------------------------------------O ' |
| ' (6 = 20.7%)', |
| '1 ...', |
| '5 ------O ' |
| ' (1 = 3.4%) {20.7%}', |
| '6 ...', |
| '10 ------O ' |
| ' (1 = 3.4%) {24.1%}', |
| '11 ...', |
| '15 ------------------O ' |
| ' (3 = 10.3%) {27.6%}', |
| '16 ------------------------------O ' |
| ' (5 = 17.2%) {37.9%}', |
| '17 ...', |
| '89 ------------------------------------------------------------------' |
| '------O (12 = 41.4%) {55.2%}', |
| '90 ------O ' |
| ' (1 = 3.4%) {96.6%}', |
| '91 ... ']) |
| |
| |
| def test_parse_histogram(self): |
| """ |
| Tests parse_histogram(). |
| """ |
| self.assertDictEqual( |
| {0: 6, 5: 1, 10: 1, 15: 3, 16: 5, 89: 12, 90: 1}, |
| histogram_verifier.parse_histogram(self.HISTOGRAM_TEXT_1)) |
| self.assertDictEqual({}, histogram_verifier.parse_histogram('')) |
| |
| def test_subtract_histogram(self): |
| """ |
| Tests subtract_histogram(). |
| """ |
| self.assertDictEqual({}, histogram_verifier.subtract_histogram({}, {})) |
| self.assertDictEqual( |
| {0: 10}, |
| histogram_verifier.subtract_histogram({0: 10}, {})) |
| self.assertDictEqual( |
| {0: -10}, |
| histogram_verifier.subtract_histogram({}, {0: 10})) |
| self.assertDictEqual( |
| {0: 10}, |
| histogram_verifier.subtract_histogram({0: 10}, {})) |
| self.assertDictEqual( |
| {0: 1}, |
| histogram_verifier.subtract_histogram({0: 1, 15:4}, {0:0, 15:4})) |
| |
| |
| class PollHistogramDifferBase(unittest.TestCase): |
| """ |
| Base class to test methods that polls HistogramDiffer. |
| |
| It mocks HistogramDiffer.end() to facilitate its callers' unittest. |
| It mocks utils.Timer so that it times out on the third |
| sleep() call. |
| """ |
| def setUp(self): |
| self.histogram_name = 'mock_histogram' |
| self.bucket_name = 'mock_bucket' |
| self.differ = histogram_verifier.HistogramDiffer( |
| None, self.histogram_name, begin=False) |
| self.differ.end = mock.Mock() |
| |
| self.time_patcher = mock.patch.object(histogram_verifier.utils.Timer, |
| 'sleep') |
| # Timeout at the third call of sleep(). |
| self.sleep_mock = self.time_patcher.start() |
| self.sleep_mock.side_effect = [True, True, False] |
| |
| def tearDown(self): |
| self.time_patcher.stop() |
| |
| |
| class ExpectSoleBucketTest(PollHistogramDifferBase): |
| """ |
| Tests histogram_verifier.expect_sole_bucket(). |
| """ |
| def test_diff_sole_bucket(self): |
| """ |
| Tests expect_sole_bucket() with sole bucket. |
| """ |
| self.differ.end.side_effect = [{self.bucket_name:1}] |
| self.assertTrue(histogram_verifier.expect_sole_bucket( |
| self.differ, self.bucket_name, self.bucket_name)) |
| |
| def test_diff_second_time(self): |
| """ |
| Tests expect_sole_bucket() with sole bucket on the second poll. |
| """ |
| # First time return empty. |
| self.differ.end.side_effect = [{}, {self.bucket_name:1}] |
| self.assertTrue(histogram_verifier.expect_sole_bucket( |
| self.differ, self.bucket_name, self.bucket_name)) |
| |
| def test_diff_more_than_one_bucket(self): |
| """ |
| Tests expect_sole_bucket() with more than one bucket. |
| """ |
| self.differ.end.side_effect = [{self.bucket_name:1, 'unexpected':1}] |
| with self.assertRaisesRegexp( |
| error.TestError, |
| '%s has bucket other than %s' % (self.histogram_name, |
| self.bucket_name)): |
| histogram_verifier.expect_sole_bucket(self.differ, self.bucket_name, |
| self.bucket_name) |
| |
| def test_diff_nothing(self): |
| """ |
| Tests expect_sole_bucket() with no bucket. |
| """ |
| self.differ.end.side_effect = [{}, {}] |
| with self.assertRaisesRegexp( |
| error.TestError, |
| 'Expect %s has %s' % (self.histogram_name, self.bucket_name)): |
| histogram_verifier.expect_sole_bucket(self.differ, self.bucket_name, |
| self.bucket_name) |
| |
| def test_diff_too_late(self): |
| """ |
| Tests expect_sole_bucket() with bucket arrives too late. |
| """ |
| # differ polls histogram diff twice. But the bucket comes at the third |
| # polling call. |
| self.differ.end.side_effect = [{}, {}, {self.bucket_name: 1}] |
| with self.assertRaisesRegexp( |
| error.TestError, |
| 'Expect %s has %s' % (self.histogram_name, self.bucket_name)): |
| histogram_verifier.expect_sole_bucket(self.differ, self.bucket_name, |
| self.bucket_name) |
| |
| class PollHistogramGrowTest(PollHistogramDifferBase): |
| """ |
| Tests histogram_verifier.poll_histogram_grow(). |
| """ |
| def test_diff_sole_bucket(self): |
| """ |
| Tests poll_histogram_grow() with sole bucket. |
| """ |
| self.differ.end.side_effect = [{self.bucket_name:1}] |
| is_grow, histogram = histogram_verifier.poll_histogram_grow( |
| self.differ, self.bucket_name, self.bucket_name) |
| self.assertTrue(is_grow) |
| self.assertDictEqual({self.bucket_name:1}, histogram) |
| |
| def test_diff_nochange(self): |
| """ |
| Tests expect_sole_bucket() with sole bucket on the second poll. |
| """ |
| self.differ.end.side_effect = [{}, {}, {}] |
| is_grow, histogram = histogram_verifier.poll_histogram_grow( |
| self.differ, self.bucket_name, self.bucket_name) |
| self.assertFalse(is_grow) |
| self.assertDictEqual({}, histogram) |
| |
| |
| class HistogramDifferTest(unittest.TestCase): |
| """ |
| Tests histogram_verifier.HistogramDiffer class. |
| """ |
| |
| HISTOGRAM_BEGIN = '\n'.join([ |
| 'Histogram: Media.GpuVideoDecoderInitializeStatus recorded 3521 samples' |
| ', mean = 2.7 (flags = 0x41)', |
| '0 ------------------------------------------------------------------' |
| '------O (2895 = 82.2%)', |
| '1 ...', |
| '15 ----------------O ' |
| ' (626 = 17.8%) {82.2%}', |
| '16 ... ']) |
| |
| HISTOGRAM_END = '\n'.join([ |
| 'Histogram: Media.GpuVideoDecoderInitializeStatus recorded 3522 samples' |
| ', mean = 2.7 (flags = 0x41)', |
| '0 ------------------------------------------------------------------' |
| '------O (2896 = 82.2%)', |
| '1 ...', |
| '15 ----------------O ' |
| ' (626 = 17.8%) {82.2%}', |
| '16 ... ']) |
| |
| HISTOGRAM_NAME = 'Media.GpuVideoDecoderInitializeStatus' |
| |
| def test_init(self): |
| """ |
| Tests __init__(). |
| """ |
| differ = histogram_verifier.HistogramDiffer(None, self.HISTOGRAM_NAME, |
| begin=False) |
| self.assertEqual(self.HISTOGRAM_NAME, differ.histogram_name) |
| self.assertDictEqual({}, differ.begin_histogram) |
| self.assertDictEqual({}, differ.end_histogram) |
| |
| def test_begin_end(self): |
| """ |
| Tests HistogramDiffer's begin() and end(). |
| |
| Mocks out HistogramDiffer.get_histogram() to simplify test. |
| """ |
| |
| differ = histogram_verifier.HistogramDiffer(None, self.HISTOGRAM_NAME, |
| begin=False) |
| differ._get_histogram = mock.Mock( |
| side_effect = [ |
| (histogram_verifier.parse_histogram(self.HISTOGRAM_BEGIN), |
| self.HISTOGRAM_BEGIN), |
| (histogram_verifier.parse_histogram(self.HISTOGRAM_END), |
| self.HISTOGRAM_END)]) |
| differ.begin() |
| self.assertDictEqual({0: 1}, differ.end()) |
| |
| def test_histogram_unchange(self): |
| """ |
| Tests HistogramDiffer with histogram unchanged. |
| |
| Expects no difference. |
| """ |
| differ = histogram_verifier.HistogramDiffer(None, self.HISTOGRAM_NAME, |
| begin=False) |
| differ._get_histogram = mock.Mock( |
| side_effect = [ |
| (histogram_verifier.parse_histogram(self.HISTOGRAM_BEGIN), |
| self.HISTOGRAM_BEGIN), |
| (histogram_verifier.parse_histogram(self.HISTOGRAM_BEGIN), |
| self.HISTOGRAM_BEGIN)]) |
| differ.begin() |
| self.assertDictEqual({}, differ.end()) |
| |
| |
| if __name__ == '__main__': |
| logging.basicConfig( |
| level=logging.DEBUG, |
| format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') |
| unittest.main() |