bug correction on the method xmlrpc.srvMethods

tests/test.lua renamed to apitest.lua
adding tests/httptest.lua - automatic tests over http
new server side (server.lua)
master
Ricardo Calheiros 2006-02-17 11:39:14 +00:00
parent e01209c34b
commit 6402524efd
4 changed files with 143 additions and 39 deletions

View File

@ -1,4 +1,13 @@
---------------------------------------------------------------------
-- XML-RPC server
-- See Copyright Notice in license.html
-- $Id$
---------------------------------------------------------------------
require"xmlrpc"
require"cgilua"
module("xmlrpc.server")
---------------------------------------------------------------------
local function respond (resp)
@ -11,17 +20,16 @@ local function respond (resp)
end
---------------------------------------------------------------------
--[[
function assert (cond, msg)
if not cond then
respond (xmlrpc.srvEncode (
{ code = 2, message = msg, },
true
))
os.exit() -- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--os.exit() -- !!!!!!!!!!!
end
end
--]]
cgilua.seterroroutput (function (msg)
respond (xmlrpc.srvEncode ({ code = 2, message = msg, }, true))
end)
@ -55,40 +63,24 @@ local function callfunc (func, arg_table)
end
---------------------------------------------------------------------
local kepler_home = "http://www.keplerproject.org"
local kepler_products = { "luasql", "lualdap", "luaexpat", "luaxmlrpc", }
local kepler_sites = {
luasql = kepler_home.."/luasql",
lualdap = kepler_home.."/lualdap",
luaexpat = kepler_home.."/luaexpat",
luaxmlrpc = kepler_home.."/luaxmlrpc",
}
local __methods
__methods = {
system = {
listMethods = function (self)
local l = {}
for name, obj in pairs (__methods) do
for method in pairs (obj) do
table.insert (l, name.."."..method)
end
end
return l
end,
},
kepler = {
products = function (self) return kepler_products end,
site = function (self, prod) return kepler_sites[prod] end,
},
}
function xmlrpc.server:new()
local o = { methods = { } }
setmetatable (o, self)
self.__index = self
return o
end
---------------------------------------------------------------------
-- Main
---------------------------------------------------------------------
function xmlrpc.server:register(name, service)
assert (type(name) == "string", "Invalid `name': string expected")
self.methods[name] = service
end
xmlrpc.srvMethods (__methods)
local func, arg_table = decodedata (cgi[1])
local ok, result = callfunc (func, arg_table)
local r = xmlrpc.srvEncode (result, not ok)
respond (r)
---------------------------------------------------------------------
function xmlrpc.server:handle()
xmlrpc.srvMethods (self.methods)
local func, arg_table = decodedata (cgi[1])
local ok, result = callfunc (func, arg_table)
local r = xmlrpc.srvEncode (result, not ok)
respond (r)
end

View File

@ -577,8 +577,12 @@ function srvMethods (tab_or_func)
if not ok then
return tab_or_func[name]
else
return function (...)
return tab_or_func[obj][method] (obj, unpack (arg))
if tab_or_func[obj] and tab_or_func[obj][method] then
return function (...)
return tab_or_func[obj][method] (obj, unpack (arg))
end
else
return nil
end
end
end

View File

@ -1,5 +1,10 @@
#!/usr/local/bin/lua50
---------------------------------------------------------------------
-- XML-RPC Overall API test script
-- See Copyright Notice in license.html
-- $Id$
---------------------------------------------------------------------
require "xmlrpc"

103
tests/httptest.lua Executable file
View File

@ -0,0 +1,103 @@
---------------------------------------------------------------------
-- XML-RPC Automatic Tests
-- See Copyright Notice in license.html
-- $Id$
-----------------------------------------------------------------------
require"xmlrpc.http"
local function init_launcher(launcher)
if launcher == 'cgilua' then
require"cgilua"
cgilua.htmlheader()
io.write = function(str)
cgilua.put(string.gsub(str, '\n','<br>'))
end --io.write
end --if
end
local function dumpt(t)
for k,v in pairs(t) do
io.write('\nk='..tostring(k)..'\tv='..tostring(v))
if type(v) == 'table' then dumpt(v) end
end --for
end
local function test(url, rtype, rvalue, method, args)
local status, res
io.write('\nURL='..url..'\nMETHOD='..method..'\nPARAMETERS=')
io.write(unpack(args or {'void'}))
if args then
status, xmlstatus, res = pcall( xmlrpc.http.call,url, method, unpack(args))
else
status, xmlstatus, res = pcall( xmlrpc.http.call,url, method)
end --if
if not status then
io.write('\nFAILURE! '..xmlstatus)
else
if not xmlstatus and rtype ~= 'failure' then
io.write('\nFAILURE! '..res)
else
io.write('\nreturn type expected= '..rtype)
if type(res) == rtype or (not xmlstatus and rtype == 'failure') then
io.write(' (OK)')
else
io.write(' (FAILURE) returning a '..type(res))
end --if
if rvalue then
io.write('\nvalue expected='..tostring(rvalue))
if type(res) == 'table' then
dumpt(res)
elseif tostring(rvalue) == tostring(res) then
io.write(' (OK)')
else
io.write(' (FAILURE) value returned='..tostring(res))
end --if
end --if
end --if
end --if
io.write('\n')
end
function syndic8()
test( "http://www.syndic8.com/xmlrpc.php", "string", nil, "syndic8.GetFeedCount" )
end
local server = 'http://localhost:80/server.lua'
function calc()
test( server, 'number', '25', 'calc.add', {10,15} )
test( server, 'string', '0.1v', 'calc.getVersion' )
test( server, 'boolean', 'true', 'calc.isprime', {7} )
test( server, 'boolean', 'false', 'calc.isprime', {80} )
test( server, 'table', {{1,0},{0,1}}, 'calc.MID' )
test( server, 'failure', 'Unavailable method', 'calc' )
test( server, 'failure', 'Unavailable method', 'calc.MID2' )
test( server, 'failure', 'Unavailable method', 'foo', {2} )
test( server, 'failure', 'Unavailable method', 'foo.foo2.foo3', {3,4,5} )
-- test( 'http://localhost:82/calc.xmlrpc', 'number', '25', 'calc.add', {10,15} )
end
local launcher = {
'lua',
'cgilua',
}
local tests = {
[1] = { name='SYNDIC8', func=syndic8 },
[2] = { name='CALCULATOR', func=calc },
}
init_launcher(launcher[1])
io.write(
[[
LuaXMLRPC - Automatic Tests
0.1v
]]
)
for k,v in pairs( tests ) do
io.write( "\n\nT"..k.." - "..v.name.."\n" )
v.func()
end --for