diff options
| -rw-r--r-- | tests/test_git_superproject.py | 36 | ||||
| -rw-r--r-- | tests/test_manifest_xml.py | 47 |
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 | |||
| 23 | import git_superproject | 23 | import git_superproject |
| 24 | import manifest_xml | 24 | import manifest_xml |
| 25 | import platform_utils | 25 | import platform_utils |
| 26 | from test_manifest_xml import sort_attributes | ||
| 26 | 27 | ||
| 27 | 28 | ||
| 28 | class SuperprojectTestCase(unittest.TestCase): | 29 | class 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 | ||
| 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>') |
