diff options
Diffstat (limited to 'tests/test_manifest_xml.py')
-rw-r--r-- | tests/test_manifest_xml.py | 47 |
1 files changed, 36 insertions, 11 deletions
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 | ||
17 | import os | 17 | import os |
18 | import platform | 18 | import platform |
19 | import re | ||
19 | import shutil | 20 | import shutil |
20 | import tempfile | 21 | import tempfile |
21 | import unittest | 22 | import 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 | ||
67 | def 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 | |||
66 | class ManifestParseTestCase(unittest.TestCase): | 91 | class 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>') |