summaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
authorAndrei Zeliankou <zelenkov@nginx.com>2023-05-29 14:23:52 +0100
committerAndrei Zeliankou <zelenkov@nginx.com>2023-05-29 14:23:52 +0100
commitf55818059c01ff9e61bee8107ed1389fe272a787 (patch)
tree27137343940f9212c5a22599c8d829f8759e84f1 /test
parentb034bf67034c4f0e966ebd207ba2f407f6f15fa8 (diff)
downloadunit-f55818059c01ff9e61bee8107ed1389fe272a787.tar.gz
unit-f55818059c01ff9e61bee8107ed1389fe272a787.tar.bz2
Tests: Log reworked.
All log-related code moved to the log.py.
Diffstat (limited to '')
-rw-r--r--test/conftest.py78
-rw-r--r--test/unit/applications/proto.py6
-rw-r--r--test/unit/log.py86
3 files changed, 90 insertions, 80 deletions
diff --git a/test/conftest.py b/test/conftest.py
index 4c548903..5e90b8a5 100644
--- a/test/conftest.py
+++ b/test/conftest.py
@@ -24,6 +24,7 @@ from unit.check.tls import check_openssl
from unit.check.unix_abstract import check_unix_abstract
from unit.http import TestHTTP
from unit.log import Log
+from unit.log import print_log_on_assert
from unit.option import option
from unit.status import Status
from unit.utils import check_findmnt
@@ -120,17 +121,6 @@ def pytest_configure(config):
fcntl.fcntl(sys.stdout.fileno(), fcntl.F_SETFL, 0)
-def print_log_on_assert(func):
- def inner_function(*args, **kwargs):
- try:
- func(*args, **kwargs)
- except AssertionError as e:
- _print_log(kwargs.get('log', None))
- raise e
-
- return inner_function
-
-
def pytest_generate_tests(metafunc):
cls = metafunc.cls
if (
@@ -196,7 +186,7 @@ def pytest_sessionstart():
break
if m is None:
- _print_log(log)
+ Log.print_log(log)
exit("Unit is writing log too long")
# discover available modules from unit.log
@@ -228,7 +218,7 @@ def pytest_sessionstart():
unit_stop()
- _check_alerts()
+ Log.check_alerts()
if option.restart:
shutil.rmtree(unit_instance['temp_dir'])
@@ -331,17 +321,17 @@ def run(request):
# print unit.log in case of error
if hasattr(request.node, 'rep_call') and request.node.rep_call.failed:
- _print_log(log)
+ Log.print_log(log)
if error_stop_unit or error_stop_processes:
- _print_log(log)
+ Log.print_log(log)
# check unit.log for errors
assert error_stop_unit is None, 'stop unit'
assert error_stop_processes is None, 'stop processes'
- _check_alerts(log=log)
+ Log.check_alerts(log=log)
def unit_run(state_dir=None):
@@ -360,6 +350,7 @@ def unit_run(state_dir=None):
exit('Could not find unit')
temp_dir = tempfile.mkdtemp(prefix='unit-test-')
+ option.temp_dir = temp_dir
public_dir(temp_dir)
if oct(stat.S_IMODE(os.stat(builddir).st_mode)) != '0o777':
@@ -394,18 +385,14 @@ def unit_run(state_dir=None):
with open(f'{temp_dir}/unit.log', 'w') as log:
unit_instance['process'] = subprocess.Popen(unitd_args, stderr=log)
- Log.temp_dir = temp_dir
-
if not waitforfiles(control_sock):
- _print_log()
+ Log.print_log()
exit('Could not start unit')
unit_instance['temp_dir'] = temp_dir
unit_instance['control_sock'] = control_sock
unit_instance['unitd'] = unitd
- option.temp_dir = temp_dir
-
with open(f'{temp_dir}/unit.pid', 'r') as f:
unit_instance['pid'] = f.read().rstrip()
@@ -466,53 +453,6 @@ def unit_stop():
@print_log_on_assert
-def _check_alerts(*, log=None):
- if log is None:
- with Log.open(encoding='utf-8') as f:
- log = f.read()
-
- found = False
- alerts = re.findall(r'.+\[alert\].+', log)
-
- if alerts:
- found = True
-
- if option.detailed:
- print('\nAll alerts/sanitizer errors found in log:')
- [print(alert) for alert in alerts]
-
- if option.skip_alerts:
- for skip in option.skip_alerts:
- alerts = [al for al in alerts if re.search(skip, al) is None]
-
- assert not alerts, 'alert(s)'
-
- if not option.skip_sanitizer:
- sanitizer_errors = re.findall('.+Sanitizer.+', log)
-
- assert not sanitizer_errors, 'sanitizer error(s)'
-
- if found and option.detailed:
- print('skipped.')
-
-
-def _print_log(log=None):
- path = Log.get_path()
-
- print(f'Path to unit.log:\n{path}\n')
-
- if option.print_log:
- os.set_blocking(sys.stdout.fileno(), True)
- sys.stdout.flush()
-
- if log is None:
- with open(path, 'r', encoding='utf-8', errors='ignore') as f:
- shutil.copyfileobj(f, sys.stdout)
- else:
- sys.stdout.write(log)
-
-
-@print_log_on_assert
def _clear_conf(sock, *, log=None):
resp = http.put(
url='/config',
@@ -769,7 +709,7 @@ def unit_pid():
def pytest_sessionfinish():
if not option.restart and option.save_log:
- print(f'Path to unit.log:\n{Log.get_path()}\n')
+ Log.print_path()
option.restart = True
diff --git a/test/unit/applications/proto.py b/test/unit/applications/proto.py
index f4d4afe4..3f4c13d3 100644
--- a/test/unit/applications/proto.py
+++ b/test/unit/applications/proto.py
@@ -17,12 +17,10 @@ class TestApplicationProto(TestControl):
return time.mktime(time.strptime(date, template))
def findall(self, pattern, name='unit.log', flags=re.M):
- with Log.open(name) as f:
- return re.findall(pattern, f.read(), flags)
+ return re.findall(pattern, Log.read(name), flags)
def search_in_log(self, pattern, name='unit.log', flags=re.M):
- with Log.open(name) as f:
- return re.search(pattern, f.read(), flags)
+ return re.search(pattern, Log.read(name), flags)
def wait_for_record(self, pattern, name='unit.log', wait=150, flags=re.M):
with Log.open(name) as f:
diff --git a/test/unit/log.py b/test/unit/log.py
index f984d7a1..c98054d5 100644
--- a/test/unit/log.py
+++ b/test/unit/log.py
@@ -1,23 +1,95 @@
+import os
+import re
+import sys
+
+from unit.option import option
+
UNIT_LOG = 'unit.log'
+def print_log_on_assert(func):
+ def inner_function(*args, **kwargs):
+ try:
+ func(*args, **kwargs)
+ except AssertionError as exception:
+ Log.print_log(*args, **kwargs)
+ raise exception
+
+ return inner_function
+
+
class Log:
- temp_dir = None
pos = {}
+ @staticmethod
+ @print_log_on_assert
+ def check_alerts(log=None):
+ if log is None:
+ log = Log.read(encoding='utf-8')
+
+ found = False
+ alerts = re.findall(r'.+\[alert\].+', log)
+
+ if alerts:
+ found = True
+
+ if option.detailed:
+ print('\nAll alerts/sanitizer errors found in log:')
+ _ = [print(alert) for alert in alerts]
+
+ if option.skip_alerts:
+ for skip in option.skip_alerts:
+ alerts = [al for al in alerts if re.search(skip, al) is None]
+
+ assert not alerts, 'alert(s)'
+
+ if not option.skip_sanitizer:
+ sanitizer_errors = re.findall('.+Sanitizer.+', log)
+
+ assert not sanitizer_errors, 'sanitizer error(s)'
+
+ if found and option.detailed:
+ print('skipped.')
+
+ @staticmethod
+ def get_path(name=UNIT_LOG):
+ return f'{option.temp_dir}/{name}'
+
+ @staticmethod
def open(name=UNIT_LOG, encoding=None):
- f = open(Log.get_path(name), 'r', encoding=encoding, errors='ignore')
- f.seek(Log.pos.get(name, 0))
+ file = open(Log.get_path(name), 'r', encoding=encoding, errors='ignore')
+ file.seek(Log.pos.get(name, 0))
+
+ return file
+
+ @staticmethod
+ def print_log(log=None):
+ Log.print_path()
- return f
+ if option.print_log:
+ os.set_blocking(sys.stdout.fileno(), True)
+ sys.stdout.flush()
+ if log is None:
+ log = Log.read(encoding='utf-8')
+
+ sys.stdout.write(log)
+
+ @staticmethod
+ def print_path():
+ print(f'Path to {UNIT_LOG}:\n{Log.get_path()}\n')
+
+ @staticmethod
+ def read(*args, **kwargs):
+ with Log.open(*args, **kwargs) as file:
+ return file.read()
+
+ @staticmethod
def set_pos(pos, name=UNIT_LOG):
Log.pos[name] = pos
+ @staticmethod
def swap(name):
pos = Log.pos.get(UNIT_LOG, 0)
Log.pos[UNIT_LOG] = Log.pos.get(name, 0)
Log.pos[name] = pos
-
- def get_path(name=UNIT_LOG):
- return f'{Log.temp_dir}/{name}'