import fnmatch
|
|
import logging.config
|
|
import os
|
|
import time
|
|
from unittest import TestCase
|
|
|
|
from .mockLogzioListener import listener
|
|
|
|
|
|
def _find(pattern, path):
|
|
result = []
|
|
for root, dirs, files in os.walk(path):
|
|
for name in files:
|
|
if fnmatch.fnmatch(name, pattern):
|
|
result.append(os.path.join(root, name))
|
|
|
|
break # Not descending recursively
|
|
return result
|
|
|
|
|
|
class TestLogzioSender(TestCase):
|
|
def setUp(self):
|
|
self.logzio_listener = listener.MockLogzioListener()
|
|
self.logzio_listener.clear_logs_buffer()
|
|
self.logzio_listener.clear_server_error()
|
|
self.logs_drain_timeout = 1
|
|
self.retries_no = 4
|
|
self.retry_timeout = 2
|
|
|
|
logging_configuration = {
|
|
"version": 1,
|
|
"formatters": {
|
|
"logzio": {
|
|
"format": '{"key": "value"}',
|
|
"validate": False
|
|
}
|
|
},
|
|
"handlers": {
|
|
"LogzioHandler": {
|
|
"class": "logzio.handler.LogzioHandler",
|
|
"formatter": "logzio",
|
|
"level": "DEBUG",
|
|
"token": "token",
|
|
'logzio_type': "type",
|
|
'logs_drain_timeout': self.logs_drain_timeout,
|
|
'url': "http://" + self.logzio_listener.get_host() + ":" + str(self.logzio_listener.get_port()),
|
|
'debug': True,
|
|
'retries_no': self.retries_no,
|
|
'retry_timeout': self.retry_timeout
|
|
}
|
|
},
|
|
"loggers": {
|
|
"test": {
|
|
"handlers": ["LogzioHandler"],
|
|
"level": "DEBUG"
|
|
}
|
|
}
|
|
}
|
|
|
|
logging.config.dictConfig(logging_configuration)
|
|
self.logger = logging.getLogger('test')
|
|
|
|
for curr_file in _find("logzio-failures-*.txt", "."):
|
|
os.remove(curr_file)
|
|
|
|
def test_simple_log_drain(self):
|
|
log_message = "Test simple log drain"
|
|
self.logger.info(log_message)
|
|
time.sleep(self.logs_drain_timeout * 2)
|
|
self.assertTrue(self.logzio_listener.find_log(log_message))
|
|
|
|
def test_multiple_lines_drain(self):
|
|
logs_num = 50
|
|
for counter in range(0, logs_num):
|
|
self.logger.info("Test " + str(counter))
|
|
time.sleep(self.logs_drain_timeout * 2)
|
|
|
|
for counter in range(0, logs_num):
|
|
self.logger.info("Test " + str(counter))
|
|
time.sleep(self.logs_drain_timeout * 2)
|
|
|
|
self.assertEqual(self.logzio_listener.get_number_of_logs(), logs_num * 2)
|
|
|
|
def test_server_failure(self):
|
|
log_message = "Failing log message"
|
|
self.logzio_listener.set_server_error()
|
|
self.logger.info(log_message)
|
|
|
|
time.sleep(self.logs_drain_timeout * 2)
|
|
|
|
self.assertFalse(self.logzio_listener.find_log(log_message))
|
|
|
|
self.logzio_listener.clear_server_error()
|
|
|
|
time.sleep(self.logs_drain_timeout * self.retry_timeout * self.retries_no) # Longer, because of the retry
|
|
|
|
self.assertTrue(self.logzio_listener.find_log(log_message))
|
|
|
|
def test_local_file_backup(self):
|
|
log_message = "Backup to local filesystem"
|
|
self.logzio_listener.set_server_error()
|
|
self.logger.info(log_message)
|
|
|
|
# Make sure no file is present
|
|
self.assertEqual(len(_find("logzio-failures-*.txt", ".")), 0)
|
|
|
|
time.sleep(self.retries_no*self.retry_timeout*2*2) # All of the retries
|
|
|
|
failure_files = _find("logzio-failures-*.txt", ".")
|
|
self.assertEqual(len(failure_files), 1)
|
|
|
|
with open(failure_files[0], "r") as f:
|
|
line = f.readline()
|
|
self.assertTrue(log_message in line)
|
|
|
|
def test_local_file_backup_disabled(self):
|
|
log_message = "Backup to local filesystem"
|
|
self.logzio_listener.set_server_error()
|
|
self.logger.handlers[0].logzio_sender.backup_logs = False
|
|
self.logger.info(log_message)
|
|
|
|
# Make sure no file is present
|
|
self.assertEqual(len(_find("logzio-failures-*.txt", ".")), 0)
|
|
|
|
time.sleep(self.retries_no*self.retry_timeout) # All of the retries
|
|
|
|
# Make sure no file was created
|
|
self.assertEqual(len(_find("logzio-failures-*.txt", ".")), 0)
|
|
|
|
def test_can_send_after_fork(self):
|
|
childpid = os.fork()
|
|
child_log_message = 'logged from child process'
|
|
parent_log_message = 'logged from parent process'
|
|
|
|
if childpid == 0:
|
|
# Log from the child process
|
|
self.logger.info(child_log_message)
|
|
time.sleep(self.logs_drain_timeout * 2)
|
|
os._exit(0)
|
|
# Wait for the child process to finish
|
|
os.waitpid(childpid, 0)
|
|
|
|
# log from the parent process
|
|
self.logger.info(parent_log_message)
|
|
time.sleep(self.logs_drain_timeout * 2)
|
|
|
|
# Ensure listener receive all log messages
|
|
self.assertTrue(self.logzio_listener.find_log(child_log_message))
|
|
self.assertTrue(self.logzio_listener.find_log(parent_log_message))
|