From 82091812601a49c134cbfa0038ebb36556a7f902 Mon Sep 17 00:00:00 2001 From: Denis Tereshkin Date: Thu, 29 Sep 2016 09:04:01 +0700 Subject: [PATCH] Broker client: skeleton --- src/ATrade/Broker/Client.hs | 32 ++++++++++++++++++++ test/TestBrokerClient.hs | 58 +++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 src/ATrade/Broker/Client.hs create mode 100644 test/TestBrokerClient.hs diff --git a/src/ATrade/Broker/Client.hs b/src/ATrade/Broker/Client.hs new file mode 100644 index 0000000..6c08fd9 --- /dev/null +++ b/src/ATrade/Broker/Client.hs @@ -0,0 +1,32 @@ +{-# LANGUAGE OverloadedStrings #-} + +module ATrade.Broker.Client ( +) where + +import ATrade.Types +import ATrade.Broker.Protocol +import Control.Concurrent hiding (readChan, writeChan) +import Control.Concurrent.BoundedChan +import Control.Concurrent.MVar +import Control.Exception +import Data.List.NonEmpty +import qualified Data.Text as T +import qualified Data.ByteString.Lazy as BL +import Data.Text.Encoding +import System.ZMQ4 +import System.Log.Logger + +data BrokerClientHandle = BrokerClientHandle { + tid :: ThreadId, + completionMvar :: compMv, + submitOrder :: Order -> IO (Either T.Text OrderId), + cancelOrder :: OrderId -> IO (Either T.Text ()), + cmdVar :: MVar BrokerServerRequest, + respVar :: MVar BrokerServerResponse +} + +startBrokerClient :: Context -> T.Text -> IO BrokerClientHandle +startBrokerClient ctx endpoint = undefined + +stopBrokerClient :: BrokerClientHandle -> IO () +stopBrokerClient handle = undefined diff --git a/test/TestBrokerClient.hs b/test/TestBrokerClient.hs new file mode 100644 index 0000000..c971e0f --- /dev/null +++ b/test/TestBrokerClient.hs @@ -0,0 +1,58 @@ + +{-# LANGUAGE OverloadedStrings #-} + +module TestBrokerServer ( + unitTests +) where + +import Test.Tasty +import Test.Tasty.SmallCheck as SC +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 +import ATrade.Util +import qualified Data.Text as T +import Control.Monad +import Control.Monad.Loops +import Control.Concurrent.MVar +import Control.Concurrent.BoundedChan +import Control.Concurrent hiding (writeChan) +import Control.Exception +import System.ZMQ4 +import Data.Aeson +import Data.Time.Clock +import Data.Time.Calendar +import Data.Maybe +import qualified Data.List as L +import Data.IORef +import Data.UUID as U +import Data.UUID.V4 as UV4 +import MockBroker + +unitTests = testGroup "Broker.Client" [] + +makeEndpoint = do + uid <- toText <$> UV4.nextRandom + return $ "inproc://brokerserver" `T.append` uid + +defaultOrder = mkOrder { + orderAccountId = "demo", + orderSecurity = "FOO", + orderPrice = Market, + orderQuantity = 10, + orderOperation = Buy + } + +testBrokerClientStartStop = testCase "Broker client starts and stops" $ withContext (\ctx -> do + ep <- makeEndpoint + (mockBroker, broState) <- mkMockBroker ["demo"] + bracket (startBrokerServer [mockBroker] ctx ep) stopBrokerServer (\broS -> + bracket (startBrokerClient ctx ep) stopBrokerClient (\broC -> + oid <- submitOrder broC defaultOrder + ))) +