Merge ~xypron/ppa-dev-tools:urldecode into ppa-dev-tools:main

Proposed by Heinrich Schuchardt
Status: Superseded
Proposed branch: ~xypron/ppa-dev-tools:urldecode
Merge into: ppa-dev-tools:main
Diff against target: 73 lines (+20/-10)
2 files modified
ppa/job.py (+7/-6)
tests/test_job.py (+13/-4)
Reviewer Review Type Date Requested Status
Bryce Harrington Needs Information
Review via email: mp+458485@code.launchpad.net

This proposal has been superseded by a proposal from 2024-01-12.

Commit message

Job.request_url: urlencode parameter strings

Triggering autopkgtests for a package with a version number like 8.2313.0-2ubuntu1+ppa1 fail due to missing urlencoding (LP: #2049105).

To post a comment you must log in.
Revision history for this message
Bryce Harrington (bryce) wrote :

Hi Heinrich,

Big thanks for proposing a fix along with the bug. Yes, this looks like a very good way to solve the problem and I agree with your approach.

Can you also include a unit test case along with this fix? It should fail without your fix applied, and pass with it (usual TDD stuff).

Thanks again for implementing the fix!

review: Needs Information
~xypron/ppa-dev-tools:urldecode updated
6da4220... by Heinrich Schuchardt

test_request_url: provide more test cases

Parameterize test_request_url() and provide more test cases.
Expect parameters in a URL to be URL encoded.

Signed-off-by: Heinrich Schuchardt <email address hidden>

Unmerged commits

9f4b2da... by Heinrich Schuchardt

Job.request_url: urlencode parameter strings

Triggering autopkgtests for a package with a version number like
8.2313.0-2ubuntu1+ppa1 fail due to missing urlencoding.
(LP: #2049105)

Signed-off-by: Heinrich Schuchardt <email address hidden>

6da4220... by Heinrich Schuchardt

test_request_url: provide more test cases

Parameterize test_request_url() and provide more test cases.
Expect parameters in a URL to be URL encoded.

Signed-off-by: Heinrich Schuchardt <email address hidden>

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/ppa/job.py b/ppa/job.py
index 669fe48..ec675e0 100755
--- a/ppa/job.py
+++ b/ppa/job.py
@@ -14,6 +14,7 @@
14import json14import json
15from functools import lru_cache15from functools import lru_cache
16from typing import Iterator16from typing import Iterator
17import urllib
1718
18from .constants import URL_AUTOPKGTEST19from .constants import URL_AUTOPKGTEST
1920
@@ -82,13 +83,13 @@ class Job:
82 :rtype: str83 :rtype: str
83 :returns: Full URL for invoking the test.84 :returns: Full URL for invoking the test.
84 """85 """
85 rel_str = f"release={self.series}"86 parameter_str = urllib.parse.urlencode({
86 arch_str = f"&arch={self.arch}"87 'release' : self.series,
87 pkg_str = f"&package={self.source_package}"88 'arch' : self.arch,
88 trigger_str = ''89 'package' : self.source_package})
89 for trigger in self.triggers:90 for trigger in self.triggers:
90 trigger_str += f"&trigger={trigger}"91 parameter_str += "&" + urllib.parse.urlencode({"trigger" : trigger})
91 return f"{URL_AUTOPKGTEST}/request.cgi?{rel_str}{arch_str}{pkg_str}{trigger_str}"92 return f"{URL_AUTOPKGTEST}/request.cgi?{parameter_str}"
9293
9394
94def get_running(response, releases=None, ppa=None) -> Iterator[Job]:95def get_running(response, releases=None, ppa=None) -> Iterator[Job]:
diff --git a/tests/test_job.py b/tests/test_job.py
index 852e04e..b33d299 100644
--- a/tests/test_job.py
+++ b/tests/test_job.py
@@ -14,6 +14,7 @@ import os
14import sys14import sys
1515
16import json16import json
17import pytest
1718
18sys.path.insert(0, os.path.realpath(19sys.path.insert(0, os.path.realpath(
19 os.path.join(os.path.dirname(os.path.realpath(__file__)), "..")))20 os.path.join(os.path.dirname(os.path.realpath(__file__)), "..")))
@@ -89,16 +90,24 @@ def test_ppas():
89 job = Job(0, '', '', '', '', ppas=['ppa:a/b', 'ppa:c/d'])90 job = Job(0, '', '', '', '', ppas=['ppa:a/b', 'ppa:c/d'])
90 assert job.ppas == ['ppa:a/b', 'ppa:c/d']91 assert job.ppas == ['ppa:a/b', 'ppa:c/d']
9192
9293@pytest.mark.parametrize('triggers, endswith', [
93def test_request_url():94 ( ['t/1'], '?release=c&arch=d&package=b&trigger=t%2F1' ),
95 ( ['t/2.3'], '?release=c&arch=d&package=b&trigger=t%2F2.3' ),
96 ( ['t/2.3-1'], '?release=c&arch=d&package=b&trigger=t%2F2.3-1' ),
97 ( ['t/2.3-1ubuntu2'], '?release=c&arch=d&package=b&trigger=t%2F2.3-1ubuntu2' ),
98 ( ['t/2.3-1ubuntu2~ppa1'], '?release=c&arch=d&package=b&trigger=t%2F2.3-1ubuntu2~ppa1' ),
99 ( ['t/2.3-1ubuntu2+ppa2'], '?release=c&arch=d&package=b&trigger=t%2F2.3-1ubuntu2%2Bppa2' ),
100 ( ['t/1', 'u/2'], '?release=c&arch=d&package=b&trigger=t%2F1&trigger=u%2F2' ),
101 ])
102def test_request_url(triggers, endswith):
94 """Checks Job object textual presentation."""103 """Checks Job object textual presentation."""
95 jobinfo = {104 jobinfo = {
96 'triggers': ['t/1'],105 'triggers': triggers,
97 'ppas': ['ppa:a/b', 'ppa:c/d']106 'ppas': ['ppa:a/b', 'ppa:c/d']
98 }107 }
99 job = Job(0, 'a', 'b', 'c', 'd', jobinfo['triggers'], jobinfo['ppas'])108 job = Job(0, 'a', 'b', 'c', 'd', jobinfo['triggers'], jobinfo['ppas'])
100 assert job.request_url.startswith("https://autopkgtest.ubuntu.com/request.cgi")109 assert job.request_url.startswith("https://autopkgtest.ubuntu.com/request.cgi")
101 assert job.request_url.endswith("?release=c&arch=d&package=b&trigger=t/1")110 assert job.request_url.endswith(endswith)
102111
103112
104def test_get_running():113def test_get_running():

Subscribers

People subscribed via source and target branches