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 testRelatedHistogramSet(self):
        a = histogram.Histogram('a', 'unitless')
        b = histogram.Histogram('b', 'unitless')
        c = histogram.Histogram('c', 'unitless')
        a.diagnostics['rhs'] = histogram.RelatedHistogramSet([b, c])

        # Don't serialize c yet.
        hists = histogram.HistogramSet([a, b])
        hists2 = histogram.HistogramSet()
        hists2.ImportDicts(hists.AsDicts())
        hists2.ResolveRelatedHistograms()
        a2 = hists2.GetHistogramsNamed('a')
        self.assertEqual(len(a2), 1)
        a2 = a2[0]
        self.assertEqual(a2.guid, a.guid)
        self.assertIsInstance(a2, histogram.Histogram)
        self.assertIsNot(a2, a)
        b2 = hists2.GetHistogramsNamed('b')
        self.assertEqual(len(b2), 1)
        b2 = b2[0]
        self.assertEqual(b2.guid, b.guid)
        self.assertIsInstance(b2, histogram.Histogram)
        self.assertIsNot(b2, b)
        rhs2 = a2.diagnostics['rhs']
        self.assertIsInstance(rhs2, histogram.RelatedHistogramSet)
        self.assertEqual(len(rhs2), 2)

        # Assert that b and c are in a2's RelatedHistogramSet, rhs2.
        rhs2hs = list(rhs2)
        rhs2guids = [h.guid for h in rhs2hs]
        b2i = rhs2guids.index(b.guid)
        self.assertIs(rhs2hs[b2i], b2)

        c2i = rhs2guids.index(c.guid)
        self.assertIsInstance(rhs2hs[c2i], histogram.HistogramRef)

        # Now serialize c and add it to hists2.
        hists2.ImportDicts([c.AsDict()])
        hists2.ResolveRelatedHistograms()

        c2 = hists2.GetHistogramsNamed('c')
        self.assertEqual(len(c2), 1)
        c2 = c2[0]
        self.assertEqual(c2.guid, c.guid)
        self.assertIsNot(c2, c)

        rhs2hs = list(rhs2)
        rhs2guids = [h.guid for h in rhs2hs]
        b2i = rhs2guids.index(b.guid)
        c2i = rhs2guids.index(c.guid)
        self.assertIs(b2, rhs2hs[b2i])
        self.assertIs(c2, rhs2hs[c2i])