gameServer/stresstest3.hs
changeset 4568 f85243bf890e
parent 4566 87ee1be17d27
parent 4340 1168d7d525ff
child 4570 fa19f0579083
equal deleted inserted replaced
4566:87ee1be17d27 4568:f85243bf890e
     1 {-# LANGUAGE CPP #-}
       
     2 
       
     3 module Main where
       
     4 
       
     5 import IO
       
     6 import System.IO
       
     7 import Control.Concurrent
       
     8 import Network
       
     9 import Control.OldException
       
    10 import Control.Monad
       
    11 import System.Random
       
    12 import Control.Monad.State
       
    13 import Data.List
       
    14 
       
    15 #if !defined(mingw32_HOST_OS)
       
    16 import System.Posix
       
    17 #endif
       
    18 
       
    19 type SState = Handle
       
    20 io = liftIO
       
    21 
       
    22 readPacket :: StateT SState IO [String]
       
    23 readPacket = do
       
    24     h <- get
       
    25     p <- io $ hGetPacket h []
       
    26     return p
       
    27     where
       
    28     hGetPacket h buf = do
       
    29         l <- hGetLine h
       
    30         if (not $ null l) then hGetPacket h (buf ++ [l]) else return buf
       
    31 
       
    32 waitPacket :: String -> StateT SState IO Bool
       
    33 waitPacket s = do
       
    34     p <- readPacket
       
    35     return $ head p == s
       
    36 
       
    37 sendPacket :: [String] -> StateT SState IO ()
       
    38 sendPacket s = do
       
    39     h <- get
       
    40     io $ do
       
    41         mapM_ (hPutStrLn h) s
       
    42         hPutStrLn h ""
       
    43         hFlush h
       
    44 
       
    45 emulateSession :: StateT SState IO ()
       
    46 emulateSession = do
       
    47     n <- io $ randomRIO (100000::Int, 100100)
       
    48     waitPacket "CONNECTED"
       
    49     sendPacket ["NICK", "test" ++ (show n)]
       
    50     waitPacket "NICK"
       
    51     sendPacket ["PROTO", "31"]
       
    52     waitPacket "PROTO"
       
    53     b <- waitPacket "LOBBY:JOINED"
       
    54     --io $ print b
       
    55     sendPacket ["QUIT", "BYE"]
       
    56     return ()
       
    57 
       
    58 testing = Control.OldException.handle print $ do
       
    59     putStr "+"
       
    60     sock <- connectTo "127.0.0.1" (PortNumber 46631)
       
    61     evalStateT emulateSession sock
       
    62     --hClose sock
       
    63     putStr "-"
       
    64     hFlush stdout
       
    65 
       
    66 forks = forM_ [1..100] $ const $ do
       
    67     delay <- randomRIO (10000::Int, 30000)
       
    68     threadDelay delay
       
    69     forkIO testing
       
    70 
       
    71 main = withSocketsDo $ do
       
    72 #if !defined(mingw32_HOST_OS)
       
    73     installHandler sigPIPE Ignore Nothing;
       
    74 #endif
       
    75     forks