diff --git a/src/ATrade/Broker/Server.hs b/src/ATrade/Broker/Server.hs index c66b90f..5708171 100644 --- a/src/ATrade/Broker/Server.hs +++ b/src/ATrade/Broker/Server.hs @@ -92,16 +92,16 @@ brokerServerThread state = finally brokerServerThread' cleanup Nothing -> return (peerId, ResponseError "Unknown account") Just (RequestCancelOrder sqnum oid) -> do m <- orderToBroker <$> readIORef state - case M.lookup oid m of + case M.lookup oid m of Just bro -> do cancelOrder bro oid return (peerId, ResponseOrderCancelled oid) Nothing -> return (peerId, ResponseError "Unknown order") Just _ -> return (peerId, ResponseError "Not implemented") - Nothing -> error "foobar" + Nothing -> return (peerId, ResponseError "Unable to parse request") handleMessage x = do 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]) diff --git a/test/TestBrokerServer.hs b/test/TestBrokerServer.hs index a533b49..4ab4abe 100644 --- a/test/TestBrokerServer.hs +++ b/test/TestBrokerServer.hs @@ -10,6 +10,7 @@ import Test.Tasty.QuickCheck as QC import Test.Tasty.HUnit import ATrade.Types +import qualified Data.ByteString as B import qualified Data.ByteString.Lazy as BL import ATrade.Broker.Server import ATrade.Broker.Protocol @@ -77,7 +78,8 @@ unitTests = testGroup "Broker.Server" [testBrokerServerStartStop , testBrokerServerSubmitOrder , testBrokerServerSubmitOrderToUnknownAccount , testBrokerServerCancelOrder - , testBrokerServerCancelUnknownOrder ] + , testBrokerServerCancelUnknownOrder + , testBrokerServerCorruptedPacket ] testBrokerServerStartStop = testCase "Broker Server starts and stops" $ withContext (\ctx -> do ep <- toText <$> UV4.nextRandom @@ -191,3 +193,28 @@ testBrokerServerCancelUnknownOrder = testCaseSteps "Broker Server: order cancell Just _ -> 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