improve api tests and error output

show only relevant aptly logs if a test fails.
for async tasks, show task output, as it contains the error message.
This commit is contained in:
André Roth
2024-07-16 19:48:04 +02:00
parent 8029305d32
commit 440c3debdc
11 changed files with 278 additions and 175 deletions

View File

@@ -5,6 +5,7 @@ import random
import shutil
import string
import time
import tempfile
from lib import BaseTest
@@ -18,11 +19,32 @@ TASK_SUCCEEDED = 2
TASK_FAILED = 3
class AptlyStream:
def __init__(self):
self.tmp_file = tempfile.NamedTemporaryFile(delete=False)
self.read_pos = 0
def fileno(self):
return self.tmp_file.fileno()
def get_contents(self):
self.tmp_file.seek(self.read_pos, 0)
return self.tmp_file.read().decode("utf-8")
def close(self):
self.tmp_file.close()
def clear(self):
self.read_pos = self.tmp_file.tell()
class APITest(BaseTest):
"""
BaseTest + testing aptly API
"""
aptly_server = None
aptly_out = None
debugOutput = True
base_url = "127.0.0.1:8765"
configOverride = {
"FileSystemPublishEndpoints": {
@@ -40,13 +62,20 @@ class APITest(BaseTest):
if APITest.aptly_server is None:
super(APITest, self).prepare()
APITest.aptly_out = AptlyStream()
configPath = os.path.join(os.environ["HOME"], self.aptlyConfigFile)
APITest.aptly_server = self._start_process(f"aptly api serve -no-lock -config={configPath} -listen={self.base_url}",)
APITest.aptly_server = self._start_process(f"aptly api serve -no-lock -config={configPath} -listen={self.base_url}", stdout=APITest.aptly_out, stderr=APITest.aptly_out)
time.sleep(1)
else:
APITest.aptly_out.clear()
if os.path.exists(os.path.join(os.environ["HOME"], self.aptlyDir, "upload")):
shutil.rmtree(os.path.join(os.environ["HOME"], self.aptlyDir, "upload"))
def debug_output(self):
return APITest.aptly_out.get_contents()
def run(self):
pass
@@ -79,6 +108,20 @@ class APITest(BaseTest):
return self.get("/api/tasks/" + str(_id))
def check_task(self, task):
self.check_equal(task.status_code, 200)
if task.json()['State'] != TASK_SUCCEEDED:
resp2 = self.get("/api/tasks/" + str(task.json()['ID']) + "/output")
raise Exception(f"task failed: {resp2.text}")
def check_task_fail(self, task, expected_output=None):
self.check_equal(task.status_code, 200)
if task.json()['State'] == TASK_SUCCEEDED:
raise Exception("task expected to fail")
if expected_output:
resp = self.get("/api/tasks/" + str(task.json()['ID']) + "/output")
self.check_equal(resp.text, expected_output)
def put(self, uri, *args, **kwargs):
if "json" in kwargs:
kwargs["data"] = json.dumps(kwargs.pop("json"))
@@ -142,6 +185,8 @@ class APITest(BaseTest):
cls.aptly_server.terminate()
cls.aptly_server.wait()
cls.aptly_server = None
if APITest.aptly_out is not None:
APITest.aptly_out.close()
def random_name(self):
return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(15))

View File

@@ -128,6 +128,7 @@ class BaseTest(object):
requiresGPG2 = False
requiresDot = False
sortOutput = False
debugOutput = False
aptlyDir = ".aptly"
aptlyConfigFile = ".aptly.conf"
@@ -177,6 +178,10 @@ class BaseTest(object):
try:
self.run()
self.check()
except Exception as exc:
if self.debugOutput:
print(f"API log:\n{self.debug_output()}")
raise exc
finally:
self.teardown()

View File

@@ -153,10 +153,8 @@ def run(include_long_tests=False, capture_results=False, tests=None, filters=Non
for (test, t, typ, val, tb, testModule) in fails:
doc = t.__doc__ or ''
print("%s:%s %s" % (test, t.__class__.__name__,
testModule.__name__ + ": " + doc.strip()))
traceback.print_exception(typ, val, tb)
print("=" * 60)
print(" - %s:%s %s" % (test, t.__class__.__name__,
testModule.__name__ + ": " + doc.strip()))
sys.exit(1)

View File

@@ -7,11 +7,16 @@ from api_lib import APITest
def check_gpgkey_exists(gpg_key, keyring):
subprocess.check_call([
p = subprocess.Popen([
"gpg", "--no-default-keyring",
"--keyring", keyring,
"--fingerprint", gpg_key,
])
"--fingerprint", gpg_key],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
p.communicate()
if p.returncode != 0:
raise Exception("gpg key does not exists")
class GPGAPITestAddKey(APITest):

View File

@@ -1,4 +1,4 @@
from api_lib import TASK_SUCCEEDED, APITest
from api_lib import APITest
class MirrorsAPITestCreateShow(APITest):
@@ -58,11 +58,8 @@ class MirrorsAPITestCreateUpdate(APITest):
mirror_desc["Name"] = self.random_name()
resp = self.put_task("/api/mirrors/" + mirror_name, json=mirror_desc)
self.check_equal(resp.status_code, 200)
self.check_task(resp)
_id = resp.json()['ID']
if resp.json()["State"] != TASK_SUCCEEDED:
resp = self.get("/api/tasks/" + str(_id) + "/output")
raise Exception("task failed: " + str(resp.json()))
resp = self.get("/api/tasks/" + str(_id) + "/detail")
self.check_equal(resp.status_code, 200)
@@ -95,7 +92,7 @@ class MirrorsAPITestCreateDelete(APITest):
self.check_equal(resp.status_code, 201)
resp = self.delete_task("/api/mirrors/" + mirror_name)
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(resp)
class MirrorsAPITestCreateList(APITest):
@@ -154,8 +151,4 @@ class MirrorsAPITestSkipArchitectureCheck(APITest):
mirror_desc = {'Name': mirror_name,
'IgnoreSignatures': True}
resp = self.put_task("/api/mirrors/" + mirror_name, json=mirror_desc)
self.check_equal(resp.status_code, 200)
_id = resp.json()['ID']
if resp.json()["State"] != TASK_SUCCEEDED:
resp = self.get("/api/tasks/" + str(_id) + "/output")
raise Exception("task failed: " + str(resp.json()))
self.check_task(resp)

View File

@@ -2,7 +2,7 @@ import urllib.error
import urllib.parse
import urllib.request
from api_lib import TASK_SUCCEEDED, APITest
from api_lib import APITest
class PackagesAPITestShow(APITest):
@@ -19,7 +19,7 @@ class PackagesAPITestShow(APITest):
"pyspi_0.6.1-1.3.dsc", "pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz").status_code, 200)
resp = self.post_task("/api/repos/" + repo_name + "/file/" + d)
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(resp)
# get information about package
pyspi_json = {

View File

@@ -27,11 +27,12 @@ class PublishAPITestRepo(APITest):
"pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz",
"pyspi-0.6.1-1.3.stripped.dsc").status_code, 200)
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
self.check_task(task)
# publishing under prefix, default distribution
prefix = self.random_name()
resp = self.post_task(
task = self.post_task(
"/api/publish/" + prefix,
json={
"SourceKind": "local",
@@ -39,6 +40,7 @@ class PublishAPITestRepo(APITest):
"Signing": DefaultSigningOptions,
}
)
self.check_task(task)
repo_expected = {
'AcquireByHash': False,
'Architectures': ['i386', 'source'],
@@ -56,8 +58,6 @@ class PublishAPITestRepo(APITest):
'Storage': '',
'Suite': ''}
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
all_repos = self.get("/api/publish")
self.check_equal(all_repos.status_code, 200)
self.check_in(repo_expected, all_repos.json())
@@ -74,7 +74,7 @@ class PublishAPITestRepo(APITest):
# publishing under root, custom distribution, architectures
distribution = self.random_name()
resp = self.post_task(
task = self.post_task(
"/api/publish/:.",
json={
"SourceKind": "local",
@@ -84,7 +84,7 @@ class PublishAPITestRepo(APITest):
"Architectures": ["i386", "amd64"],
}
)
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(task)
repo2_expected = {
'AcquireByHash': False,
'Architectures': ['amd64', 'i386'],
@@ -138,12 +138,14 @@ class PublishSnapshotAPITest(APITest):
self.check_equal(self.upload("/api/files/" + d,
"libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200)
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
self.check_task(task)
self.check_equal(self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot_name}).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot_name})
self.check_task(task)
prefix = self.random_name()
resp = self.post_task(
task = self.post_task(
"/api/publish/" + prefix,
json={
"AcquireByHash": True,
@@ -157,9 +159,9 @@ class PublishSnapshotAPITest(APITest):
"Label": "fun",
}
)
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(task)
_id = resp.json()['ID']
_id = task.json()['ID']
resp = self.get("/api/tasks/" + str(_id) + "/detail")
self.check_equal(resp.json()['RemainingNumberOfPackages'], 0)
self.check_equal(resp.json()['TotalNumberOfPackages'], 1)
@@ -213,10 +215,11 @@ class PublishUpdateAPITestRepo(APITest):
"pyspi_0.6.1-1.3.dsc",
"pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz",
"pyspi-0.6.1-1.3.stripped.dsc").status_code, 200)
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
self.check_task(task)
prefix = self.random_name()
resp = self.post_task(
task = self.post_task(
"/api/publish/" + prefix,
json={
"Architectures": ["i386", "source"],
@@ -225,8 +228,7 @@ class PublishUpdateAPITestRepo(APITest):
"Signing": DefaultSigningOptions,
}
)
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(task)
self.check_not_exists(
"public/" + prefix + "/pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb")
@@ -236,20 +238,22 @@ class PublishUpdateAPITestRepo(APITest):
d = self.random_name()
self.check_equal(self.upload("/api/files/" + d,
"libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200)
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
self.check_task(task)
self.check_equal(self.delete_task("/api/repos/" + repo_name + "/packages/",
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']}).json()['State'], TASK_SUCCEEDED)
task = self.delete_task("/api/repos/" + repo_name + "/packages/",
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']})
self.check_task(task)
# Update and switch AcquireByHash on.
resp = self.put_task(
task = self.put_task(
"/api/publish/" + prefix + "/wheezy",
json={
"AcquireByHash": True,
"Signing": DefaultSigningOptions,
}
)
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(task)
repo_expected = {
'AcquireByHash': True,
'Architectures': ['i386', 'source'],
@@ -279,7 +283,8 @@ class PublishUpdateAPITestRepo(APITest):
self.check_not_exists(
"public/" + prefix + "/pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc")
self.check_equal(self.delete_task("/api/publish/" + prefix + "/wheezy").json()['State'], TASK_SUCCEEDED)
task = self.delete_task("/api/publish/" + prefix + "/wheezy")
self.check_task(task)
self.check_not_exists("public/" + prefix + "dists/")
@@ -300,10 +305,11 @@ class PublishConcurrentUpdateAPITestRepo(APITest):
"pyspi_0.6.1-1.3.dsc",
"pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz",
"pyspi-0.6.1-1.3.stripped.dsc").status_code, 200)
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
self.check_task(task)
prefix = self.random_name()
resp = self.post_task(
task = self.post_task(
"/api/publish/" + prefix,
json={
"Architectures": ["i386", "source"],
@@ -312,8 +318,7 @@ class PublishConcurrentUpdateAPITestRepo(APITest):
"Signing": DefaultSigningOptions,
}
)
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(task)
self.check_not_exists(
"public/" + prefix + "/pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb")
@@ -323,10 +328,12 @@ class PublishConcurrentUpdateAPITestRepo(APITest):
d = self.random_name()
self.check_equal(self.upload("/api/files/" + d,
"libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200)
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
self.check_task(task)
self.check_equal(self.delete_task("/api/repos/" + repo_name + "/packages/",
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']}).json()['State'], TASK_SUCCEEDED)
task = self.delete_task("/api/repos/" + repo_name + "/packages/",
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']})
self.check_task(task)
def _do_update(result, index):
resp = self.put_task(
@@ -379,7 +386,8 @@ class PublishConcurrentUpdateAPITestRepo(APITest):
self.check_not_exists(
"public/" + prefix + "/pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc")
self.check_equal(self.delete_task("/api/publish/" + prefix + "/wheezy").json()['State'], TASK_SUCCEEDED)
task = self.delete_task("/api/publish/" + prefix + "/wheezy")
self.check_task(task)
self.check_not_exists("public/" + prefix + "dists/")
@@ -400,18 +408,18 @@ class PublishUpdateSkipCleanupAPITestRepo(APITest):
"pyspi_0.6.1-1.3.dsc",
"pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz",
"pyspi-0.6.1-1.3.stripped.dsc").status_code, 200)
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
self.check_task(task)
prefix = self.random_name()
resp = self.post_task("/api/publish/" + prefix,
task = self.post_task("/api/publish/" + prefix,
json={
"Architectures": ["i386", "source"],
"SourceKind": "local",
"Sources": [{"Name": repo_name}],
"Signing": DefaultSigningOptions,
})
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(task)
self.check_not_exists(
"public/" + prefix + "/pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb")
@@ -420,7 +428,7 @@ class PublishUpdateSkipCleanupAPITestRepo(APITest):
# Publish two repos, so that deleting one while skipping cleanup will
# not delete the whole prefix.
resp = self.post_task("/api/publish/" + prefix,
task = self.post_task("/api/publish/" + prefix,
json={
"Architectures": ["i386", "source"],
"Distribution": "otherdist",
@@ -428,23 +436,24 @@ class PublishUpdateSkipCleanupAPITestRepo(APITest):
"Sources": [{"Name": repo_name}],
"Signing": DefaultSigningOptions,
})
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(task)
d = self.random_name()
self.check_equal(self.upload("/api/files/" + d,
"libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200)
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
self.check_task(task)
self.check_equal(self.delete_task("/api/repos/" + repo_name + "/packages/",
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']}).json()['State'], TASK_SUCCEEDED)
task = self.delete_task("/api/repos/" + repo_name + "/packages/",
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']})
self.check_task(task)
resp = self.put_task("/api/publish/" + prefix + "/wheezy",
task = self.put_task("/api/publish/" + prefix + "/wheezy",
json={
"Signing": DefaultSigningOptions,
"SkipCleanup": True,
})
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(task)
repo_expected = {
'AcquireByHash': False,
'Architectures': ['i386', 'source'],
@@ -471,7 +480,8 @@ class PublishUpdateSkipCleanupAPITestRepo(APITest):
self.check_exists("public/" + prefix +
"/pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc")
self.check_equal(self.delete_task("/api/publish/" + prefix + "/wheezy", params={"SkipCleanup": "1"}).json()['State'], TASK_SUCCEEDED)
task = self.delete_task("/api/publish/" + prefix + "/wheezy", params={"SkipCleanup": "1"})
self.check_task(task)
self.check_exists("public/" + prefix + "/pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb")
self.check_exists("public/" + prefix + "/pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc")
@@ -493,13 +503,15 @@ class PublishSwitchAPITestRepo(APITest):
"pyspi_0.6.1-1.3.dsc",
"pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz",
"pyspi-0.6.1-1.3.stripped.dsc").status_code, 200)
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
self.check_task(task)
snapshot1_name = self.random_name()
self.check_equal(self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot1_name}).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot1_name})
self.check_task(task)
prefix = self.random_name()
resp = self.post_task(
task = self.post_task(
"/api/publish/" + prefix,
json={
"Architectures": ["i386", "source"],
@@ -507,8 +519,8 @@ class PublishSwitchAPITestRepo(APITest):
"Sources": [{"Name": snapshot1_name}],
"Signing": DefaultSigningOptions,
})
self.check_task(task)
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
repo_expected = {
'AcquireByHash': False,
'Architectures': ['i386', 'source'],
@@ -537,22 +549,25 @@ class PublishSwitchAPITestRepo(APITest):
d = self.random_name()
self.check_equal(self.upload("/api/files/" + d,
"libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200)
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
self.check_task(task)
self.check_equal(self.delete_task("/api/repos/" + repo_name + "/packages/",
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']}).json()['State'], TASK_SUCCEEDED)
task = self.delete_task("/api/repos/" + repo_name + "/packages/",
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']})
self.check_task(task)
snapshot2_name = self.random_name()
self.check_equal(self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot2_name}).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot2_name})
self.check_task(task)
resp = self.put_task(
task = self.put_task(
"/api/publish/" + prefix + "/wheezy",
json={
"Snapshots": [{"Component": "main", "Name": snapshot2_name}],
"Signing": DefaultSigningOptions,
"SkipContents": True,
})
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(task)
repo_expected = {
'AcquireByHash': False,
'Architectures': ['i386', 'source'],
@@ -579,7 +594,8 @@ class PublishSwitchAPITestRepo(APITest):
self.check_not_exists(
"public/" + prefix + "/pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc")
self.check_equal(self.delete_task("/api/publish/" + prefix + "/wheezy").json()['State'], TASK_SUCCEEDED)
task = self.delete_task("/api/publish/" + prefix + "/wheezy")
self.check_task(task)
self.check_not_exists("public/" + prefix + "dists/")
@@ -600,13 +616,15 @@ class PublishSwitchAPISkipCleanupTestRepo(APITest):
"pyspi_0.6.1-1.3.dsc",
"pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz",
"pyspi-0.6.1-1.3.stripped.dsc").status_code, 200)
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
self.check_task(task)
snapshot1_name = self.random_name()
self.check_equal(self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot1_name}).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot1_name})
self.check_task(task)
prefix = self.random_name()
resp = self.post_task("/api/publish/" + prefix,
task = self.post_task("/api/publish/" + prefix,
json={
"Architectures": ["i386", "source"],
"SourceKind": "snapshot",
@@ -614,7 +632,7 @@ class PublishSwitchAPISkipCleanupTestRepo(APITest):
"Signing": DefaultSigningOptions,
})
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(task)
repo_expected = {
'AcquireByHash': False,
'Architectures': ['i386', 'source'],
@@ -642,7 +660,7 @@ class PublishSwitchAPISkipCleanupTestRepo(APITest):
# Publish two snapshots, so that deleting one while skipping cleanup will
# not delete the whole prefix.
resp = self.post_task("/api/publish/" + prefix,
task = self.post_task("/api/publish/" + prefix,
json={
"Architectures": ["i386", "source"],
"Distribution": "otherdist",
@@ -651,7 +669,7 @@ class PublishSwitchAPISkipCleanupTestRepo(APITest):
"Signing": DefaultSigningOptions,
})
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(task)
repo_expected = {
'AcquireByHash': False,
'Architectures': ['i386', 'source'],
@@ -675,22 +693,25 @@ class PublishSwitchAPISkipCleanupTestRepo(APITest):
d = self.random_name()
self.check_equal(self.upload("/api/files/" + d,
"libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200)
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
self.check_task(task)
self.check_equal(self.delete_task("/api/repos/" + repo_name + "/packages/",
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']}).json()['State'], TASK_SUCCEEDED)
task = self.delete_task("/api/repos/" + repo_name + "/packages/",
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']})
self.check_task(task)
snapshot2_name = self.random_name()
self.check_equal(self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot2_name}).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot2_name})
self.check_task(task)
resp = self.put_task("/api/publish/" + prefix + "/wheezy",
task = self.put_task("/api/publish/" + prefix + "/wheezy",
json={
"Snapshots": [{"Component": "main", "Name": snapshot2_name}],
"Signing": DefaultSigningOptions,
"SkipCleanup": True,
"SkipContents": True,
})
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(task)
repo_expected = {
'AcquireByHash': False,
'Architectures': ['i386', 'source'],
@@ -715,7 +736,8 @@ class PublishSwitchAPISkipCleanupTestRepo(APITest):
self.check_exists("public/" + prefix + "/pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb")
self.check_exists("public/" + prefix + "/pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc")
self.check_equal(self.delete_task("/api/publish/" + prefix + "/wheezy", params={"SkipCleanup": "1"}).json()['State'], TASK_SUCCEEDED)
task = self.delete_task("/api/publish/" + prefix + "/wheezy", params={"SkipCleanup": "1"})
self.check_task(task)
self.check_exists("public/" + prefix + "/pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb")
self.check_exists("public/" + prefix + "/pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc")

View File

@@ -1,4 +1,4 @@
from api_lib import TASK_FAILED, TASK_SUCCEEDED, APITest
from api_lib import APITest
from .publish import DefaultSigningOptions
@@ -41,7 +41,8 @@ class ReposAPITestCreateIndexDelete(APITest):
names = [repo["Name"] for repo in repos]
assert repo_name in names
self.check_equal(self.delete_task("/api/repos/" + repo_name).json()['State'], TASK_SUCCEEDED)
resp = self.delete_task("/api/repos/" + repo_name)
self.check_task(resp)
self.check_equal(self.delete("/api/repos/" + repo_name).status_code, 404)
self.check_equal(self.get("/api/repos/" + repo_name).status_code, 404)
@@ -61,25 +62,32 @@ class ReposAPITestCreateIndexDelete(APITest):
"pyspi_0.6.1-1.3.dsc", "pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz").status_code, 200)
resp = self.post_task("/api/repos/" + repo_name + "/file/" + d)
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(resp)
self.check_equal(self.post_task("/api/repos/" + repo_name + "/snapshots", json={"Name": repo_name}).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/snapshots", json={"Name": repo_name})
self.check_task(task)
self.check_equal(self.post_task("/api/publish",
json={
"SourceKind": "local",
"Sources": [{"Name": repo_name}],
"Signing": DefaultSigningOptions,
}).json()['State'], TASK_SUCCEEDED)
resp = self.post_task("/api/publish",
json={
"SourceKind": "local",
"Sources": [{"Name": repo_name}],
"Signing": DefaultSigningOptions,
})
self.check_task(resp)
# repo is not deletable while it is published
self.check_equal(self.delete_task("/api/repos/" + repo_name).json()['State'], TASK_FAILED)
self.check_equal(self.delete_task("/api/repos/" + repo_name, params={"force": "1"}).json()['State'], TASK_FAILED)
task = self.delete_task("/api/repos/" + repo_name)
self.check_task_fail(task)
task = self.delete_task("/api/repos/" + repo_name, params={"force": "1"})
self.check_task_fail(task)
# drop published
self.check_equal(self.delete_task("/api/publish//" + distribution).json()['State'], TASK_SUCCEEDED)
self.check_equal(self.delete_task("/api/repos/" + repo_name).json()['State'], TASK_FAILED)
self.check_equal(self.delete_task("/api/repos/" + repo_name, params={"force": "1"}).json()['State'], TASK_SUCCEEDED)
task = self.delete_task("/api/publish//" + distribution)
self.check_task(task)
task = self.delete_task("/api/repos/" + repo_name)
self.check_task_fail(task)
task = self.delete_task("/api/repos/" + repo_name, params={"force": "1"})
self.check_task(task)
self.check_equal(self.get("/api/repos/" + repo_name).status_code, 404)
@@ -97,7 +105,7 @@ class ReposAPITestAdd(APITest):
"pyspi_0.6.1-1.3.dsc", "pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz").status_code, 200)
resp = self.post_task("/api/repos/" + repo_name + "/file/" + d)
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(resp)
resp = self.get("/api/tasks/" + str(resp.json()['ID']) + "/output")
self.check_equal(resp.status_code, 200)
@@ -125,7 +133,8 @@ class ReposAPITestAddNotFullRemove(APITest):
self.check_equal(self.upload("/api/files/" + d,
"pyspi_0.6.1-1.3.dsc", "pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz", "aptly.pub").status_code, 200)
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
self.check_task(task)
self.check_equal(self.get("/api/repos/" + repo_name + "/packages").json(), ['Psource pyspi 0.6.1-1.3 3a8b37cbd9a3559e'])
self.check_exists("upload/" + d + "/aptly.pub")
@@ -145,7 +154,8 @@ class ReposAPITestAddNoRemove(APITest):
self.check_equal(self.upload("/api/files/" + d,
"pyspi_0.6.1-1.3.dsc", "pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz").status_code, 200)
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d, params={"noRemove": 1}).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/file/" + d, params={"noRemove": 1})
self.check_task(task)
self.check_equal(self.get("/api/repos/" + repo_name + "/packages").json(), ['Psource pyspi 0.6.1-1.3 3a8b37cbd9a3559e'])
self.check_exists("upload/" + d + "/pyspi_0.6.1-1.3.dsc")
@@ -165,7 +175,7 @@ class ReposAPITestAddFile(APITest):
"libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200)
resp = self.post_task("/api/repos/" + repo_name + "/file/" + d + "/libboost-program-options-dev_1.49.0.1_i386.deb")
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(resp)
resp = self.get("/api/tasks/" + str(resp.json()['ID']) + "/output")
self.check_equal(resp.status_code, 200)
@@ -197,7 +207,7 @@ class ReposAPITestInclude(APITest):
self.check_equal(resp.status_code, 200)
resp = self.post_task("/api/repos/" + repo_name + "/include/" + d, params={"ignoreSignature": 1})
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(resp)
resp = self.get("/api/tasks/" + str(resp.json()['ID']) + "/output")
self.check_equal(resp.status_code, 200)
@@ -225,7 +235,8 @@ class ReposAPITestShowQuery(APITest):
"libboost-program-options-dev_1.49.0.1_i386.deb", "pyspi_0.6.1-1.3.dsc",
"pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz",
"pyspi-0.6.1-1.3.stripped.dsc").status_code, 200)
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
self.check_task(task)
self.check_equal(sorted(self.get("/api/repos/" + repo_name + "/packages", params={"q": "pyspi"}).json()),
['Psource pyspi 0.6.1-1.3 3a8b37cbd9a3559e', 'Psource pyspi 0.6.1-1.4 f8f1daa806004e89'])
@@ -258,13 +269,15 @@ class ReposAPITestAddMultiple(APITest):
"pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz",
"pyspi-0.6.1-1.3.stripped.dsc").status_code, 200)
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d + "/pyspi_0.6.1-1.3.dsc",
params={"noRemove": 1}).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/file/" + d + "/pyspi_0.6.1-1.3.dsc",
params={"noRemove": 1})
self.check_task(task)
self.check_equal(sorted(self.get("/api/repos/" + repo_name + "/packages").json()),
['Psource pyspi 0.6.1-1.3 3a8b37cbd9a3559e'])
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d + "/pyspi-0.6.1-1.3.stripped.dsc").json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/file/" + d + "/pyspi-0.6.1-1.3.stripped.dsc")
self.check_task(task)
self.check_equal(sorted(self.get("/api/repos/" + repo_name + "/packages").json()),
['Psource pyspi 0.6.1-1.3 3a8b37cbd9a3559e', 'Psource pyspi 0.6.1-1.4 f8f1daa806004e89'])
@@ -286,34 +299,39 @@ class ReposAPITestPackagesAddDelete(APITest):
"pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz",
"pyspi-0.6.1-1.3.stripped.dsc").status_code, 200)
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
self.check_task(task)
self.check_equal(sorted(self.get("/api/repos/" + repo_name + "/packages").json()),
['Pi386 libboost-program-options-dev 1.49.0.1 918d2f433384e378',
'Psource pyspi 0.6.1-1.3 3a8b37cbd9a3559e',
'Psource pyspi 0.6.1-1.4 f8f1daa806004e89'])
self.check_equal(self.post_task("/api/repos/" + repo_name + "/packages/",
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']}).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/packages/",
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']})
self.check_task(task)
self.check_equal(sorted(self.get("/api/repos/" + repo_name + "/packages").json()),
['Pi386 libboost-program-options-dev 1.49.0.1 918d2f433384e378',
'Psource pyspi 0.6.1-1.3 3a8b37cbd9a3559e',
'Psource pyspi 0.6.1-1.4 f8f1daa806004e89'])
self.check_equal(self.post_task("/api/repos/" + repo_name + "/packages/",
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89',
'Psource no-such-package 0.6.1-1.4 f8f1daa806004e89']}).json()['State'], TASK_FAILED)
task = self.post_task("/api/repos/" + repo_name + "/packages/",
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89',
'Psource no-such-package 0.6.1-1.4 f8f1daa806004e89']})
self.check_task_fail(task)
self.check_equal(self.delete_task("/api/repos/" + repo_name + "/packages/",
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']}).json()['State'], TASK_SUCCEEDED)
task = self.delete_task("/api/repos/" + repo_name + "/packages/",
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']})
self.check_task(task)
self.check_equal(sorted(self.get("/api/repos/" + repo_name + "/packages").json()),
['Pi386 libboost-program-options-dev 1.49.0.1 918d2f433384e378',
'Psource pyspi 0.6.1-1.3 3a8b37cbd9a3559e'])
self.check_equal(self.post_task("/api/repos/" + repo_name + "/packages/",
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']}).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/packages/",
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']})
self.check_task(task)
self.check_equal(sorted(self.get("/api/repos/" + repo_name + "/packages").json()),
['Pi386 libboost-program-options-dev 1.49.0.1 918d2f433384e378',
@@ -324,9 +342,10 @@ class ReposAPITestPackagesAddDelete(APITest):
self.check_equal(self.post("/api/repos", json={"Name": repo_name2, "Comment": "fun repo"}).status_code, 201)
self.check_equal(self.post_task("/api/repos/" + repo_name2 + "/packages/",
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89',
'Pi386 libboost-program-options-dev 1.49.0.1 918d2f433384e378']}).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name2 + "/packages/",
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89',
'Pi386 libboost-program-options-dev 1.49.0.1 918d2f433384e378']})
self.check_task(task)
self.check_equal(sorted(self.get("/api/repos/" + repo_name2 + "/packages").json()),
['Pi386 libboost-program-options-dev 1.49.0.1 918d2f433384e378',
@@ -349,7 +368,7 @@ class ReposAPITestShowMaxVersion(APITest):
).status_code, 200)
resp = self.post_task("/api/repos/" + repo_name + "/file/" + d)
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(resp)
resp = self.get("/api/tasks/" + str(resp.json()['ID']) + "/output")
self.check_equal(resp.status_code, 200)
@@ -377,7 +396,7 @@ class ReposAPITestCopyPackage(APITest):
d = self.random_name()
self.check_equal(self.upload(f"/api/files/{d}", f"{pkg_name}.deb").status_code, 200)
resp = self.post_task(f"/api/repos/{repo1_name}/file/{d}")
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(resp)
# Creating target repo
repo2_name = self.random_name()
@@ -385,8 +404,11 @@ class ReposAPITestCopyPackage(APITest):
# Copy the package
resp = self.post_task(f"/api/repos/{repo2_name}/copy/{repo1_name}/{pkg_name}")
self.check_equal(resp.status_code, 200)
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(resp)
# Test non-existing package
resp = self.post_task(f"/api/repos/{repo2_name}/copy/{repo1_name}/la<la>la")
self.check_task_fail(resp)
self.check_equal(self.get(f"/api/repos/{repo2_name}/packages").json(),
['Pi386 libboost-program-options-dev 1.49.0.1 918d2f433384e378'])

View File

@@ -1,4 +1,4 @@
from api_lib import TASK_FAILED, TASK_SUCCEEDED, APITest
from api_lib import TASK_FAILED, APITest
from .publish import DefaultSigningOptions
@@ -13,8 +13,8 @@ class SnapshotsAPITestCreateShowEmpty(APITest):
'Name': snapshot_name}
# create empty snapshot
resp = self.post_task("/api/snapshots", json=snapshot_desc)
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/snapshots", json=snapshot_desc)
self.check_task(task)
self.check_subset(snapshot_desc, self.get("/api/snapshots/" + snapshot_name).json())
self.check_equal(self.get("/api/snapshots/" + snapshot_name).status_code, 200)
@@ -47,8 +47,8 @@ class SnapshotsAPITestCreateFromRefs(APITest):
# create empty snapshot
empty_snapshot_name = self.random_name()
resp = self.post_task("/api/snapshots", json={"Name": empty_snapshot_name})
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/snapshots", json={"Name": empty_snapshot_name})
self.check_task(task)
self.check_equal(
self.get("/api/snapshots/" + empty_snapshot_name).json()['Description'], "Created as empty"
)
@@ -59,14 +59,15 @@ class SnapshotsAPITestCreateFromRefs(APITest):
d = self.random_name()
self.check_equal(self.upload("/api/files/" + d,
"libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200)
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
self.check_task(task)
# create snapshot with empty snapshot as source and package
snapshot = snapshot_desc.copy()
snapshot['PackageRefs'] = ["Pi386 libboost-program-options-dev 1.49.0.1 918d2f433384e378"]
snapshot['SourceSnapshots'] = [empty_snapshot_name]
resp = self.post_task("/api/snapshots", json=snapshot)
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/snapshots", json=snapshot)
self.check_task(task)
snapshot.pop('SourceSnapshots')
snapshot.pop('PackageRefs')
resp = self.get("/api/snapshots/" + snapshot_name)
@@ -100,8 +101,8 @@ class SnapshotsAPITestCreateFromRepo(APITest):
snapshot_name = self.random_name()
self.check_equal(self.post("/api/repos", json={"Name": repo_name}).status_code, 201)
resp = self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot_name})
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot_name})
self.check_task(task)
self.check_equal([],
self.get("/api/snapshots/" + snapshot_name + "/packages", params={"format": "details"}).json())
@@ -110,10 +111,11 @@ class SnapshotsAPITestCreateFromRepo(APITest):
self.check_equal(self.upload("/api/files/" + d,
"libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200)
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
self.check_task(task)
resp = self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot_name})
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot_name})
self.check_task(task)
self.check_equal(self.get("/api/snapshots/" + snapshot_name).status_code, 200)
self.check_subset({'Architecture': 'i386',
@@ -143,13 +145,13 @@ class SnapshotsAPITestCreateUpdate(APITest):
snapshot_desc = {'Description': 'fun snapshot',
'Name': snapshot_name}
resp = self.post_task("/api/snapshots", json=snapshot_desc)
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/snapshots", json=snapshot_desc)
self.check_task(task)
new_snapshot_name = self.random_name()
resp = self.put_task("/api/snapshots/" + snapshot_name, json={'Name': new_snapshot_name,
task = self.put_task("/api/snapshots/" + snapshot_name, json={'Name': new_snapshot_name,
'Description': 'New description'})
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(task)
resp = self.get("/api/snapshots/" + new_snapshot_name)
self.check_equal(resp.status_code, 200)
@@ -176,16 +178,18 @@ class SnapshotsAPITestCreateDelete(APITest):
'Name': snapshot_name}
# deleting unreferenced snapshot
resp = self.post_task("/api/snapshots", json=snapshot_desc)
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/snapshots", json=snapshot_desc)
self.check_task(task)
self.check_equal(self.delete_task("/api/snapshots/" + snapshot_name).json()['State'], TASK_SUCCEEDED)
task = self.delete_task("/api/snapshots/" + snapshot_name)
self.check_task(task)
self.check_equal(self.get("/api/snapshots/" + snapshot_name).status_code, 404)
# deleting referenced snapshot
snap1, snap2 = self.random_name(), self.random_name()
self.check_equal(self.post_task("/api/snapshots", json={"Name": snap1}).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/snapshots", json={"Name": snap1})
self.check_task(task)
self.check_equal(
self.post_task(
"/api/snapshots", json={"Name": snap2, "SourceSnapshots": [snap1]}
@@ -194,11 +198,12 @@ class SnapshotsAPITestCreateDelete(APITest):
self.check_equal(self.delete_task("/api/snapshots/" + snap1).json()['State'], TASK_FAILED)
self.check_equal(self.get("/api/snapshots/" + snap1).status_code, 200)
self.check_equal(self.delete_task("/api/snapshots/" + snap1, params={"force": "1"}).json()['State'], TASK_SUCCEEDED)
task = self.delete_task("/api/snapshots/" + snap1, params={"force": "1"})
self.check_task(task)
self.check_equal(self.get("/api/snapshots/" + snap1).status_code, 404)
# deleting published snapshot
resp = self.post_task(
task = self.post_task(
"/api/publish",
json={
"SourceKind": "snapshot",
@@ -208,7 +213,7 @@ class SnapshotsAPITestCreateDelete(APITest):
"Signing": DefaultSigningOptions,
}
)
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
self.check_task(task)
self.check_equal(self.delete_task("/api/snapshots/" + snap2).json()['State'], TASK_FAILED)
self.check_equal(self.delete_task("/api/snapshots/" + snap2, params={"force": "1"}).json()['State'], TASK_FAILED)
@@ -228,10 +233,11 @@ class SnapshotsAPITestSearch(APITest):
self.check_equal(self.upload("/api/files/" + d,
"libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200)
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
self.check_task(task)
resp = self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot_name})
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot_name})
self.check_task(task)
resp = self.get("/api/snapshots/" + snapshot_name + "/packages",
params={"q": "libboost-program-options-dev", "format": "details"})
@@ -262,13 +268,14 @@ class SnapshotsAPITestDiff(APITest):
self.check_equal(self.upload("/api/files/" + d,
"libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200)
self.check_equal(self.post_task("/api/repos/" + repos[-1] + "/file/" + d).json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repos[-1] + "/file/" + d)
self.check_task(task)
resp = self.post_task("/api/repos/" + repos[-1] + '/snapshots', json={'Name': snapshots[0]})
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/repos/" + repos[-1] + '/snapshots', json={'Name': snapshots[0]})
self.check_task(task)
resp = self.post_task("/api/snapshots", json={'Name': snapshots[1]})
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
task = self.post_task("/api/snapshots", json={'Name': snapshots[1]})
self.check_task(task)
resp = self.get("/api/snapshots/" + snapshots[0] + "/diff/" + snapshots[1])
self.check_equal(resp.status_code, 200)
@@ -302,19 +309,19 @@ class SnapshotsAPITestMerge(APITest):
# create source snapshots
for source in sources:
resp = self.post_task("/api/snapshots", json=source)
self.check_equal(resp.json()["State"], TASK_SUCCEEDED)
task = self.post_task("/api/snapshots", json=source)
self.check_task(task)
# create merge snapshot
merged_name = self.random_name()
resp = self.post_task(
task = self.post_task(
"/api/snapshots/merge",
json={
"Destination": merged_name,
"Sources": [source["Name"] for source in sources],
},
)
self.check_equal(resp.json()["State"], TASK_SUCCEEDED)
self.check_task(task)
# check merge snapshot
resp = self.get(f"/api/snapshots/{merged_name}")
@@ -329,9 +336,8 @@ class SnapshotsAPITestMerge(APITest):
)
# remove merge snapshot
self.check_equal(
self.delete_task(f"/api/snapshots/{merged_name}").json()["State"], TASK_SUCCEEDED
)
task = self.delete_task(f"/api/snapshots/{merged_name}")
self.check_task(task)
# create merge snapshot without sources
merged_name = self.random_name()

View File

@@ -1,4 +1,4 @@
from api_lib import TASK_SUCCEEDED, APITest
from api_lib import APITest
from .publish import DefaultSigningOptions
@@ -49,9 +49,8 @@ class TaskAPITestParallelTasks(APITest):
def _wait_for_task(self, task_id):
uri = "/api/tasks/%d/wait" % int(task_id)
resp = self.get(uri)
self.check_equal(resp.status_code, 200)
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
task = self.get(uri)
self.check_task(task)
def _wait_for_all_tasks(self):
resp = self.get("/api/tasks-wait")
@@ -103,6 +102,5 @@ class TaskAPITestParallelTasks(APITest):
self._wait_for_all_tasks()
for publish_task_id in publish_task_ids:
resp = self.get("/api/tasks/%d" % publish_task_id)
self.check_equal(resp.status_code, 200)
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
task = self.get("/api/tasks/%d" % publish_task_id)
self.check_task(task)

View File

@@ -6,19 +6,28 @@ import urllib.parse
import urllib.request
from lib import BaseTest
from api_lib import AptlyStream
class UnixSocketAPITest(BaseTest):
aptly_server = None
socket_path = "/tmp/_aptly_test.sock"
base_url = ("unix://%s" % socket_path)
aptly_out = None
debugOutput = True
def prepare(self):
if self.aptly_server is None:
self.aptly_server = self._start_process("aptly api serve -no-lock -listen=%s" % (self.base_url),)
UnixSocketAPITest.aptly_out = AptlyStream()
self.aptly_server = self._start_process("aptly api serve -no-lock -listen=%s" % (self.base_url), stdout=UnixSocketAPITest.aptly_out, stderr=UnixSocketAPITest.aptly_out)
time.sleep(1)
else:
UnixSocketAPITest.aptly_out.clear()
super(UnixSocketAPITest, self).prepare()
def debug_output(self):
return UnixSocketAPITest.aptly_out.get_contents()
def shutdown(self):
if self.aptly_server is not None:
self.aptly_server.terminate()