OSDN Git Service

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