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)
示例#7
0
  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)
示例#8
0
 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())