Skip to content

Commit

Permalink
[#2] fix regression tests
Browse files Browse the repository at this point in the history
For qitoolchain feeds, either 'url' or 'path' attributes must be set in a 'feed' non-root element
Will now throw a violent AssertionError on malformed feed.

Change-Id: I979d647adc9465de8d55d21dea1d3c7d3841553e
  • Loading branch information
Julien Blondeau committed Feb 5, 2018
1 parent 85ea88f commit 5e750c3
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 30 deletions.
1 change: 1 addition & 0 deletions .gitlab-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ doitall:
qt4-linguist-tools
gettext
zip
rsync
before_script:
# Handle SSH authentication to the internal gitlab server
Expand Down
16 changes: 7 additions & 9 deletions python/qitoolchain/feed.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ def is_url(location):
return "://" in location

def raise_parse_error(package_tree, feed, message):
""" Raise a nice pasing error about the given
""" Raise a nice parsing error about the given
package_tree element.
"""
Expand All @@ -51,11 +51,11 @@ def tree_from_feed(feed_location, branch=None, name=None):
if is_url(feed_location):
fp = qisys.remote.open_remote_location(feed_location)
else:
raise Exception("Feed location is not an existing path nor an url")
raise Exception("Could not parse %s: Feed location is not an existing path nor an url" % feed_location)
tree = ElementTree.ElementTree()
tree.parse(fp)
except Exception:
ui.error("Could not parse", feed_location)
except Exception as e:
ui.error(e.message)
raise
finally:
if fp:
Expand Down Expand Up @@ -147,18 +147,16 @@ def parse(self, feed, branch=None, name=None, first_pass=True):
for feed_tree in feeds:
feed_name = feed_tree.get("name")
feed_url = feed_tree.get("url")
feed_path = feed_tree.get("path")
assert feed_path or feed_url, "Either 'url' or 'path' attributes must be set in a 'feed' non-root element"
# feed_url can be relative to feed:
if feed_tree.get("path") and branch:
if feed_path and branch:
feed_path = os.path.join(tc_path + ".git", feed_tree.get("path"))
self.parse(feed_path)
if feed_name:
self.parse(feed_path, branch=branch, name=feed_name, first_pass=False)
elif feed_url:
if not is_url(feed_url):
feed_url = urlparse.urljoin(feed, feed_url)
self.parse(feed_url)
if feed_name:
self.parse(feed, branch=branch, name=feed_name, first_pass=False)
select_tree = tree.find("select")
if select_tree is not None:
blacklist_trees = select_tree.findall("blacklist")
Expand Down
86 changes: 65 additions & 21 deletions python/qitoolchain/test/test_feed.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,29 @@

import pytest

#
# Commons variables
#
default_oss_xml = """\
<feed>
<package name="boost" url="boost.zip" />
</feed>
"""

default_third_part_xml = """\
<feed>
<package name="oracle-jdk" url="jdk.zip" />
</feed>
"""

# feed url is either absolute or relative to the parent feed url
default_full_xml = """ \
<feed>
<feed name="oss" path="feeds/oss.xml" />
<feed name="3rdpart" url="3rdpart.xml" />
</feed>
"""

def test_is_url():
assert not is_url(r"c:\foo\bar" )
assert is_url("http://foo.com/bar.xml")
Expand All @@ -20,33 +43,54 @@ def test_parse_non_exising_path():
assert "not an existing path" in e.value.message
assert "nor an url" in e.value.message


def _generic_test_git(_git_server, _feed, full_xml, oss_xml, third_part_xml):
_git_server.create_repo("toolchains.git")

_git_server.push_file("toolchains.git", "feeds/oss.xml", oss_xml)
_git_server.push_file("toolchains.git", "feeds/3rdpart.xml", third_part_xml)
_git_server.push_file("toolchains.git", "feeds/full.xml", full_xml)

git_url = _git_server.get_repo("toolchains.git").clone_url

parser = ToolchainFeedParser("foo")
parser.parse(git_url, name="full", branch="master")

names = [x.name for x in parser.packages]
assert names == ["boost", "oracle-jdk"]


def test_git(git_server, feed):
git_server.create_repo("toolchains.git")
oss_xml = """\
<feed>
<package name="boost" url="boost.zip" />
</feed>
"""
third_part_xml = """\
<feed>
<package name="oracle-jdk" url="jdk.zip" />
</feed>
"""
_generic_test_git(git_server, feed, default_full_xml, default_oss_xml, default_third_part_xml)


def test_git_missing_url_and_path(git_server, feed):
full_xml = """ \
<feed>
<feed name="oss" />
<feed name="3rdpart" />
<feed name="3rdpart" url="3rdpart.xml" />
</feed>
"""
with pytest.raises(AssertionError) as e:
_generic_test_git(git_server, feed, full_xml, default_oss_xml, default_third_part_xml)
assert "attributes must be set" in e.value.message
assert "url" in e.value.message
assert "path" in e.value.message

git_server.push_file("toolchains.git", "feeds/oss.xml", oss_xml)
git_server.push_file("toolchains.git", "feeds/3rdpart.xml", third_part_xml)
git_server.push_file("toolchains.git", "feeds/full.xml", full_xml)

git_url = git_server.get_repo("toolchains.git").clone_url

parser = ToolchainFeedParser("foo")
parser.parse(git_url, name="full", branch="master")
def test_git_bad_url(git_server, feed):
# URL is bad because relative url are relative to the parent URL, and this one will add one more 'feeds' prefix.
# The resulting built URL will end with share/qi/toolchains/foo.git/feeds/feeds/3rdpart.xml
# and the double feeds/feeds/ makes it unknown
full_xml = """ \
<feed>
<feed name="oss" path="feeds/oss.xml" />
<feed name="3rdpart" url="feeds/3rdpart.xml" />
</feed>
"""

names = [x.name for x in parser.packages]
assert names == ["boost", "oracle-jdk"]
with pytest.raises(Exception) as e:
_generic_test_git(git_server, feed, full_xml, default_oss_xml, default_third_part_xml)
assert "not parse" in e.value.message
assert "not an existing path" in e.value.message
assert "nor an url" in e.value.message

0 comments on commit 5e750c3

Please sign in to comment.