OSDN Git Service

d8d487bc838eb545ffc64f87dd109ea41527f3dd
[shogi-server/shogi-server.git] / test / baseclient.rb
1 require 'socket'
2 require 'stringio'
3 require 'test/unit'
4
5 class BaseClient < Test::Unit::TestCase
6   def setup
7     port = 4000
8     params = {"Host" => "localhost", "Port" => port, "Prompt" => //}
9     @socket1 = TCPSocket.open("localhost", port)
10     @socket1.sync = true
11     @socket2 = TCPSocket.open("localhost", port)
12     @socket2.sync = true
13   end
14
15   def teardown
16     @socket1.close
17     @socket2.close
18   end
19
20   def login
21     classname = self.class.name
22     cmd "LOGIN sente#{classname} dummy x1"
23     cmd "%%GAME test#{classname}-1500-0 +"
24     
25     cmd2 "LOGIN gote#{classname} dummy2 x1"
26     cmd2 "%%CHALLENGE test#{classname}-1500-0 -"
27   end
28
29   def agree
30     cmd  "AGREE"
31     sleep 0.5
32     cmd2 "AGREE"
33   end
34
35   def handshake
36     login
37
38     sleep 2 # to wait for game matching
39
40     agree
41
42     cmd  "+2726FU"
43     cmd2 "-3334FU"
44    
45     yield if block_given?
46     sleep 2
47     result  = cmd  "LOGOUT"
48     result2 = cmd2 "LOGOUT"
49     result  += read_nonblock(@socket1)
50     result2 += read_nonblock(@socket2)
51     [result, result2]
52   end
53
54   def read_nonblock(io)
55     sleep 0.05  
56     str = ""
57     begin
58       loop do   
59         str << io.read_nonblock(64)
60       end
61     rescue Errno::EAGAIN
62       # do nothing
63     rescue EOFError
64       # do nothing
65     end
66     str
67   end
68
69   def cmd(s)
70     # read the previous return
71     str = read_nonblock(@socket1)
72     @socket1.puts s if s && ! @socket1.closed?
73     str
74   end
75
76   def cmd2(s)
77     # read the previous return
78     str = read_nonblock(@socket2)
79     @socket2.puts s if s && ! @socket2.closed?
80     str
81   end
82
83   def logout12
84     cmd  "LOGOUT"
85     cmd2 "LOGOUT"
86     sleep 1
87   end
88
89   def logout21
90     cmd2 "LOGOUT"
91     cmd  "LOGOUT"
92     sleep 1
93   end
94
95   def test_dummy
96     assert true
97   end
98 end
99
100
101 class ReadFileClient < BaseClient
102   def filepath(csa_file_name)
103     return File.join(File.dirname(__FILE__), "csa", csa_file_name)
104   end
105
106   def handshake(csa)
107     login
108     sleep 1
109     agree
110     sleep 1
111
112     csa_io = StringIO.new(csa)
113     while line = csa_io.gets do
114       case line
115       when /^\+\d{4}\w{2}/
116         cmd ""
117         cmd $&
118       when /^\-\d{4}\w{2}/
119         cmd2 ""
120         cmd2 $&
121       end
122     end
123   end
124 end # ReadFileClient