blob: 6dee21286d5d8ef74f543579895e713ca9e533d5 [file] [log] [blame]
#!/usr/bin/python2
# 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()