def testMerge(self): events = histogram.RelatedEventSet() events.Add({ 'stableId': '0.0', 'title': 'foo', 'start': 0, 'duration': 1, }) generic = histogram.Generic('generic diagnostic') generic2 = histogram.Generic('generic diagnostic 2') related_set = histogram.RelatedHistogramSet([ histogram.Histogram('histogram', 'count'), ]) hist = histogram.Histogram('', 'count') # When Histograms are merged, first an empty clone is created with an empty # DiagnosticMap. hist2 = histogram.Histogram('', 'count') hist2.diagnostics['a'] = generic hist.diagnostics.Merge(hist2.diagnostics, hist, hist2) self.assertIs(generic, hist.diagnostics['a']) # Separate keys are not merged. hist3 = histogram.Histogram('', 'count') hist3.diagnostics['b'] = generic2 hist.diagnostics.Merge(hist3.diagnostics, hist, hist3) self.assertIs(generic, hist.diagnostics['a']) self.assertIs(generic2, hist.diagnostics['b']) # Merging unmergeable diagnostics should produce an # UnmergeableDiagnosticSet. hist4 = histogram.Histogram('', 'count') hist4.diagnostics['a'] = related_set hist.diagnostics.Merge(hist4.diagnostics, hist, hist4) self.assertIsInstance(hist.diagnostics['a'], histogram.UnmergeableDiagnosticSet) diagnostics = list(hist.diagnostics['a']) self.assertIs(generic, diagnostics[0]) self.assertIs(related_set, diagnostics[1]) # UnmergeableDiagnosticSets are mergeable. hist5 = histogram.Histogram('', 'count') hist5.diagnostics['a'] = histogram.UnmergeableDiagnosticSet( [events, generic2]) hist.diagnostics.Merge(hist5.diagnostics, hist, hist5) self.assertIsInstance(hist.diagnostics['a'], histogram.UnmergeableDiagnosticSet) diagnostics = list(hist.diagnostics['a']) self.assertIs(generic, diagnostics[0]) self.assertIs(related_set, diagnostics[1]) self.assertIs(events, diagnostics[2]) self.assertIs(generic2, diagnostics[3])
def testReplaceSharedDiagnostic_NonRefAddsToMap(self): hist = histogram.Histogram('', 'unitless') hists = histogram_set.HistogramSet([hist]) diag0 = histogram.Generic('shared0') diag1 = histogram.Generic('shared1') hists.AddSharedDiagnostic('generic0', diag0) guid0 = diag0.guid guid1 = diag1.guid hists.ReplaceSharedDiagnostic(guid0, diag1) self.assertIsNotNone(hists.LookupDiagnostic(guid1))
def testMerge(self): t0 = histogram.TagMap({ 'tagsToStoryNames': { 'press': ['story0', 'story1'], 'desktop': ['story0', 'story1', 'story2'] }}) t1 = histogram.TagMap({ 'tagsToStoryNames': { 'press': ['story3', 'story4'], 'android': ['story3', 'story4', 'story5'] }}) self.assertFalse(t0.CanAddDiagnostic( histogram.Generic(''), None, None, None)) self.assertTrue(t0.CanAddDiagnostic(t1, None, None, None)) m0 = histogram.Diagnostic.FromDict(t0.AsDict()) self.assertTrue(isinstance(m0, histogram.TagMap)) self.assertFalse( m0.CanAddDiagnostic(histogram.Generic(''), None, None, None)) self.assertTrue(m0.CanAddDiagnostic(t1, None, None, None)) m0.AddDiagnostic(t1, None, None, None) m1 = histogram.Diagnostic.FromDict(t1.AsDict()) m1.AddDiagnostic(t0, None, None, None) self.assertDictEqual(m0.AsDict(), m1.AsDict()) m2 = histogram.Diagnostic.FromDict(t1.AsDict()) self.assertNotEqual(m2.AsDict(), m0.AsDict()) # Test round-tripping of merged diagnostic clone = histogram.Diagnostic.FromDict(m0.AsDict()) self.assertSetEqual( set(clone.tags_to_story_names.keys()), set(['press', 'desktop', 'android'])) self.assertSetEqual( clone.tags_to_story_names.get('press'), set(['story0', 'story1', 'story3', 'story4'])) self.assertSetEqual( clone.tags_to_story_names.get('desktop'), set(['story0', 'story1', 'story2'])) self.assertSetEqual( clone.tags_to_story_names.get('android'), set(['story3', 'story4', 'story5']))
def testSharedDiagnostic(self): hist = histogram.Histogram('', 'unitless') hists = histogram.HistogramSet([hist]) diag = histogram.Generic('shared') hists.AddSharedDiagnostic('generic', diag) # Serializing a single Histogram with a single shared diagnostic should # produce 2 dicts. ds = hists.AsDicts() self.assertEqual(len(ds), 2) self.assertDeepEqual(diag.AsDict(), ds[0]) # The serialized Histogram should refer to the shared diagnostic by its # guid. self.assertEqual(ds[1]['diagnostics']['generic'], diag.guid) # Deserialize ds. hists2 = histogram.HistogramSet() hists2.ImportDicts(ds) self.assertEqual(len(hists2), 1) hist2 = [h for h in hists2][0] # The diagnostic reference should be deserialized as a DiagnosticRef until # resolveRelatedHistograms is called. self.assertIsInstance(hist2.diagnostics.get('generic'), histogram.DiagnosticRef) hists2.ResolveRelatedHistograms() self.assertIsInstance(hist2.diagnostics.get('generic'), histogram.Generic) self.assertEqual(diag.value, hist2.diagnostics.get('generic').value)
def testReplaceSharedDiagnostic(self): hist = histogram.Histogram('', 'unitless') hists = histogram_set.HistogramSet([hist]) diag0 = histogram.Generic('shared0') diag1 = histogram.Generic('shared1') hists.AddSharedDiagnostic('generic0', diag0) hists.AddSharedDiagnostic('generic1', diag1) guid0 = diag0.guid guid1 = diag1.guid hists.ReplaceSharedDiagnostic(guid0, histogram.DiagnosticRef('fakeGuid')) self.assertEqual(hist.diagnostics['generic0'].guid, 'fakeGuid') self.assertEqual(hist.diagnostics['generic1'].guid, guid1)
def testGetSharedDiagnosticsOfType(self): d0 = histogram.Generic('foo') d1 = histogram.TelemetryInfo() hs = histogram_set.HistogramSet() hs.AddSharedDiagnostic('generic', d0) hs.AddSharedDiagnostic('generic', d1) diagnostics = hs.GetSharedDiagnosticsOfType(histogram.Generic) self.assertEqual(len(diagnostics), 1) self.assertIsInstance(diagnostics[0], histogram.Generic)
def testFindHistogramLevelSparseDiagnostics(self): histogram = histogram_module.Histogram('hist', 'count') histograms = histogram_module.HistogramSet([histogram]) histograms.AddSharedDiagnostic('foo', histogram_module.Generic('bar')) histograms.AddSharedDiagnostic( 'telemetry', histogram_module.TelemetryInfo()) diagnostics = add_histograms.FindHistogramLevelSparseDiagnostics( histogram.guid, histograms) self.assertEqual(1, len(diagnostics)) self.assertIsInstance(diagnostics[0], histogram_module.TelemetryInfo)
def testInlineSharedDiagnostic(self): generic = histogram.Generic('generic diagnostic') hist = histogram.Histogram('', 'count') _ = generic.guid # First access sets guid hist.diagnostics['foo'] = generic generic.Inline() self.assertTrue(generic.is_inline) hist_dict = hist.AsDict() diag_dict = hist_dict['diagnostics']['foo'] self.assertIsInstance(diag_dict, dict) self.assertEqual(diag_dict['type'], 'Generic')
def testSerializationSize(self): hist = histogram.Histogram('', 'unitless', self.TEST_BOUNDARIES) d = hist.AsDict() self.assertEqual(107, len(ToJSON(d))) self.assertIsNone(d.get('allBins')) self.assertDeepEqual(d, histogram.Histogram.FromDict(d).AsDict()) hist.AddSample(100) d = hist.AsDict() self.assertEqual(198, len(ToJSON(d))) self.assertIsInstance(d['allBins'], dict) self.assertDeepEqual(d, histogram.Histogram.FromDict(d).AsDict()) hist.AddSample(100) d = hist.AsDict() # SAMPLE_VALUES grew by "100," self.assertEqual(202, len(ToJSON(d))) self.assertIsInstance(d['allBins'], dict) self.assertDeepEqual(d, histogram.Histogram.FromDict(d).AsDict()) hist.AddSample(271, {'foo': histogram.Generic('bar')}) d = hist.AsDict() self.assertEqual(262, len(ToJSON(d))) self.assertIsInstance(d['allBins'], dict) self.assertDeepEqual(d, histogram.Histogram.FromDict(d).AsDict()) # Add samples to most bins so that allBinsArray is more efficient than # allBinsDict. for i in xrange(10, 100): hist.AddSample(10 * i) d = hist.AsDict() self.assertEqual(691, len(ToJSON(d))) self.assertIsInstance(d['allBins'], list) self.assertDeepEqual(d, histogram.Histogram.FromDict(d).AsDict()) # Lowering maxNumSampleValues takes a random sub-sample of the existing # sampleValues. We have deliberately set all samples to 3-digit numbers so # that the serialized size is constant regardless of which samples are # retained. hist.max_num_sample_values = 10 d = hist.AsDict() self.assertEqual(383, len(ToJSON(d))) self.assertIsInstance(d['allBins'], list) self.assertDeepEqual(d, histogram.Histogram.FromDict(d).AsDict())