mirror of
https://gerrit.googlesource.com/git-repo
synced 2024-12-21 07:16:21 +00:00
tests: Make the tests pass for Python < 3.8
Before Python 3.8, xml.dom.minidom sorted the attributes of an element when writing it to a file, while later versions output the attributes in the order they were created. Avoid these differences by sorting the attributes for each element before comparing the generated manifests with the expected ones. Bug: https://crbug.com/gerrit/14382 Change-Id: Ie2597727afcc48f9063a7261ad970e8a549f0587 Signed-off-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com> Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/303326 Reviewed-by: Mike Frysinger <vapier@google.com>
This commit is contained in:
parent
d177609cb0
commit
5d58c18146
@ -23,6 +23,7 @@ from unittest import mock
|
|||||||
import git_superproject
|
import git_superproject
|
||||||
import manifest_xml
|
import manifest_xml
|
||||||
import platform_utils
|
import platform_utils
|
||||||
|
from test_manifest_xml import sort_attributes
|
||||||
|
|
||||||
|
|
||||||
class SuperprojectTestCase(unittest.TestCase):
|
class SuperprojectTestCase(unittest.TestCase):
|
||||||
@ -140,12 +141,12 @@ class SuperprojectTestCase(unittest.TestCase):
|
|||||||
with open(manifest_path, 'r') as fp:
|
with open(manifest_path, 'r') as fp:
|
||||||
manifest_xml = fp.read()
|
manifest_xml = fp.read()
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
manifest_xml,
|
sort_attributes(manifest_xml),
|
||||||
'<?xml version="1.0" ?><manifest>'
|
'<?xml version="1.0" ?><manifest>'
|
||||||
'<remote name="default-remote" fetch="http://localhost"/>'
|
'<remote fetch="http://localhost" name="default-remote"/>'
|
||||||
'<default remote="default-remote" revision="refs/heads/main"/>'
|
'<default remote="default-remote" revision="refs/heads/main"/>'
|
||||||
'<project name="platform/art" path="art" revision="ABCDEF" '
|
'<project groups="notdefault,platform-' + self.platform + '" '
|
||||||
'groups="notdefault,platform-' + self.platform + '"/>'
|
'name="platform/art" path="art" revision="ABCDEF"/>'
|
||||||
'<superproject name="superproject"/>'
|
'<superproject name="superproject"/>'
|
||||||
'</manifest>')
|
'</manifest>')
|
||||||
|
|
||||||
@ -167,13 +168,13 @@ class SuperprojectTestCase(unittest.TestCase):
|
|||||||
with open(manifest_path, 'r') as fp:
|
with open(manifest_path, 'r') as fp:
|
||||||
manifest_xml = fp.read()
|
manifest_xml = fp.read()
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
manifest_xml,
|
sort_attributes(manifest_xml),
|
||||||
'<?xml version="1.0" ?><manifest>'
|
'<?xml version="1.0" ?><manifest>'
|
||||||
'<remote name="default-remote" fetch="http://localhost"/>'
|
'<remote fetch="http://localhost" name="default-remote"/>'
|
||||||
'<default remote="default-remote" revision="refs/heads/main"/>'
|
'<default remote="default-remote" revision="refs/heads/main"/>'
|
||||||
'<project name="platform/art" path="art" '
|
'<project groups="notdefault,platform-' + self.platform + '" '
|
||||||
'revision="2c2724cb36cd5a9cec6c852c681efc3b7c6b86ea" '
|
'name="platform/art" path="art" '
|
||||||
'groups="notdefault,platform-' + self.platform + '"/>'
|
'revision="2c2724cb36cd5a9cec6c852c681efc3b7c6b86ea"/>'
|
||||||
'<superproject name="superproject"/>'
|
'<superproject name="superproject"/>'
|
||||||
'</manifest>')
|
'</manifest>')
|
||||||
|
|
||||||
@ -208,16 +209,17 @@ class SuperprojectTestCase(unittest.TestCase):
|
|||||||
with open(manifest_path, 'r') as fp:
|
with open(manifest_path, 'r') as fp:
|
||||||
manifest_xml = fp.read()
|
manifest_xml = fp.read()
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
manifest_xml,
|
sort_attributes(manifest_xml),
|
||||||
'<?xml version="1.0" ?><manifest>'
|
'<?xml version="1.0" ?><manifest>'
|
||||||
'<remote name="default-remote" fetch="http://localhost"/>'
|
'<remote fetch="http://localhost" name="default-remote"/>'
|
||||||
'<remote name="goog" fetch="http://localhost2"/>'
|
'<remote fetch="http://localhost2" name="goog"/>'
|
||||||
'<default remote="default-remote" revision="refs/heads/main"/>'
|
'<default remote="default-remote" revision="refs/heads/main"/>'
|
||||||
'<project name="platform/art" path="art" '
|
'<project groups="notdefault,platform-' + self.platform + '" '
|
||||||
'revision="2c2724cb36cd5a9cec6c852c681efc3b7c6b86ea" '
|
'name="platform/art" path="art" '
|
||||||
'groups="notdefault,platform-' + self.platform + '"/>'
|
'revision="2c2724cb36cd5a9cec6c852c681efc3b7c6b86ea"/>'
|
||||||
'<project name="platform/vendor/x" path="vendor/x" remote="goog" '
|
'<project clone-depth="1" groups="vendor" '
|
||||||
'revision="master-with-vendor" groups="vendor" clone-depth="1"/>'
|
'name="platform/vendor/x" path="vendor/x" remote="goog" '
|
||||||
|
'revision="master-with-vendor"/>'
|
||||||
'<superproject name="superproject"/>'
|
'<superproject name="superproject"/>'
|
||||||
'</manifest>')
|
'</manifest>')
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
import platform
|
import platform
|
||||||
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
import tempfile
|
import tempfile
|
||||||
import unittest
|
import unittest
|
||||||
@ -63,6 +64,30 @@ if os.path.sep != '/':
|
|||||||
INVALID_FS_PATHS += tuple(x.replace('/', os.path.sep) for x in INVALID_FS_PATHS)
|
INVALID_FS_PATHS += tuple(x.replace('/', os.path.sep) for x in INVALID_FS_PATHS)
|
||||||
|
|
||||||
|
|
||||||
|
def sort_attributes(manifest):
|
||||||
|
"""Sort the attributes of all elements alphabetically.
|
||||||
|
|
||||||
|
This is needed because different versions of the toxml() function from
|
||||||
|
xml.dom.minidom outputs the attributes of elements in different orders.
|
||||||
|
Before Python 3.8 they were output alphabetically, later versions preserve
|
||||||
|
the order specified by the user.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
manifest: String containing an XML manifest.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The XML manifest with the attributes of all elements sorted alphabetically.
|
||||||
|
"""
|
||||||
|
new_manifest = ''
|
||||||
|
# This will find every element in the XML manifest, whether they have
|
||||||
|
# attributes or not. This simplifies recreating the manifest below.
|
||||||
|
matches = re.findall(r'(<[/?]?[a-z-]+\s*)((?:\S+?="[^"]+"\s*?)*)(\s*[/?]?>)', manifest)
|
||||||
|
for head, attrs, tail in matches:
|
||||||
|
m = re.findall(r'\S+?="[^"]+"', attrs)
|
||||||
|
new_manifest += head + ' '.join(sorted(m)) + tail
|
||||||
|
return new_manifest
|
||||||
|
|
||||||
|
|
||||||
class ManifestParseTestCase(unittest.TestCase):
|
class ManifestParseTestCase(unittest.TestCase):
|
||||||
"""TestCase for parsing manifests."""
|
"""TestCase for parsing manifests."""
|
||||||
|
|
||||||
@ -254,9 +279,9 @@ class XmlManifestTests(ManifestParseTestCase):
|
|||||||
self.assertEqual(manifest.superproject['name'], 'superproject')
|
self.assertEqual(manifest.superproject['name'], 'superproject')
|
||||||
self.assertEqual(manifest.superproject['remote'].name, 'test-remote')
|
self.assertEqual(manifest.superproject['remote'].name, 'test-remote')
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
manifest.ToXml().toxml(),
|
sort_attributes(manifest.ToXml().toxml()),
|
||||||
'<?xml version="1.0" ?><manifest>'
|
'<?xml version="1.0" ?><manifest>'
|
||||||
'<remote name="test-remote" fetch="http://localhost"/>'
|
'<remote fetch="http://localhost" name="test-remote"/>'
|
||||||
'<default remote="test-remote" revision="refs/heads/main"/>'
|
'<default remote="test-remote" revision="refs/heads/main"/>'
|
||||||
'<superproject name="superproject"/>'
|
'<superproject name="superproject"/>'
|
||||||
'</manifest>')
|
'</manifest>')
|
||||||
@ -408,9 +433,9 @@ class ProjectElementTests(ManifestParseTestCase):
|
|||||||
project = manifest.projects[0]
|
project = manifest.projects[0]
|
||||||
project.SetRevisionId('ABCDEF')
|
project.SetRevisionId('ABCDEF')
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
manifest.ToXml().toxml(),
|
sort_attributes(manifest.ToXml().toxml()),
|
||||||
'<?xml version="1.0" ?><manifest>'
|
'<?xml version="1.0" ?><manifest>'
|
||||||
'<remote name="default-remote" fetch="http://localhost"/>'
|
'<remote fetch="http://localhost" name="default-remote"/>'
|
||||||
'<default remote="default-remote" revision="refs/heads/main"/>'
|
'<default remote="default-remote" revision="refs/heads/main"/>'
|
||||||
'<project name="test-name" revision="ABCDEF"/>'
|
'<project name="test-name" revision="ABCDEF"/>'
|
||||||
'</manifest>')
|
'</manifest>')
|
||||||
@ -516,9 +541,9 @@ class SuperProjectElementTests(ManifestParseTestCase):
|
|||||||
self.assertEqual(manifest.superproject['remote'].name, 'test-remote')
|
self.assertEqual(manifest.superproject['remote'].name, 'test-remote')
|
||||||
self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/superproject')
|
self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/superproject')
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
manifest.ToXml().toxml(),
|
sort_attributes(manifest.ToXml().toxml()),
|
||||||
'<?xml version="1.0" ?><manifest>'
|
'<?xml version="1.0" ?><manifest>'
|
||||||
'<remote name="test-remote" fetch="http://localhost"/>'
|
'<remote fetch="http://localhost" name="test-remote"/>'
|
||||||
'<default remote="test-remote" revision="refs/heads/main"/>'
|
'<default remote="test-remote" revision="refs/heads/main"/>'
|
||||||
'<superproject name="superproject"/>'
|
'<superproject name="superproject"/>'
|
||||||
'</manifest>')
|
'</manifest>')
|
||||||
@ -537,10 +562,10 @@ class SuperProjectElementTests(ManifestParseTestCase):
|
|||||||
self.assertEqual(manifest.superproject['remote'].name, 'superproject-remote')
|
self.assertEqual(manifest.superproject['remote'].name, 'superproject-remote')
|
||||||
self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/platform/superproject')
|
self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/platform/superproject')
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
manifest.ToXml().toxml(),
|
sort_attributes(manifest.ToXml().toxml()),
|
||||||
'<?xml version="1.0" ?><manifest>'
|
'<?xml version="1.0" ?><manifest>'
|
||||||
'<remote name="default-remote" fetch="http://localhost"/>'
|
'<remote fetch="http://localhost" name="default-remote"/>'
|
||||||
'<remote name="superproject-remote" fetch="http://localhost"/>'
|
'<remote fetch="http://localhost" name="superproject-remote"/>'
|
||||||
'<default remote="default-remote" revision="refs/heads/main"/>'
|
'<default remote="default-remote" revision="refs/heads/main"/>'
|
||||||
'<superproject name="platform/superproject" remote="superproject-remote"/>'
|
'<superproject name="platform/superproject" remote="superproject-remote"/>'
|
||||||
'</manifest>')
|
'</manifest>')
|
||||||
@ -557,9 +582,9 @@ class SuperProjectElementTests(ManifestParseTestCase):
|
|||||||
self.assertEqual(manifest.superproject['name'], 'superproject')
|
self.assertEqual(manifest.superproject['name'], 'superproject')
|
||||||
self.assertEqual(manifest.superproject['remote'].name, 'default-remote')
|
self.assertEqual(manifest.superproject['remote'].name, 'default-remote')
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
manifest.ToXml().toxml(),
|
sort_attributes(manifest.ToXml().toxml()),
|
||||||
'<?xml version="1.0" ?><manifest>'
|
'<?xml version="1.0" ?><manifest>'
|
||||||
'<remote name="default-remote" fetch="http://localhost"/>'
|
'<remote fetch="http://localhost" name="default-remote"/>'
|
||||||
'<default remote="default-remote" revision="refs/heads/main"/>'
|
'<default remote="default-remote" revision="refs/heads/main"/>'
|
||||||
'<superproject name="superproject"/>'
|
'<superproject name="superproject"/>'
|
||||||
'</manifest>')
|
'</manifest>')
|
||||||
|
Loading…
Reference in New Issue
Block a user