Port autopkgtests to python3, taken from Ubuntu, thanks to them and Dimitri John Ledkov (Closes: #937169)
This commit is contained in:
parent
5c60ced7db
commit
dcb5203681
5 changed files with 63 additions and 56 deletions
7
debian/changelog
vendored
7
debian/changelog
vendored
|
@ -1,3 +1,10 @@
|
|||
nut (2.7.4-12) unstable; urgency=medium
|
||||
|
||||
* Port autopkgtests to python3, taken from Ubuntu, thanks to them and
|
||||
Dimitri John Ledkov (Closes: #937169)
|
||||
|
||||
-- Laurent Bigonville <bigon@debian.org> Thu, 30 Jan 2020 01:06:14 +0100
|
||||
|
||||
nut (2.7.4-11) unstable; urgency=medium
|
||||
|
||||
* Remove python(2) binding and disable nut-monitor package for now as it
|
||||
|
|
2
debian/tests/control
vendored
2
debian/tests/control
vendored
|
@ -1,3 +1,3 @@
|
|||
Tests: nut
|
||||
Depends: lsb-release, netcat, nut-client, nut-server, psmisc, python
|
||||
Depends: lsb-release, netcat, nut-client, nut-server, psmisc, python3
|
||||
Restrictions: needs-root
|
||||
|
|
2
debian/tests/nut
vendored
2
debian/tests/nut
vendored
|
@ -3,4 +3,4 @@
|
|||
# Testing nut
|
||||
#------------
|
||||
set -e
|
||||
python `dirname $0`/test-nut.py 2>&1
|
||||
python3 `dirname $0`/test-nut.py 2>&1
|
||||
|
|
18
debian/tests/test-nut.py
vendored
18
debian/tests/test-nut.py
vendored
|
@ -75,7 +75,7 @@ try:
|
|||
except ImportError:
|
||||
class PrivateNutTest(object):
|
||||
'''Empty class'''
|
||||
print >>sys.stdout, "Skipping private tests"
|
||||
print("Skipping private tests")
|
||||
|
||||
|
||||
class NutTestCommon(testlib.TestlibCase):
|
||||
|
@ -161,7 +161,7 @@ FINALDELAY 0
|
|||
|
||||
testlib.create_fill(self.notifyscript, '''
|
||||
#! /bin/bash
|
||||
echo "$*" > ''' + self.notifylog + '\n', mode=0755)
|
||||
echo "$*" > ''' + self.notifylog + '\n', mode=0o755)
|
||||
|
||||
# dummy-ups absolutely needs a data file, even if empty
|
||||
testlib.config_replace('/etc/nut/dummy.dev', '''
|
||||
|
@ -230,7 +230,7 @@ UPSMON_OPTIONS=""
|
|||
rc, report = testlib.cmd([self.initscript, 'start'])
|
||||
expected = 0
|
||||
result = 'Got exit code %d, expected %d\n' % (rc, expected)
|
||||
self.assertEquals(expected, rc, result + report)
|
||||
self.assertEqual(expected, rc, result + report)
|
||||
time.sleep(2)
|
||||
|
||||
def _stop(self):
|
||||
|
@ -238,14 +238,14 @@ UPSMON_OPTIONS=""
|
|||
rc, report = testlib.cmd([self.initscript, 'stop'])
|
||||
expected = 0
|
||||
result = 'Got exit code %d, expected %d\n' % (rc, expected)
|
||||
self.assertEquals(expected, rc, result + report)
|
||||
self.assertEqual(expected, rc, result + report)
|
||||
|
||||
def _reload(self):
|
||||
'''Reload NUT'''
|
||||
rc, report = testlib.cmd([self.initscript, 'force-reload'])
|
||||
expected = 0
|
||||
result = 'Got exit code %d, expected %d\n' % (rc, expected)
|
||||
self.assertEquals(expected, rc, result + report)
|
||||
self.assertEqual(expected, rc, result + report)
|
||||
|
||||
def _restart(self):
|
||||
'''Restart NUT'''
|
||||
|
@ -261,7 +261,7 @@ UPSMON_OPTIONS=""
|
|||
self._skipped("init script does not support status command")
|
||||
expected = 1
|
||||
result = 'Got exit code %d, expected %d\n' % (rc, expected)
|
||||
self.assertEquals(expected, rc, result + report)
|
||||
self.assertEqual(expected, rc, result + report)
|
||||
|
||||
def _testDaemons(self, daemons):
|
||||
'''Daemons running'''
|
||||
|
@ -379,7 +379,7 @@ printf '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\n' | nc -q 1 127.0.0.1
|
|||
sleep 1
|
||||
dd if=/dev/urandom count=64 | nc -q 1 127.0.0.1 3493
|
||||
'''
|
||||
testlib.create_fill(script, contents, mode=0755)
|
||||
testlib.create_fill(script, contents, mode=0o755)
|
||||
rc, report = testlib.cmd([script])
|
||||
|
||||
# It should not have crashed. Let's see if it did
|
||||
|
@ -414,9 +414,9 @@ if __name__ == '__main__':
|
|||
# suite.addTest(unittest.TestLoader().loadTestsFromTestCase(MyPrivateTest))
|
||||
|
||||
else:
|
||||
print '''Usage:
|
||||
print('''Usage:
|
||||
test-nut.py [-v] basic tests
|
||||
'''
|
||||
''')
|
||||
sys.exit(1)
|
||||
rc = unittest.TextTestRunner(verbosity=2).run(suite)
|
||||
if not rc.wasSuccessful():
|
||||
|
|
90
debian/tests/testlib.py
vendored
90
debian/tests/testlib.py
vendored
|
@ -22,7 +22,6 @@
|
|||
import string, random, crypt, subprocess, pwd, grp, signal, time, unittest, tempfile, shutil, os, os.path, re, glob
|
||||
import sys, socket, gzip
|
||||
from stat import *
|
||||
from encodings import string_escape
|
||||
|
||||
import warnings
|
||||
warnings.filterwarnings('ignore', message=r'.*apt_pkg\.TagFile.*', category=DeprecationWarning)
|
||||
|
@ -77,7 +76,7 @@ def _save_backup(path):
|
|||
|
||||
def config_copydir(path):
|
||||
if os.path.exists(path) and not os.path.isdir(path):
|
||||
raise OSError, "'%s' is not a directory" % (path)
|
||||
raise OSError("'%s' is not a directory" % (path))
|
||||
_restore_backup(path)
|
||||
|
||||
pathbackup = path + '.autotest'
|
||||
|
@ -90,13 +89,13 @@ def config_replace(path,contents,append=False):
|
|||
if os.path.exists(path):
|
||||
_save_backup(path)
|
||||
if append:
|
||||
contents = file(path).read() + contents
|
||||
contents = open(path).read() + contents
|
||||
open(path, 'w').write(contents)
|
||||
|
||||
def config_comment(path, field):
|
||||
_save_backup(path)
|
||||
contents = ""
|
||||
for line in file(path):
|
||||
for line in open(path).readlines():
|
||||
if re.search("^\s*%s\s*=" % (field), line):
|
||||
line = "#" + line
|
||||
contents += line
|
||||
|
@ -112,7 +111,7 @@ def config_set(path, field, value, spaces=True):
|
|||
else:
|
||||
setting = '%s=%s\n' % (field, value)
|
||||
found = False
|
||||
for line in file(path):
|
||||
for line in open(path).readlines():
|
||||
if re.search("^\s*%s\s*=" % (field), line):
|
||||
found = True
|
||||
line = setting
|
||||
|
@ -155,20 +154,20 @@ def timeout(secs, f, *args):
|
|||
|
||||
def require_nonroot():
|
||||
if os.geteuid() == 0:
|
||||
print >>sys.stderr, "This series of tests should be run as a regular user with sudo access, not as root."
|
||||
print("This series of tests should be run as a regular user with sudo access, not as root.", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
def require_root():
|
||||
if os.geteuid() != 0:
|
||||
print >>sys.stderr, "This series of tests should be run with root privileges (e.g. via sudo)."
|
||||
print("This series of tests should be run with root privileges (e.g. via sudo).", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
def require_sudo():
|
||||
if os.geteuid() != 0 or os.environ.get('SUDO_USER', None) == None:
|
||||
print >>sys.stderr, "This series of tests must be run under sudo."
|
||||
print("This series of tests must be run under sudo.", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
if os.environ['SUDO_USER'] == 'root':
|
||||
print >>sys.stderr, 'Please run this test using sudo from a regular user. (You ran sudo from root.)'
|
||||
print('Please run this test using sudo from a regular user. (You ran sudo from root.)', file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
def random_string(length,lower=False):
|
||||
|
@ -190,14 +189,14 @@ def mkstemp_fill(contents,suffix='',prefix='testlib-',dir=None):
|
|||
|
||||
handle, name = tempfile.mkstemp(suffix=suffix,prefix=prefix,dir=dir)
|
||||
os.close(handle)
|
||||
handle = file(name,"w+")
|
||||
handle = open(name,"w+")
|
||||
handle.write(contents)
|
||||
handle.flush()
|
||||
handle.seek(0)
|
||||
|
||||
return handle, name
|
||||
|
||||
def create_fill(path, contents, mode=0644):
|
||||
def create_fill(path, contents, mode=0o644):
|
||||
'''Safely create a page'''
|
||||
# make the temp file in the same dir as the destination file so we
|
||||
# don't get invalid cross-device link errors when we rename
|
||||
|
@ -342,7 +341,7 @@ def ubuntu_release():
|
|||
return "UNKNOWN"
|
||||
|
||||
if size > 1024*1024:
|
||||
raise IOError, 'Could not open "%s" (too big)' % f
|
||||
raise IOError('Could not open "%s" (too big)' % f)
|
||||
|
||||
try:
|
||||
fh = open("/etc/lsb-release", 'r')
|
||||
|
@ -364,8 +363,8 @@ def cmd(command, input = None, stderr = subprocess.STDOUT, stdout = subprocess.P
|
|||
a textual error if it failed.'''
|
||||
|
||||
try:
|
||||
sp = subprocess.Popen(command, stdin=stdin, stdout=stdout, stderr=stderr, close_fds=True, preexec_fn=subprocess_setup)
|
||||
except OSError, e:
|
||||
sp = subprocess.Popen(command, stdin=stdin, stdout=stdout, stderr=stderr, close_fds=True, preexec_fn=subprocess_setup, universal_newlines=True)
|
||||
except OSError as e:
|
||||
return [127, str(e)]
|
||||
|
||||
out, outerr = sp.communicate(input)
|
||||
|
@ -382,7 +381,7 @@ def cmd_pipe(command1, command2, input = None, stderr = subprocess.STDOUT, stdin
|
|||
try:
|
||||
sp1 = subprocess.Popen(command1, stdin=stdin, stdout=subprocess.PIPE, stderr=stderr, close_fds=True)
|
||||
sp2 = subprocess.Popen(command2, stdin=sp1.stdout, stdout=subprocess.PIPE, stderr=stderr, close_fds=True)
|
||||
except OSError, e:
|
||||
except OSError as e:
|
||||
return [127, str(e)]
|
||||
|
||||
out = sp2.communicate(input)[0]
|
||||
|
@ -407,7 +406,7 @@ def cwd_has_enough_space(cdir, total_bytes):
|
|||
|
||||
cdir = os.getcwd()
|
||||
while cdir != '/':
|
||||
if not mounts.has_key(cdir):
|
||||
if cdir not in mounts:
|
||||
cdir = os.path.dirname(cdir)
|
||||
continue
|
||||
if kb < mounts[cdir]:
|
||||
|
@ -650,7 +649,7 @@ def is_kdeinit_running():
|
|||
# check for it.
|
||||
rc, report = cmd(['ps', 'x'])
|
||||
if 'kdeinit4 Running' not in report:
|
||||
print >>sys.stderr, ("kdeinit not running (you may start/stop any KDE application then run this script again)")
|
||||
print(("kdeinit not running (you may start/stop any KDE application then run this script again)"), file=sys.stderr)
|
||||
return False
|
||||
return True
|
||||
|
||||
|
@ -660,7 +659,7 @@ def get_pkgconfig_flags(libs=[]):
|
|||
rc, pkg_config = cmd(['pkg-config', '--cflags', '--libs'] + libs)
|
||||
expected = 0
|
||||
if rc != expected:
|
||||
print >>sys.stderr, 'Got exit code %d, expected %d\n' % (rc, expected)
|
||||
print('Got exit code %d, expected %d\n' % (rc, expected), file=sys.stderr)
|
||||
assert(rc == expected)
|
||||
return pkg_config.split()
|
||||
|
||||
|
@ -750,8 +749,8 @@ class TestlibManager(object):
|
|||
# Load LSB release file
|
||||
self.lsb_release = dict()
|
||||
if not os.path.exists('/usr/bin/lsb_release') and not os.path.exists('/bin/lsb_release'):
|
||||
raise OSError, "Please install 'lsb-release'"
|
||||
for line in subprocess.Popen(['lsb_release','-a'],stdout=subprocess.PIPE,stderr=subprocess.PIPE).communicate()[0].splitlines():
|
||||
raise OSError("Please install 'lsb-release'")
|
||||
for line in subprocess.Popen(['lsb_release','-a'],stdout=subprocess.PIPE,stderr=subprocess.PIPE, universal_newlines=True).communicate()[0].splitlines():
|
||||
field, value = line.split(':',1)
|
||||
value=value.strip()
|
||||
field=field.strip()
|
||||
|
@ -768,7 +767,7 @@ class TestlibManager(object):
|
|||
self.lsb_release['Distributor ID'] = "Ubuntu"
|
||||
self.lsb_release['Release'] = 8.04
|
||||
else:
|
||||
raise OSError, "Unknown version of HP MIE"
|
||||
raise OSError("Unknown version of HP MIE")
|
||||
|
||||
# FIXME: hack to assume a most-recent release if we're not
|
||||
# running under Ubuntu.
|
||||
|
@ -789,7 +788,7 @@ class TestlibManager(object):
|
|||
elif machine.startswith('arm'):
|
||||
self.dpkg_arch = 'armel'
|
||||
else:
|
||||
raise ValueError, "Unknown machine type '%s'" % (machine)
|
||||
raise ValueError("Unknown machine type '%s'" % (machine))
|
||||
else:
|
||||
self.dpkg_arch = cmd(['dpkg','--print-architecture'])[1].strip()
|
||||
|
||||
|
@ -800,7 +799,8 @@ class TestlibManager(object):
|
|||
versig = '/proc/version_signature'
|
||||
if os.path.exists(versig):
|
||||
self.kernel_is_ubuntu = True
|
||||
self.kernel_version_signature = file(versig).read().strip()
|
||||
with open(versig) as f:
|
||||
self.kernel_version_signature = f.read().strip()
|
||||
self.kernel_version_ubuntu = self.kernel_version
|
||||
elif os.path.exists('/usr/bin/dpkg'):
|
||||
# this can easily be inaccurate but is only an issue for Dapper
|
||||
|
@ -829,14 +829,14 @@ class TestlibManager(object):
|
|||
kernel = self.kernel_version_ubuntu
|
||||
if kernel != self.kernel_version_signature:
|
||||
kernel += " (%s)" % (self.kernel_version_signature)
|
||||
print >>sys.stdout, "Running test: '%s' distro: '%s %.2f' kernel: '%s' arch: '%s' uid: %d/%d SUDO_USER: '%s')" % ( \
|
||||
print("Running test: '%s' distro: '%s %.2f' kernel: '%s' arch: '%s' uid: %d/%d SUDO_USER: '%s')" % ( \
|
||||
sys.argv[0],
|
||||
self.lsb_release['Distributor ID'],
|
||||
self.lsb_release['Release'],
|
||||
kernel,
|
||||
self.dpkg_arch,
|
||||
os.geteuid(), os.getuid(),
|
||||
os.environ.get('SUDO_USER', ''))
|
||||
os.environ.get('SUDO_USER', '')), file=sys.stdout)
|
||||
sys.stdout.flush()
|
||||
|
||||
# Additional heuristics
|
||||
|
@ -848,7 +848,7 @@ class TestlibManager(object):
|
|||
# time.sleep(0.5)
|
||||
|
||||
def hello(self, msg):
|
||||
print >>sys.stderr, "Hello from %s" % (msg)
|
||||
print("Hello from %s" % (msg), file=sys.stderr)
|
||||
# The central instance
|
||||
manager = TestlibManager()
|
||||
|
||||
|
@ -885,11 +885,11 @@ class TestlibCase(unittest.TestCase):
|
|||
if self.lsb_release['Release'] == 8.04 and rc == 255 and len(out) > 0:
|
||||
rc = 0
|
||||
result = 'Got exit code %d, expected %d:\n%s\n' % (rc, expected, report)
|
||||
self.assertEquals(expected, rc, result)
|
||||
self.assertEqual(expected, rc, result)
|
||||
|
||||
filetype = '^%s$' % (filetype)
|
||||
result = 'File type reported by file: [%s], expected regex: [%s]\n' % (out, filetype)
|
||||
self.assertNotEquals(None, re.search(filetype, out), result)
|
||||
self.assertNotEqual(None, re.search(filetype, out), result)
|
||||
|
||||
def yank_commonname_from_cert(self, certfile):
|
||||
'''Extract the commonName from a given PEM'''
|
||||
|
@ -905,12 +905,12 @@ class TestlibCase(unittest.TestCase):
|
|||
|
||||
def announce(self, text):
|
||||
if self.my_verbosity:
|
||||
print >>sys.stdout, "(%s) " % (text),
|
||||
print("(%s) " % (text), end=' ', file=sys.stdout)
|
||||
sys.stdout.flush()
|
||||
|
||||
def make_clean(self):
|
||||
rc, output = self.shell_cmd(['make','clean'])
|
||||
self.assertEquals(rc, 0, output)
|
||||
self.assertEqual(rc, 0, output)
|
||||
|
||||
def get_makefile_compiler(self):
|
||||
# Find potential compiler name
|
||||
|
@ -929,7 +929,7 @@ class TestlibCase(unittest.TestCase):
|
|||
|
||||
compiler = self.get_makefile_compiler()
|
||||
rc, output = self.shell_cmd(['make',target])
|
||||
self.assertEquals(rc, expected, 'rc(%d)!=%d:\n' % (rc, expected) + output)
|
||||
self.assertEqual(rc, expected, 'rc(%d)!=%d:\n' % (rc, expected) + output)
|
||||
self.assertTrue('%s ' % (compiler) in output, 'Expected "%s":' % (compiler) + output)
|
||||
return output
|
||||
|
||||
|
@ -954,13 +954,13 @@ class TestlibCase(unittest.TestCase):
|
|||
'''Test a shell command matches a specific exit code'''
|
||||
rc, report, out = self._testlib_shell_cmd(args, stdin=stdin, stdout=stdout, stderr=stderr)
|
||||
result = 'Got exit code %d, expected %d\n' % (rc, expected)
|
||||
self.assertEquals(expected, rc, msg + result + report)
|
||||
self.assertEqual(expected, rc, msg + result + report)
|
||||
|
||||
def assertShellExitNotEquals(self, unwanted, args, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, msg=""):
|
||||
'''Test a shell command doesn't match a specific exit code'''
|
||||
rc, report, out = self._testlib_shell_cmd(args, stdin=stdin, stdout=stdout, stderr=stderr)
|
||||
result = 'Got (unwanted) exit code %d\n' % rc
|
||||
self.assertNotEquals(unwanted, rc, msg + result + report)
|
||||
self.assertNotEqual(unwanted, rc, msg + result + report)
|
||||
|
||||
def assertShellOutputContains(self, text, args, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, msg="", invert=False):
|
||||
'''Test a shell command contains a specific output'''
|
||||
|
@ -976,12 +976,12 @@ class TestlibCase(unittest.TestCase):
|
|||
rc, report, out = self._testlib_shell_cmd(args, stdin=stdin, stdout=stdout, stderr=stderr)
|
||||
result = 'Got exit code %d. Looking for exact text "%s" (%s)\n' % (rc, text, " ".join(args))
|
||||
if not invert:
|
||||
self.assertEquals(text, out, msg + result + report)
|
||||
self.assertEqual(text, out, msg + result + report)
|
||||
else:
|
||||
self.assertNotEquals(text, out, msg + result + report)
|
||||
self.assertNotEqual(text, out, msg + result + report)
|
||||
if expected != None:
|
||||
result = 'Got exit code %d. Expected %d (%s)\n' % (rc, expected, " ".join(args))
|
||||
self.assertEquals(rc, expected, msg + result + report)
|
||||
self.assertEqual(rc, expected, msg + result + report)
|
||||
|
||||
def _word_find(self, report, content, invert=False):
|
||||
'''Check for a specific string'''
|
||||
|
@ -994,20 +994,20 @@ class TestlibCase(unittest.TestCase):
|
|||
|
||||
def _test_sysctl_value(self, path, expected, msg=None, exists=True):
|
||||
sysctl = '/proc/sys/%s' % (path)
|
||||
self.assertEquals(exists, os.path.exists(sysctl), sysctl)
|
||||
self.assertEqual(exists, os.path.exists(sysctl), sysctl)
|
||||
value = None
|
||||
if exists:
|
||||
value = int(file(sysctl).read())
|
||||
value = int(open(sysctl).read())
|
||||
report = "%s is not %d: %d" % (sysctl, expected, value)
|
||||
if msg:
|
||||
report += " (%s)" % (msg)
|
||||
self.assertEquals(value, expected, report)
|
||||
self.assertEqual(value, expected, report)
|
||||
return value
|
||||
|
||||
def set_sysctl_value(self, path, desired):
|
||||
sysctl = '/proc/sys/%s' % (path)
|
||||
self.assertTrue(os.path.exists(sysctl),"%s does not exist" % (sysctl))
|
||||
file(sysctl,'w').write(str(desired))
|
||||
open(sysctl,'w').write(str(desired))
|
||||
self._test_sysctl_value(path, desired)
|
||||
|
||||
def kernel_at_least(self, introduced):
|
||||
|
@ -1031,7 +1031,7 @@ class TestGroup:
|
|||
self.group = None
|
||||
if group:
|
||||
if group_exists(group):
|
||||
raise ValueError, 'group name already exists'
|
||||
raise ValueError('group name already exists')
|
||||
else:
|
||||
while(True):
|
||||
group = random_string(7,lower=lower)
|
||||
|
@ -1063,11 +1063,11 @@ class TestUser:
|
|||
self.login = None
|
||||
|
||||
if os.geteuid() != 0:
|
||||
raise ValueError, "You must be root to run this test"
|
||||
raise ValueError("You must be root to run this test")
|
||||
|
||||
if login:
|
||||
if login_exists(login):
|
||||
raise ValueError, 'login name already exists'
|
||||
raise ValueError('login name already exists')
|
||||
else:
|
||||
while(True):
|
||||
login = 't' + random_string(7,lower=lower)
|
||||
|
@ -1114,7 +1114,7 @@ class TestUser:
|
|||
'''Add user to the specified group name'''
|
||||
rc, report = cmd(['usermod', '-G', group, self.login])
|
||||
if rc != 0:
|
||||
print report
|
||||
print(report)
|
||||
assert rc == 0
|
||||
|
||||
# Timeout handler using alarm() from John P. Speno's Pythonic Avocado
|
||||
|
@ -1140,5 +1140,5 @@ class TimeoutFunction:
|
|||
return result
|
||||
|
||||
def main():
|
||||
print "hi"
|
||||
print("hi")
|
||||
unittest.main()
|
||||
|
|
Loading…
Reference in a new issue