133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# Copyright 2013 The Chromium Authors. All rights reserved.
233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# Use of this source code is governed by a BSD-style license that can be
333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# found in the LICENSE file.
433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckimport os
533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckimport unittest
633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom telemetry import story
833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom telemetry import page as page_module
933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom telemetry import value
1033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom telemetry.value import histogram as histogram_module
1133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom telemetry.value import improvement_direction
1233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
1333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
1433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass TestBase(unittest.TestCase):
1533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  def setUp(self):
1633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    story_set = story.StorySet(base_dir=os.path.dirname(__file__))
1733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    story_set.AddStory(
1833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        page_module.Page("http://www.bar.com/", story_set, story_set.base_dir))
1933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    story_set.AddStory(
2033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        page_module.Page("http://www.baz.com/", story_set, story_set.base_dir))
2133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    story_set.AddStory(
2233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        page_module.Page("http://www.foo.com/", story_set, story_set.base_dir))
2333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self.story_set = story_set
2433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
2533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  @property
2633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  def pages(self):
2733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    return self.story_set.stories
2833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
2933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass ValueTest(TestBase):
3033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  def testRepr(self):
3133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    page = self.pages[0]
3233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    v = histogram_module.HistogramValue(
3333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            page, 'x', 'counts',
3433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck           raw_value_json='{"buckets": [{"low": 1, "high": 2, "count": 1}]}',
3533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck           important=True, description='desc', tir_label='my_ir',
3633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck           improvement_direction=improvement_direction.UP)
3733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    expected = ('HistogramValue(http://www.bar.com/, x, counts, '
3833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                'raw_json_string={"buckets": [{"low": 1, "high": 2, "count": '
3933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                '1}]}, important=True, description=desc, tir_label=my_ir, '
4033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                'improvement_direction=up, grouping_keys={})')
4133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
4233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self.assertEquals(expected, str(v))
4333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
4433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  def testHistogramBasic(self):
4533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    page0 = self.pages[0]
4633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    histogram = histogram_module.HistogramValue(
4733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        page0, 'x', 'counts',
4833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        raw_value_json='{"buckets": [{"low": 1, "high": 2, "count": 1}]}',
4933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        important=False, improvement_direction=improvement_direction.UP)
5033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self.assertEquals(
5133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      ['{"buckets": [{"low": 1, "high": 2, "count": 1}]}'],
5233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      histogram.GetBuildbotValue())
5333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self.assertEquals(1.5,
5433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                      histogram.GetRepresentativeNumber())
5533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self.assertEquals(
5633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      ['{"buckets": [{"low": 1, "high": 2, "count": 1}]}'],
5733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      histogram.GetBuildbotValue())
5833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
5933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self.assertEquals(
6033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        'unimportant-histogram',
6133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        histogram.GetBuildbotDataType(value.SUMMARY_RESULT_OUTPUT_CONTEXT))
6233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    histogram.important = True
6333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self.assertEquals(
6433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        'histogram',
6533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        histogram.GetBuildbotDataType(value.SUMMARY_RESULT_OUTPUT_CONTEXT))
6633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
6733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  def testBucketAsDict(self):
6833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    bucket = histogram_module.HistogramValueBucket(33, 45, 78)
6933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    d = bucket.AsDict()
7033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
7133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self.assertEquals(d, {
7233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck          'low': 33,
7333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck          'high': 45,
7433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck          'count': 78
7533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        })
7633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
7733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  def testAsDict(self):
7833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    histogram = histogram_module.HistogramValue(
7933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        None, 'x', 'counts',
8033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        raw_value_json='{"buckets": [{"low": 1, "high": 2, "count": 1}]}',
8133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        important=False, improvement_direction=improvement_direction.DOWN)
8233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    d = histogram.AsDictWithoutBaseClassEntries()
8333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
8433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self.assertEquals(['buckets'], d.keys())
8533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self.assertTrue(isinstance(d['buckets'], list))
8633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self.assertEquals(len(d['buckets']), 1)
8733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
8833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  def testFromDict(self):
8933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    d = {
9033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      'type': 'histogram',
9133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      'name': 'x',
9233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      'units': 'counts',
9333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      'buckets': [{'low': 1, 'high': 2, 'count': 1}],
9433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      'improvement_direction': 'down',
9533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    }
9633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    v = value.Value.FromDict(d, {})
9733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
9833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self.assertTrue(isinstance(v, histogram_module.HistogramValue))
9933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self.assertEquals(
10033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      ['{"buckets": [{"low": 1, "high": 2, "count": 1}]}'],
10133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      v.GetBuildbotValue())
10233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self.assertEquals(improvement_direction.DOWN, v.improvement_direction)
10333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
10433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  def testFromDictWithoutImprovementDirection(self):
10533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    d = {
10633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      'type': 'histogram',
10733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      'name': 'x',
10833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      'units': 'counts',
10933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      'buckets': [{'low': 1, 'high': 2, 'count': 1}],
11033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    }
11133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    v = value.Value.FromDict(d, {})
11233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
11333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self.assertTrue(isinstance(v, histogram_module.HistogramValue))
11433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self.assertIsNone(v.improvement_direction)
11533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
11633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  def testMergeLikeValuesFromSamePage(self):
11733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    d1 = {
11833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      'type': 'histogram',
11933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      'name': 'x',
12033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      'units': 'counts',
12133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      'description': 'histogram-based metric',
12233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      'buckets': [{'low': 1, 'high': 3, 'count': 1}],
12333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    }
12433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
12533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    d2 = {
12633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      'type': 'histogram',
12733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      'name': 'x',
12833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      'units': 'counts',
12933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      'description': 'histogram-based metric',
13033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      'buckets': [{'low': 2, 'high': 4, 'count': 1}],
13133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    }
13233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
13333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    v0, v1 = value.Value.FromDict(d1, {}), value.Value.FromDict(d2, {})
13433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
13533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    vM = histogram_module.HistogramValue.MergeLikeValuesFromSamePage([v0, v1])
13633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self.assertTrue(isinstance(vM, histogram_module.HistogramValue))
13733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    self.assertEquals('histogram-based metric', vM.description)
138