summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/test_git_superproject.py36
-rw-r--r--tests/test_manifest_xml.py47
2 files changed, 55 insertions, 28 deletions
diff --git a/tests/test_git_superproject.py b/tests/test_git_superproject.py
index 5c1455f5..b1ae3576 100644
--- a/tests/test_git_superproject.py
+++ b/tests/test_git_superproject.py
@@ -23,6 +23,7 @@ from unittest import mock
23import git_superproject 23import git_superproject
24import manifest_xml 24import manifest_xml
25import platform_utils 25import platform_utils
26from test_manifest_xml import sort_attributes
26 27
27 28
28class SuperprojectTestCase(unittest.TestCase): 29class SuperprojectTestCase(unittest.TestCase):
@@ -140,12 +141,12 @@ class SuperprojectTestCase(unittest.TestCase):
140 with open(manifest_path, 'r') as fp: 141 with open(manifest_path, 'r') as fp:
141 manifest_xml = fp.read() 142 manifest_xml = fp.read()
142 self.assertEqual( 143 self.assertEqual(
143 manifest_xml, 144 sort_attributes(manifest_xml),
144 '<?xml version="1.0" ?><manifest>' 145 '<?xml version="1.0" ?><manifest>'
145 '<remote name="default-remote" fetch="http://localhost"/>' 146 '<remote fetch="http://localhost" name="default-remote"/>'
146 '<default remote="default-remote" revision="refs/heads/main"/>' 147 '<default remote="default-remote" revision="refs/heads/main"/>'
147 '<project name="platform/art" path="art" revision="ABCDEF" ' 148 '<project groups="notdefault,platform-' + self.platform + '" '
148 'groups="notdefault,platform-' + self.platform + '"/>' 149 'name="platform/art" path="art" revision="ABCDEF"/>'
149 '<superproject name="superproject"/>' 150 '<superproject name="superproject"/>'
150 '</manifest>') 151 '</manifest>')
151 152
@@ -167,13 +168,13 @@ class SuperprojectTestCase(unittest.TestCase):
167 with open(manifest_path, 'r') as fp: 168 with open(manifest_path, 'r') as fp:
168 manifest_xml = fp.read() 169 manifest_xml = fp.read()
169 self.assertEqual( 170 self.assertEqual(
170 manifest_xml, 171 sort_attributes(manifest_xml),
171 '<?xml version="1.0" ?><manifest>' 172 '<?xml version="1.0" ?><manifest>'
172 '<remote name="default-remote" fetch="http://localhost"/>' 173 '<remote fetch="http://localhost" name="default-remote"/>'
173 '<default remote="default-remote" revision="refs/heads/main"/>' 174 '<default remote="default-remote" revision="refs/heads/main"/>'
174 '<project name="platform/art" path="art" ' 175 '<project groups="notdefault,platform-' + self.platform + '" '
175 'revision="2c2724cb36cd5a9cec6c852c681efc3b7c6b86ea" ' 176 'name="platform/art" path="art" '
176 'groups="notdefault,platform-' + self.platform + '"/>' 177 'revision="2c2724cb36cd5a9cec6c852c681efc3b7c6b86ea"/>'
177 '<superproject name="superproject"/>' 178 '<superproject name="superproject"/>'
178 '</manifest>') 179 '</manifest>')
179 180
@@ -208,16 +209,17 @@ class SuperprojectTestCase(unittest.TestCase):
208 with open(manifest_path, 'r') as fp: 209 with open(manifest_path, 'r') as fp:
209 manifest_xml = fp.read() 210 manifest_xml = fp.read()
210 self.assertEqual( 211 self.assertEqual(
211 manifest_xml, 212 sort_attributes(manifest_xml),
212 '<?xml version="1.0" ?><manifest>' 213 '<?xml version="1.0" ?><manifest>'
213 '<remote name="default-remote" fetch="http://localhost"/>' 214 '<remote fetch="http://localhost" name="default-remote"/>'
214 '<remote name="goog" fetch="http://localhost2"/>' 215 '<remote fetch="http://localhost2" name="goog"/>'
215 '<default remote="default-remote" revision="refs/heads/main"/>' 216 '<default remote="default-remote" revision="refs/heads/main"/>'
216 '<project name="platform/art" path="art" ' 217 '<project groups="notdefault,platform-' + self.platform + '" '
217 'revision="2c2724cb36cd5a9cec6c852c681efc3b7c6b86ea" ' 218 'name="platform/art" path="art" '
218 'groups="notdefault,platform-' + self.platform + '"/>' 219 'revision="2c2724cb36cd5a9cec6c852c681efc3b7c6b86ea"/>'
219 '<project name="platform/vendor/x" path="vendor/x" remote="goog" ' 220 '<project clone-depth="1" groups="vendor" '
220 'revision="master-with-vendor" groups="vendor" clone-depth="1"/>' 221 'name="platform/vendor/x" path="vendor/x" remote="goog" '
222 'revision="master-with-vendor"/>'
221 '<superproject name="superproject"/>' 223 '<superproject name="superproject"/>'
222 '</manifest>') 224 '</manifest>')
223 225
diff --git a/tests/test_manifest_xml.py b/tests/test_manifest_xml.py
index 99848e57..bd74780d 100644
--- a/tests/test_manifest_xml.py
+++ b/tests/test_manifest_xml.py
@@ -16,6 +16,7 @@
16 16
17import os 17import os
18import platform 18import platform
19import re
19import shutil 20import shutil
20import tempfile 21import tempfile
21import unittest 22import unittest
@@ -63,6 +64,30 @@ if os.path.sep != '/':
63 INVALID_FS_PATHS += tuple(x.replace('/', os.path.sep) for x in INVALID_FS_PATHS) 64 INVALID_FS_PATHS += tuple(x.replace('/', os.path.sep) for x in INVALID_FS_PATHS)
64 65
65 66
67def sort_attributes(manifest):
68 """Sort the attributes of all elements alphabetically.
69
70 This is needed because different versions of the toxml() function from
71 xml.dom.minidom outputs the attributes of elements in different orders.
72 Before Python 3.8 they were output alphabetically, later versions preserve
73 the order specified by the user.
74
75 Args:
76 manifest: String containing an XML manifest.
77
78 Returns:
79 The XML manifest with the attributes of all elements sorted alphabetically.
80 """
81 new_manifest = ''
82 # This will find every element in the XML manifest, whether they have
83 # attributes or not. This simplifies recreating the manifest below.
84 matches = re.findall(r'(<[/?]?[a-z-]+\s*)((?:\S+?="[^"]+"\s*?)*)(\s*[/?]?>)', manifest)
85 for head, attrs, tail in matches:
86 m = re.findall(r'\S+?="[^"]+"', attrs)
87 new_manifest += head + ' '.join(sorted(m)) + tail
88 return new_manifest
89
90
66class ManifestParseTestCase(unittest.TestCase): 91class ManifestParseTestCase(unittest.TestCase):
67 """TestCase for parsing manifests.""" 92 """TestCase for parsing manifests."""
68 93
@@ -254,9 +279,9 @@ class XmlManifestTests(ManifestParseTestCase):
254 self.assertEqual(manifest.superproject['name'], 'superproject') 279 self.assertEqual(manifest.superproject['name'], 'superproject')
255 self.assertEqual(manifest.superproject['remote'].name, 'test-remote') 280 self.assertEqual(manifest.superproject['remote'].name, 'test-remote')
256 self.assertEqual( 281 self.assertEqual(
257 manifest.ToXml().toxml(), 282 sort_attributes(manifest.ToXml().toxml()),
258 '<?xml version="1.0" ?><manifest>' 283 '<?xml version="1.0" ?><manifest>'
259 '<remote name="test-remote" fetch="http://localhost"/>' 284 '<remote fetch="http://localhost" name="test-remote"/>'
260 '<default remote="test-remote" revision="refs/heads/main"/>' 285 '<default remote="test-remote" revision="refs/heads/main"/>'
261 '<superproject name="superproject"/>' 286 '<superproject name="superproject"/>'
262 '</manifest>') 287 '</manifest>')
@@ -408,9 +433,9 @@ class ProjectElementTests(ManifestParseTestCase):
408 project = manifest.projects[0] 433 project = manifest.projects[0]
409 project.SetRevisionId('ABCDEF') 434 project.SetRevisionId('ABCDEF')
410 self.assertEqual( 435 self.assertEqual(
411 manifest.ToXml().toxml(), 436 sort_attributes(manifest.ToXml().toxml()),
412 '<?xml version="1.0" ?><manifest>' 437 '<?xml version="1.0" ?><manifest>'
413 '<remote name="default-remote" fetch="http://localhost"/>' 438 '<remote fetch="http://localhost" name="default-remote"/>'
414 '<default remote="default-remote" revision="refs/heads/main"/>' 439 '<default remote="default-remote" revision="refs/heads/main"/>'
415 '<project name="test-name" revision="ABCDEF"/>' 440 '<project name="test-name" revision="ABCDEF"/>'
416 '</manifest>') 441 '</manifest>')
@@ -516,9 +541,9 @@ class SuperProjectElementTests(ManifestParseTestCase):
516 self.assertEqual(manifest.superproject['remote'].name, 'test-remote') 541 self.assertEqual(manifest.superproject['remote'].name, 'test-remote')
517 self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/superproject') 542 self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/superproject')
518 self.assertEqual( 543 self.assertEqual(
519 manifest.ToXml().toxml(), 544 sort_attributes(manifest.ToXml().toxml()),
520 '<?xml version="1.0" ?><manifest>' 545 '<?xml version="1.0" ?><manifest>'
521 '<remote name="test-remote" fetch="http://localhost"/>' 546 '<remote fetch="http://localhost" name="test-remote"/>'
522 '<default remote="test-remote" revision="refs/heads/main"/>' 547 '<default remote="test-remote" revision="refs/heads/main"/>'
523 '<superproject name="superproject"/>' 548 '<superproject name="superproject"/>'
524 '</manifest>') 549 '</manifest>')
@@ -537,10 +562,10 @@ class SuperProjectElementTests(ManifestParseTestCase):
537 self.assertEqual(manifest.superproject['remote'].name, 'superproject-remote') 562 self.assertEqual(manifest.superproject['remote'].name, 'superproject-remote')
538 self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/platform/superproject') 563 self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/platform/superproject')
539 self.assertEqual( 564 self.assertEqual(
540 manifest.ToXml().toxml(), 565 sort_attributes(manifest.ToXml().toxml()),
541 '<?xml version="1.0" ?><manifest>' 566 '<?xml version="1.0" ?><manifest>'
542 '<remote name="default-remote" fetch="http://localhost"/>' 567 '<remote fetch="http://localhost" name="default-remote"/>'
543 '<remote name="superproject-remote" fetch="http://localhost"/>' 568 '<remote fetch="http://localhost" name="superproject-remote"/>'
544 '<default remote="default-remote" revision="refs/heads/main"/>' 569 '<default remote="default-remote" revision="refs/heads/main"/>'
545 '<superproject name="platform/superproject" remote="superproject-remote"/>' 570 '<superproject name="platform/superproject" remote="superproject-remote"/>'
546 '</manifest>') 571 '</manifest>')
@@ -557,9 +582,9 @@ class SuperProjectElementTests(ManifestParseTestCase):
557 self.assertEqual(manifest.superproject['name'], 'superproject') 582 self.assertEqual(manifest.superproject['name'], 'superproject')
558 self.assertEqual(manifest.superproject['remote'].name, 'default-remote') 583 self.assertEqual(manifest.superproject['remote'].name, 'default-remote')
559 self.assertEqual( 584 self.assertEqual(
560 manifest.ToXml().toxml(), 585 sort_attributes(manifest.ToXml().toxml()),
561 '<?xml version="1.0" ?><manifest>' 586 '<?xml version="1.0" ?><manifest>'
562 '<remote name="default-remote" fetch="http://localhost"/>' 587 '<remote fetch="http://localhost" name="default-remote"/>'
563 '<default remote="default-remote" revision="refs/heads/main"/>' 588 '<default remote="default-remote" revision="refs/heads/main"/>'
564 '<superproject name="superproject"/>' 589 '<superproject name="superproject"/>'
565 '</manifest>') 590 '</manifest>')