from NSCP import Settings, Registry, Core, log, status, sleep from test_helper import BasicTest, TestResult, Callable, setup_singleton, install_testcases, init_testcases, shutdown_testcases import plugin_pb2 from types import * import socket import unicodedata import uuid class Message: uuid = None channel = None source = None command = None status = None message = None perf = None tag = None delivered = False def __init__(self, channel = None, source = None, command = None, status = None, message = None, perf = None, tag = None): if not channel: self.uuid = str(uuid.uuid4()) self.channel = channel self.source = source self.command = command self.status = status self.message = message self.perf = perf self.delivered = False self.tag = tag def copy_from(self, other): self.uuid = other.uuid self.channel = other.channel self.source = other.source self.command = other.command self.status = other.status self.message = other.message self.perf = other.perf self.delivered = other.delivered self.tag = other.tag def __str__(self): return 'Message: %s (%s, %s, %s)'%(self.uuid, self.channel, self.status, self.message) def __repr__(self): return self.__str__() class EventLogTest(BasicTest): instance = None key = '' reg = None conf = None core = None last_tag = [] got_simple_response = None message_count = 0 messages = [] class SingletonHelper: def __call__( self, *args, **kw ) : if EventLogTest.instance is None : object = EventLogTest() EventLogTest.instance = object return EventLogTest.instance getInstance = SingletonHelper() def desc(self): return 'Testcase for eventlog' def title(self): return 'EventLog test' def setup(self, plugin_id, prefix): self.key = '_%stest_command'%prefix self.reg = Registry.get(plugin_id) self.reg.simple_subscription('pytest_evlog_01', EventLogTest.simple_inbox_handler_01) self.reg.simple_subscription('pytest_evlog_02', EventLogTest.simple_inbox_handler_02) def simple_inbox_handler_01(channel, source, command, code, message, perf): instance = EventLogTest.getInstance() return instance.simple_inbox_handler_wrapped(channel, source, command, code, message, perf, '001') simple_inbox_handler_01 = Callable(simple_inbox_handler_01) def simple_inbox_handler_02(channel, source, command, code, message, perf): instance = EventLogTest.getInstance() return instance.simple_inbox_handler_wrapped(channel, source, command, code, message, perf, '002') simple_inbox_handler_02 = Callable(simple_inbox_handler_02) def simple_inbox_handler_wrapped(self, channel, source, command, status, message, perf, tag): msg = Message(channel, source, command, status, message, perf, tag) msg.delivered = True self.messages.append(msg) log('Recieved: %s'%msg) return True def teardown(self): None def test_create(self, source, id, level, severity, category, facility, arguments): result = TestResult('Creating log message: i:%d, l:%s, s:%s, c:%d, f:%d'%(id, level, severity, category, facility)) args = ['--source', source, '--id', id, # Any number (corresponds with message identifier) -- Identifies message '--level', level, # error(1), warning(2), success(0), info(4), auditSuccess(8), auditFailure(10) -- Loglevel severity (ie log level) '--severity', severity, # success(0), informational(1), warning(2), error(3) -- Developer severity (ie classification) '--category', category, # '--facility', facility # ] for f in arguments: args.append('--argument') args.append(f) (ret, msg) = self.core.simple_exec('eventlog', 'insert', args) result.assert_equals(ret, 0, 'return code') result.assert_equals(len(msg), 1, 'Message length') if len(msg) == 1: result.assert_equals(msg[0], 'Message reported successfully', 'Status message') return result def test_w_expected(self, filter, syntax, expected): result = TestResult('Validating filter: %s (%d)'%(filter, expected)) (res, msg, perf) = self.core.simple_query('CheckEventLog', ['file=Application', 'debug=false', 'warn=gt:%d'%expected, 'crit=gt:%d'%expected, 'filter=%s'%filter, 'syntax=%s'%syntax, 'scan-range=-10m', 'top-syntax=${status} ${count}==%d: ${list}'%expected]) result.assert_equals(res, status.OK, "Validate status OK for %s"%filter) (res, msg, perf) = self.core.simple_query('CheckEventLog', ['file=Application', 'debug=false', 'warn=eq:%d'%expected, 'crit=gt:%d'%expected, 'filter=%s'%filter, 'syntax=%s'%syntax, 'scan-range=-10m', 'top-syntax=${status} ${count}==%d: ${list}'%expected]) result.assert_equals(res, status.WARNING, "Validate status OK for %s"%filter) (res, msg, perf) = self.core.simple_query('CheckEventLog', ['file=Application', 'debug=false', 'warn=eq:%d'%expected, 'crit=eq:%d'%expected, 'filter=%s'%filter, 'syntax=%s'%syntax, 'scan-range=-10m', 'top-syntax=${status} ${count}==%d: ${list}'%expected]) result.assert_equals(res, status.CRITICAL, "Validate status CRIT for %s"%filter) return result def test_syntax(self, filter, syntax, expected): result = TestResult('Validating syntax: %s'%syntax) (res, msg, perf) = self.core.simple_query('CheckEventLog', ['file=Application', 'warn=ne:1', 'filter=%s'%filter, 'syntax=%s'%syntax, 'descriptions', 'scan-range=-10m']) result.assert_equals(msg, expected, "Validate message rendering syntax: %s"%msg) return result def run_test(self): result = TestResult('Checking CheckEventLog') cache = TestResult('Checking CheckEventLog CACHE') sleep(2000) #(res, msg, perf) = self.core.simple_query('CheckEventLogCACHE', ['warn=eq:1', 'crit=eq:2']) #cache.assert_equals(res, status.OK, "Validate cache is empty") #cache.assert_equals(msg, 'Eventlog check ok', "Validate cache is ok: %s"%msg) a_list = ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'] result.add(self.test_create('Application Error', 1000, 'error', 'success', 0, 0, a_list)) result.add(self.test_create('Application Error', 1000, 'warning', 'informational', 1, 5, a_list)) result.add(self.test_create('Application Error', 1000, 'success', 'warning', 2, 5, a_list)) result.add(self.test_create('Application Error', 1000, 'info', 'error', 3, 5, a_list)) for x in range(1,10): log('Waiting...%d/4.'%len(self.messages)) sleep(100) if len(self.messages) == 4: break log('Recieved %d messages.'%len(self.messages)) result.assert_equals(len(self.messages), 4, 'Verify that all 4 messages are sent through') for msg in self.messages: if msg.message.startswith('X1'): r = TestResult('Validating message X1') r.assert_equals(msg.message, 'X1 warning Application Error: ', 'Verify message') r.assert_equals(msg.channel, 'pytest_evlog_01', 'Verify channel') r.assert_equals(msg.tag, '001', 'Verify tag') r.assert_equals(msg.status, status.WARNING, 'Verify status') result.add(r) elif msg.message.startswith('X2'): r = TestResult('Validating message X2') r.assert_equals(msg.message, 'X2 success Application Error: ', 'Verify message') r.assert_equals(msg.channel, 'pytest_evlog_02', 'Verify channel') r.assert_equals(msg.tag, '002', 'Verify tag') r.assert_equals(msg.status, status.CRITICAL, 'Verify status') result.add(r) elif msg.message.startswith('X3'): r = TestResult('Validating message X3') r.assert_equals(msg.message, 'X3 info Application Error: ', 'Verify message') r.assert_equals(msg.channel, 'pytest_evlog_01', 'Verify channel') r.assert_equals(msg.tag, '001', 'Verify tag') r.assert_equals(msg.status, status.UNKNOWN, 'Verify status') result.add(r) elif msg.message.startswith('X4'): r = TestResult('Validating message X4') r.assert_equals(msg.message, 'X4 error Application Error: ', 'Verify message') r.assert_equals(msg.channel, 'pytest_evlog_01', 'Verify channel') r.assert_equals(msg.tag, '001', 'Verify tag') r.assert_equals(msg.status, status.OK, 'Verify status') result.add(r) #(res, msg, perf) = self.core.simple_query('CheckEventLogCACHE', ['warn=eq:1', 'crit=eq:4']) #cache.assert_equals(res, status.CRITICAL, "Validate cache has items: %s"%msg) #cache.assert_equals(msg, 'X4 error Application Error: , X1 warning Application Error: , X2 success Application Error: , X3 info Application Error: , eventlog: 4 = critical', "Validate cache message") #cache.assert_equals(perf, "'eventlog'=4;1;4", "Validate cache performance") #(res, msg, perf) = self.core.simple_query('CheckEventLogCACHE', ['warn=eq:1', 'crit=eq:2']) #cache.assert_equals(res, status.OK, "Validate cache is empty (again)") #cache.assert_equals(msg, 'Eventlog check ok', "Validate cache is ok: %s"%msg) #result.add(cache) r = TestResult('Checking filters') r.add(self.test_w_expected('id = 1000 and generated gt 1m', '%generated%', 0)) r.add(self.test_w_expected('id = 1000 and generated gt -1m', '%generated%', 4)) r.add(self.test_w_expected('id = 1000 and generated gt -1m and id = 1000', '%generated%: %id%, %category%', 4)) r.add(self.test_w_expected('id = 1000 and generated gt -1m and category = 1', '%category%', 1)) r.add(self.test_w_expected('id = 1000 and generated gt -1m and category = 0', '%category%', 1)) r.add(self.test_w_expected("id = 1000 and generated gt -1m and level = 'error'", '%level%', 1)) r.add(self.test_w_expected("id = 1000 and generated gt -1m and level = 'warning'", '%level%', 1)) result.add(r) r = TestResult('Checking syntax') r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 0', '%source% - %type% - %category%', 'Application Error - error - 0')) r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 1', '%source% - %type% - %category%', 'Application Error - warning - 1')) r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 2', '%source% - %type% - %category%', 'Application Error - information - 2')) r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 3', '%source% - %type% - %category%', 'Application Error - information - 3')) #r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 0', '%facility% - %qualifier% - %customer%', '0 - 0 - 0')) #r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 1', '%facility% - %qualifier% - %customer%', '5 - 5 - 0')) #r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 0', '%rawid% - %severity% - %log%', '1000 - success - Application')) #r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 1', '%rawid% - %severity% - %log%', '1074070504 - informational - Application')) #r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 2', '%rawid% - %severity% - %log%', '2147812328 - warning - Application')) #r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 3', '%rawid% - %severity% - %log%', '3221554152 - error - Application')) #r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 0', '%id% - %strings%', '1000 - a, a, a, a, a, a, a, a, a, a, a, a, a, ')) #r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 1', '%id% - %strings%', '1000 - a, a, a, a, a, a, a, a, a, a, a, a, a, ')) result.add(r) return result def install_filter(self, conf, path, target, filter = None, syntax = '%type% %source%: %message%', severity = 'OK', lang = 'english', age = '5s'): if filter: conf.set_string(path, 'filter', filter) if target: conf.set_string(path, 'target', target) if lang: conf.set_string(path, 'language', lang) if age: conf.set_string(path, 'maximum age', age) if syntax: conf.set_string(path, 'detail syntax', syntax) if severity: conf.set_string(path, 'severity', severity) conf.set_string(path, 'log', 'application') conf.set_string(path, 'debug', 'true') def install(self, arguments): conf = self.conf conf.set_string('/modules', 'pytest_eventlog', 'CheckEventLog') conf.set_string('/modules', 'pytest', 'PythonScript') conf.set_string('/settings/pytest/scripts', 'test_eventlog', 'test_eventlog.py') conf.set_string('/settings/pytest_eventlog/real-time', 'enabled', 'true') self.install_filter(conf, '/settings/pytest_eventlog/real-time/filters/default', 'pytest_evlog_01', 'id = 1000 and category = 0', '%type% %source%: %message%','OK') base_syntax = '${id},${category} ${source}: ${message}' self.install_filter(conf, '/settings/pytest_eventlog/real-time/filters/py_test_001', 'pytest_evlog_01', 'id = 1000 and category = 1', 'X1 %s'%base_syntax, 'WARNING') self.install_filter(conf, '/settings/pytest_eventlog/real-time/filters/py_test_002', 'pytest_evlog_02', 'id = 1000 and category = 2', 'X2 %s'%base_syntax, 'CRITICAL') self.install_filter(conf, '/settings/pytest_eventlog/real-time/filters/py_test_003', None, 'id = 1000 and category = 3', 'X3 %s'%base_syntax, 'UNKNOWN') self.install_filter(conf, '/settings/pytest_eventlog/real-time/filters/py_test_004', None, None , 'X4 %s'%base_syntax, None) conf.set_string('/settings/pytest_eventlog/real-time', 'maximum age', '5s') conf.set_string('/settings/pytest_eventlog/real-time', 'debug', 'true') conf.set_string('/settings/pytest_eventlog/real-time', 'enable active', 'true') conf.save() def uninstall(self): None def help(self): None def init(self, plugin_id, prefix): self.reg = Registry.get(plugin_id) self.core = Core.get(plugin_id) self.conf = Settings.get(plugin_id) def shutdown(self): None setup_singleton(EventLogTest) all_tests = [EventLogTest] def __main__(args): install_testcases(all_tests) def init(plugin_id, plugin_alias, script_alias): init_testcases(plugin_id, plugin_alias, script_alias, all_tests) def shutdown(): shutdown_testcases()