#! /usr/bin/ruby # Author: Dario Meloni require 'rubygems' require 'test/unit' require 'xmlrpc/xmlrpcs' require 'xmlrpc/server' require 'socket' $socket_path="/tmp/test.sock" class UnixXMLClient < XMLRPC::ClientS def new_socket(info,async) UNIXSocket.new(info) end def write_request(socket,request) socket.write("#{request.length}\n") socket.write(request) end def read_response(socket) l = socket.readline return socket.read(l.to_i) end end class UnixXMLServer < XMLRPC::BasicServer attr_reader :path def initialize( path ) super() @path = path @server = UNIXServer.new(@path) end def serve() catch (:exit_serve) { while(true) @server.listen(5) client, client_addr = @server.accept l = client.readline data = client.read(l.to_i) pdata = process(data) client.write("#{pdata.length}\n") client.write(pdata) client.close end } end end class TC_xmlrpcs_unix < Test::Unit::TestCase def setup @s = UnixXMLServer.new($socket_path) @s.add_introspection @s.add_multicall @s.add_handler("test.add") do |a,b| a+b end @t = Thread.new do @s.serve end end def teardown Thread.kill(@t) File.unlink($socket_path) end def test_create client = UnixXMLClient.new($socket_path) assert(client.call("test.add",2,3) == 5, "Failed calling add") proxy = client.proxy "test" assert(proxy.add(1,4) == 5,"Failed using the proxy") a, b = client.multicall(["test.add",3,2],["test.add",4,1]) assert( a == 5 && b == 5, "Failed multicall") assert(client.call("system.listMethods"),"Failed system.listMethods") end end