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 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)
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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 = [
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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
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():
|
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'
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user