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