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>') |
