#!/usr/local/bin/lua50 --------------------------------------------------------------------- -- XML-RPC Overall API test script -- See Copyright Notice in license.html -- $Id$ --------------------------------------------------------------------- require "xmlrpc" function table._print (tab, indent, spacing) spacing = spacing or "" indent = indent or "\t" io.write ("{\n") for nome, val in pairs (tab) do io.write (spacing..indent) local t = type(nome) if t == "string" then io.write (string.format ("[%q] = ", tostring (nome))) elseif t == "number" or t == "boolean" then io.write (string.format ("[%s] = ", tostring (nome))) else io.write (t) end t = type(val) if t == "string" or t == "number" then io.write (string.format ("%q", val)) elseif t == "table" then table.print (val, indent, spacing..indent) else io.write (t) end io.write (",\n") end io.write (spacing.."}") end function table._tostring (tab, indent, spacing) local s = {} spacing = spacing or "" indent = indent or "\t" table.insert (s, "{\n") for nome, val in pairs (tab) do table.insert (s, spacing..indent) local t = type(nome) if t == "string" then table.insert (s, string.format ("[%q] = ", tostring (nome))) elseif t == "number" or t == "boolean" then table.insert (s, string.format ("[%s] = ", tostring (nome))) else table.insert (s, t) end t = type(val) if t == "string" or t == "number" then table.insert (s, string.format ("%q", val)) elseif t == "table" then table.insert (s, table._tostring (val, indent, spacing..indent)) else table.insert (s, t) end table.insert (s, ",\n") end table.insert (s, spacing.."}") return table.concat (s) end function table.print (tab, indent, spacing) io.write (table._tostring (tab, indent, spacing)) end function table.equal2 (t1, t2) if type(t1) ~= "table" or type(t2) ~= "table" then return false end for key, v1 in t1 do local v2 = rawget (t2, key) if type(v1) == "table" and type(v2) == "table" then if not table.equal (v1, v2) then return false end elseif v1 ~= v2 then return false end end return true end function table.equal (t1, t2) if type(t1) ~= "table" or type(t2) ~= "table" then return false end local s1 = table._tostring (t1) local s2 = table._tostring (t2) s1 = string.gsub (s1, "%s*", "") s2 = string.gsub (s2, "%s*", "") --if s1 ~= s2 then --print(s1, "!!!!", s2) --end return s1 == s2, s1.."!!!"..s2 end function remove_type (tab) if type(tab) ~= "table" then return tab elseif tab["*type"] then return tab["*value"] end for i,v in pairs (tab) do if type(v) == "table" then tab[i] = remove_type (v) end end return tab end function call_test (xml_call, method, ...) local xc = string.gsub (xml_call, "(%p)", "%%%1") --xc = string.gsub (xc, "\r?\n%s*", "%%s*") xc = string.gsub (xc, "%s*", "") arg.n = nil -- client enconding test local meth_call = xmlrpc.clEncode (method, unpack (arg)) meth_call = string.gsub (meth_call, "%s*", "") local s = string.gsub (meth_call, xc, "") s = string.gsub (s, "%s*", "") assert (s == "", s.."\n!!!\n"..xc) -- server decoding test local meth_call, param = xmlrpc.srvDecode (xml_call) assert (meth_call == method, meth_call) arg = remove_type (arg) assert (table.equal (arg, param)) end function response_test (xml_resp, lua_obj) -- client decoding test local ok, obj = xmlrpc.clDecode (xml_resp) -- server encoding test xml_resp = string.gsub (xml_resp, "(%p)", "%%%1") xml_resp = string.gsub (xml_resp, "\r?\n%s*", "%%s*") local meth_resp = xmlrpc.srvEncode (lua_obj) if type (obj) == "table" then lua_obj = remove_type (lua_obj) assert (table.equal (obj, lua_obj)) else assert (obj == lua_obj) end local s = string.gsub (meth_resp, xml_resp, "") s = string.gsub (s, "%s*", "") assert (s == "", s) end function fault_test (xml_resp, message, code) -- client decoding test local ok, str, n = xmlrpc.clDecode (xml_resp) assert (str == message) assert (n == code) -- server encoding test xml_resp = string.gsub (xml_resp, "(%p)", "%%%1") xml_resp = string.gsub (xml_resp, "\r?\n%s*", "%%s*") local meth_resp = xmlrpc.srvEncode ({ message = message, code = code }, true) local s = string.gsub (meth_resp, xml_resp, "") s = string.gsub (s, "%s*", "") assert (s == "", s) end --------------------------------------------------------------------- -- call tests. --------------------------------------------------------------------- call_test ([[ examples.getStateName 41 ]], "examples.getStateName", 41) local double_139 = xmlrpc.newTypedValue (139, "double") call_test ([[ examples.getSomething lowerBound 18.2 upperBound 139 ]], "examples.getSomething", { lowerBound = 18.2, upperBound = double_139 }) local double_array = xmlrpc.newArray ("double") call_test ([[ test 1 2 3 4 ]], "test", xmlrpc.newTypedValue ({ 1, 2, 3, 4, }, double_array) ) local double_array_array = xmlrpc.newArray (double_array) call_test ([[ test 1 2 3 4 11 12 13 14 21 22 23 24 ]], "test", xmlrpc.newTypedValue ( { { 1, 2, 3, 4, }, { 11, 12, 13, 14, }, { 21, 22, 23, 24, }, }, double_array_array ) ) call_test ([[ insertTable people name Fulano email fulano@nowhere.world name Beltrano email beltrano@nowhere.world name Cicrano email cicrano@nowhere.world ]], "insertTable", "people", xmlrpc.newTypedValue ( { { name = "Fulano", email = "fulano@nowhere.world", }, { name = "Beltrano", email = "beltrano@nowhere.world", }, { name = "Cicrano", email = "cicrano@nowhere.world", }, }, xmlrpc.newArray ("struct") ) ) --------------------------------------------------------------------- -- response tests. --------------------------------------------------------------------- response_test ([[ South Dakota ]], "South Dakota") response_test ([[ lowerBound 18.2 upperBound 139 ]], { lowerBound = 18.2, upperBound = double_139 }) fault_test ([[ faultCode 1 faultString error string ]], "error string", 1) print("Ok!")