1- use hotfix:: message:: { FixMessage , RawFixMessage } ;
1+ use hotfix:: config:: SessionConfig ;
2+ use hotfix:: message:: logon:: { Logon , ResetSeqNumConfig } ;
3+ use hotfix:: message:: { FixMessage , RawFixMessage , generate_message} ;
24use hotfix:: session:: SessionRef ;
35use hotfix:: transport:: FixConnection ;
46use hotfix:: transport:: reader:: ReaderRef ;
@@ -12,18 +14,23 @@ use tokio::sync::{mpsc, oneshot};
1214
1315const DEFAULT_TIMEOUT : Duration = Duration :: from_millis ( 10 ) ;
1416
15- pub struct MockCounterparty {
17+ pub struct MockCounterparty < M > {
1618 receiver : Receiver < WriterMessage > ,
17- // History of received messages from the session
18- messages : Vec < Message > ,
19+ received_messages : Vec < Message > ,
20+ sent_messages : Vec < Vec < u8 > > ,
21+ session_ref : SessionRef < M > ,
22+ session_config : SessionConfig ,
1923 dictionary : Dictionary ,
2024 message_config : MessageConfig ,
2125 _connection : FixConnection ,
2226 _dc_sender : oneshot:: Sender < ( ) > ,
2327}
2428
25- impl MockCounterparty {
26- pub async fn start ( session_ref : SessionRef < impl FixMessage > ) -> Self {
29+ impl < M > MockCounterparty < M >
30+ where
31+ M : FixMessage ,
32+ {
33+ pub async fn start ( session_ref : SessionRef < M > , session_config : SessionConfig ) -> Self {
2734 let ( writer_ref, receiver) = Self :: create_writer ( ) ;
2835 let ( reader_ref, dc_sender) = Self :: create_reader ( ) ;
2936 let connection = FixConnection :: new ( writer_ref, reader_ref) ;
@@ -32,14 +39,39 @@ impl MockCounterparty {
3239
3340 Self {
3441 receiver,
35- messages : vec ! [ ] ,
42+ received_messages : vec ! [ ] ,
43+ sent_messages : vec ! [ ] ,
44+ session_ref,
45+ session_config,
3646 dictionary : Dictionary :: fix44 ( ) ,
3747 message_config : MessageConfig :: default ( ) ,
3848 _connection : connection,
3949 _dc_sender : dc_sender,
4050 }
4151 }
4252
53+ pub async fn send_logon ( & mut self ) {
54+ let logon = Logon :: new (
55+ self . session_config . heartbeat_interval ,
56+ ResetSeqNumConfig :: NoReset ( None ) ,
57+ ) ;
58+ self . send_message ( logon) . await ;
59+ }
60+
61+ pub async fn send_message ( & mut self , message : impl FixMessage ) {
62+ let raw_message = generate_message (
63+ & self . session_config . sender_comp_id ,
64+ & self . session_config . target_comp_id ,
65+ self . sent_messages . len ( ) + 1 ,
66+ message,
67+ )
68+ . expect ( "failed to generate message" ) ;
69+ self . sent_messages . push ( raw_message. clone ( ) ) ;
70+ self . session_ref
71+ . new_fix_message_received ( RawFixMessage :: new ( raw_message) )
72+ . await ;
73+ }
74+
4375 /// Waits for and returns the next message received from the session.
4476 ///
4577 /// A `None` response indicates we have been disconnected, either through the channel
@@ -51,8 +83,8 @@ impl MockCounterparty {
5183 . and_then ( |writer_message| match writer_message {
5284 WriterMessage :: SendMessage ( raw_message) => {
5385 let message = self . parse_message ( & raw_message) ;
54- self . messages . push ( message) ;
55- self . messages . last ( )
86+ self . received_messages . push ( message) ;
87+ self . received_messages . last ( )
5688 }
5789 WriterMessage :: Disconnect => None ,
5890 } )
@@ -73,15 +105,15 @@ impl MockCounterparty {
73105
74106 pub async fn assert_next < F > ( & mut self , assertion : F )
75107 where
76- F : FnOnce ( & Message ) -> bool ,
108+ F : FnOnce ( & Message ) ,
77109 {
78110 self . assert_next_with_timeout ( assertion, DEFAULT_TIMEOUT )
79111 . await ;
80112 }
81113
82114 pub async fn assert_next_with_timeout < F > ( & mut self , assertion : F , timeout : Duration )
83115 where
84- F : FnOnce ( & Message ) -> bool ,
116+ F : FnOnce ( & Message ) ,
85117 {
86118 match tokio:: time:: timeout ( timeout, self . get_next ( ) ) . await {
87119 Ok ( Some ( message) ) => {
0 commit comments