mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-01-11 03:11:50 +00:00
8
.github/workflows/ci.yml
vendored
8
.github/workflows/ci.yml
vendored
@@ -19,7 +19,7 @@ env:
|
|||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: test
|
name: test
|
||||||
runs-on: ubuntu-18.04
|
runs-on: ubuntu-20.04
|
||||||
continue-on-error: ${{ matrix.allow_failure }}
|
continue-on-error: ${{ matrix.allow_failure }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: true
|
fail-fast: true
|
||||||
@@ -55,16 +55,16 @@ jobs:
|
|||||||
- name: Setup Python
|
- name: Setup Python
|
||||||
uses: actions/setup-python@v2
|
uses: actions/setup-python@v2
|
||||||
with:
|
with:
|
||||||
python-version: 2.7.17
|
python-version: 3.9
|
||||||
|
|
||||||
- name: Install O/S packages
|
- name: Install O/S packages
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install -y python-virtualenv graphviz gnupg1 gnupg2 gpgv1 gpgv2 git gcc make
|
sudo apt-get install -y graphviz gnupg1 gnupg2 gpgv1 gpgv2 git gcc make
|
||||||
|
|
||||||
- name: Install Python packages
|
- name: Install Python packages
|
||||||
run: |
|
run: |
|
||||||
pip install six packaging appdirs
|
pip install six packaging appdirs virtualenv
|
||||||
pip install -U pip setuptools
|
pip install -U pip setuptools
|
||||||
pip install -r system/requirements.txt
|
pip install -r system/requirements.txt
|
||||||
|
|
||||||
|
|||||||
1
Makefile
1
Makefile
@@ -79,4 +79,3 @@ version:
|
|||||||
@echo $(VERSION)
|
@echo $(VERSION)
|
||||||
|
|
||||||
.PHONY: man modules version release goxc
|
.PHONY: man modules version release goxc
|
||||||
|
|
||||||
|
|||||||
@@ -38,11 +38,14 @@ class FileSystemEndpointTest(BaseTest):
|
|||||||
if not os.path.islink(os.path.join(os.environ["HOME"], ".aptly", path)):
|
if not os.path.islink(os.path.join(os.environ["HOME"], ".aptly", path)):
|
||||||
raise Exception("path %s is not a symlink" % (path, ))
|
raise Exception("path %s is not a symlink" % (path, ))
|
||||||
|
|
||||||
|
def is_hardlink(self, path):
|
||||||
|
return os.stat(os.path.join(os.environ["HOME"], ".aptly", path)).st_nlink >= 2
|
||||||
|
|
||||||
def check_is_hardlink(self, path):
|
def check_is_hardlink(self, path):
|
||||||
if os.stat(os.path.join(os.environ["HOME"], ".aptly", path)) <= 1:
|
if not self.is_hardlink(path):
|
||||||
raise Exception("path %s is not a hardlink" % (path, ))
|
raise Exception("path %s is not a hardlink" % (path, ))
|
||||||
|
|
||||||
def check_is_copy(self, path):
|
def check_is_copy(self, path):
|
||||||
fullpath = os.path.join(os.environ["HOME"], ".aptly", path)
|
fullpath = os.path.join(os.environ["HOME"], ".aptly", path)
|
||||||
if not (os.path.isfile(fullpath) and not self.check_is_hardlink(path)):
|
if not (os.path.isfile(fullpath) and not self.is_hardlink(path)):
|
||||||
raise Exception("path %s is not a copy" % (path, ))
|
raise Exception("path %s is not a copy" % (path, ))
|
||||||
|
|||||||
@@ -13,17 +13,27 @@ import shlex
|
|||||||
import shutil
|
import shutil
|
||||||
import string
|
import string
|
||||||
import threading
|
import threading
|
||||||
import urllib
|
import urllib.error
|
||||||
|
import urllib.parse
|
||||||
|
import urllib.request
|
||||||
import pprint
|
import pprint
|
||||||
import SocketServer
|
import socketserver
|
||||||
import SimpleHTTPServer
|
import http.server
|
||||||
|
import zlib
|
||||||
|
|
||||||
|
|
||||||
class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
|
def ungzip_if_required(output):
|
||||||
|
if isinstance(output, bytes) and output.startswith(b"\x1f\x8b"):
|
||||||
|
return zlib.decompress(output, 16 + zlib.MAX_WBITS).decode('utf-8')
|
||||||
|
|
||||||
|
return output
|
||||||
|
|
||||||
|
|
||||||
|
class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class FileHTTPServerRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
class FileHTTPServerRequestHandler(http.server.SimpleHTTPRequestHandler):
|
||||||
def translate_path(self, path):
|
def translate_path(self, path):
|
||||||
"""Translate a /-separated PATH to the local filename syntax.
|
"""Translate a /-separated PATH to the local filename syntax.
|
||||||
|
|
||||||
@@ -35,9 +45,9 @@ class FileHTTPServerRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
|||||||
# abandon query parameters
|
# abandon query parameters
|
||||||
path = path.split('?', 1)[0]
|
path = path.split('?', 1)[0]
|
||||||
path = path.split('#', 1)[0]
|
path = path.split('#', 1)[0]
|
||||||
path = posixpath.normpath(urllib.unquote(path))
|
path = posixpath.normpath(urllib.parse.unquote(path))
|
||||||
words = path.split('/')
|
words = path.split('/')
|
||||||
words = filter(None, words)
|
words = [_f for _f in words if _f]
|
||||||
path = self.rootPath
|
path = self.rootPath
|
||||||
for word in words:
|
for word in words:
|
||||||
_, word = os.path.splitdrive(word)
|
_, word = os.path.splitdrive(word)
|
||||||
@@ -70,7 +80,7 @@ class GPGFinder(object):
|
|||||||
def find_gpg(self, executables, expected_version):
|
def find_gpg(self, executables, expected_version):
|
||||||
for executable in executables:
|
for executable in executables:
|
||||||
try:
|
try:
|
||||||
output = subprocess.check_output([executable, "--version"])
|
output = subprocess.check_output([executable, "--version"], text=True)
|
||||||
if expected_version in output:
|
if expected_version in output:
|
||||||
return executable
|
return executable
|
||||||
except Exception:
|
except Exception:
|
||||||
@@ -90,7 +100,7 @@ class DotFinder(object):
|
|||||||
def find_dot(self, executables):
|
def find_dot(self, executables):
|
||||||
for executable in executables:
|
for executable in executables:
|
||||||
try:
|
try:
|
||||||
subprocess.check_output([executable, "-V"])
|
subprocess.check_output([executable, "-V"], text=True)
|
||||||
return executable
|
return executable
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
@@ -114,6 +124,7 @@ class BaseTest(object):
|
|||||||
requiresGPG1 = False
|
requiresGPG1 = False
|
||||||
requiresGPG2 = False
|
requiresGPG2 = False
|
||||||
requiresDot = False
|
requiresDot = False
|
||||||
|
sortOutput = False
|
||||||
|
|
||||||
expectedCode = 0
|
expectedCode = 0
|
||||||
configFile = {
|
configFile = {
|
||||||
@@ -198,12 +209,12 @@ class BaseTest(object):
|
|||||||
|
|
||||||
def prepare_fixture(self):
|
def prepare_fixture(self):
|
||||||
if self.fixturePool:
|
if self.fixturePool:
|
||||||
os.makedirs(os.path.join(os.environ["HOME"], ".aptly"), 0755)
|
os.makedirs(os.path.join(os.environ["HOME"], ".aptly"), 0o755)
|
||||||
os.symlink(self.fixturePoolDir, os.path.join(
|
os.symlink(self.fixturePoolDir, os.path.join(
|
||||||
os.environ["HOME"], ".aptly", "pool"))
|
os.environ["HOME"], ".aptly", "pool"))
|
||||||
|
|
||||||
if self.fixturePoolCopy:
|
if self.fixturePoolCopy:
|
||||||
os.makedirs(os.path.join(os.environ["HOME"], ".aptly"), 0755)
|
os.makedirs(os.path.join(os.environ["HOME"], ".aptly"), 0o755)
|
||||||
shutil.copytree(self.fixturePoolDir, os.path.join(
|
shutil.copytree(self.fixturePoolDir, os.path.join(
|
||||||
os.environ["HOME"], ".aptly", "pool"), ignore=shutil.ignore_patterns(".git"))
|
os.environ["HOME"], ".aptly", "pool"), ignore=shutil.ignore_patterns(".git"))
|
||||||
|
|
||||||
@@ -228,12 +239,17 @@ class BaseTest(object):
|
|||||||
for cmd in self.fixtureCmds:
|
for cmd in self.fixtureCmds:
|
||||||
self.run_cmd(cmd)
|
self.run_cmd(cmd)
|
||||||
|
|
||||||
|
def sort_lines(self, output):
|
||||||
|
return "\n".join(sorted(self.ensure_utf8(output).split("\n")))
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
self.output = self.output_processor(
|
output = self.run_cmd(self.runCmd, self.expectedCode)
|
||||||
self.run_cmd(self.runCmd, self.expectedCode))
|
if self.sortOutput:
|
||||||
|
output = self.sort_lines(output)
|
||||||
|
self.output = self.output_processor(output)
|
||||||
|
|
||||||
def _start_process(self, command, stderr=subprocess.STDOUT, stdout=None):
|
def _start_process(self, command, stderr=subprocess.STDOUT, stdout=None):
|
||||||
if not hasattr(command, "__iter__"):
|
if isinstance(command, str):
|
||||||
params = {
|
params = {
|
||||||
'files': os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "files"),
|
'files': os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "files"),
|
||||||
'changes': os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "changes"),
|
'changes': os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "changes"),
|
||||||
@@ -245,8 +261,8 @@ class BaseTest(object):
|
|||||||
params['url'] = self.webServerUrl
|
params['url'] = self.webServerUrl
|
||||||
|
|
||||||
command = string.Template(command).substitute(params)
|
command = string.Template(command).substitute(params)
|
||||||
|
|
||||||
command = shlex.split(command)
|
command = shlex.split(command)
|
||||||
|
|
||||||
environ = os.environ.copy()
|
environ = os.environ.copy()
|
||||||
environ["LC_ALL"] = "C"
|
environ["LC_ALL"] = "C"
|
||||||
environ.update(self.environmentOverride)
|
environ.update(self.environmentOverride)
|
||||||
@@ -261,7 +277,7 @@ class BaseTest(object):
|
|||||||
raise Exception("exit code %d != %d (output: %s)" % (
|
raise Exception("exit code %d != %d (output: %s)" % (
|
||||||
proc.returncode, expected_code, output))
|
proc.returncode, expected_code, output))
|
||||||
return output
|
return output
|
||||||
except Exception, e:
|
except Exception as e:
|
||||||
raise Exception("Running command %s failed: %s" %
|
raise Exception("Running command %s failed: %s" %
|
||||||
(command, str(e)))
|
(command, str(e)))
|
||||||
|
|
||||||
@@ -315,19 +331,20 @@ class BaseTest(object):
|
|||||||
else:
|
else:
|
||||||
raise
|
raise
|
||||||
|
|
||||||
def read_file(self, path):
|
def read_file(self, path, mode=''):
|
||||||
with open(os.path.join(os.environ["HOME"], ".aptly", path), "r") as f:
|
with open(os.path.join(os.environ["HOME"], ".aptly", path), "r" + mode) as f:
|
||||||
return f.read()
|
return f.read()
|
||||||
|
|
||||||
def delete_file(self, path):
|
def delete_file(self, path):
|
||||||
os.unlink(os.path.join(os.environ["HOME"], ".aptly", path))
|
os.unlink(os.path.join(os.environ["HOME"], ".aptly", path))
|
||||||
|
|
||||||
def check_file_contents(self, path, gold_name, match_prepare=None):
|
def check_file_contents(self, path, gold_name, match_prepare=None, mode='', ensure_utf8=True):
|
||||||
contents = self.read_file(path)
|
contents = self.read_file(path, mode=mode)
|
||||||
try:
|
try:
|
||||||
|
|
||||||
self.verify_match(self.get_gold(gold_name),
|
self.verify_match(self.get_gold(gold_name),
|
||||||
contents, match_prepare=match_prepare)
|
contents, match_prepare=match_prepare,
|
||||||
|
ensure_utf8=ensure_utf8)
|
||||||
except: # noqa: E722
|
except: # noqa: E722
|
||||||
if self.captureResults:
|
if self.captureResults:
|
||||||
if match_prepare is not None:
|
if match_prepare is not None:
|
||||||
@@ -376,9 +393,13 @@ class BaseTest(object):
|
|||||||
if item not in l:
|
if item not in l:
|
||||||
raise Exception("item %r not in %r", item, l)
|
raise Exception("item %r not in %r", item, l)
|
||||||
|
|
||||||
|
def check_not_in(self, item, l):
|
||||||
|
if item in l:
|
||||||
|
raise Exception("item %r in %r", item, l)
|
||||||
|
|
||||||
def check_subset(self, a, b):
|
def check_subset(self, a, b):
|
||||||
diff = ''
|
diff = ''
|
||||||
for k, v in a.items():
|
for k, v in list(a.items()):
|
||||||
if k not in b:
|
if k not in b:
|
||||||
diff += "unexpected key '%s'\n" % (k,)
|
diff += "unexpected key '%s'\n" % (k,)
|
||||||
elif b[k] != v:
|
elif b[k] != v:
|
||||||
@@ -387,7 +408,16 @@ class BaseTest(object):
|
|||||||
if diff:
|
if diff:
|
||||||
raise Exception("content doesn't match:\n" + diff)
|
raise Exception("content doesn't match:\n" + diff)
|
||||||
|
|
||||||
def verify_match(self, a, b, match_prepare=None):
|
def ensure_utf8(self, a):
|
||||||
|
if isinstance(a, bytes):
|
||||||
|
return a.decode('utf-8')
|
||||||
|
return a
|
||||||
|
|
||||||
|
def verify_match(self, a, b, match_prepare=None, ensure_utf8=True):
|
||||||
|
if ensure_utf8:
|
||||||
|
a = self.ensure_utf8(a)
|
||||||
|
b = self.ensure_utf8(b)
|
||||||
|
|
||||||
if match_prepare is not None:
|
if match_prepare is not None:
|
||||||
a = match_prepare(a)
|
a = match_prepare(a)
|
||||||
b = match_prepare(b)
|
b = match_prepare(b)
|
||||||
|
|||||||
@@ -24,6 +24,9 @@ except ImportError:
|
|||||||
return s
|
return s
|
||||||
|
|
||||||
|
|
||||||
|
PYTHON_MINIMUM_VERSION = (3, 9)
|
||||||
|
|
||||||
|
|
||||||
def natural_key(string_):
|
def natural_key(string_):
|
||||||
"""See https://blog.codinghorror.com/sorting-for-humans-natural-sort-order/"""
|
"""See https://blog.codinghorror.com/sorting-for-humans-natural-sort-order/"""
|
||||||
return [int(s) if s.isdigit() else s for s in re.split(r'(\d+)', string_)]
|
return [int(s) if s.isdigit() else s for s in re.split(r'(\d+)', string_)]
|
||||||
@@ -107,18 +110,18 @@ def run(include_long_tests=False, capture_results=False, tests=None, filters=Non
|
|||||||
if lastBase is not None:
|
if lastBase is not None:
|
||||||
lastBase.shutdown_class()
|
lastBase.shutdown_class()
|
||||||
|
|
||||||
print "TESTS: %d SUCCESS: %d FAIL: %d SKIP: %d" % (
|
print("TESTS: %d SUCCESS: %d FAIL: %d SKIP: %d" % (
|
||||||
numTests, numTests - numFailed, numFailed, numSkipped)
|
numTests, numTests - numFailed, numFailed, numSkipped))
|
||||||
|
|
||||||
if len(fails) > 0:
|
if len(fails) > 0:
|
||||||
print "\nFAILURES (%d):" % (len(fails), )
|
print("\nFAILURES (%d):" % (len(fails), ))
|
||||||
|
|
||||||
for (test, t, typ, val, tb, testModule) in fails:
|
for (test, t, typ, val, tb, testModule) in fails:
|
||||||
doc = t.__doc__ or ''
|
doc = t.__doc__ or ''
|
||||||
print "%s:%s %s" % (test, t.__class__.__name__,
|
print("%s:%s %s" % (test, t.__class__.__name__,
|
||||||
testModule.__name__ + ": " + doc.strip())
|
testModule.__name__ + ": " + doc.strip()))
|
||||||
traceback.print_exception(typ, val, tb)
|
traceback.print_exception(typ, val, tb)
|
||||||
print "=" * 60
|
print("=" * 60)
|
||||||
|
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
@@ -128,14 +131,17 @@ if __name__ == "__main__":
|
|||||||
try:
|
try:
|
||||||
os.environ['APTLY_VERSION'] = os.popen(
|
os.environ['APTLY_VERSION'] = os.popen(
|
||||||
"make version").read().strip()
|
"make version").read().strip()
|
||||||
except BaseException, e:
|
except BaseException as e:
|
||||||
print "Failed to capture current version: ", e
|
print("Failed to capture current version: ", e)
|
||||||
|
|
||||||
output = subprocess.check_output(['gpg1', '--version'])
|
if sys.version_info < PYTHON_MINIMUM_VERSION:
|
||||||
|
raise RuntimeError(f'Tests require Python {PYTHON_MINIMUM_VERSION} or higher.')
|
||||||
|
|
||||||
|
output = subprocess.check_output(['gpg1', '--version'], text=True)
|
||||||
if not output.startswith('gpg (GnuPG) 1'):
|
if not output.startswith('gpg (GnuPG) 1'):
|
||||||
raise RuntimeError('Tests require gpg v1')
|
raise RuntimeError('Tests require gpg v1')
|
||||||
|
|
||||||
output = subprocess.check_output(['gpgv1', '--version'])
|
output = subprocess.check_output(['gpgv1', '--version'], text=True)
|
||||||
if not output.startswith('gpgv (GnuPG) 1'):
|
if not output.startswith('gpgv (GnuPG) 1'):
|
||||||
raise RuntimeError('Tests require gpgv v1')
|
raise RuntimeError('Tests require gpgv v1')
|
||||||
|
|
||||||
|
|||||||
@@ -8,10 +8,10 @@ try:
|
|||||||
if 'AWS_SECRET_ACCESS_KEY' in os.environ and 'AWS_ACCESS_KEY_ID' in os.environ:
|
if 'AWS_SECRET_ACCESS_KEY' in os.environ and 'AWS_ACCESS_KEY_ID' in os.environ:
|
||||||
s3_conn = boto.connect_s3()
|
s3_conn = boto.connect_s3()
|
||||||
else:
|
else:
|
||||||
print "S3 tests disabled: AWS creds not found in the environment"
|
print("S3 tests disabled: AWS creds not found in the environment")
|
||||||
s3_conn = None
|
s3_conn = None
|
||||||
except ImportError, e:
|
except ImportError as e:
|
||||||
print "S3 tests disabled: can't import boto", e
|
print("S3 tests disabled: can't import boto", e)
|
||||||
s3_conn = None
|
s3_conn = None
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -25,10 +25,10 @@ try:
|
|||||||
swift_conn = swiftclient.Connection(auth_url, auth_username,
|
swift_conn = swiftclient.Connection(auth_url, auth_username,
|
||||||
auth_password, auth_version=1)
|
auth_password, auth_version=1)
|
||||||
else:
|
else:
|
||||||
print "Swift tests disabled: OpenStack creds not found in the environment"
|
print("Swift tests disabled: OpenStack creds not found in the environment")
|
||||||
swift_conn = None
|
swift_conn = None
|
||||||
except ImportError, e:
|
except ImportError as e:
|
||||||
print "Swift tests disabled: unable to import swiftclient", e
|
print("Swift tests disabled: unable to import swiftclient", e)
|
||||||
swift_conn = None
|
swift_conn = None
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ class UpdateMirror1Test(BaseTest):
|
|||||||
"""
|
"""
|
||||||
update mirrors: regular update
|
update mirrors: regular update
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
longTest = False
|
longTest = False
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly -architectures=i386,amd64 mirror create --ignore-signatures varnish https://packagecloud.io/varnishcache/varnish30/debian/ wheezy main",
|
"aptly -architectures=i386,amd64 mirror create --ignore-signatures varnish https://packagecloud.io/varnishcache/varnish30/debian/ wheezy main",
|
||||||
@@ -25,9 +26,6 @@ class UpdateMirror1Test(BaseTest):
|
|||||||
runCmd = "aptly mirror update --ignore-signatures varnish"
|
runCmd = "aptly mirror update --ignore-signatures varnish"
|
||||||
outputMatchPrepare = filterOutRedirects
|
outputMatchPrepare = filterOutRedirects
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class UpdateMirror2Test(BaseTest):
|
class UpdateMirror2Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
@@ -113,6 +111,7 @@ class UpdateMirror7Test(BaseTest):
|
|||||||
"""
|
"""
|
||||||
update mirrors: flat repository
|
update mirrors: flat repository
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureGpg = True
|
fixtureGpg = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly mirror create --keyring=aptlytest.gpg -architectures=amd64 flat https://cloud.r-project.org/bin/linux/debian jessie-cran35/",
|
"aptly mirror create --keyring=aptlytest.gpg -architectures=amd64 flat https://cloud.r-project.org/bin/linux/debian jessie-cran35/",
|
||||||
@@ -120,9 +119,6 @@ class UpdateMirror7Test(BaseTest):
|
|||||||
runCmd = "aptly mirror update --keyring=aptlytest.gpg flat"
|
runCmd = "aptly mirror update --keyring=aptlytest.gpg flat"
|
||||||
outputMatchPrepare = filterOutSignature
|
outputMatchPrepare = filterOutSignature
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class UpdateMirror8Test(BaseTest):
|
class UpdateMirror8Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
@@ -143,6 +139,7 @@ class UpdateMirror9Test(BaseTest):
|
|||||||
"""
|
"""
|
||||||
update mirrors: flat repository + sources
|
update mirrors: flat repository + sources
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureGpg = True
|
fixtureGpg = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly mirror create --keyring=aptlytest.gpg -with-sources flat-src https://cloud.r-project.org/bin/linux/debian jessie-cran35/",
|
"aptly mirror create --keyring=aptlytest.gpg -with-sources flat-src https://cloud.r-project.org/bin/linux/debian jessie-cran35/",
|
||||||
@@ -150,14 +147,12 @@ class UpdateMirror9Test(BaseTest):
|
|||||||
runCmd = "aptly mirror update --keyring=aptlytest.gpg flat-src"
|
runCmd = "aptly mirror update --keyring=aptlytest.gpg flat-src"
|
||||||
outputMatchPrepare = filterOutSignature
|
outputMatchPrepare = filterOutSignature
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class UpdateMirror10Test(BaseTest):
|
class UpdateMirror10Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
update mirrors: filtered
|
update mirrors: filtered
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureGpg = True
|
fixtureGpg = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly mirror create -keyring=aptlytest.gpg -with-sources -filter='!(Name (% r-*)), !($$PackageType (source))' flat-src https://cloud.r-project.org/bin/linux/debian jessie-cran35/",
|
"aptly mirror create -keyring=aptlytest.gpg -with-sources -filter='!(Name (% r-*)), !($$PackageType (source))' flat-src https://cloud.r-project.org/bin/linux/debian jessie-cran35/",
|
||||||
@@ -165,15 +160,13 @@ class UpdateMirror10Test(BaseTest):
|
|||||||
runCmd = "aptly mirror update --keyring=aptlytest.gpg flat-src"
|
runCmd = "aptly mirror update --keyring=aptlytest.gpg flat-src"
|
||||||
outputMatchPrepare = filterOutSignature
|
outputMatchPrepare = filterOutSignature
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class UpdateMirror11Test(BaseTest):
|
class UpdateMirror11Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
update mirrors: update over FTP
|
update mirrors: update over FTP
|
||||||
"""
|
"""
|
||||||
skipTest = "Requesting obsolete file - stretch/InRelease"
|
skipTest = "Requesting obsolete file - stretch/InRelease"
|
||||||
|
sortOutput = True
|
||||||
longTest = False
|
longTest = False
|
||||||
fixtureGpg = True
|
fixtureGpg = True
|
||||||
requiresFTP = True
|
requiresFTP = True
|
||||||
@@ -183,15 +176,13 @@ class UpdateMirror11Test(BaseTest):
|
|||||||
outputMatchPrepare = filterOutSignature
|
outputMatchPrepare = filterOutSignature
|
||||||
runCmd = "aptly mirror update -keyring=aptlytest.gpg stretch-main"
|
runCmd = "aptly mirror update -keyring=aptlytest.gpg stretch-main"
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class UpdateMirror12Test(BaseTest):
|
class UpdateMirror12Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
update mirrors: update with udebs
|
update mirrors: update with udebs
|
||||||
"""
|
"""
|
||||||
skipTest = "Requesting obsolete file - stretch/InRelease"
|
skipTest = "Requesting obsolete file - stretch/InRelease"
|
||||||
|
sortOutput = True
|
||||||
longTest = False
|
longTest = False
|
||||||
fixtureGpg = True
|
fixtureGpg = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
@@ -200,14 +191,12 @@ class UpdateMirror12Test(BaseTest):
|
|||||||
runCmd = "aptly mirror update -keyring=aptlytest.gpg stretch"
|
runCmd = "aptly mirror update -keyring=aptlytest.gpg stretch"
|
||||||
outputMatchPrepare = filterOutSignature
|
outputMatchPrepare = filterOutSignature
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class UpdateMirror13Test(BaseTest):
|
class UpdateMirror13Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
update mirrors: regular update with --skip-existing-packages option
|
update mirrors: regular update with --skip-existing-packages option
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
longTest = False
|
longTest = False
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly -architectures=i386,amd64 mirror create --ignore-signatures varnish https://packagecloud.io/varnishcache/varnish30/debian/ wheezy main",
|
"aptly -architectures=i386,amd64 mirror create --ignore-signatures varnish https://packagecloud.io/varnishcache/varnish30/debian/ wheezy main",
|
||||||
@@ -215,14 +204,12 @@ class UpdateMirror13Test(BaseTest):
|
|||||||
runCmd = "aptly mirror update --ignore-signatures --skip-existing-packages varnish"
|
runCmd = "aptly mirror update --ignore-signatures --skip-existing-packages varnish"
|
||||||
outputMatchPrepare = filterOutRedirects
|
outputMatchPrepare = filterOutRedirects
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class UpdateMirror14Test(BaseTest):
|
class UpdateMirror14Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
update mirrors: regular update with --skip-existing-packages option
|
update mirrors: regular update with --skip-existing-packages option
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
longTest = False
|
longTest = False
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly -architectures=i386,amd64 mirror create --ignore-signatures varnish https://packagecloud.io/varnishcache/varnish30/debian/ wheezy main",
|
"aptly -architectures=i386,amd64 mirror create --ignore-signatures varnish https://packagecloud.io/varnishcache/varnish30/debian/ wheezy main",
|
||||||
@@ -231,24 +218,19 @@ class UpdateMirror14Test(BaseTest):
|
|||||||
runCmd = "aptly mirror update --ignore-signatures --skip-existing-packages varnish"
|
runCmd = "aptly mirror update --ignore-signatures --skip-existing-packages varnish"
|
||||||
outputMatchPrepare = filterOutRedirects
|
outputMatchPrepare = filterOutRedirects
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class UpdateMirror15Test(BaseTest):
|
class UpdateMirror15Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
update mirrors: update for mirror without MD5 checksums
|
update mirrors: update for mirror without MD5 checksums
|
||||||
"""
|
"""
|
||||||
skipTest = "Using deprecated service - bintray"
|
skipTest = "Using deprecated service - bintray"
|
||||||
|
sortOutput = True
|
||||||
longTest = False
|
longTest = False
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly mirror create --ignore-signatures bintray https://dl.bintray.com/smira/deb/ ./",
|
"aptly mirror create --ignore-signatures bintray https://dl.bintray.com/smira/deb/ ./",
|
||||||
]
|
]
|
||||||
runCmd = "aptly mirror update --ignore-signatures bintray"
|
runCmd = "aptly mirror update --ignore-signatures bintray"
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
def check(self):
|
def check(self):
|
||||||
super(UpdateMirror15Test, self).check()
|
super(UpdateMirror15Test, self).check()
|
||||||
# check pool
|
# check pool
|
||||||
@@ -263,15 +245,13 @@ class UpdateMirror16Test(BaseTest):
|
|||||||
as mirror lacks MD5 checksum, file would be downloaded but not re-imported
|
as mirror lacks MD5 checksum, file would be downloaded but not re-imported
|
||||||
"""
|
"""
|
||||||
skipTest = "Using deprecated service - bintray"
|
skipTest = "Using deprecated service - bintray"
|
||||||
|
sortOutput = True
|
||||||
longTest = False
|
longTest = False
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly mirror create --ignore-signatures bintray https://dl.bintray.com/smira/deb/ ./",
|
"aptly mirror create --ignore-signatures bintray https://dl.bintray.com/smira/deb/ ./",
|
||||||
]
|
]
|
||||||
runCmd = "aptly mirror update --ignore-signatures bintray"
|
runCmd = "aptly mirror update --ignore-signatures bintray"
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
def prepare(self):
|
def prepare(self):
|
||||||
super(UpdateMirror16Test, self).prepare()
|
super(UpdateMirror16Test, self).prepare()
|
||||||
|
|
||||||
@@ -292,15 +272,13 @@ class UpdateMirror17Test(BaseTest):
|
|||||||
"""
|
"""
|
||||||
update mirrors: update for mirror but with file in pool on legacy MD5 location
|
update mirrors: update for mirror but with file in pool on legacy MD5 location
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
longTest = False
|
longTest = False
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly mirror create -ignore-signatures -architectures=i386 -filter=libboost-program-options-dev stretch http://cdn-fastly.deb.debian.org/debian stretch main",
|
"aptly mirror create -ignore-signatures -architectures=i386 -filter=libboost-program-options-dev stretch http://cdn-fastly.deb.debian.org/debian stretch main",
|
||||||
]
|
]
|
||||||
runCmd = "aptly mirror update -ignore-signatures stretch"
|
runCmd = "aptly mirror update -ignore-signatures stretch"
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
def prepare(self):
|
def prepare(self):
|
||||||
super(UpdateMirror17Test, self).prepare()
|
super(UpdateMirror17Test, self).prepare()
|
||||||
|
|
||||||
@@ -321,6 +299,7 @@ class UpdateMirror18Test(BaseTest):
|
|||||||
"""
|
"""
|
||||||
update mirrors: update for mirror but with file in pool on legacy MD5 location and disabled legacy path support
|
update mirrors: update for mirror but with file in pool on legacy MD5 location and disabled legacy path support
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
longTest = False
|
longTest = False
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly mirror create -ignore-signatures -architectures=i386 -filter=libboost-program-options-dev stretch http://cdn-fastly.deb.debian.org/debian stretch main",
|
"aptly mirror create -ignore-signatures -architectures=i386 -filter=libboost-program-options-dev stretch http://cdn-fastly.deb.debian.org/debian stretch main",
|
||||||
@@ -328,9 +307,6 @@ class UpdateMirror18Test(BaseTest):
|
|||||||
runCmd = "aptly mirror update -ignore-signatures stretch"
|
runCmd = "aptly mirror update -ignore-signatures stretch"
|
||||||
configOverride = {'skipLegacyPool': True}
|
configOverride = {'skipLegacyPool': True}
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
def prepare(self):
|
def prepare(self):
|
||||||
super(UpdateMirror18Test, self).prepare()
|
super(UpdateMirror18Test, self).prepare()
|
||||||
|
|
||||||
@@ -361,13 +337,14 @@ class UpdateMirror19Test(BaseTest):
|
|||||||
outputMatchPrepare = filterOutSignature
|
outputMatchPrepare = filterOutSignature
|
||||||
|
|
||||||
def output_processor(self, output):
|
def output_processor(self, output):
|
||||||
return "\n".join(line for line in output.split("\n") if ".deb" not in line)
|
return "\n".join(line for line in self.ensure_utf8(output).split("\n") if ".deb" not in line)
|
||||||
|
|
||||||
|
|
||||||
class UpdateMirror20Test(BaseTest):
|
class UpdateMirror20Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
update mirrors: flat repository (internal GPG implementation)
|
update mirrors: flat repository (internal GPG implementation)
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureGpg = True
|
fixtureGpg = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly mirror create --keyring=aptlytest.gpg -architectures=amd64 --filter='r-cran-class' flat https://cloud.r-project.org/bin/linux/debian jessie-cran35/",
|
"aptly mirror create --keyring=aptlytest.gpg -architectures=amd64 --filter='r-cran-class' flat https://cloud.r-project.org/bin/linux/debian jessie-cran35/",
|
||||||
@@ -376,9 +353,6 @@ class UpdateMirror20Test(BaseTest):
|
|||||||
runCmd = "aptly mirror update --keyring=aptlytest.gpg flat"
|
runCmd = "aptly mirror update --keyring=aptlytest.gpg flat"
|
||||||
outputMatchPrepare = filterOutSignature
|
outputMatchPrepare = filterOutSignature
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class UpdateMirror21Test(BaseTest):
|
class UpdateMirror21Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
@@ -395,7 +369,7 @@ class UpdateMirror21Test(BaseTest):
|
|||||||
outputMatchPrepare = filterOutSignature
|
outputMatchPrepare = filterOutSignature
|
||||||
|
|
||||||
def output_processor(self, output):
|
def output_processor(self, output):
|
||||||
return "\n".join(line for line in output.split("\n") if ".deb" not in line)
|
return "\n".join(line for line in self.ensure_utf8(output).split("\n") if ".deb" not in line)
|
||||||
|
|
||||||
|
|
||||||
class UpdateMirror22Test(BaseTest):
|
class UpdateMirror22Test(BaseTest):
|
||||||
@@ -418,6 +392,7 @@ class UpdateMirror23Test(BaseTest):
|
|||||||
update mirrors: update with installer
|
update mirrors: update with installer
|
||||||
"""
|
"""
|
||||||
skipTest = "Requesting obsolete file - stretch/InRelease"
|
skipTest = "Requesting obsolete file - stretch/InRelease"
|
||||||
|
sortOutput = True
|
||||||
longTest = False
|
longTest = False
|
||||||
fixtureGpg = True
|
fixtureGpg = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
@@ -426,15 +401,13 @@ class UpdateMirror23Test(BaseTest):
|
|||||||
runCmd = "aptly mirror update -keyring=aptlytest.gpg stretch"
|
runCmd = "aptly mirror update -keyring=aptlytest.gpg stretch"
|
||||||
outputMatchPrepare = filterOutSignature
|
outputMatchPrepare = filterOutSignature
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class UpdateMirror24Test(BaseTest):
|
class UpdateMirror24Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
update mirrors: update with installer with separate gpg file
|
update mirrors: update with installer with separate gpg file
|
||||||
"""
|
"""
|
||||||
skipTest = "Requesting obsolete file - stretch/InRelease"
|
skipTest = "Requesting obsolete file - stretch/InRelease"
|
||||||
|
sortOutput = True
|
||||||
longTest = False
|
longTest = False
|
||||||
fixtureGpg = True
|
fixtureGpg = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
@@ -442,6 +415,3 @@ class UpdateMirror24Test(BaseTest):
|
|||||||
]
|
]
|
||||||
runCmd = "aptly mirror update -keyring=aptlytest.gpg trusty"
|
runCmd = "aptly mirror update -keyring=aptlytest.gpg trusty"
|
||||||
outputMatchPrepare = filterOutSignature
|
outputMatchPrepare = filterOutSignature
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|||||||
@@ -2,21 +2,13 @@ import os
|
|||||||
import hashlib
|
import hashlib
|
||||||
import inspect
|
import inspect
|
||||||
import re
|
import re
|
||||||
import zlib
|
from lib import BaseTest, ungzip_if_required
|
||||||
from lib import BaseTest
|
|
||||||
|
|
||||||
|
|
||||||
def strip_processor(output):
|
def strip_processor(output):
|
||||||
return "\n".join([l for l in output.split("\n") if not l.startswith(' ') and not l.startswith('Date:')])
|
return "\n".join([l for l in output.split("\n") if not l.startswith(' ') and not l.startswith('Date:')])
|
||||||
|
|
||||||
|
|
||||||
def ungzip_if_required(output):
|
|
||||||
if output.startswith("\x1f\x8b"):
|
|
||||||
return zlib.decompress(output, 16 + zlib.MAX_WBITS)
|
|
||||||
|
|
||||||
return output
|
|
||||||
|
|
||||||
|
|
||||||
class PublishRepo1Test(BaseTest):
|
class PublishRepo1Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
publish repo: default
|
publish repo: default
|
||||||
@@ -60,9 +52,9 @@ class PublishRepo1Test(BaseTest):
|
|||||||
self.check_file_contents('public/dists/maverick/main/binary-i386/Packages',
|
self.check_file_contents('public/dists/maverick/main/binary-i386/Packages',
|
||||||
'binary', match_prepare=lambda s: "\n".join(sorted(s.split("\n"))))
|
'binary', match_prepare=lambda s: "\n".join(sorted(s.split("\n"))))
|
||||||
self.check_file_contents('public/dists/maverick/main/Contents-i386.gz',
|
self.check_file_contents('public/dists/maverick/main/Contents-i386.gz',
|
||||||
'contents_i386', match_prepare=ungzip_if_required)
|
'contents_i386', match_prepare=ungzip_if_required, mode='b', ensure_utf8=False)
|
||||||
self.check_file_contents('public/dists/maverick/Contents-i386.gz',
|
self.check_file_contents('public/dists/maverick/Contents-i386.gz',
|
||||||
'contents_i386_legacy', match_prepare=ungzip_if_required)
|
'contents_i386_legacy', match_prepare=ungzip_if_required, mode='b', ensure_utf8=False)
|
||||||
|
|
||||||
# verify signatures
|
# verify signatures
|
||||||
self.run_cmd([self.gpgFinder.gpg, "--no-auto-check-trustdb", "--keyring", os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "files", "aptly.pub"),
|
self.run_cmd([self.gpgFinder.gpg, "--no-auto-check-trustdb", "--keyring", os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "files", "aptly.pub"),
|
||||||
@@ -101,8 +93,7 @@ class PublishRepo1Test(BaseTest):
|
|||||||
else:
|
else:
|
||||||
h = hashlib.sha512()
|
h = hashlib.sha512()
|
||||||
|
|
||||||
h.update(self.read_file(os.path.join(
|
h.update(self.read_file(os.path.join('public/dists/maverick', path), mode='b'))
|
||||||
'public/dists/maverick', path)))
|
|
||||||
|
|
||||||
if h.hexdigest() != fileHash:
|
if h.hexdigest() != fileHash:
|
||||||
raise Exception("file hash doesn't match for %s: %s != %s" % (
|
raise Exception("file hash doesn't match for %s: %s != %s" % (
|
||||||
@@ -545,8 +536,7 @@ class PublishRepo17Test(BaseTest):
|
|||||||
else:
|
else:
|
||||||
h = hashlib.sha512()
|
h = hashlib.sha512()
|
||||||
|
|
||||||
h.update(self.read_file(os.path.join(
|
h.update(self.read_file(os.path.join('public/dists/maverick', path), mode='b'))
|
||||||
'public/dists/maverick', path)))
|
|
||||||
|
|
||||||
if h.hexdigest() != fileHash:
|
if h.hexdigest() != fileHash:
|
||||||
raise Exception("file hash doesn't match for %s: %s != %s" % (
|
raise Exception("file hash doesn't match for %s: %s != %s" % (
|
||||||
@@ -637,8 +627,8 @@ class PublishRepo23Test(BaseTest):
|
|||||||
runCmd = "aptly publish repo -component=main,contrib repo1"
|
runCmd = "aptly publish repo -component=main,contrib repo1"
|
||||||
expectedCode = 2
|
expectedCode = 2
|
||||||
|
|
||||||
def outputMatchPrepare(_, s):
|
def outputMatchPrepare(self, s):
|
||||||
return "\n".join([l for l in s.split("\n") if l.startswith("ERROR")])
|
return "\n".join([l for l in self.ensure_utf8(s).split("\n") if l.startswith("ERROR")])
|
||||||
|
|
||||||
|
|
||||||
class PublishRepo24Test(BaseTest):
|
class PublishRepo24Test(BaseTest):
|
||||||
@@ -832,8 +822,8 @@ class PublishRepo31Test(BaseTest):
|
|||||||
gold_processor = BaseTest.expand_environ
|
gold_processor = BaseTest.expand_environ
|
||||||
configOverride = {"gpgProvider": "internal"}
|
configOverride = {"gpgProvider": "internal"}
|
||||||
|
|
||||||
def outputMatchPrepare(_, s):
|
def outputMatchPrepare(self, s):
|
||||||
return re.sub(r' \d{4}-\d{2}-\d{2}', '', s)
|
return re.sub(r' \d{4}-\d{2}-\d{2}', '', self.ensure_utf8(s))
|
||||||
|
|
||||||
def check(self):
|
def check(self):
|
||||||
super(PublishRepo31Test, self).check()
|
super(PublishRepo31Test, self).check()
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
import os
|
import os
|
||||||
import hashlib
|
import hashlib
|
||||||
import inspect
|
import inspect
|
||||||
import zlib
|
from lib import BaseTest, ungzip_if_required
|
||||||
from lib import BaseTest
|
|
||||||
|
|
||||||
|
|
||||||
def strip_processor(output):
|
def strip_processor(output):
|
||||||
@@ -13,13 +12,6 @@ def sorted_processor(output):
|
|||||||
return "\n".join(sorted(output.split("\n")))
|
return "\n".join(sorted(output.split("\n")))
|
||||||
|
|
||||||
|
|
||||||
def ungzip_if_required(output):
|
|
||||||
if output.startswith("\x1f\x8b"):
|
|
||||||
return zlib.decompress(output, 16 + zlib.MAX_WBITS)
|
|
||||||
|
|
||||||
return output
|
|
||||||
|
|
||||||
|
|
||||||
class PublishSnapshot1Test(BaseTest):
|
class PublishSnapshot1Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
publish snapshot: defaults
|
publish snapshot: defaults
|
||||||
@@ -75,9 +67,9 @@ class PublishSnapshot1Test(BaseTest):
|
|||||||
'packages_amd64', match_prepare=sorted_processor)
|
'packages_amd64', match_prepare=sorted_processor)
|
||||||
|
|
||||||
self.check_file_contents('public/dists/maverick/main/Contents-i386.gz',
|
self.check_file_contents('public/dists/maverick/main/Contents-i386.gz',
|
||||||
'contents_i386', match_prepare=ungzip_if_required)
|
'contents_i386', match_prepare=ungzip_if_required, mode='b', ensure_utf8=False)
|
||||||
self.check_file_contents('public/dists/maverick/main/Contents-amd64.gz',
|
self.check_file_contents('public/dists/maverick/main/Contents-amd64.gz',
|
||||||
'contents_amd64', match_prepare=ungzip_if_required)
|
'contents_amd64', match_prepare=ungzip_if_required, mode='b', ensure_utf8=False)
|
||||||
|
|
||||||
# verify signatures
|
# verify signatures
|
||||||
self.run_cmd([self.gpgFinder.gpg, "--no-auto-check-trustdb", "--keyring", os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "files", "aptly.pub"),
|
self.run_cmd([self.gpgFinder.gpg, "--no-auto-check-trustdb", "--keyring", os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "files", "aptly.pub"),
|
||||||
@@ -116,8 +108,7 @@ class PublishSnapshot1Test(BaseTest):
|
|||||||
else:
|
else:
|
||||||
h = hashlib.sha512()
|
h = hashlib.sha512()
|
||||||
|
|
||||||
h.update(self.read_file(os.path.join(
|
h.update(self.read_file(os.path.join('public/dists/maverick', path), mode='b'))
|
||||||
'public/dists/maverick', path)))
|
|
||||||
|
|
||||||
if h.hexdigest() != fileHash:
|
if h.hexdigest() != fileHash:
|
||||||
raise Exception("file hash doesn't match for %s: %s != %s" % (
|
raise Exception("file hash doesn't match for %s: %s != %s" % (
|
||||||
@@ -841,8 +832,7 @@ class PublishSnapshot26Test(BaseTest):
|
|||||||
else:
|
else:
|
||||||
h = hashlib.sha512()
|
h = hashlib.sha512()
|
||||||
|
|
||||||
h.update(self.read_file(os.path.join(
|
h.update(self.read_file(os.path.join('public/dists/maverick', path), mode='b'))
|
||||||
'public/dists/maverick', path)))
|
|
||||||
|
|
||||||
if h.hexdigest() != fileHash:
|
if h.hexdigest() != fileHash:
|
||||||
raise Exception("file hash doesn't match for %s: %s != %s" % (
|
raise Exception("file hash doesn't match for %s: %s != %s" % (
|
||||||
@@ -940,8 +930,8 @@ class PublishSnapshot32Test(BaseTest):
|
|||||||
runCmd = "aptly publish snapshot -component=main,contrib snap32.1"
|
runCmd = "aptly publish snapshot -component=main,contrib snap32.1"
|
||||||
expectedCode = 2
|
expectedCode = 2
|
||||||
|
|
||||||
def outputMatchPrepare(_, s):
|
def outputMatchPrepare(self, s):
|
||||||
return "\n".join([l for l in s.split("\n") if l.startswith("ERROR")])
|
return "\n".join([l for l in self.ensure_utf8(s).split("\n") if l.startswith("ERROR")])
|
||||||
|
|
||||||
|
|
||||||
class PublishSnapshot33Test(BaseTest):
|
class PublishSnapshot33Test(BaseTest):
|
||||||
@@ -1093,7 +1083,7 @@ class PublishSnapshot35Test(BaseTest):
|
|||||||
else:
|
else:
|
||||||
h = hashlib.sha512()
|
h = hashlib.sha512()
|
||||||
|
|
||||||
h.update(self.read_file(os.path.join('public/dists/stretch', path)))
|
h.update(self.read_file(os.path.join('public/dists/stretch', path), mode='b'))
|
||||||
|
|
||||||
if h.hexdigest() != fileHash:
|
if h.hexdigest() != fileHash:
|
||||||
raise Exception("file hash doesn't match for %s: %s != %s" % (
|
raise Exception("file hash doesn't match for %s: %s != %s" % (
|
||||||
@@ -1217,6 +1207,6 @@ class PublishSnapshot39Test(BaseTest):
|
|||||||
'packages_amd64', match_prepare=sorted_processor)
|
'packages_amd64', match_prepare=sorted_processor)
|
||||||
|
|
||||||
self.check_file_contents('public/dists/maverick/main/Contents-i386.gz',
|
self.check_file_contents('public/dists/maverick/main/Contents-i386.gz',
|
||||||
'contents_i386', match_prepare=ungzip_if_required)
|
'contents_i386', match_prepare=ungzip_if_required, mode='b', ensure_utf8=False)
|
||||||
self.check_file_contents('public/dists/maverick/main/Contents-amd64.gz',
|
self.check_file_contents('public/dists/maverick/main/Contents-amd64.gz',
|
||||||
'contents_amd64', match_prepare=ungzip_if_required)
|
'contents_amd64', match_prepare=ungzip_if_required, mode='b', ensure_utf8=False)
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ class PublishSwitch1Test(BaseTest):
|
|||||||
else:
|
else:
|
||||||
h = hashlib.sha512()
|
h = hashlib.sha512()
|
||||||
|
|
||||||
h.update(self.read_file(os.path.join('public/dists/maverick', path)))
|
h.update(self.read_file(os.path.join('public/dists/maverick', path), mode='b'))
|
||||||
|
|
||||||
if h.hexdigest() != fileHash:
|
if h.hexdigest() != fileHash:
|
||||||
raise Exception("file hash doesn't match for %s: %s != %s" % (path, fileHash, h.hexdigest()))
|
raise Exception("file hash doesn't match for %s: %s != %s" % (path, fileHash, h.hexdigest()))
|
||||||
@@ -346,7 +346,7 @@ class PublishSwitch8Test(BaseTest):
|
|||||||
else:
|
else:
|
||||||
h = hashlib.sha512()
|
h = hashlib.sha512()
|
||||||
|
|
||||||
h.update(self.read_file(os.path.join('public/dists/maverick', path)))
|
h.update(self.read_file(os.path.join('public/dists/maverick', path), mode='b'))
|
||||||
|
|
||||||
if h.hexdigest() != fileHash:
|
if h.hexdigest() != fileHash:
|
||||||
raise Exception("file hash doesn't match for %s: %s != %s" % (path, fileHash, h.hexdigest()))
|
raise Exception("file hash doesn't match for %s: %s != %s" % (path, fileHash, h.hexdigest()))
|
||||||
@@ -378,8 +378,8 @@ class PublishSwitch9Test(BaseTest):
|
|||||||
runCmd = "aptly publish switch -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -component=a,b maverick snap2"
|
runCmd = "aptly publish switch -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -component=a,b maverick snap2"
|
||||||
expectedCode = 2
|
expectedCode = 2
|
||||||
|
|
||||||
def outputMatchPrepare(_, s):
|
def outputMatchPrepare(self, s):
|
||||||
return "\n".join([l for l in s.split("\n") if l.startswith("ERROR")])
|
return "\n".join([l for l in self.ensure_utf8(s).split("\n") if l.startswith("ERROR")])
|
||||||
|
|
||||||
|
|
||||||
class PublishSwitch10Test(BaseTest):
|
class PublishSwitch10Test(BaseTest):
|
||||||
@@ -535,7 +535,7 @@ class PublishSwitch14Test(BaseTest):
|
|||||||
else:
|
else:
|
||||||
h = hashlib.sha512()
|
h = hashlib.sha512()
|
||||||
|
|
||||||
h.update(self.read_file(os.path.join('public/dists/maverick', path)))
|
h.update(self.read_file(os.path.join('public/dists/maverick', path), mode='b'))
|
||||||
|
|
||||||
if h.hexdigest() != fileHash:
|
if h.hexdigest() != fileHash:
|
||||||
raise Exception("file hash doesn't match for %s: %s != %s" % (path, fileHash, h.hexdigest()))
|
raise Exception("file hash doesn't match for %s: %s != %s" % (path, fileHash, h.hexdigest()))
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ class PublishUpdate1Test(BaseTest):
|
|||||||
else:
|
else:
|
||||||
h = hashlib.sha512()
|
h = hashlib.sha512()
|
||||||
|
|
||||||
h.update(self.read_file(os.path.join('public/dists/maverick', path)))
|
h.update(self.read_file(os.path.join('public/dists/maverick', path), mode='b'))
|
||||||
|
|
||||||
if h.hexdigest() != fileHash:
|
if h.hexdigest() != fileHash:
|
||||||
raise Exception("file hash doesn't match for %s: %s != %s" % (path, fileHash, h.hexdigest()))
|
raise Exception("file hash doesn't match for %s: %s != %s" % (path, fileHash, h.hexdigest()))
|
||||||
@@ -427,7 +427,7 @@ class PublishUpdate12Test(BaseTest):
|
|||||||
else:
|
else:
|
||||||
h = hashlib.sha512()
|
h = hashlib.sha512()
|
||||||
|
|
||||||
h.update(self.read_file(os.path.join('public/dists/maverick', path)))
|
h.update(self.read_file(os.path.join('public/dists/maverick', path), mode='b'))
|
||||||
|
|
||||||
if h.hexdigest() != fileHash:
|
if h.hexdigest() != fileHash:
|
||||||
raise Exception("file hash doesn't match for %s: %s != %s" % (path, fileHash, h.hexdigest()))
|
raise Exception("file hash doesn't match for %s: %s != %s" % (path, fileHash, h.hexdigest()))
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
Testing serving public repo
|
Testing serving public repo
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import httplib
|
import http.client
|
||||||
import os
|
import os
|
||||||
import signal
|
import signal
|
||||||
import subprocess
|
import subprocess
|
||||||
@@ -50,7 +50,7 @@ class Serve1Test(BaseTest):
|
|||||||
try:
|
try:
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
conn = httplib.HTTPConnection("127.0.0.1", 8765)
|
conn = http.client.HTTPConnection("127.0.0.1", 8765)
|
||||||
conn.request("GET", "/")
|
conn.request("GET", "/")
|
||||||
r = conn.getresponse()
|
r = conn.getresponse()
|
||||||
if r.status != 200:
|
if r.status != 200:
|
||||||
@@ -66,7 +66,7 @@ class Serve1Test(BaseTest):
|
|||||||
if proc.returncode != -2 and proc.returncode != 2:
|
if proc.returncode != -2 and proc.returncode != 2:
|
||||||
raise Exception("exit code %d != %d (output: %s)" % (proc.returncode, -2, output))
|
raise Exception("exit code %d != %d (output: %s)" % (proc.returncode, -2, output))
|
||||||
self.output = output
|
self.output = output
|
||||||
except Exception, e:
|
except Exception as e:
|
||||||
raise Exception("Running command %s failed: %s" % (self.runCmd, str(e)))
|
raise Exception("Running command %s failed: %s" % (self.runCmd, str(e)))
|
||||||
|
|
||||||
def check(self):
|
def check(self):
|
||||||
|
|||||||
@@ -76,8 +76,8 @@ class AddRepo4Test(BaseTest):
|
|||||||
super(AddRepo4Test, self).prepare()
|
super(AddRepo4Test, self).prepare()
|
||||||
|
|
||||||
self.tempSrcDir = tempfile.mkdtemp()
|
self.tempSrcDir = tempfile.mkdtemp()
|
||||||
os.makedirs(os.path.join(self.tempSrcDir, "01"), 0755)
|
os.makedirs(os.path.join(self.tempSrcDir, "01"), 0o755)
|
||||||
os.makedirs(os.path.join(self.tempSrcDir, "02", "03"), 0755)
|
os.makedirs(os.path.join(self.tempSrcDir, "02", "03"), 0o755)
|
||||||
|
|
||||||
shutil.copy(os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "files", "libboost-program-options-dev_1.49.0.1_i386.deb"),
|
shutil.copy(os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "files", "libboost-program-options-dev_1.49.0.1_i386.deb"),
|
||||||
os.path.join(self.tempSrcDir, "01"))
|
os.path.join(self.tempSrcDir, "01"))
|
||||||
@@ -133,7 +133,7 @@ class AddRepo5Test(BaseTest):
|
|||||||
super(AddRepo5Test, self).prepare()
|
super(AddRepo5Test, self).prepare()
|
||||||
|
|
||||||
self.tempSrcDir = tempfile.mkdtemp()
|
self.tempSrcDir = tempfile.mkdtemp()
|
||||||
os.makedirs(os.path.join(self.tempSrcDir, "02", "03"), 0755)
|
os.makedirs(os.path.join(self.tempSrcDir, "02", "03"), 0o755)
|
||||||
|
|
||||||
shutil.copy(os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "files", "pyspi_0.6.1-1.3.dsc"),
|
shutil.copy(os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "files", "pyspi_0.6.1-1.3.dsc"),
|
||||||
os.path.join(self.tempSrcDir, "02", "03"))
|
os.path.join(self.tempSrcDir, "02", "03"))
|
||||||
@@ -330,7 +330,7 @@ class AddRepo16Test(BaseTest):
|
|||||||
super(AddRepo16Test, self).prepare()
|
super(AddRepo16Test, self).prepare()
|
||||||
|
|
||||||
self.tempSrcDir = tempfile.mkdtemp()
|
self.tempSrcDir = tempfile.mkdtemp()
|
||||||
os.makedirs(os.path.join(self.tempSrcDir, "02", "03"), 0755)
|
os.makedirs(os.path.join(self.tempSrcDir, "02", "03"), 0o755)
|
||||||
|
|
||||||
shutil.copy(os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "files", "pyspi_0.6.1-1.3.dsc"),
|
shutil.copy(os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "files", "pyspi_0.6.1-1.3.dsc"),
|
||||||
os.path.join(self.tempSrcDir, "02", "03"))
|
os.path.join(self.tempSrcDir, "02", "03"))
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ class ImportRepo1Test(BaseTest):
|
|||||||
"""
|
"""
|
||||||
import to local repo: simple import
|
import to local repo: simple import
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureDB = True
|
fixtureDB = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
||||||
@@ -16,14 +17,12 @@ class ImportRepo1Test(BaseTest):
|
|||||||
self.check_output()
|
self.check_output()
|
||||||
self.check_cmd_output("aptly repo show -with-packages repo1", "repo_show")
|
self.check_cmd_output("aptly repo show -with-packages repo1", "repo_show")
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class ImportRepo2Test(BaseTest):
|
class ImportRepo2Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
import to local repo: import w/deps
|
import to local repo: import w/deps
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureDB = True
|
fixtureDB = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
||||||
@@ -35,14 +34,12 @@ class ImportRepo2Test(BaseTest):
|
|||||||
self.check_output()
|
self.check_output()
|
||||||
self.check_cmd_output("aptly repo show -with-packages repo1", "repo_show")
|
self.check_cmd_output("aptly repo show -with-packages repo1", "repo_show")
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class ImportRepo3Test(BaseTest):
|
class ImportRepo3Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
import to local repo: simple move w/deps but w/o archs
|
import to local repo: simple move w/deps but w/o archs
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureDB = True
|
fixtureDB = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
||||||
@@ -50,14 +47,12 @@ class ImportRepo3Test(BaseTest):
|
|||||||
runCmd = "aptly repo import -with-deps wheezy-contrib repo1 redeclipse"
|
runCmd = "aptly repo import -with-deps wheezy-contrib repo1 redeclipse"
|
||||||
expectedCode = 1
|
expectedCode = 1
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class ImportRepo4Test(BaseTest):
|
class ImportRepo4Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
import to local repo: dry run
|
import to local repo: dry run
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureDB = True
|
fixtureDB = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
||||||
@@ -68,14 +63,12 @@ class ImportRepo4Test(BaseTest):
|
|||||||
self.check_output()
|
self.check_output()
|
||||||
self.check_cmd_output("aptly repo show -with-packages repo1", "repo_show")
|
self.check_cmd_output("aptly repo show -with-packages repo1", "repo_show")
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class ImportRepo5Test(BaseTest):
|
class ImportRepo5Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
import to local repo: wrong dep
|
import to local repo: wrong dep
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureDB = True
|
fixtureDB = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
||||||
@@ -83,9 +76,6 @@ class ImportRepo5Test(BaseTest):
|
|||||||
runCmd = "aptly repo import wheezy-contrib repo1 'pyspi >> 0.6.1-1.3)'"
|
runCmd = "aptly repo import wheezy-contrib repo1 'pyspi >> 0.6.1-1.3)'"
|
||||||
expectedCode = 1
|
expectedCode = 1
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class ImportRepo6Test(BaseTest):
|
class ImportRepo6Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
@@ -125,11 +115,9 @@ class ImportRepo9Test(BaseTest):
|
|||||||
"""
|
"""
|
||||||
import to local repo: import with complex query
|
import to local repo: import with complex query
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureDB = True
|
fixtureDB = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
||||||
]
|
]
|
||||||
runCmd = "aptly repo import wheezy-main repo1 '(httpd, $$Source (=nginx)) | exim4'"
|
runCmd = "aptly repo import wheezy-main repo1 '(httpd, $$Source (=nginx)) | exim4'"
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ class CopyRepo1Test(BaseTest):
|
|||||||
"""
|
"""
|
||||||
copy in local repo: simple copy
|
copy in local repo: simple copy
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo2",
|
"aptly repo create -comment=Cool -distribution=squeeze repo2",
|
||||||
@@ -17,14 +18,12 @@ class CopyRepo1Test(BaseTest):
|
|||||||
self.check_cmd_output("aptly repo show -with-packages repo1", "repo1_show")
|
self.check_cmd_output("aptly repo show -with-packages repo1", "repo1_show")
|
||||||
self.check_cmd_output("aptly repo show -with-packages repo2", "repo2_show")
|
self.check_cmd_output("aptly repo show -with-packages repo2", "repo2_show")
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class CopyRepo2Test(BaseTest):
|
class CopyRepo2Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
copy in local repo: simple copy w/deps
|
copy in local repo: simple copy w/deps
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo2",
|
"aptly repo create -comment=Cool -distribution=squeeze repo2",
|
||||||
@@ -37,14 +36,12 @@ class CopyRepo2Test(BaseTest):
|
|||||||
self.check_cmd_output("aptly repo show -with-packages repo1", "repo1_show")
|
self.check_cmd_output("aptly repo show -with-packages repo1", "repo1_show")
|
||||||
self.check_cmd_output("aptly repo show -with-packages repo2", "repo2_show")
|
self.check_cmd_output("aptly repo show -with-packages repo2", "repo2_show")
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class CopyRepo3Test(BaseTest):
|
class CopyRepo3Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
copy in local repo: simple copy w/deps but w/o archs
|
copy in local repo: simple copy w/deps but w/o archs
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo2",
|
"aptly repo create -comment=Cool -distribution=squeeze repo2",
|
||||||
@@ -53,14 +50,12 @@ class CopyRepo3Test(BaseTest):
|
|||||||
runCmd = "aptly repo copy -with-deps repo1 repo2 'pyspi (>> 0.6.1-1.3)' libboost-program-options-dev_1.49.0.1_i386"
|
runCmd = "aptly repo copy -with-deps repo1 repo2 'pyspi (>> 0.6.1-1.3)' libboost-program-options-dev_1.49.0.1_i386"
|
||||||
expectedCode = 1
|
expectedCode = 1
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class CopyRepo4Test(BaseTest):
|
class CopyRepo4Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
copy in local repo: dry run
|
copy in local repo: dry run
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo2",
|
"aptly repo create -comment=Cool -distribution=squeeze repo2",
|
||||||
@@ -73,14 +68,12 @@ class CopyRepo4Test(BaseTest):
|
|||||||
self.check_cmd_output("aptly repo show -with-packages repo1", "repo1_show")
|
self.check_cmd_output("aptly repo show -with-packages repo1", "repo1_show")
|
||||||
self.check_cmd_output("aptly repo show -with-packages repo2", "repo2_show")
|
self.check_cmd_output("aptly repo show -with-packages repo2", "repo2_show")
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class CopyRepo5Test(BaseTest):
|
class CopyRepo5Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
copy in local repo: wrong dep
|
copy in local repo: wrong dep
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo2",
|
"aptly repo create -comment=Cool -distribution=squeeze repo2",
|
||||||
@@ -89,9 +82,6 @@ class CopyRepo5Test(BaseTest):
|
|||||||
runCmd = "aptly repo copy repo1 repo2 'pyspi >> 0.6.1-1.3)'"
|
runCmd = "aptly repo copy repo1 repo2 'pyspi >> 0.6.1-1.3)'"
|
||||||
expectedCode = 1
|
expectedCode = 1
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class CopyRepo6Test(BaseTest):
|
class CopyRepo6Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ class IncludeRepo6Test(BaseTest):
|
|||||||
super(IncludeRepo6Test, self).prepare()
|
super(IncludeRepo6Test, self).prepare()
|
||||||
|
|
||||||
self.tempSrcDir = tempfile.mkdtemp()
|
self.tempSrcDir = tempfile.mkdtemp()
|
||||||
os.makedirs(os.path.join(self.tempSrcDir, "01"), 0755)
|
os.makedirs(os.path.join(self.tempSrcDir, "01"), 0o755)
|
||||||
|
|
||||||
for path in ["hardlink_0.2.1.dsc", "hardlink_0.2.1_amd64.changes", "hardlink_0.2.1_amd64.deb"]:
|
for path in ["hardlink_0.2.1.dsc", "hardlink_0.2.1_amd64.changes", "hardlink_0.2.1_amd64.deb"]:
|
||||||
shutil.copy(os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "changes", path),
|
shutil.copy(os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "changes", path),
|
||||||
@@ -536,7 +536,7 @@ class IncludeRepo22Test(BaseTest):
|
|||||||
super(IncludeRepo22Test, self).prepare()
|
super(IncludeRepo22Test, self).prepare()
|
||||||
|
|
||||||
self.tempSrcDir = tempfile.mkdtemp()
|
self.tempSrcDir = tempfile.mkdtemp()
|
||||||
os.makedirs(os.path.join(self.tempSrcDir, "01"), 0755)
|
os.makedirs(os.path.join(self.tempSrcDir, "01"), 0o755)
|
||||||
|
|
||||||
for path in ["hardlink_0.2.1.dsc", "hardlink_0.2.1_amd64.deb"]:
|
for path in ["hardlink_0.2.1.dsc", "hardlink_0.2.1_amd64.deb"]:
|
||||||
shutil.copy(os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "changes", path),
|
shutil.copy(os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "changes", path),
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ class MoveRepo1Test(BaseTest):
|
|||||||
"""
|
"""
|
||||||
move in local repo: simple move
|
move in local repo: simple move
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo2",
|
"aptly repo create -comment=Cool -distribution=squeeze repo2",
|
||||||
@@ -17,14 +18,12 @@ class MoveRepo1Test(BaseTest):
|
|||||||
self.check_cmd_output("aptly repo show -with-packages repo1", "repo1_show")
|
self.check_cmd_output("aptly repo show -with-packages repo1", "repo1_show")
|
||||||
self.check_cmd_output("aptly repo show -with-packages repo2", "repo2_show")
|
self.check_cmd_output("aptly repo show -with-packages repo2", "repo2_show")
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class MoveRepo2Test(BaseTest):
|
class MoveRepo2Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
move in local repo: simple move w/deps
|
move in local repo: simple move w/deps
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo2",
|
"aptly repo create -comment=Cool -distribution=squeeze repo2",
|
||||||
@@ -37,14 +36,12 @@ class MoveRepo2Test(BaseTest):
|
|||||||
self.check_cmd_output("aptly repo show -with-packages repo1", "repo1_show")
|
self.check_cmd_output("aptly repo show -with-packages repo1", "repo1_show")
|
||||||
self.check_cmd_output("aptly repo show -with-packages repo2", "repo2_show")
|
self.check_cmd_output("aptly repo show -with-packages repo2", "repo2_show")
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class MoveRepo3Test(BaseTest):
|
class MoveRepo3Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
move in local repo: simple move w/deps but w/o archs
|
move in local repo: simple move w/deps but w/o archs
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo2",
|
"aptly repo create -comment=Cool -distribution=squeeze repo2",
|
||||||
@@ -53,14 +50,12 @@ class MoveRepo3Test(BaseTest):
|
|||||||
runCmd = "aptly repo move -with-deps repo1 repo2 'pyspi (>> 0.6.1-1.3)' libboost-program-options-dev_1.49.0.1_i386"
|
runCmd = "aptly repo move -with-deps repo1 repo2 'pyspi (>> 0.6.1-1.3)' libboost-program-options-dev_1.49.0.1_i386"
|
||||||
expectedCode = 1
|
expectedCode = 1
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class MoveRepo4Test(BaseTest):
|
class MoveRepo4Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
move in local repo: dry run
|
move in local repo: dry run
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo2",
|
"aptly repo create -comment=Cool -distribution=squeeze repo2",
|
||||||
@@ -73,14 +68,12 @@ class MoveRepo4Test(BaseTest):
|
|||||||
self.check_cmd_output("aptly repo show -with-packages repo1", "repo1_show")
|
self.check_cmd_output("aptly repo show -with-packages repo1", "repo1_show")
|
||||||
self.check_cmd_output("aptly repo show -with-packages repo2", "repo2_show")
|
self.check_cmd_output("aptly repo show -with-packages repo2", "repo2_show")
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class MoveRepo5Test(BaseTest):
|
class MoveRepo5Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
move in local repo: wrong dep
|
move in local repo: wrong dep
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
"aptly repo create -comment=Cool -distribution=squeeze repo1",
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze repo2",
|
"aptly repo create -comment=Cool -distribution=squeeze repo2",
|
||||||
@@ -89,9 +82,6 @@ class MoveRepo5Test(BaseTest):
|
|||||||
runCmd = "aptly repo move repo1 repo2 'pyspi >> 0.6.1-1.3)'"
|
runCmd = "aptly repo move repo1 repo2 'pyspi >> 0.6.1-1.3)'"
|
||||||
expectedCode = 1
|
expectedCode = 1
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class MoveRepo6Test(BaseTest):
|
class MoveRepo6Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ class RemoveRepo1Test(BaseTest):
|
|||||||
"""
|
"""
|
||||||
remove from local repo: as dep
|
remove from local repo: as dep
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze local-repo",
|
"aptly repo create -comment=Cool -distribution=squeeze local-repo",
|
||||||
"aptly repo add local-repo ${files}"
|
"aptly repo add local-repo ${files}"
|
||||||
@@ -15,14 +16,12 @@ class RemoveRepo1Test(BaseTest):
|
|||||||
self.check_output()
|
self.check_output()
|
||||||
self.check_cmd_output("aptly repo show -with-packages local-repo", "repo_show")
|
self.check_cmd_output("aptly repo show -with-packages local-repo", "repo_show")
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class RemoveRepo2Test(BaseTest):
|
class RemoveRepo2Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
remove from local repo: as dep with version, key
|
remove from local repo: as dep with version, key
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze local-repo",
|
"aptly repo create -comment=Cool -distribution=squeeze local-repo",
|
||||||
"aptly repo add local-repo ${files}"
|
"aptly repo add local-repo ${files}"
|
||||||
@@ -33,9 +32,6 @@ class RemoveRepo2Test(BaseTest):
|
|||||||
self.check_output()
|
self.check_output()
|
||||||
self.check_cmd_output("aptly repo show -with-packages local-repo", "repo_show")
|
self.check_cmd_output("aptly repo show -with-packages local-repo", "repo_show")
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|
||||||
|
|
||||||
class RemoveRepo3Test(BaseTest):
|
class RemoveRepo3Test(BaseTest):
|
||||||
"""
|
"""
|
||||||
@@ -49,6 +45,7 @@ class RemoveRepo4Test(BaseTest):
|
|||||||
"""
|
"""
|
||||||
remove from local repo: dry run
|
remove from local repo: dry run
|
||||||
"""
|
"""
|
||||||
|
sortOutput = True
|
||||||
fixtureCmds = [
|
fixtureCmds = [
|
||||||
"aptly repo create -comment=Cool -distribution=squeeze local-repo",
|
"aptly repo create -comment=Cool -distribution=squeeze local-repo",
|
||||||
"aptly repo add local-repo ${files}"
|
"aptly repo add local-repo ${files}"
|
||||||
@@ -58,6 +55,3 @@ class RemoveRepo4Test(BaseTest):
|
|||||||
def check(self):
|
def check(self):
|
||||||
self.check_output()
|
self.check_output()
|
||||||
self.check_cmd_output("aptly repo show -with-packages local-repo", "repo_show")
|
self.check_cmd_output("aptly repo show -with-packages local-repo", "repo_show")
|
||||||
|
|
||||||
def output_processor(self, output):
|
|
||||||
return "\n".join(sorted(output.split("\n")))
|
|
||||||
|
|||||||
@@ -12,16 +12,16 @@ class GraphAPITest(APITest):
|
|||||||
def check(self):
|
def check(self):
|
||||||
resp = self.get("/api/graph.png")
|
resp = self.get("/api/graph.png")
|
||||||
self.check_equal(resp.headers["Content-Type"], "image/png")
|
self.check_equal(resp.headers["Content-Type"], "image/png")
|
||||||
self.check_equal(resp.content[:4], '\x89PNG')
|
self.check_equal(resp.content[:4], b'\x89PNG')
|
||||||
|
|
||||||
self.check_equal(self.post("/api/repos", json={"Name": "xyz", "Comment": "fun repo"}).status_code, 201)
|
self.check_equal(self.post("/api/repos", json={"Name": "xyz", "Comment": "fun repo"}).status_code, 201)
|
||||||
resp = self.get("/api/graph.svg")
|
resp = self.get("/api/graph.svg")
|
||||||
self.check_equal(resp.headers["Content-Type"], "image/svg+xml")
|
self.check_equal(resp.headers["Content-Type"], "image/svg+xml")
|
||||||
self.check_equal(resp.content[:4], '<?xm')
|
self.check_equal(resp.content[:4], b'<?xm')
|
||||||
|
|
||||||
resp = self.get("/api/graph.dot")
|
resp = self.get("/api/graph.dot")
|
||||||
self.check_equal(resp.headers["Content-Type"], "text/plain; charset=utf-8")
|
self.check_equal(resp.headers["Content-Type"], "text/plain; charset=utf-8")
|
||||||
self.check_equal(resp.content[:13], 'digraph aptly')
|
self.check_equal(resp.content[:13], b'digraph aptly')
|
||||||
|
|
||||||
# basic test of layout:
|
# basic test of layout:
|
||||||
# horizontal should be wider than vertical
|
# horizontal should be wider than vertical
|
||||||
|
|||||||
@@ -10,11 +10,11 @@ class MirrorsAPITestCreateShow(APITest):
|
|||||||
|
|
||||||
def check(self):
|
def check(self):
|
||||||
mirror_name = self.random_name()
|
mirror_name = self.random_name()
|
||||||
mirror_desc = {u'Name': mirror_name,
|
mirror_desc = {'Name': mirror_name,
|
||||||
u'ArchiveURL': 'http://security.debian.org/',
|
'ArchiveURL': 'http://security.debian.org/',
|
||||||
u'Architectures': ['amd64'],
|
'Architectures': ['amd64'],
|
||||||
u'Components': ['main'],
|
'Components': ['main'],
|
||||||
u'Distribution': 'wheezy/updates'}
|
'Distribution': 'wheezy/updates'}
|
||||||
|
|
||||||
resp = self.post("/api/mirrors", json=mirror_desc)
|
resp = self.post("/api/mirrors", json=mirror_desc)
|
||||||
self.check_equal(resp.status_code, 400)
|
self.check_equal(resp.status_code, 400)
|
||||||
@@ -22,17 +22,17 @@ class MirrorsAPITestCreateShow(APITest):
|
|||||||
'error': 'unable to fetch mirror: verification of detached signature failed: exit status 2',
|
'error': 'unable to fetch mirror: verification of detached signature failed: exit status 2',
|
||||||
}, resp.json())
|
}, resp.json())
|
||||||
|
|
||||||
mirror_desc[u'IgnoreSignatures'] = True
|
mirror_desc['IgnoreSignatures'] = True
|
||||||
resp = self.post("/api/mirrors", json=mirror_desc)
|
resp = self.post("/api/mirrors", json=mirror_desc)
|
||||||
self.check_equal(resp.status_code, 201)
|
self.check_equal(resp.status_code, 201)
|
||||||
|
|
||||||
resp = self.get("/api/mirrors/" + mirror_name)
|
resp = self.get("/api/mirrors/" + mirror_name)
|
||||||
self.check_equal(resp.status_code, 200)
|
self.check_equal(resp.status_code, 200)
|
||||||
self.check_subset({u'Name': mirror_name,
|
self.check_subset({'Name': mirror_name,
|
||||||
u'ArchiveRoot': 'http://security.debian.org/',
|
'ArchiveRoot': 'http://security.debian.org/',
|
||||||
u'Architectures': ['amd64'],
|
'Architectures': ['amd64'],
|
||||||
u'Components': ['main'],
|
'Components': ['main'],
|
||||||
u'Distribution': 'wheezy/updates'}, resp.json())
|
'Distribution': 'wheezy/updates'}, resp.json())
|
||||||
|
|
||||||
resp = self.get("/api/mirrors/" + mirror_desc["Name"] + "/packages")
|
resp = self.get("/api/mirrors/" + mirror_desc["Name"] + "/packages")
|
||||||
self.check_equal(resp.status_code, 404)
|
self.check_equal(resp.status_code, 404)
|
||||||
@@ -44,12 +44,12 @@ class MirrorsAPITestCreateUpdate(APITest):
|
|||||||
"""
|
"""
|
||||||
def check(self):
|
def check(self):
|
||||||
mirror_name = self.random_name()
|
mirror_name = self.random_name()
|
||||||
mirror_desc = {u'Name': mirror_name,
|
mirror_desc = {'Name': mirror_name,
|
||||||
u'ArchiveURL': 'https://packagecloud.io/varnishcache/varnish30/debian/',
|
'ArchiveURL': 'https://packagecloud.io/varnishcache/varnish30/debian/',
|
||||||
u'Distribution': 'wheezy',
|
'Distribution': 'wheezy',
|
||||||
u'Components': ['main']}
|
'Components': ['main']}
|
||||||
|
|
||||||
mirror_desc[u'IgnoreSignatures'] = True
|
mirror_desc['IgnoreSignatures'] = True
|
||||||
resp = self.post("/api/mirrors", json=mirror_desc)
|
resp = self.post("/api/mirrors", json=mirror_desc)
|
||||||
self.check_equal(resp.status_code, 201)
|
self.check_equal(resp.status_code, 201)
|
||||||
|
|
||||||
@@ -68,9 +68,9 @@ class MirrorsAPITestCreateUpdate(APITest):
|
|||||||
|
|
||||||
resp = self.get("/api/mirrors/" + mirror_desc["Name"])
|
resp = self.get("/api/mirrors/" + mirror_desc["Name"])
|
||||||
self.check_equal(resp.status_code, 200)
|
self.check_equal(resp.status_code, 200)
|
||||||
self.check_subset({u'Name': mirror_desc["Name"],
|
self.check_subset({'Name': mirror_desc["Name"],
|
||||||
u'ArchiveRoot': 'https://packagecloud.io/varnishcache/varnish30/debian/',
|
'ArchiveRoot': 'https://packagecloud.io/varnishcache/varnish30/debian/',
|
||||||
u'Distribution': 'wheezy'}, resp.json())
|
'Distribution': 'wheezy'}, resp.json())
|
||||||
|
|
||||||
resp = self.get("/api/mirrors/" + mirror_desc["Name"] + "/packages")
|
resp = self.get("/api/mirrors/" + mirror_desc["Name"] + "/packages")
|
||||||
self.check_equal(resp.status_code, 200)
|
self.check_equal(resp.status_code, 200)
|
||||||
@@ -82,11 +82,11 @@ class MirrorsAPITestCreateDelete(APITest):
|
|||||||
"""
|
"""
|
||||||
def check(self):
|
def check(self):
|
||||||
mirror_name = self.random_name()
|
mirror_name = self.random_name()
|
||||||
mirror_desc = {u'Name': mirror_name,
|
mirror_desc = {'Name': mirror_name,
|
||||||
u'ArchiveURL': 'https://packagecloud.io/varnishcache/varnish30/debian/',
|
'ArchiveURL': 'https://packagecloud.io/varnishcache/varnish30/debian/',
|
||||||
u'IgnoreSignatures': True,
|
'IgnoreSignatures': True,
|
||||||
u'Distribution': 'wheezy',
|
'Distribution': 'wheezy',
|
||||||
u'Components': ['main']}
|
'Components': ['main']}
|
||||||
|
|
||||||
resp = self.post("/api/mirrors", json=mirror_desc)
|
resp = self.post("/api/mirrors", json=mirror_desc)
|
||||||
self.check_equal(resp.status_code, 201)
|
self.check_equal(resp.status_code, 201)
|
||||||
@@ -105,11 +105,11 @@ class MirrorsAPITestCreateList(APITest):
|
|||||||
count = len(resp.json())
|
count = len(resp.json())
|
||||||
|
|
||||||
mirror_name = self.random_name()
|
mirror_name = self.random_name()
|
||||||
mirror_desc = {u'Name': mirror_name,
|
mirror_desc = {'Name': mirror_name,
|
||||||
u'ArchiveURL': 'https://packagecloud.io/varnishcache/varnish30/debian/',
|
'ArchiveURL': 'https://packagecloud.io/varnishcache/varnish30/debian/',
|
||||||
u'IgnoreSignatures': True,
|
'IgnoreSignatures': True,
|
||||||
u'Distribution': 'wheezy',
|
'Distribution': 'wheezy',
|
||||||
u'Components': ['main']}
|
'Components': ['main']}
|
||||||
|
|
||||||
resp = self.post("/api/mirrors", json=mirror_desc)
|
resp = self.post("/api/mirrors", json=mirror_desc)
|
||||||
self.check_equal(resp.status_code, 201)
|
self.check_equal(resp.status_code, 201)
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
import urllib
|
import urllib.error
|
||||||
|
import urllib.parse
|
||||||
|
import urllib.request
|
||||||
|
|
||||||
from api_lib import APITest
|
from api_lib import APITest
|
||||||
|
|
||||||
|
|
||||||
@@ -19,7 +22,7 @@ class PackagesAPITestShow(APITest):
|
|||||||
self.check_equal(resp.json()['State'], 2)
|
self.check_equal(resp.json()['State'], 2)
|
||||||
|
|
||||||
# get information about package
|
# get information about package
|
||||||
resp = self.get("/api/packages/" + urllib.quote('Psource pyspi 0.6.1-1.3 3a8b37cbd9a3559e'))
|
resp = self.get("/api/packages/" + urllib.parse.quote('Psource pyspi 0.6.1-1.3 3a8b37cbd9a3559e'))
|
||||||
self.check_equal(resp.status_code, 200)
|
self.check_equal(resp.status_code, 200)
|
||||||
self.check_equal(resp.json(), {
|
self.check_equal(resp.json(), {
|
||||||
'Architecture': 'any',
|
'Architecture': 'any',
|
||||||
@@ -40,5 +43,5 @@ class PackagesAPITestShow(APITest):
|
|||||||
'Vcs-Svn': 'svn://svn.tribulaciones.org/srv/svn/pyspi/trunk',
|
'Vcs-Svn': 'svn://svn.tribulaciones.org/srv/svn/pyspi/trunk',
|
||||||
'Version': '0.6.1-1.3'})
|
'Version': '0.6.1-1.3'})
|
||||||
|
|
||||||
resp = self.get("/api/packages/" + urllib.quote('Pamd64 no-such-package 1.0 3a8b37cbd9a3559e'))
|
resp = self.get("/api/packages/" + urllib.parse.quote('Pamd64 no-such-package 1.0 3a8b37cbd9a3559e'))
|
||||||
self.check_equal(resp.status_code, 404)
|
self.check_equal(resp.status_code, 404)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
from api_lib import APITest
|
from api_lib import APITest
|
||||||
from publish import DefaultSigningOptions
|
from .publish import DefaultSigningOptions
|
||||||
|
|
||||||
|
|
||||||
class ReposAPITestCreateShow(APITest):
|
class ReposAPITestCreateShow(APITest):
|
||||||
@@ -8,10 +8,10 @@ class ReposAPITestCreateShow(APITest):
|
|||||||
"""
|
"""
|
||||||
def check(self):
|
def check(self):
|
||||||
repo_name = self.random_name()
|
repo_name = self.random_name()
|
||||||
repo_desc = {u'Comment': u'fun repo',
|
repo_desc = {'Comment': 'fun repo',
|
||||||
u'DefaultComponent': u'',
|
'DefaultComponent': '',
|
||||||
u'DefaultDistribution': u'',
|
'DefaultDistribution': '',
|
||||||
u'Name': repo_name}
|
'Name': repo_name}
|
||||||
|
|
||||||
resp = self.post("/api/repos", json={"Name": repo_name, "Comment": "fun repo"})
|
resp = self.post("/api/repos", json={"Name": repo_name, "Comment": "fun repo"})
|
||||||
self.check_equal(resp.json(), repo_desc)
|
self.check_equal(resp.json(), repo_desc)
|
||||||
@@ -101,10 +101,10 @@ class ReposAPITestAdd(APITest):
|
|||||||
resp = self.get("/api/tasks/" + str(resp.json()['ID']) + "/output")
|
resp = self.get("/api/tasks/" + str(resp.json()['ID']) + "/output")
|
||||||
self.check_equal(resp.status_code, 200)
|
self.check_equal(resp.status_code, 200)
|
||||||
|
|
||||||
self.check_in("Added: pyspi_0.6.1-1.3_source added", resp.content)
|
self.check_in(b"Added: pyspi_0.6.1-1.3_source added", resp.content)
|
||||||
self.check_equal("Removed: " in resp.content, False)
|
self.check_not_in(b"Removed: ", resp.content)
|
||||||
self.check_equal("Failed files: " in resp.content, False)
|
self.check_not_in(b"Failed files: ", resp.content)
|
||||||
self.check_equal("Warnings: " in resp.content, False)
|
self.check_not_in(b"Warnings: ", resp.content)
|
||||||
|
|
||||||
self.check_equal(self.get("/api/repos/" + repo_name + "/packages").json(), ['Psource pyspi 0.6.1-1.3 3a8b37cbd9a3559e'])
|
self.check_equal(self.get("/api/repos/" + repo_name + "/packages").json(), ['Psource pyspi 0.6.1-1.3 3a8b37cbd9a3559e'])
|
||||||
|
|
||||||
@@ -169,10 +169,10 @@ class ReposAPITestAddFile(APITest):
|
|||||||
resp = self.get("/api/tasks/" + str(resp.json()['ID']) + "/output")
|
resp = self.get("/api/tasks/" + str(resp.json()['ID']) + "/output")
|
||||||
self.check_equal(resp.status_code, 200)
|
self.check_equal(resp.status_code, 200)
|
||||||
|
|
||||||
self.check_in("Added: libboost-program-options-dev_1.49.0.1_i386 added", resp.content)
|
self.check_in(b"Added: libboost-program-options-dev_1.49.0.1_i386 added", resp.content)
|
||||||
self.check_equal("Removed: " in resp.content, False)
|
self.check_not_in(b"Removed: ", resp.content)
|
||||||
self.check_equal("Failed files: " in resp.content, False)
|
self.check_not_in(b"Failed files: ", resp.content)
|
||||||
self.check_equal("Warnings: " in resp.content, False)
|
self.check_not_in(b"Warnings: ", resp.content)
|
||||||
|
|
||||||
self.check_equal(self.get("/api/repos/" + repo_name + "/packages").json(),
|
self.check_equal(self.get("/api/repos/" + repo_name + "/packages").json(),
|
||||||
['Pi386 libboost-program-options-dev 1.49.0.1 918d2f433384e378'])
|
['Pi386 libboost-program-options-dev 1.49.0.1 918d2f433384e378'])
|
||||||
@@ -200,10 +200,10 @@ class ReposAPITestInclude(APITest):
|
|||||||
|
|
||||||
resp = self.get("/api/tasks/" + str(resp.json()['ID']) + "/output")
|
resp = self.get("/api/tasks/" + str(resp.json()['ID']) + "/output")
|
||||||
self.check_equal(resp.status_code, 200)
|
self.check_equal(resp.status_code, 200)
|
||||||
self.check_in("Added: hardlink_0.2.1_source added, hardlink_0.2.1_amd64 added", resp.content)
|
self.check_in(b"Added: hardlink_0.2.1_source added, hardlink_0.2.1_amd64 added", resp.content)
|
||||||
self.check_equal(
|
self.check_equal(
|
||||||
sorted(self.get("/api/repos/" + repo_name + "/packages").json()),
|
sorted(self.get("/api/repos/" + repo_name + "/packages").json()),
|
||||||
[u'Pamd64 hardlink 0.2.1 daf8fcecbf8210ad', u'Psource hardlink 0.2.1 8f72df429d7166e5']
|
['Pamd64 hardlink 0.2.1 daf8fcecbf8210ad', 'Psource hardlink 0.2.1 8f72df429d7166e5']
|
||||||
)
|
)
|
||||||
|
|
||||||
self.check_not_exists("upload/" + d)
|
self.check_not_exists("upload/" + d)
|
||||||
@@ -238,7 +238,7 @@ class ReposAPITestShowQuery(APITest):
|
|||||||
|
|
||||||
resp = self.get("/api/repos/" + repo_name + "/packages", params={"q": "pyspi)"})
|
resp = self.get("/api/repos/" + repo_name + "/packages", params={"q": "pyspi)"})
|
||||||
self.check_equal(resp.status_code, 400)
|
self.check_equal(resp.status_code, 400)
|
||||||
self.check_equal(resp.json()["error"], u'parsing failed: unexpected token ): expecting end of query')
|
self.check_equal(resp.json()["error"], 'parsing failed: unexpected token ): expecting end of query')
|
||||||
|
|
||||||
|
|
||||||
class ReposAPITestAddMultiple(APITest):
|
class ReposAPITestAddMultiple(APITest):
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
from api_lib import APITest
|
from api_lib import APITest
|
||||||
from publish import DefaultSigningOptions
|
from .publish import DefaultSigningOptions
|
||||||
|
|
||||||
|
|
||||||
class SnapshotsAPITestCreateShowEmpty(APITest):
|
class SnapshotsAPITestCreateShowEmpty(APITest):
|
||||||
@@ -8,8 +8,8 @@ class SnapshotsAPITestCreateShowEmpty(APITest):
|
|||||||
"""
|
"""
|
||||||
def check(self):
|
def check(self):
|
||||||
snapshot_name = self.random_name()
|
snapshot_name = self.random_name()
|
||||||
snapshot_desc = {u'Description': u'fun snapshot',
|
snapshot_desc = {'Description': 'fun snapshot',
|
||||||
u'Name': snapshot_name}
|
'Name': snapshot_name}
|
||||||
|
|
||||||
# create empty snapshot
|
# create empty snapshot
|
||||||
resp = self.post_task("/api/snapshots", json=snapshot_desc)
|
resp = self.post_task("/api/snapshots", json=snapshot_desc)
|
||||||
@@ -36,9 +36,9 @@ class SnapshotsAPITestCreateFromRefs(APITest):
|
|||||||
"""
|
"""
|
||||||
def check(self):
|
def check(self):
|
||||||
snapshot_name = self.random_name()
|
snapshot_name = self.random_name()
|
||||||
snapshot_desc = {u'Description': u'fun snapshot',
|
snapshot_desc = {'Description': 'fun snapshot',
|
||||||
u'Name': snapshot_name,
|
'Name': snapshot_name,
|
||||||
u'SourceSnapshots': [self.random_name()]}
|
'SourceSnapshots': [self.random_name()]}
|
||||||
|
|
||||||
# creating snapshot from missing source snapshot
|
# creating snapshot from missing source snapshot
|
||||||
resp = self.post("/api/snapshots", json=snapshot_desc)
|
resp = self.post("/api/snapshots", json=snapshot_desc)
|
||||||
@@ -115,15 +115,15 @@ class SnapshotsAPITestCreateFromRepo(APITest):
|
|||||||
self.check_equal(resp.json()['State'], 2)
|
self.check_equal(resp.json()['State'], 2)
|
||||||
self.check_equal(self.get("/api/snapshots/" + snapshot_name).status_code, 200)
|
self.check_equal(self.get("/api/snapshots/" + snapshot_name).status_code, 200)
|
||||||
|
|
||||||
self.check_subset({u'Architecture': 'i386',
|
self.check_subset({'Architecture': 'i386',
|
||||||
u'Package': 'libboost-program-options-dev',
|
'Package': 'libboost-program-options-dev',
|
||||||
u'Version': '1.49.0.1',
|
'Version': '1.49.0.1',
|
||||||
'FilesHash': '918d2f433384e378'},
|
'FilesHash': '918d2f433384e378'},
|
||||||
self.get("/api/snapshots/" + snapshot_name + "/packages", params={"format": "details"}).json()[0])
|
self.get("/api/snapshots/" + snapshot_name + "/packages", params={"format": "details"}).json()[0])
|
||||||
|
|
||||||
self.check_subset({u'Architecture': 'i386',
|
self.check_subset({'Architecture': 'i386',
|
||||||
u'Package': 'libboost-program-options-dev',
|
'Package': 'libboost-program-options-dev',
|
||||||
u'Version': '1.49.0.1',
|
'Version': '1.49.0.1',
|
||||||
'FilesHash': '918d2f433384e378'},
|
'FilesHash': '918d2f433384e378'},
|
||||||
self.get("/api/snapshots/" + snapshot_name + "/packages",
|
self.get("/api/snapshots/" + snapshot_name + "/packages",
|
||||||
params={"format": "details", "q": "Version (> 0.6.1-1.4)"}).json()[0])
|
params={"format": "details", "q": "Version (> 0.6.1-1.4)"}).json()[0])
|
||||||
@@ -139,8 +139,8 @@ class SnapshotsAPITestCreateUpdate(APITest):
|
|||||||
"""
|
"""
|
||||||
def check(self):
|
def check(self):
|
||||||
snapshot_name = self.random_name()
|
snapshot_name = self.random_name()
|
||||||
snapshot_desc = {u'Description': u'fun snapshot',
|
snapshot_desc = {'Description': 'fun snapshot',
|
||||||
u'Name': snapshot_name}
|
'Name': snapshot_name}
|
||||||
|
|
||||||
resp = self.post_task("/api/snapshots", json=snapshot_desc)
|
resp = self.post_task("/api/snapshots", json=snapshot_desc)
|
||||||
self.check_equal(resp.json()['State'], 2)
|
self.check_equal(resp.json()['State'], 2)
|
||||||
@@ -171,8 +171,8 @@ class SnapshotsAPITestCreateDelete(APITest):
|
|||||||
"""
|
"""
|
||||||
def check(self):
|
def check(self):
|
||||||
snapshot_name = self.random_name()
|
snapshot_name = self.random_name()
|
||||||
snapshot_desc = {u'Description': u'fun snapshot',
|
snapshot_desc = {'Description': 'fun snapshot',
|
||||||
u'Name': snapshot_name}
|
'Name': snapshot_name}
|
||||||
|
|
||||||
# deleting unreferenced snapshot
|
# deleting unreferenced snapshot
|
||||||
resp = self.post_task("/api/snapshots", json=snapshot_desc)
|
resp = self.post_task("/api/snapshots", json=snapshot_desc)
|
||||||
@@ -251,8 +251,8 @@ class SnapshotsAPITestDiff(APITest):
|
|||||||
GET /api/snapshot/:name/diff/:name2
|
GET /api/snapshot/:name/diff/:name2
|
||||||
"""
|
"""
|
||||||
def check(self):
|
def check(self):
|
||||||
repos = [self.random_name() for x in xrange(2)]
|
repos = [self.random_name() for x in range(2)]
|
||||||
snapshots = [self.random_name() for x in xrange(2)]
|
snapshots = [self.random_name() for x in range(2)]
|
||||||
|
|
||||||
for repo_name in repos:
|
for repo_name in repos:
|
||||||
self.check_equal(self.post("/api/repos", json={"Name": repo_name}).status_code, 201)
|
self.check_equal(self.post("/api/repos", json={"Name": repo_name}).status_code, 201)
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import requests_unixsocket
|
import requests_unixsocket
|
||||||
import urllib
|
import urllib.error
|
||||||
|
import urllib.parse
|
||||||
|
import urllib.request
|
||||||
import os
|
import os
|
||||||
import os.path
|
import os.path
|
||||||
|
|
||||||
@@ -42,5 +44,5 @@ class SystemdAPIHandoverTest(BaseTest):
|
|||||||
print("Skipping test as we failed to setup a listener.")
|
print("Skipping test as we failed to setup a listener.")
|
||||||
return
|
return
|
||||||
session = requests_unixsocket.Session()
|
session = requests_unixsocket.Session()
|
||||||
r = session.get('http+unix://%s/api/version' % urllib.quote(self.socket_path, safe=''))
|
r = session.get('http+unix://%s/api/version' % urllib.parse.quote(self.socket_path, safe=''))
|
||||||
self.check_equal(r.json(), {'Version': os.environ['APTLY_VERSION']})
|
self.check_equal(r.json(), {'Version': os.environ['APTLY_VERSION']})
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
from api_lib import APITest
|
from api_lib import APITest
|
||||||
from publish import DefaultSigningOptions
|
from .publish import DefaultSigningOptions
|
||||||
|
|
||||||
|
|
||||||
class TaskAPITestParallelTasks(APITest):
|
class TaskAPITestParallelTasks(APITest):
|
||||||
@@ -8,11 +8,11 @@ class TaskAPITestParallelTasks(APITest):
|
|||||||
"""
|
"""
|
||||||
def _create_mirror(self, dist):
|
def _create_mirror(self, dist):
|
||||||
mirror_name = self.random_name()
|
mirror_name = self.random_name()
|
||||||
mirror_desc = {u'Name': mirror_name,
|
mirror_desc = {'Name': mirror_name,
|
||||||
u'ArchiveURL': 'https://packagecloud.io/varnishcache/varnish30/debian/',
|
'ArchiveURL': 'https://packagecloud.io/varnishcache/varnish30/debian/',
|
||||||
u'Distribution': dist,
|
'Distribution': dist,
|
||||||
u'Components': ['main']}
|
'Components': ['main']}
|
||||||
mirror_desc[u'IgnoreSignatures'] = True
|
mirror_desc['IgnoreSignatures'] = True
|
||||||
resp = self.post("/api/mirrors", json=mirror_desc)
|
resp = self.post("/api/mirrors", json=mirror_desc)
|
||||||
self.check_equal(resp.status_code, 201)
|
self.check_equal(resp.status_code, 201)
|
||||||
resp = self.put("/api/mirrors/" + mirror_name, json=mirror_desc, params={'_async': True})
|
resp = self.put("/api/mirrors/" + mirror_name, json=mirror_desc, params={'_async': True})
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
import requests_unixsocket
|
import requests_unixsocket
|
||||||
import time
|
import time
|
||||||
import os
|
import os
|
||||||
import urllib
|
import urllib.error
|
||||||
|
import urllib.parse
|
||||||
|
import urllib.request
|
||||||
|
|
||||||
from lib import BaseTest
|
from lib import BaseTest
|
||||||
|
|
||||||
@@ -32,7 +34,7 @@ class UnixSocketAPITest(BaseTest):
|
|||||||
"""
|
"""
|
||||||
def check(self):
|
def check(self):
|
||||||
session = requests_unixsocket.Session()
|
session = requests_unixsocket.Session()
|
||||||
r = session.get('http+unix://%s/api/version' % urllib.quote(UnixSocketAPITest.socket_path, safe=''))
|
r = session.get('http+unix://%s/api/version' % urllib.parse.quote(UnixSocketAPITest.socket_path, safe=''))
|
||||||
# Just needs to come back, we actually don't care much about the code.
|
# Just needs to come back, we actually don't care much about the code.
|
||||||
# Only needs to verify that the socket is actually responding.
|
# Only needs to verify that the socket is actually responding.
|
||||||
self.check_equal(r.json(), {'Version': os.environ['APTLY_VERSION']})
|
self.check_equal(r.json(), {'Version': os.environ['APTLY_VERSION']})
|
||||||
|
|||||||
Reference in New Issue
Block a user