2024-04-01 10:40:20 +02:00

328 lines
10 KiB
Lua

test = require("test_helper")
TestMessage = {
uuid = nil,
source = nil,
command = nil,
status = nil,
message = nil,
perfdata = nil,
got_simple_response = false,
got_response = false
}
TestNRPE = {
requests = {},
responses = {}
}
function TestNRPE:install(arguments)
local conf = nscp.Settings()
conf:set_string('/modules', 'test_nrpe_server', 'NRPEServer')
conf:set_string('/modules', 'test_nrpe_client', 'NRPEClient')
conf:set_string('/modules', 'luatest', 'LUAScript')
conf:set_string('/settings/luatest/scripts', 'test_nrpe', 'test_nrpe.lua')
conf:set_string('/settings/NRPE/test_nrpe_server', 'port', '15666')
conf:set_string('/settings/NRPE/test_nrpe_server', 'inbox', 'nrpe_test_inbox')
conf:set_string('/settings/NRPE/test_nrpe_server', 'encryption', '1')
conf:set_string('/settings/NRPE/test_nrpe_server', 'insecure', 'true')
conf:set_string('/settings/NRPE/test_nrpe_client/targets', 'nrpe_test_local', 'nrpe://127.0.0.1:15666')
conf:set_string('/settings/NRPE/test_nrpe_client/targets/default', 'insecure', 'true')
end
function TestNRPE:setup()
local reg = nscp.Registry()
reg:simple_query('check_py_nrpe_test_s', self, self.simple_handler, 'TODO')
--reg:query('check_py_nrpe_test', self, self.handler, 'TODO')
end
function TestNRPE:teardown()
end
function TestNRPE:uninstall()
end
function TestNRPE:help()
end
function TestNRPE:init(plugin_id)
end
function TestNRPE:shutdown()
end
function TestNRPE:has_response(id)
return self.responses[id]
end
function TestNRPE:get_response(id)
msg = self.requests[id]
if msg == nil then
msg = TestMessage
msg.uuid=id
self.responses[id] = msg
return msg
end
return msg
end
function TestNRPE:set_response(msg)
self.responses[msg.uuid] = msg
end
function TestNRPE:del_response(id)
self.responses[id] = nil
end
function TestNRPE:get_request(id)
msg = self.requests[id]
if msg == nil then
msg = TestMessage
msg.uuid=id
self.requests[id] = msg
return msg
end
return msg
end
function TestNRPE:set_request(msg)
self.requests[msg.uuid] = msg
end
function TestNRPE:del_request(id)
self.requests[id] = nil
end
function TestNRPE:simple_handler(command, args)
local core = nscp.Core()
msg = self:get_response(args[0])
msg.got_simple_response = true
self:set_response(msg)
message = rmsg.message
if args[1] then
message = string.rep('x', args[1])
end
rmsg = self:get_request(args[0])
return rmsg.status, message, rmsg.perfdata
end
function TestNRPE:handler(req)
local msg = self:get_response(args[0])
msg.got_response = true
self:set_response(msg)
end
function TestNRPE:submit_payload(tag, ssl, length, payload_length, source, status, message, perf, target)
local core = nscp.Core()
local result = test.TestResult:new{message='Testing NRPE: '..tag..' for '..target}
local msg = protobuf.Plugin.QueryRequestMessage.new()
hdr = msg:get_header()
hdr:set_destination_id(target)
hdr:set_command("nrpe_forward")
host = hdr:add_hosts()
host:set_address("127.0.0.1:15666")
host:set_id(target)
if target == 'valid' then
else
enc = host:add_metadata()
enc:set_key("use ssl")
enc:set_value(tostring(ssl))
enc = host:add_metadata()
enc:set_key("payload length")
enc:set_value(tostring(length))
enc = host:add_metadata()
enc:set_key("timeout")
enc:set_value('10')
end
uid = string.random(12)
payload = msg:add_payload()
payload:set_command('check_py_nrpe_test_s')
payload:set_arguments(1, uid)
if payload_length ~= 0 then
payload:set_arguments(2, payload_length)
end
rmsg = self:get_request(uid)
rmsg.status = status
rmsg.message = message
rmsg.perfdata = perf
self:set_request(rmsg)
serialized = msg:serialized()
result_code, response = core:query(serialized)
response_message = protobuf.Plugin.QueryResponseMessage.parsefromstring(response)
found = False
for i = 0,10 do
if (self:has_response(uid)) then
rmsg = self:get_response(uid)
--#result.add_message(rmsg.got_response, 'Testing to recieve message using %s'%tag)
result:add_message(rmsg.got_simple_response, 'Testing to recieve simple message using '..tag)
result:add_message(response_message:size_payload() == 1, 'Verify that we only get one payload response for '..tag)
pl = response_message:get_payload(1)
result:assert_equals(pl:get_result(), test.status_to_int(status), 'Verify that status is sent through '..tag)
if payload_length == 0 then
l = pl:get_lines(1)
result:assert_equals(l:get_message(), rmsg.message, 'Verify that message is sent through '..tag)
else
max_len = payload_length
if max_len >= length then
max_len = length - 1
end
l = pl:get_lines(1)
result:assert_equals(string.len(l:get_message()), max_len, 'Verify that message length is correct ' .. max_len .. ': ' ..tag)
end
--#result.assert_equals(rmsg.perfdata, perf, 'Verify that performance data is sent through')
self:del_response(uid)
found = true
break
else
core:log('info', string.format('Waiting for %s (%s/%s)', uid,tag,target))
nscp.sleep(500)
end
end
if (not found) then
result:add_message(false, string.format('Failed to find message %s using %s', uid, tag))
end
return result
end
function TestNRPE:test_one(ssl, length, payload_length, status)
tag = string.format("%s/%d/%s", tostring(ssl), length, status)
local result = test.TestResult:new{message=string.format('Testing: %s with various targets', tag)}
for k,t in pairs({'valid', 'test_rp', 'invalid'}) do
result:add(self:submit_payload(tag, ssl, length, payload_length, tag .. 'src' .. tag, status, tag .. 'msg' .. tag, '', t))
end
result:add(self:submit_payload(tag, ssl, length, payload_length, tag .. 'src' .. tag, status, tag .. 'msg' .. tag, '', 'valid'))
return result
end
function TestNRPE:do_one_test(ssl, length)
if ssl == nil then ssl = true end
length = length or 1024
local conf = nscp.Settings()
local core = nscp.Core()
conf:set_int('/settings/NRPE/test_nrpe_server', 'payload length', length)
conf:set_bool('/settings/NRPE/test_nrpe_server', 'use ssl', ssl)
conf:set_bool('/settings/NRPE/test_nrpe_server', 'allow arguments', true)
conf:set_bool('/settings/NRPE/test_nrpe_server', 'extended response', false)
core:reload('test_nrpe_server')
conf:set_string('/settings/NRPE/test_nrpe_client/targets/default', 'address', 'nrpe://127.0.0.1:35666')
conf:set_bool('/settings/NRPE/test_nrpe_client/targets/default', 'ssl', not ssl)
conf:set_int('/settings/NRPE/test_nrpe_client/targets/default', 'payload length', length*3)
conf:set_string('/settings/NRPE/test_nrpe_client/targets/invalid', 'address', 'nrpe://127.0.0.1:25666')
conf:set_bool('/settings/NRPE/test_nrpe_client/targets/invalid', 'use ssl', not ssl)
conf:set_int('/settings/NRPE/test_nrpe_client/targets/invalid', 'payload length', length*2)
conf:set_string('/settings/NRPE/test_nrpe_client/targets/valid', 'address', 'nrpe://127.0.0.1:15666')
conf:set_bool('/settings/NRPE/test_nrpe_client/targets/valid', 'use ssl', ssl)
conf:set_int('/settings/NRPE/test_nrpe_client/targets/valid', 'payload length', length)
core:reload('test_nrpe_client')
local result = test.TestResult:new{message="Testing "..tostring(ssl)..", "..tostring(length)}
result:add(self:test_one(ssl, length, 0, 'unknown'))
result:add(self:test_one(ssl, length, 0, 'ok'))
result:add(self:test_one(ssl, length, 0, 'warn'))
result:add(self:test_one(ssl, length, 0, 'crit'))
result:add(self:test_one(ssl, length, length/2, 'ok'))
result:add(self:test_one(ssl, length, length, 'ok'))
result:add(self:test_one(ssl, length, length*2, 'ok'))
return result
end
function TestNRPE:test_timeout(ssl, server_timeout, client_timeout, length)
local conf = nscp.Settings()
local core = nscp.Core()
conf:set_bool('/settings/NRPE/test_nrpe_server', 'use ssl', ssl)
conf:set_int('/settings/NRPE/test_nrpe_server', 'timeout', server_timeout)
conf:set_bool('/settings/NRPE/test_nrpe_server', 'allow arguments', true)
conf:set_int('/settings/NRPE/test_nrpe_server', 'payload length', length)
core:reload('test_nrpe_server')
conf:set_string('/settings/NRPE/test_nrpe_client/targets/default', 'address', 'nrpe://127.0.0.1:15666')
conf:set_bool('/settings/NRPE/test_nrpe_client/targets/default', 'use ssl', ssl)
conf:set_int('/settings/NRPE/test_nrpe_client/targets/default', 'timeout', client_timeout)
conf:set_int('/settings/NRPE/test_nrpe_client/targets/default', 'payload length', length)
core:reload('test_nrpe_client')
local result = test.TestResult:new{message="Testing timeouts ssl: "..tostring(ssl)..", server: "..tostring(server_timeout)..", client: "..tostring(client_timeout)}
local msg = protobuf.Plugin.QueryRequestMessage.new()
hdr = msg:get_header()
hdr:set_destination_id('test')
host = hdr:add_hosts()
host:set_address("127.0.0.1:15666")
host:set_id('test')
meta = hdr:add_metadata()
meta:set_key("command")
meta:set_value('check_py_nrpe_test_s')
meta = hdr:add_metadata()
meta:set_key("retry")
meta:set_value('0')
uid = string.random(12)
payload = msg:add_payload()
payload:set_command('nrpe_forward')
payload:set_arguments(1, uid)
rmsg = self:get_request(uid)
rmsg.status = 'ok'
rmsg.message = 'Hello: Timeout'
rmsg.perfdata = ''
self:set_request(rmsg)
serialized = msg:serialized()
result_code, response = core:query(serialized)
response_message = protobuf.Plugin.QueryResponseMessage.parsefromstring(response)
found = False
for i = 0,10 do
if (self:has_response(uid)) then
rmsg = self:get_response(uid)
result:add_message(false, string.format('Testing to recieve message using'))
self:del_response(uid)
found = true
break
else
core:log('error', string.format('Timeout waiting for %s', uid))
nscp.sleep(500)
end
end
if (found) then
result:add_message(false, string.format('Making sure timeout message was never delivered'))
end
return result
end
function TestNRPE:run()
local result = test.TestResult:new{message="NRPE Test Suite"}
result:add(self:do_one_test(true, 1024))
result:add(self:do_one_test(false, 1024))
result:add(self:do_one_test(true, 4096))
result:add(self:do_one_test(true, 65536))
result:add(self:do_one_test(true, 1048576))
result:add(self:test_timeout(false, 30, 1, 104857600))
result:add(self:test_timeout(false, 1, 30, 104857600))
result:add(self:test_timeout(true, 30, 1, 104857600))
result:add(self:test_timeout(true, 1, 30, 104857600))
nscp.sleep(500)
return result
end
instances = { TestNRPE }
test.init_test_manager(instances)
function main(args)
return test.install_test_manager(instances)
end