Tests: minor fixes.

Fixed temporary dir removing.
Fixed printing path to log.
Module checks moved to the separate file.
This commit is contained in:
Andrei Zeliankou
2020-10-01 10:17:00 +01:00
parent 1fe1518ab1
commit d491527555
10 changed files with 89 additions and 76 deletions

View File

@@ -2,6 +2,7 @@ import fcntl
import os import os
import platform import platform
import pytest import pytest
import shutil
import signal import signal
import stat import stat
import subprocess import subprocess
@@ -10,6 +11,10 @@ import re
import tempfile import tempfile
import time import time
from unit.check.go import check_go
from unit.check.node import check_node
from unit.check.tls import check_openssl
def pytest_addoption(parser): def pytest_addoption(parser):
parser.addoption( parser.addoption(
@@ -132,6 +137,20 @@ def pytest_sessionstart(session):
else: else:
option.available['modules'][module[0]].append(module[1]) option.available['modules'][module[0]].append(module[1])
# discover modules from check
option.available['modules']['openssl'] = check_openssl(unit['unitd'])
option.available['modules']['go'] = check_go(
option.current_dir, unit['temp_dir'], option.test_dir
)
option.available['modules']['node'] = check_node(option.current_dir)
# remove None values
option.available['modules'] = {
k: v for k, v in option.available['modules'].items() if v is not None
}
unit_stop() unit_stop()
@@ -216,6 +235,7 @@ def unit_stop():
p.kill() p.kill()
return 'Could not terminate unit' return 'Could not terminate unit'
shutil.rmtree(unit_instance['temp_dir'])
def public_dir(path): def public_dir(path):
os.chmod(path, 0o777) os.chmod(path, 0o777)
@@ -265,31 +285,32 @@ def _check_alerts(log):
alerts = [al for al in alerts if re.search(skip, al) is None] alerts = [al for al in alerts if re.search(skip, al) is None]
if alerts: if alerts:
_print_log(log) _print_log(data=log)
assert not alerts, 'alert(s)' assert not alerts, 'alert(s)'
if not option.skip_sanitizer: if not option.skip_sanitizer:
sanitizer_errors = re.findall('.+Sanitizer.+', log) sanitizer_errors = re.findall('.+Sanitizer.+', log)
if sanitizer_errors: if sanitizer_errors:
_print_log(log) _print_log(data=log)
assert not sanitizer_errors, 'sanitizer error(s)' assert not sanitizer_errors, 'sanitizer error(s)'
if found: if found:
print('skipped.') print('skipped.')
def _print_log(data=None): def _print_log(path=None, data=None):
unit_log = unit_instance['log'] if path is None:
path = unit_instance['log']
print('Path to unit.log:\n' + unit_log + '\n') print('Path to unit.log:\n' + path + '\n')
if option.print_log: if option.print_log:
os.set_blocking(sys.stdout.fileno(), True) os.set_blocking(sys.stdout.fileno(), True)
sys.stdout.flush() sys.stdout.flush()
if data is None: if data is None:
with open(unit_log, 'r', encoding='utf-8', errors='ignore') as f: with open(path, 'r', encoding='utf-8', errors='ignore') as f:
shutil.copyfileobj(f, sys.stdout) shutil.copyfileobj(f, sys.stdout)
else: else:
sys.stdout.write(data) sys.stdout.write(data)

View File

@@ -3,6 +3,7 @@ import subprocess
import pytest import pytest
from unit.applications.lang.java import TestApplicationJava from unit.applications.lang.java import TestApplicationJava
from conftest import option
class TestJavaIsolationRootfs(TestApplicationJava): class TestJavaIsolationRootfs(TestApplicationJava):
@@ -23,7 +24,7 @@ class TestJavaIsolationRootfs(TestApplicationJava):
[ [
"mount", "mount",
"--bind", "--bind",
self.pardir + "/build", option.current_dir + "/build",
self.temp_dir + "/jars", self.temp_dir + "/jars",
], ],
stderr=subprocess.STDOUT, stderr=subprocess.STDOUT,

View File

@@ -6,26 +6,12 @@ from conftest import option
class TestApplicationGo(TestApplicationProto): class TestApplicationGo(TestApplicationProto):
@classmethod
def setup_class(cls, complete_check=True):
unit = super().setup_class(complete_check=False)
# check go module
go_app = TestApplicationGo()
go_app.temp_dir = unit.temp_dir
proc = go_app.prepare_env('empty', 'app')
if proc and proc.returncode == 0:
cls.available['modules']['go'] = []
return unit if not complete_check else unit.complete()
def prepare_env(self, script, name, static=False): def prepare_env(self, script, name, static=False):
if not os.path.exists(self.temp_dir + '/go'): if not os.path.exists(self.temp_dir + '/go'):
os.mkdir(self.temp_dir + '/go') os.mkdir(self.temp_dir + '/go')
env = os.environ.copy() env = os.environ.copy()
env['GOPATH'] = self.pardir + '/build/go' env['GOPATH'] = option.current_dir + '/build/go'
if static: if static:
args = [ args = [

View File

@@ -49,10 +49,12 @@ class TestApplicationJava(TestApplicationProto):
if not os.path.isdir(classes_path): if not os.path.isdir(classes_path):
os.makedirs(classes_path) os.makedirs(classes_path)
classpath = self.pardir + '/build/tomcat-servlet-api-9.0.13.jar' classpath = (
option.current_dir + '/build/tomcat-servlet-api-9.0.13.jar'
)
ws_jars = glob.glob( ws_jars = glob.glob(
self.pardir + '/build/websocket-api-java-*.jar' option.current_dir + '/build/websocket-api-java-*.jar'
) )
if not ws_jars: if not ws_jars:
@@ -78,7 +80,7 @@ class TestApplicationJava(TestApplicationProto):
"listeners": {"*:7080": {"pass": "applications/" + script}}, "listeners": {"*:7080": {"pass": "applications/" + script}},
"applications": { "applications": {
script: { script: {
"unit_jars": self.pardir + '/build', "unit_jars": option.current_dir + '/build',
"type": 'java', "type": 'java',
"processes": {"spare": 0}, "processes": {"spare": 0},
"working_directory": script_path, "working_directory": script_path,

View File

@@ -7,17 +7,6 @@ from conftest import option, public_dir
class TestApplicationNode(TestApplicationProto): class TestApplicationNode(TestApplicationProto):
@classmethod
def setup_class(cls, complete_check=True):
unit = super().setup_class(complete_check=False)
# check node module
if os.path.exists(unit.pardir + '/node/node_modules'):
cls.available['modules']['node'] = []
return unit if not complete_check else unit.complete()
def load(self, script, name='app.js', **kwargs): def load(self, script, name='app.js', **kwargs):
# copy application # copy application
@@ -28,7 +17,7 @@ class TestApplicationNode(TestApplicationProto):
# copy modules # copy modules
shutil.copytree( shutil.copytree(
self.pardir + '/node/node_modules', option.current_dir + '/node/node_modules',
self.temp_dir + '/node/node_modules', self.temp_dir + '/node/node_modules',
) )

View File

@@ -15,27 +15,6 @@ class TestApplicationTLS(TestApplicationProto):
self.context.check_hostname = False self.context.check_hostname = False
self.context.verify_mode = ssl.CERT_NONE self.context.verify_mode = ssl.CERT_NONE
@classmethod
def setup_class(cls, complete_check=True):
unit = super().setup_class(complete_check=False)
# check tls module
try:
subprocess.check_output(['which', 'openssl'])
output = subprocess.check_output(
[unit.unitd, '--version'], stderr=subprocess.STDOUT
)
if re.search('--openssl', output.decode()):
cls.available['modules']['openssl'] = []
except:
pass
return unit if not complete_check else unit.complete()
def certificate(self, name='default', load=True): def certificate(self, name='default', load=True):
self.openssl_conf() self.openssl_conf()

29
test/unit/check/go.py Normal file
View File

@@ -0,0 +1,29 @@
import os
import subprocess
def check_go(current_dir, temp_dir, test_dir):
if not os.path.exists(temp_dir + '/go'):
os.mkdir(temp_dir + '/go')
env = os.environ.copy()
env['GOPATH'] = current_dir + '/build/go'
try:
process = subprocess.Popen(
[
'go',
'build',
'-o',
temp_dir + '/go/app',
test_dir + '/go/empty/app.go',
],
env=env,
)
process.communicate()
if process.returncode == 0:
return True
except:
return None

6
test/unit/check/node.py Normal file
View File

@@ -0,0 +1,6 @@
import os
def check_node(current_dir):
if os.path.exists(current_dir + '/node/node_modules'):
return True

13
test/unit/check/tls.py Normal file
View File

@@ -0,0 +1,13 @@
import re
import subprocess
def check_openssl(unitd):
subprocess.check_output(['which', 'openssl'])
output = subprocess.check_output(
[unitd, '--version'], stderr=subprocess.STDOUT
)
if re.search('--openssl', output.decode()):
return True

View File

@@ -16,11 +16,6 @@ from multiprocessing import Process
class TestUnit(): class TestUnit():
pardir = os.path.abspath(
os.path.join(os.path.dirname(__file__), os.pardir, os.pardir)
)
@classmethod @classmethod
def setup_class(cls, complete_check=True): def setup_class(cls, complete_check=True):
cls.available = option.available cls.available = option.available
@@ -41,17 +36,9 @@ class TestUnit():
break break
if m is None: if m is None:
_print_log() _print_log(path=unit.temp_dir + '/unit.log')
exit("Unit is writing log too long") exit("Unit is writing log too long")
# discover available modules from unit.log
for module in re.findall(r'module: ([a-zA-Z]+) (.*) ".*"$', log, re.M):
if module[0] not in cls.available['modules']:
cls.available['modules'][module[0]] = [module[1]]
else:
cls.available['modules'][module[0]].append(module[1])
def check(available, prerequisites): def check(available, prerequisites):
missed = [] missed = []
@@ -102,7 +89,7 @@ class TestUnit():
self._run() self._run()
def _run(self): def _run(self):
build_dir = self.pardir + '/build' build_dir = option.current_dir + '/build'
self.unitd = build_dir + '/unitd' self.unitd = build_dir + '/unitd'
if not os.path.isfile(self.unitd): if not os.path.isfile(self.unitd):
@@ -122,7 +109,7 @@ class TestUnit():
[ [
self.unitd, self.unitd,
'--no-daemon', '--no-daemon',
'--modules', self.pardir + '/build', '--modules', build_dir,
'--state', self.temp_dir + '/state', '--state', self.temp_dir + '/state',
'--pid', self.temp_dir + '/unit.pid', '--pid', self.temp_dir + '/unit.pid',
'--log', self.temp_dir + '/unit.log', '--log', self.temp_dir + '/unit.log',
@@ -135,7 +122,7 @@ class TestUnit():
atexit.register(self.stop) atexit.register(self.stop)
if not waitforfiles(self.temp_dir + '/control.unit.sock'): if not waitforfiles(self.temp_dir + '/control.unit.sock'):
_print_log() _print_log(path=self.temp_dir + '/unit.log')
exit("Could not start unit") exit("Could not start unit")
self._started = True self._started = True
@@ -155,7 +142,7 @@ class TestUnit():
if not option.save_log: if not option.save_log:
shutil.rmtree(self.temp_dir) shutil.rmtree(self.temp_dir)
else: else:
_print_log() _print_log(path=self.temp_dir)
assert self.stop_errors == [None, None], 'stop errors' assert self.stop_errors == [None, None], 'stop errors'