Browse Source

BrokerClient: support for notifications request

master
Denis Tereshkin 9 years ago
parent
commit
e42ea94eab
  1. 17
      src/ATrade/Broker/Client.hs
  2. 16
      test/TestBrokerClient.hs

17
src/ATrade/Broker/Client.hs

@ -4,7 +4,8 @@ module ATrade.Broker.Client (
startBrokerClient, startBrokerClient,
stopBrokerClient, stopBrokerClient,
submitOrder, submitOrder,
cancelOrder cancelOrder,
getNotifications
) where ) where
import ATrade.Types import ATrade.Types
@ -29,6 +30,7 @@ data BrokerClientHandle = BrokerClientHandle {
completionMvar :: MVar (), completionMvar :: MVar (),
submitOrder :: Order -> IO (Either T.Text OrderId), submitOrder :: Order -> IO (Either T.Text OrderId),
cancelOrder :: OrderId -> IO (Either T.Text ()), cancelOrder :: OrderId -> IO (Either T.Text ()),
getNotifications :: IO (Either T.Text [Notification]),
cmdVar :: MVar BrokerServerRequest, cmdVar :: MVar BrokerServerRequest,
respVar :: MVar BrokerServerResponse respVar :: MVar BrokerServerResponse
} }
@ -61,6 +63,7 @@ startBrokerClient ctx endpoint = do
completionMvar = compMv, completionMvar = compMv,
submitOrder = bcSubmitOrder idCounter cmdVar respVar, submitOrder = bcSubmitOrder idCounter cmdVar respVar,
cancelOrder = bcCancelOrder idCounter cmdVar respVar, cancelOrder = bcCancelOrder idCounter cmdVar respVar,
getNotifications = bcGetNotifications idCounter cmdVar respVar,
cmdVar = cmdVar, cmdVar = cmdVar,
respVar = respVar respVar = respVar
} }
@ -80,7 +83,7 @@ bcSubmitOrder idCounter cmdVar respVar order = do
_ -> return $ Left "Unknown error" _ -> return $ Left "Unknown error"
(ResponseError msg) -> return $ Left msg (ResponseError msg) -> return $ Left msg
bcCancelOrder :: IORef RequestSqnum -> MVar BrokerServerRequest -> MVar BrokerServerResponse -> OrderId -> IO (Either T.Text ())
bcCancelOrder idCounter cmdVar respVar orderId = do bcCancelOrder idCounter cmdVar respVar orderId = do
sqnum <- nextId idCounter sqnum <- nextId idCounter
putMVar cmdVar (RequestCancelOrder sqnum orderId) putMVar cmdVar (RequestCancelOrder sqnum orderId)
@ -90,4 +93,12 @@ bcCancelOrder idCounter cmdVar respVar orderId = do
_ -> return $ Left "Unknown error" _ -> return $ Left "Unknown error"
(ResponseError msg) -> return $ Left msg (ResponseError msg) -> return $ Left msg
bcGetNotifications :: IORef RequestSqnum -> MVar BrokerServerRequest -> MVar BrokerServerResponse -> IO (Either T.Text [Notification])
bcGetNotifications idCounter cmdVar respVar = do
sqnum <- nextId idCounter
putMVar cmdVar (RequestNotifications sqnum)
resp <- takeMVar respVar
case resp of
(ResponseNotifications ns) -> return $ Right ns
_ -> return $ Left "Unknown error"
(ResponseError msg) -> return $ Left msg

16
test/TestBrokerClient.hs

@ -38,6 +38,7 @@ import MockBroker
unitTests = testGroup "Broker.Client" [ unitTests = testGroup "Broker.Client" [
testBrokerClientStartStop testBrokerClientStartStop
, testBrokerClientCancelOrder , testBrokerClientCancelOrder
, testBrokerClientGetNotifications
] ]
makeEndpoint = do makeEndpoint = do
@ -77,3 +78,18 @@ testBrokerClientCancelOrder = testCase "Broker client: submit and cancel order"
Right _ -> return() Right _ -> return()
))) )))
testBrokerClientGetNotifications = testCase "Broker client: get notifications" $ withContext (\ctx -> do
ep <- makeEndpoint
(mockBroker, broState) <- mkMockBroker ["demo"]
bracket (startBrokerServer [mockBroker] ctx ep) stopBrokerServer (\broS ->
bracket (startBrokerClient ctx ep) stopBrokerClient (\broC -> do
maybeOid <- submitOrder broC defaultOrder
case maybeOid of
Left err -> assertFailure "Invalid response"
Right oid -> do
maybeNs <- getNotifications broC
case maybeNs of
Left err -> assertFailure "Invalid response"
Right ns -> 1 @=? length ns
)))

Loading…
Cancel
Save