OSDN Git Service

Merge branch '201312-usiToCsa'
[shogi-server/shogi-server.git] / test / benchmark.rb
index 2d3be05..28539d7 100644 (file)
@@ -1,14 +1,18 @@
 #!/usr/bin/ruby
 
+require 'logger'
 require 'socket'
 require 'thread'
 
+$logger = nil
+
 class BenchPlayer
   def initialize(game_name, name, sente)
     @game_name = game_name
     @name = "%s_%s" % [game_name, name]
     @turn_mark = sente ? "+" : "-"
     @nmoves = 0
+    @socket = nil
   end
   attr_reader :nmoves
 
@@ -22,37 +26,42 @@ class BenchPlayer
 
   def reader
     Thread.new do
+      Thread.pass
       loop do 
-        if r = select([@socket], nil, nil, 10)
+        if r = select([@socket], nil, nil, 300)
           str = r[0].first.gets
           if %r!^[\+\-]\d{4}\w{2},T\d+$! =~ str
             @nmoves += 1
           end
-          @message << str
+          @message << str if str
         else
-          raise "timed out"
+          $logger.warn "Timed out: %s" % [@name]
         end
       end
+      $logger.error "Socket error: %s" % [@name]
     end
   end
 
   def wait(reg)
     loop do 
       break if reg =~ @message
-      sleep 0.1
+      #$logger.debug "WAIT %s: %s" % [reg, @message]
+      sleep 0.001
+      #Thread.pass
     end
   end
 
   def wait_nmoves(n)
     loop do
       break if @nmoves == n
-      sleep 0.01
+      sleep 0.001
+      #Thread.pass
     end
   end
 
   def login
     @socket.puts "LOGIN #{@name} dummy x1"
-    wait %r!^LOGIN!
+    wait %r!^##\[LOGIN\] \+OK!
   end
 
   def game
@@ -94,12 +103,20 @@ class BenchGame
   end
 
   def start
+    $logger.info "Starting... %s" % [@game_name]
+    $logger.debug "Connecting... %s" % [@game_name]
     each_player {|player| player.connect}
+    $logger.debug "Logging in... %s" % [@game_name]
     each_player {|player| player.login}
+    $logger.debug "Sending GAME... %s" % [@game_name]
     each_player {|player| player.game}
+    $logger.debug "Waiting... %s" % [@game_name]
     each_player {|player| player.wait %r!^END Game_Summary!}
+    $logger.debug "Agreeing... %s" % [@game_name]
     each_player {|player| player.agree}
+    $logger.debug "AGREE waiting... %s" % [@game_name]
     each_player {|player| player.wait %r!^START:!}
+    $logger.info "Started %s" % [@game_name]
     turn = true # black
     nmoves = 0
     @csa.each_line do |line|
@@ -115,10 +132,15 @@ class BenchGame
         turn = true
         nmoves += 1
       when /^%TORYO/
+        $logger.debug "Waiting TORYO... %s" % [@game_name]
+        @p1.wait_nmoves nmoves
+        @p2.wait_nmoves nmoves
         turn ? @p1.toryo : @p2.toryo
       end
     end
+    $logger.info "Logging out... %s" % [@game_name]
     each_player {|player| player.logout}
+    $logger.info "Finished %s" % [@game_name]
   end
 end
 
@@ -127,11 +149,15 @@ if __FILE__ == $0
   filepath = ARGV.shift || File.join(File.dirname(__FILE__), "csa", "wdoor+floodgate-900-0+gps_normal+gps_l+20100507120007.csa")
   csa = File.open(filepath){|f| f.read} 
 
+  $logger = Logger.new(STDOUT)
+  $logger.level = $DEBUG ? Logger::DEBUG : Logger::INFO  
+
   nclients = ARGV.shift || 1
   nclients = nclients.to_i
   threads = []
   nclients.times do |i|
     threads << Thread.new do
+      Thread.pass
       game = BenchGame.new("b#{i}", csa)
       game.start
     end