summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrey Zelenkov <zelenkov@nginx.com>2018-03-06 16:58:47 +0300
committerAndrey Zelenkov <zelenkov@nginx.com>2018-03-06 16:58:47 +0300
commit30a32c2f09d954ee85be86e202828eab851311d6 (patch)
tree31d13b1163fe242cd51e5cbd7a4cb81887f4580b
parent912a49c6091c1fd9b630d2e0966f0fe1b97a3e42 (diff)
downloadunit-30a32c2f09d954ee85be86e202828eab851311d6.tar.gz
unit-30a32c2f09d954ee85be86e202828eab851311d6.tar.bz2
Tests: detect alerts and Sanitizer errors.
Diffstat (limited to '')
-rw-r--r--test/test_configuration.py19
-rw-r--r--test/unit.py37
2 files changed, 56 insertions, 0 deletions
diff --git a/test/test_configuration.py b/test/test_configuration.py
index 82638507..97ed1914 100644
--- a/test/test_configuration.py
+++ b/test/test_configuration.py
@@ -62,6 +62,12 @@ class TestUnitConfiguration(unit.TestUnitControl):
self.assertIn('error', self.conf('"{}"', '/applications'), 'string')
def test_applications_type_only(self):
+ self.skip_alerts.extend([
+ r'python module is empty',
+ r'failed to apply new conf',
+ r'process \d+ exited on signal'
+ ])
+
self.assertIn('error', self.conf({
"app": {
"type": "python"
@@ -120,6 +126,13 @@ class TestUnitConfiguration(unit.TestUnitControl):
@unittest.expectedFailure
def test_listeners_empty(self):
+ self.skip_sanitizer = True
+ self.skip_alerts.extend([
+ r'nxt_lvlhsh_is_empty\(&port->rpc_streams\)',
+ r'sendmsg.+failed',
+ r'process \d+ exited on signal'
+ ])
+
self.assertIn('error', self.conf({"*:7080":{}}, '/listeners'),
'listener empty')
@@ -179,6 +192,12 @@ class TestUnitConfiguration(unit.TestUnitControl):
}), 'explicit ipv6')
def test_listeners_no_port(self):
+ self.skip_alerts.extend([
+ r'invalid listener "127\.0\.0\.1"',
+ r'failed to apply new conf',
+ r'process \d+ exited on signal'
+ ])
+
self.assertIn('error', self.conf({
"listeners": {
"127.0.0.1": {
diff --git a/test/unit.py b/test/unit.py
index f6514a49..892624c1 100644
--- a/test/unit.py
+++ b/test/unit.py
@@ -6,6 +6,7 @@ import time
import shutil
import socket
import select
+import platform
import tempfile
import unittest
from subprocess import call
@@ -14,6 +15,7 @@ from multiprocessing import Process
class TestUnit(unittest.TestCase):
pardir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))
+ architecture = platform.architecture()[0]
def setUp(self):
self._run()
@@ -21,6 +23,10 @@ class TestUnit(unittest.TestCase):
def tearDown(self):
self._stop()
+ with open(self.testdir + '/unit.log', 'r', encoding='utf-8',
+ errors='ignore') as f:
+ self._check_alerts(f.read())
+
if '--leave' not in sys.argv:
shutil.rmtree(self.testdir)
@@ -41,6 +47,8 @@ class TestUnit(unittest.TestCase):
self._stop()
exit("Unit is writing log too long")
+ self._check_alerts(log)
+
missed_module = ''
for module in modules:
m = re.search('module: ' + module, log)
@@ -77,6 +85,12 @@ class TestUnit(unittest.TestCase):
self.testdir + '/unit.log', self.testdir + '/control.unit.sock'):
exit("Could not start unit")
+ self.skip_alerts = [r'read signalfd\(4\) failed']
+ self.skip_sanitizer = False
+
+ if self.architecture == '32bit':
+ self.skip_alerts.append(r'freed pointer points to non-freeble page')
+
def _stop(self):
with open(self.testdir + '/unit.pid', 'r') as f:
pid = f.read().rstrip()
@@ -105,6 +119,29 @@ class TestUnit(unittest.TestCase):
if process.exitcode:
exit("Child process terminated with code " + str(process.exitcode))
+ def _check_alerts(self, log):
+ found = False
+
+ alerts = re.findall('.+\[alert\].+', log)
+
+ if alerts:
+ print('All alerts/sanitizer errors found in log:')
+ [print(alert) for alert in alerts]
+ found = True
+
+ if self.skip_alerts:
+ for skip in self.skip_alerts:
+ alerts = [al for al in alerts if re.search(skip, al) is None]
+
+ self.assertFalse(alerts, 'alert(s)')
+
+ if not self.skip_sanitizer:
+ self.assertFalse(re.findall('.+Sanitizer.+', log),
+ 'sanitizer error(s)')
+
+ if found:
+ print('skipped.')
+
def _waitforfiles(self, *files):
for i in range(50):
wait = False