require File.dirname(__FILE__) + '/abstract_unit'
require 'webrick'
require 'webrick/log'
require 'singleton'
module ClientTest
class Person < ActionWebService::Struct
member :firstnames, [:string]
member :lastname, :string
def ==(other)
firstnames == other.firstnames && lastname == other.lastname
end
end
class Inner < ActionWebService::Struct
member :name, :string
end
class Outer < ActionWebService::Struct
member :name, :string
member :inner, Inner
end
class User < ActiveRecord::Base
end
module Accounting
class User < ActiveRecord::Base
end
end
class WithModel < ActionWebService::Struct
member :user, User
member :users, [User]
end
class WithMultiDimArray < ActionWebService::Struct
member :pref, [[:string]]
end
class API < ActionWebService::API::Base
api_method :void
api_method :normal, :expects => [:int, :int], :returns => [:int]
api_method :array_return, :returns => [[Person]]
api_method :struct_pass, :expects => [[Person]], :returns => [:bool]
api_method :nil_struct_return, :returns => [Person]
api_method :inner_nil, :returns => [Outer]
api_method :client_container, :returns => [:int]
api_method :named_parameters, :expects => [{:key=>:string}, {:id=>:int}]
api_method :thrower
api_method :user_return, :returns => [User]
api_method :with_model_return, :returns => [WithModel]
api_method :scoped_model_return, :returns => [Accounting::User]
api_method :multi_dim_return, :returns => [WithMultiDimArray]
end
class NullLogOut
def <<(*args); end
end
class Container < ActionController::Base
web_service_api API
attr_accessor :value_void
attr_accessor :value_normal
attr_accessor :value_array_return
attr_accessor :value_struct_pass
attr_accessor :value_named_parameters
def initialize
@session = @assigns = {}
@value_void = nil
@value_normal = nil
@value_array_return = nil
@value_struct_pass = nil
@value_named_parameters = nil
end
def void
@value_void = @method_params
end
def normal
@value_normal = @method_params
5
end
def array_return
person = Person.new
person.firstnames = ["one", "two"]
person.lastname = "last"
@value_array_return = [person]
end
def struct_pass
@value_struct_pass = @method_params
true
end
def nil_struct_return
nil
end
def inner_nil
Outer.new :name => 'outer', :inner => nil
end
def client_container
50
end
def named_parameters
@value_named_parameters = @method_params
end
def thrower
raise "Hi"
end
def user_return
User.find(1)
end
def with_model_return
WithModel.new :user => User.find(1), :users => User.find(:all)
end
def scoped_model_return
Accounting::User.find(1)
end
def multi_dim_return
WithMultiDimArray.new :pref => [%w{pref1 value1}, %w{pref2 value2}]
end
end
class AbstractClientLet < WEBrick::HTTPServlet::AbstractServlet
def initialize(controller)
@controller = controller
end
def get_instance(*args)
self
end
def require_path_info?
false
end
def do_GET(req, res)
raise WEBrick::HTTPStatus::MethodNotAllowed, "GET request not allowed."
end
def do_POST(req, res)
raise NotImplementedError
end
end
class AbstractServer
include ClientTest
include Singleton
attr :container
def initialize
@container = Container.new
@clientlet = create_clientlet(@container)
log = WEBrick::BasicLog.new(NullLogOut.new)
@server = WEBrick::HTTPServer.new(:Port => server_port, :Logger => log, :AccessLog => log)
@server.mount('/', @clientlet)
@thr = Thread.new { @server.start }
until @server.status == :Running; end
at_exit { @server.stop; @thr.join }
end
protected
def create_clientlet
raise NotImplementedError
end
def server_port
raise NotImplementedError
end
end
end