Browse Source

BrokerServer: handle corrupt packages

master
Denis Tereshkin 9 years ago
parent
commit
608600960a
  1. 4
      src/ATrade/Broker/Server.hs
  2. 29
      test/TestBrokerServer.hs

4
src/ATrade/Broker/Server.hs

@ -98,10 +98,10 @@ brokerServerThread state = finally brokerServerThread' cleanup
return (peerId, ResponseOrderCancelled oid) return (peerId, ResponseOrderCancelled oid)
Nothing -> return (peerId, ResponseError "Unknown order") Nothing -> return (peerId, ResponseError "Unknown order")
Just _ -> return (peerId, ResponseError "Not implemented") Just _ -> return (peerId, ResponseError "Not implemented")
Nothing -> error "foobar" Nothing -> return (peerId, ResponseError "Unable to parse request")
handleMessage x = do handleMessage x = do
warningM "Broker.Server" ("Invalid packet received: " ++ show x) warningM "Broker.Server" ("Invalid packet received: " ++ show x)
error "foobar" return (B.empty, ResponseError "Invalid packet structure")
sendMessage sock (peerId, resp) = sendMulti sock (peerId :| [B.empty, BL.toStrict . encode $ resp]) sendMessage sock (peerId, resp) = sendMulti sock (peerId :| [B.empty, BL.toStrict . encode $ resp])

29
test/TestBrokerServer.hs

@ -10,6 +10,7 @@ import Test.Tasty.QuickCheck as QC
import Test.Tasty.HUnit import Test.Tasty.HUnit
import ATrade.Types import ATrade.Types
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as BL import qualified Data.ByteString.Lazy as BL
import ATrade.Broker.Server import ATrade.Broker.Server
import ATrade.Broker.Protocol import ATrade.Broker.Protocol
@ -77,7 +78,8 @@ unitTests = testGroup "Broker.Server" [testBrokerServerStartStop
, testBrokerServerSubmitOrder , testBrokerServerSubmitOrder
, testBrokerServerSubmitOrderToUnknownAccount , testBrokerServerSubmitOrderToUnknownAccount
, testBrokerServerCancelOrder , testBrokerServerCancelOrder
, testBrokerServerCancelUnknownOrder ] , testBrokerServerCancelUnknownOrder
, testBrokerServerCorruptedPacket ]
testBrokerServerStartStop = testCase "Broker Server starts and stops" $ withContext (\ctx -> do testBrokerServerStartStop = testCase "Broker Server starts and stops" $ withContext (\ctx -> do
ep <- toText <$> UV4.nextRandom ep <- toText <$> UV4.nextRandom
@ -191,3 +193,28 @@ testBrokerServerCancelUnknownOrder = testCaseSteps "Broker Server: order cancell
Just _ -> assertFailure "Invalid response" Just _ -> assertFailure "Invalid response"
Nothing -> assertFailure "Invalid response" Nothing -> assertFailure "Invalid response"
))) )))
testBrokerServerCorruptedPacket = testCaseSteps "Broker Server: corrupted packet" $
\step -> withContext (\ctx -> do
step "Setup"
ep <- makeEndpoint
(mockBroker, broState) <- mkMockBroker ["demo"]
bracket (startBrokerServer [mockBroker] ctx ep) stopBrokerServer (\broS ->
withSocket ctx Req (\sock -> do
step "Connecting"
connect sock (T.unpack ep)
step "Sending request"
send sock [] (corrupt . BL.toStrict . encode $ RequestSubmitOrder 1 defaultOrder)
threadDelay 10000
step "Reading response"
resp <- decode . BL.fromStrict <$> receive sock
case resp of
Just (ResponseError _) -> return ()
Just _ -> assertFailure "Invalid response"
Nothing -> assertFailure "Invalid response"
)))
where
corrupt = B.drop 5

Loading…
Cancel
Save