+2009-06-15 Daigo Moriwaki <daigo at debian dot org>
+
+ * [shogi-server]
+ - When a Gote player AGREEd a new game and then a Sente player
+ logged out (LOGOUT), the Gote incorrectly received a LOGOUT message
+ from the server. Since Gote's state was not AGREEd or STARTed yet,
+ the Gote should be REJECTed. This issue has been fixed.
+ (Closes: #17335)
+
2009-06-14 Daigo Moriwaki <daigo at debian dot org>
* [shogi-server]
end
def kill(killer)
- if ["agree_waiting", "start_waiting"].include?(@sente.status)
- reject(killer.name)
- elsif (@current_player == killer)
+ [@sente, @gote].each do |player|
+ if ["agree_waiting", "start_waiting"].include?(player.status)
+ reject(killer.name)
+ return # return from this method
+ end
+ end
+
+ if (@current_player == killer)
result = GameResultAbnormalWin.new(self, @next_player, @current_player)
result.process
finish
$:.unshift File.dirname(__FILE__)
require 'TC_board'
+require 'TC_before_agree'
require 'TC_floodgate'
require 'TC_functional'
require 'TC_game_result'
--- /dev/null
+require "baseclient"
+require "kconv"
+
+class TestBeforeAgree < BaseClient
+
+ def test_before_agree_gote_logout
+ login
+ result = cmd "AGREE"
+ result2 = cmd2 "LOGOUT"
+
+ result += read_nonblock(@socket1)
+ result2 += read_nonblock(@socket2)
+
+ assert(/^REJECT/ =~ result)
+ assert(/^REJECT/ =~ result2)
+ end
+
+ def test_before_agree_sente_logout
+ login
+ sleep 0.5
+ result2 = cmd2 "AGREE"
+ result = cmd "LOGOUT"
+
+ result += read_nonblock(@socket1)
+ result2 += read_nonblock(@socket2)
+
+ assert(/^REJECT/ =~ result)
+ assert(/^REJECT/ =~ result2)
+ end
+end