Commit e01e679e authored by Weilun Shi's avatar Weilun Shi Committed by Commit Bot

Pretty print the merged xml before writing it

Pretty print the merged xml to make sure it follows our xml style before
sending to our server.

Bug: b/158215587
Change-Id: I6fd0776bd7a1db2e2f89db26399acdb2b1e36496
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2236681
Commit-Queue: Weilun Shi <sweilun@chromium.org>
Commit-Queue: Ilya Sherman <isherman@chromium.org>
Auto-Submit: Weilun Shi <sweilun@chromium.org>
Reviewed-by: default avatarIlya Sherman <isherman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#776333}
parent 11e84a0f
...@@ -12,6 +12,7 @@ import xml.dom.minidom ...@@ -12,6 +12,7 @@ import xml.dom.minidom
import expand_owners import expand_owners
import extract_histograms import extract_histograms
import histograms_print_style
import populate_enums import populate_enums
...@@ -104,12 +105,18 @@ def MergeFiles(filenames=[], files=[]): ...@@ -104,12 +105,18 @@ def MergeFiles(filenames=[], files=[]):
return MergeTrees(trees) return MergeTrees(trees)
def PrettyPrintMergedFiles(filenames=[], files=[]):
return histograms_print_style.GetPrintStyle().PrettyPrintXml(
MergeFiles(filenames=filenames, files=files))
def main(): def main():
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument('inputs', nargs="+") parser.add_argument('inputs', nargs="+")
parser.add_argument('--output', required=True) parser.add_argument('--output', required=True)
args = parser.parse_args() args = parser.parse_args()
MergeFiles(args.inputs).writexml(open(args.output, 'w')) with open(args.output, 'w') as f:
f.write(PrettyPrintMergedFiles(args.inputs))
if __name__ == '__main__': if __name__ == '__main__':
......
...@@ -4,8 +4,6 @@ ...@@ -4,8 +4,6 @@
import unittest import unittest
import xml.dom.minidom
import histogram_paths import histogram_paths
import merge_xml import merge_xml
...@@ -14,21 +12,23 @@ class MergeXmlTest(unittest.TestCase): ...@@ -14,21 +12,23 @@ class MergeXmlTest(unittest.TestCase):
def testMergeFiles(self): def testMergeFiles(self):
"""Checks that enums.xml and histograms.xml can merge successfully.""" """Checks that enums.xml and histograms.xml can merge successfully."""
merged = merge_xml.MergeFiles( merged = merge_xml.PrettyPrintMergedFiles(
[histogram_paths.TEST_ENUMS_XML, histogram_paths.TEST_HISTOGRAMS_XML]) [histogram_paths.TEST_ENUMS_XML, histogram_paths.TEST_HISTOGRAMS_XML])
# If ukm.xml is not provided, there is no need to populate the # If ukm.xml is not provided, there is no need to populate the
# UkmEventNameHash enum. # UkmEventNameHash enum.
expected_merged = xml.dom.minidom.parseString(""" expected_merged_xml = """
<histogram-configuration><enums> <histogram-configuration>
<enums>
<enum name="Enum1"> <enum name="Enum1">
<int label="Value0" value="0"/> <int value="0" label="Value0"/>
<int label="Value1" value="1"/> <int value="1" label="Value1"/>
</enum> </enum>
<enum name="TestEnum"> <enum name="TestEnum">
<int label="Value0" value="0"/> <int value="0" label="Value0"/>
<int label="Value1" value="1"/> <int value="1" label="Value1"/>
</enum> </enum>
<enum name="UkmEventNameHash"> <enum name="UkmEventNameHash">
...@@ -38,7 +38,9 @@ class MergeXmlTest(unittest.TestCase): ...@@ -38,7 +38,9 @@ class MergeXmlTest(unittest.TestCase):
</enum> </enum>
</enums><histograms> </enums>
<histograms>
<histogram name="Foo.Bar" units="xxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyzzzz"> <histogram name="Foo.Bar" units="xxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyzzzz">
<summary>Foo</summary> <summary>Foo</summary>
...@@ -46,37 +48,37 @@ class MergeXmlTest(unittest.TestCase): ...@@ -46,37 +48,37 @@ class MergeXmlTest(unittest.TestCase):
<component>Component</component> <component>Component</component>
</histogram> </histogram>
<histogram name="Test.Histogram" units="microseconds"> <histogram name="Test.EnumHistogram" enum="TestEnum" expires_after="M81">
<owner>uma@chromium.org</owner>
<obsolete> <obsolete>
Removed 6/2020. Obsolete message
</obsolete> </obsolete>
<owner>person@chromium.org</owner> <summary>A enum histogram.</summary>
<summary>
Summary 2
</summary>
</histogram> </histogram>
<histogram name="Test.EnumHistogram" enum="TestEnum" expires_after="M81"> <histogram name="Test.Histogram" units="microseconds">
<owner>uma@chromium.org</owner>
<obsolete> <obsolete>
Obsolete message Removed 6/2020.
</obsolete> </obsolete>
<summary> <owner>person@chromium.org</owner>
A enum histogram. <summary>Summary 2</summary>
</summary>
</histogram> </histogram>
</histograms><histogram_suffixes_list> </histograms>
<histogram_suffixes_list>
<histogram_suffixes name="Test.HistogramSuffixes" separator="."> <histogram_suffixes name="Test.HistogramSuffixes" separator=".">
<suffix label="A histogram_suffixes" name="TestSuffix"/> <suffix name="TestSuffix" label="A histogram_suffixes"/>
<affected-histogram name="Test.Histogram"/> <affected-histogram name="Test.Histogram"/>
</histogram_suffixes> </histogram_suffixes>
</histogram_suffixes_list></histogram-configuration> </histogram_suffixes_list>
""")
</histogram-configuration>
"""
self.maxDiff = None self.maxDiff = None
self.assertEqual(expected_merged.toxml(), merged.toxml()) self.assertEqual(expected_merged_xml.strip(), merged.strip())
def testMergeFiles_WithXmlEvents(self): def testMergeFiles_WithXmlEvents(self):
"""Checks that the UkmEventNameHash enum is populated correctly. """Checks that the UkmEventNameHash enum is populated correctly.
...@@ -85,18 +87,20 @@ class MergeXmlTest(unittest.TestCase): ...@@ -85,18 +87,20 @@ class MergeXmlTest(unittest.TestCase):
where where each value is a xml event name hash truncated to 31 bits and where where each value is a xml event name hash truncated to 31 bits and
each label is the corresponding event name. each label is the corresponding event name.
""" """
merged = merge_xml.MergeFiles(histogram_paths.ALL_TEST_XMLS) merged = merge_xml.PrettyPrintMergedFiles(histogram_paths.ALL_TEST_XMLS)
expected_merged = xml.dom.minidom.parseString(""" expected_merged_xml = """
<histogram-configuration><enums> <histogram-configuration>
<enums>
<enum name="Enum1"> <enum name="Enum1">
<int label="Value0" value="0"/> <int value="0" label="Value0"/>
<int label="Value1" value="1"/> <int value="1" label="Value1"/>
</enum> </enum>
<enum name="TestEnum"> <enum name="TestEnum">
<int label="Value0" value="0"/> <int value="0" label="Value0"/>
<int label="Value1" value="1"/> <int value="1" label="Value1"/>
</enum> </enum>
<enum name="UkmEventNameHash"> <enum name="UkmEventNameHash">
...@@ -104,12 +108,14 @@ class MergeXmlTest(unittest.TestCase): ...@@ -104,12 +108,14 @@ class MergeXmlTest(unittest.TestCase):
bits. This gets populated by the GetEnumsNodes function in merge_xml.py bits. This gets populated by the GetEnumsNodes function in merge_xml.py
when producing the merged XML file. --> when producing the merged XML file. -->
<int label="AbusiveExperienceHeuristic.WindowOpen" value="324605288"/>\ <int value="324605288" label="AbusiveExperienceHeuristic.WindowOpen"/>
<int label="AbusiveExperienceHeuristic.TabUnder" value="1621538456"/>\ <int value="1621538456" label="AbusiveExperienceHeuristic.TabUnder"/>
<int label="Autofill.SelectedMaskedServerCard (Obsolete)" value="1913876024"/>\ <int value="1913876024" label="Autofill.SelectedMaskedServerCard (Obsolete)"/>
</enum> </enum>
</enums><histograms> </enums>
<histograms>
<histogram name="Foo.Bar" units="xxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyzzzz"> <histogram name="Foo.Bar" units="xxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyzzzz">
<summary>Foo</summary> <summary>Foo</summary>
...@@ -117,37 +123,37 @@ class MergeXmlTest(unittest.TestCase): ...@@ -117,37 +123,37 @@ class MergeXmlTest(unittest.TestCase):
<component>Component</component> <component>Component</component>
</histogram> </histogram>
<histogram name="Test.Histogram" units="microseconds"> <histogram name="Test.EnumHistogram" enum="TestEnum" expires_after="M81">
<owner>uma@chromium.org</owner>
<obsolete> <obsolete>
Removed 6/2020. Obsolete message
</obsolete> </obsolete>
<owner>person@chromium.org</owner> <summary>A enum histogram.</summary>
<summary>
Summary 2
</summary>
</histogram> </histogram>
<histogram name="Test.EnumHistogram" enum="TestEnum" expires_after="M81"> <histogram name="Test.Histogram" units="microseconds">
<owner>uma@chromium.org</owner>
<obsolete> <obsolete>
Obsolete message Removed 6/2020.
</obsolete> </obsolete>
<summary> <owner>person@chromium.org</owner>
A enum histogram. <summary>Summary 2</summary>
</summary>
</histogram> </histogram>
</histograms><histogram_suffixes_list> </histograms>
<histogram_suffixes_list>
<histogram_suffixes name="Test.HistogramSuffixes" separator="."> <histogram_suffixes name="Test.HistogramSuffixes" separator=".">
<suffix label="A histogram_suffixes" name="TestSuffix"/> <suffix name="TestSuffix" label="A histogram_suffixes"/>
<affected-histogram name="Test.Histogram"/> <affected-histogram name="Test.Histogram"/>
</histogram_suffixes> </histogram_suffixes>
</histogram_suffixes_list></histogram-configuration> </histogram_suffixes_list>
""")
</histogram-configuration>
"""
self.maxDiff = None self.maxDiff = None
self.assertEqual(expected_merged.toxml(), merged.toxml()) self.assertEqual(expected_merged_xml.strip(), merged.strip())
if __name__ == '__main__': if __name__ == '__main__':
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment