From d5c37909235b893a556f8777cd587cb2f80bb01b Mon Sep 17 00:00:00 2001 From: beatles Date: Mon, 15 Jun 2009 14:24:34 +0000 Subject: [PATCH] * [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) --- changelog | 9 +++++++++ shogi_server/game.rb | 11 ++++++++--- test/TC_ALL.rb | 1 + test/TC_before_agree.rb | 30 ++++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 test/TC_before_agree.rb diff --git a/changelog b/changelog index 0c30678..1e6ecc7 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,12 @@ +2009-06-15 Daigo Moriwaki + + * [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 * [shogi-server] diff --git a/shogi_server/game.rb b/shogi_server/game.rb index 365b608..0dc3746 100644 --- a/shogi_server/game.rb +++ b/shogi_server/game.rb @@ -350,9 +350,14 @@ class Game 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 diff --git a/test/TC_ALL.rb b/test/TC_ALL.rb index f13eb2c..619d313 100644 --- a/test/TC_ALL.rb +++ b/test/TC_ALL.rb @@ -1,6 +1,7 @@ $:.unshift File.dirname(__FILE__) require 'TC_board' +require 'TC_before_agree' require 'TC_floodgate' require 'TC_functional' require 'TC_game_result' diff --git a/test/TC_before_agree.rb b/test/TC_before_agree.rb new file mode 100644 index 0000000..c3761ac --- /dev/null +++ b/test/TC_before_agree.rb @@ -0,0 +1,30 @@ +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 -- 2.11.0