Tests: minor fixes.
Fixed temporary dir removing. Fixed printing path to log. Module checks moved to the separate file.
This commit is contained in:
@@ -2,6 +2,7 @@ import fcntl
|
||||
import os
|
||||
import platform
|
||||
import pytest
|
||||
import shutil
|
||||
import signal
|
||||
import stat
|
||||
import subprocess
|
||||
@@ -10,6 +11,10 @@ import re
|
||||
import tempfile
|
||||
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):
|
||||
parser.addoption(
|
||||
@@ -132,6 +137,20 @@ def pytest_sessionstart(session):
|
||||
else:
|
||||
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()
|
||||
|
||||
|
||||
@@ -216,6 +235,7 @@ def unit_stop():
|
||||
p.kill()
|
||||
return 'Could not terminate unit'
|
||||
|
||||
shutil.rmtree(unit_instance['temp_dir'])
|
||||
|
||||
def public_dir(path):
|
||||
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]
|
||||
|
||||
if alerts:
|
||||
_print_log(log)
|
||||
_print_log(data=log)
|
||||
assert not alerts, 'alert(s)'
|
||||
|
||||
if not option.skip_sanitizer:
|
||||
sanitizer_errors = re.findall('.+Sanitizer.+', log)
|
||||
|
||||
if sanitizer_errors:
|
||||
_print_log(log)
|
||||
_print_log(data=log)
|
||||
assert not sanitizer_errors, 'sanitizer error(s)'
|
||||
|
||||
if found:
|
||||
print('skipped.')
|
||||
|
||||
|
||||
def _print_log(data=None):
|
||||
unit_log = unit_instance['log']
|
||||
def _print_log(path=None, data=None):
|
||||
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:
|
||||
os.set_blocking(sys.stdout.fileno(), True)
|
||||
sys.stdout.flush()
|
||||
|
||||
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)
|
||||
else:
|
||||
sys.stdout.write(data)
|
||||
|
||||
@@ -3,6 +3,7 @@ import subprocess
|
||||
import pytest
|
||||
|
||||
from unit.applications.lang.java import TestApplicationJava
|
||||
from conftest import option
|
||||
|
||||
|
||||
class TestJavaIsolationRootfs(TestApplicationJava):
|
||||
@@ -23,7 +24,7 @@ class TestJavaIsolationRootfs(TestApplicationJava):
|
||||
[
|
||||
"mount",
|
||||
"--bind",
|
||||
self.pardir + "/build",
|
||||
option.current_dir + "/build",
|
||||
self.temp_dir + "/jars",
|
||||
],
|
||||
stderr=subprocess.STDOUT,
|
||||
|
||||
@@ -6,26 +6,12 @@ from conftest import option
|
||||
|
||||
|
||||
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):
|
||||
if not os.path.exists(self.temp_dir + '/go'):
|
||||
os.mkdir(self.temp_dir + '/go')
|
||||
|
||||
env = os.environ.copy()
|
||||
env['GOPATH'] = self.pardir + '/build/go'
|
||||
env['GOPATH'] = option.current_dir + '/build/go'
|
||||
|
||||
if static:
|
||||
args = [
|
||||
|
||||
@@ -49,10 +49,12 @@ class TestApplicationJava(TestApplicationProto):
|
||||
if not os.path.isdir(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(
|
||||
self.pardir + '/build/websocket-api-java-*.jar'
|
||||
option.current_dir + '/build/websocket-api-java-*.jar'
|
||||
)
|
||||
|
||||
if not ws_jars:
|
||||
@@ -78,7 +80,7 @@ class TestApplicationJava(TestApplicationProto):
|
||||
"listeners": {"*:7080": {"pass": "applications/" + script}},
|
||||
"applications": {
|
||||
script: {
|
||||
"unit_jars": self.pardir + '/build',
|
||||
"unit_jars": option.current_dir + '/build',
|
||||
"type": 'java',
|
||||
"processes": {"spare": 0},
|
||||
"working_directory": script_path,
|
||||
|
||||
@@ -7,17 +7,6 @@ from conftest import option, public_dir
|
||||
|
||||
|
||||
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):
|
||||
# copy application
|
||||
|
||||
@@ -28,7 +17,7 @@ class TestApplicationNode(TestApplicationProto):
|
||||
# copy modules
|
||||
|
||||
shutil.copytree(
|
||||
self.pardir + '/node/node_modules',
|
||||
option.current_dir + '/node/node_modules',
|
||||
self.temp_dir + '/node/node_modules',
|
||||
)
|
||||
|
||||
|
||||
@@ -15,27 +15,6 @@ class TestApplicationTLS(TestApplicationProto):
|
||||
self.context.check_hostname = False
|
||||
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):
|
||||
self.openssl_conf()
|
||||
|
||||
|
||||
29
test/unit/check/go.py
Normal file
29
test/unit/check/go.py
Normal 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
6
test/unit/check/node.py
Normal 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
13
test/unit/check/tls.py
Normal 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
|
||||
@@ -16,11 +16,6 @@ from multiprocessing import Process
|
||||
|
||||
|
||||
class TestUnit():
|
||||
|
||||
pardir = os.path.abspath(
|
||||
os.path.join(os.path.dirname(__file__), os.pardir, os.pardir)
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def setup_class(cls, complete_check=True):
|
||||
cls.available = option.available
|
||||
@@ -41,17 +36,9 @@ class TestUnit():
|
||||
break
|
||||
|
||||
if m is None:
|
||||
_print_log()
|
||||
_print_log(path=unit.temp_dir + '/unit.log')
|
||||
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):
|
||||
missed = []
|
||||
|
||||
@@ -102,7 +89,7 @@ class TestUnit():
|
||||
self._run()
|
||||
|
||||
def _run(self):
|
||||
build_dir = self.pardir + '/build'
|
||||
build_dir = option.current_dir + '/build'
|
||||
self.unitd = build_dir + '/unitd'
|
||||
|
||||
if not os.path.isfile(self.unitd):
|
||||
@@ -122,7 +109,7 @@ class TestUnit():
|
||||
[
|
||||
self.unitd,
|
||||
'--no-daemon',
|
||||
'--modules', self.pardir + '/build',
|
||||
'--modules', build_dir,
|
||||
'--state', self.temp_dir + '/state',
|
||||
'--pid', self.temp_dir + '/unit.pid',
|
||||
'--log', self.temp_dir + '/unit.log',
|
||||
@@ -135,7 +122,7 @@ class TestUnit():
|
||||
atexit.register(self.stop)
|
||||
|
||||
if not waitforfiles(self.temp_dir + '/control.unit.sock'):
|
||||
_print_log()
|
||||
_print_log(path=self.temp_dir + '/unit.log')
|
||||
exit("Could not start unit")
|
||||
|
||||
self._started = True
|
||||
@@ -155,7 +142,7 @@ class TestUnit():
|
||||
if not option.save_log:
|
||||
shutil.rmtree(self.temp_dir)
|
||||
else:
|
||||
_print_log()
|
||||
_print_log(path=self.temp_dir)
|
||||
|
||||
assert self.stop_errors == [None, None], 'stop errors'
|
||||
|
||||
|
||||
Reference in New Issue
Block a user