1require 'drb/drb'
2require 'drb/extserv'
3require 'timeout'
4
5class XArray < Array
6  def initialize(ary)
7    ary.each do |x|
8      self.push(x)
9    end
10  end
11end
12
13class XArray2 < XArray
14  include DRbUndumped
15end
16
17class Unknown2
18  def initialize
19    @foo = 'unknown2'
20  end
21end
22
23class DRbEx
24  include DRbUndumped
25
26  class FooBar
27    def initialize
28      @foo = 'bar'
29    end
30  end
31
32  class UError < RuntimeError; end
33
34  def initialize
35    @xary2_hash = nil
36    @hash = nil
37    @hello = 'hello'
38  end
39  attr_reader :hello
40
41  def sample(a, b, c)
42    a.to_i + b.to_i + c.to_i
43  end
44
45  def sum(*a)
46    s = 0
47    a.each do |e|
48      s += e.to_i
49    end
50    s
51  end
52
53  def do_timeout(n)
54    timeout(0.1) do
55      n.sleep(2)
56    end
57  end
58
59  def unknown_module
60    FooBar.new
61  end
62
63  def unknown_class
64    Unknown2.new
65  end
66
67  def unknown_error
68    raise UError
69  end
70
71  def remote_no_method_error
72    invoke_no_method(self)
73  end
74
75  def test_yield
76    yield
77    yield([])
78    yield(*[])
79  end
80
81  def echo_yield(*arg)
82    yield(*arg)
83    nil
84  end
85
86  def echo_yield_0
87    yield
88    nil
89  end
90
91  def echo_yield_1(one)
92    yield(one)
93    nil
94  end
95
96  def echo_yield_2(one, two)
97    yield(one, two)
98    nil
99  end
100
101  def xarray_each
102    xary = [XArray.new([0])]
103    xary.each do |x|
104      yield(x)
105    end
106    nil
107  end
108
109  def xarray2_hash
110    unless @xary2_hash
111      @xary2_hash = { "a" => XArray2.new([0]), "b" => XArray2.new([1]) }
112    end
113    DRbObject.new(@xary2_hash)
114  end
115
116  def simple_hash
117    unless @hash
118      @hash = { 'a'=>:a, 'b'=>:b }
119    end
120    DRbObject.new(@hash)
121  end
122
123  def [](key)
124    key.to_s
125  end
126
127  def to_a
128    [self]
129  end
130
131  def method_missing(msg, *a, &b)
132    if msg == :missing
133      return true
134    else
135      super(msg, *a, &b)
136    end
137  end
138
139  private
140  def call_private_method
141    true
142  end
143
144  protected
145  def call_protected_method
146    true
147  end
148end
149
150if __FILE__ == $0
151  def ARGV.shift
152    it = super()
153    raise "usage: #{$0} <manager-uri> <name>" unless it
154    it
155  end
156
157  DRb::DRbServer.default_argc_limit(8)
158  DRb::DRbServer.default_load_limit(4096)
159  DRb.start_service('druby://localhost:0', DRbEx.new)
160  es = DRb::ExtServ.new(ARGV.shift, ARGV.shift)
161  DRb.thread.join
162  es.stop_service if es.alive?
163end
164