@@ -3,17 +3,20 @@ use std::time::Duration;
33use crate :: common:: TestEnvironment ;
44use fake:: { Fake , Faker } ;
55use futures:: StreamExt ;
6+ use tokio:: task;
67use rabbitmq_stream_client:: {
78 error:: {
89 ClientError , ConsumerCloseError , ConsumerDeliveryError , ConsumerStoreOffsetError ,
910 ProducerCloseError ,
1011 } ,
11- types:: { Delivery , Message , OffsetSpecification } ,
12+ types:: { Delivery , Message , OffsetSpecification , SuperStreamConsumer } ,
1213 Consumer , FilterConfiguration , NoDedup , Producer ,
1314} ;
1415
1516use rabbitmq_stream_protocol:: ResponseCode ;
1617use std:: sync:: Arc ;
18+ use std:: sync:: atomic:: { AtomicU32 , Ordering } ;
19+ use rabbitmq_stream_client:: types:: { HashRoutingMurmurStrategy , RoutingStrategy } ;
1720
1821#[ tokio:: test( flavor = "multi_thread" ) ]
1922async fn consumer_test ( ) {
@@ -54,6 +57,69 @@ async fn consumer_test() {
5457 producer. close ( ) . await . unwrap ( ) ;
5558}
5659
60+ fn hash_strategy_value_extractor ( message : & Message ) -> String {
61+ let s = String :: from_utf8 ( Vec :: from ( message. data ( ) . unwrap ( ) ) ) . expect ( "Found invalid UTF-8" ) ;
62+ return s;
63+ }
64+
65+ #[ tokio:: test( flavor = "multi_thread" ) ]
66+ async fn super_stream_consumer_test ( ) {
67+ let env = TestEnvironment :: create_super_stream ( ) . await ;
68+ let reference: String = Faker . fake ( ) ;
69+
70+ let message_count = 10 ;
71+ let mut super_stream_producer = env
72+ . env
73+ . super_stream_producer ( RoutingStrategy :: HashRoutingStrategy (
74+ HashRoutingMurmurStrategy {
75+ routing_extractor : & hash_strategy_value_extractor,
76+ } ,
77+ ) )
78+ . build ( & env. super_stream )
79+ . await
80+ . unwrap ( ) ;
81+
82+ static super_stream_consumer: SuperStreamConsumer = env
83+ . env
84+ . super_stream_consumer ( )
85+ . offset ( OffsetSpecification :: Next )
86+ . build ( & env. stream )
87+ . await
88+ . unwrap ( ) ;
89+
90+ for n in 0 ..message_count {
91+ let msg = Message :: builder ( ) . body ( format ! ( "message{}" , n) ) . build ( ) ;
92+ let _ = super_stream_producer
93+ . send ( msg, |confirmation_status| async move {
94+ println ! ( "Message confirmed with status {:?}" , confirmation_status) ;
95+ } )
96+ . await
97+ . unwrap ( ) ;
98+ }
99+
100+
101+ let received_messages = Arc :: new ( AtomicU32 :: new ( 0 ) ) ;
102+ let consumers = super_stream_consumer. get_consumers ( ) . await ;
103+
104+ let mut tasks = Vec :: new ( ) ;
105+ for mut consumer in consumers. into_iter ( ) {
106+ let received_messages_outer = received_messages. clone ( ) ;
107+ tasks. push ( task:: spawn ( async move {
108+ let inner_received_messages = received_messages_outer. clone ( ) ;
109+ let delivery = consumer. next ( ) . await . unwrap ( ) ;
110+ let _ = String :: from_utf8 ( delivery. unwrap ( ) . message ( ) . data ( ) . unwrap ( ) . to_vec ( ) ) . unwrap ( ) ;
111+ inner_received_messages. fetch_add ( 1 , Ordering :: Relaxed ) ;
112+
113+ } ) ) ;
114+ }
115+
116+ futures:: future:: join_all ( tasks) . await ;
117+
118+ assert ! ( received_messages. fetch_add( 1 , Ordering :: Relaxed ) == message_count) ;
119+ //consumer.handle().close().await.unwrap();
120+ super_stream_producer. close ( ) . await . unwrap ( ) ;
121+ }
122+
57123#[ tokio:: test( flavor = "multi_thread" ) ]
58124async fn consumer_test_offset_specification_offset ( ) {
59125 let env = TestEnvironment :: create ( ) . await ;
0 commit comments