@@ -17,6 +17,7 @@ mod service_request_response {
17
17
use iceoryx2:: node:: NodeBuilder ;
18
18
use iceoryx2:: port:: client:: Client ;
19
19
use iceoryx2:: port:: server:: Server ;
20
+ use iceoryx2:: port:: LoanError ;
20
21
use iceoryx2:: prelude:: { PortFactory , * } ;
21
22
use iceoryx2:: service:: builder:: publish_subscribe:: { CustomHeaderMarker , CustomPayloadMarker } ;
22
23
use iceoryx2:: service:: static_config:: message_type_details:: { TypeDetail , TypeVariant } ;
@@ -1001,7 +1002,7 @@ mod service_request_response {
1001
1002
assert_that ! ( response. header( ) . number_of_elements( ) , eq NUMBER_OF_ELEMENTS as u64 ) ;
1002
1003
let payload_ptr = response. payload ( ) . as_ptr ( ) as * const u8 ;
1003
1004
for n in 0 ..type_details. size {
1004
- assert_that ! ( unsafe { * payload_ptr. add( n) } , eq( n % 255 ) as u8 ) ;
1005
+ assert_that ! ( unsafe { * payload_ptr. add( n) } , eq( n % 89 ) as u8 ) ;
1005
1006
}
1006
1007
}
1007
1008
@@ -1029,7 +1030,7 @@ mod service_request_response {
1029
1030
. request_user_header :: < CustomHeaderMarker > ( )
1030
1031
. response_user_header :: < CustomHeaderMarker > ( )
1031
1032
. __internal_set_request_header_type_details ( & type_details)
1032
- . create ( )
1033
+ . open ( )
1033
1034
. unwrap ( )
1034
1035
} ;
1035
1036
@@ -1051,7 +1052,7 @@ mod service_request_response {
1051
1052
}
1052
1053
1053
1054
#[ test]
1054
- fn sending_responses_with_custom_header_works < Sut : Service > ( ) {
1055
+ fn sending_response_with_custom_header_works < Sut : Service > ( ) {
1055
1056
let service_name = generate_service_name ( ) ;
1056
1057
let config = generate_isolated_config ( ) ;
1057
1058
let node = NodeBuilder :: new ( ) . config ( & config) . create :: < Sut > ( ) . unwrap ( ) ;
@@ -1074,7 +1075,7 @@ mod service_request_response {
1074
1075
. request_user_header :: < CustomHeaderMarker > ( )
1075
1076
. response_user_header :: < CustomHeaderMarker > ( )
1076
1077
. __internal_set_response_header_type_details ( & type_details)
1077
- . create ( )
1078
+ . open ( )
1078
1079
. unwrap ( )
1079
1080
} ;
1080
1081
@@ -1090,6 +1091,7 @@ mod service_request_response {
1090
1091
for n in 0 ..type_details. size {
1091
1092
unsafe { header_ptr. add ( n) . write ( ( n % 229 ) as u8 ) } ;
1092
1093
}
1094
+ unsafe { response. assume_init ( ) . send ( ) . unwrap ( ) } ;
1093
1095
1094
1096
let response = unsafe { pending_response. receive_custom_payload ( ) . unwrap ( ) . unwrap ( ) } ;
1095
1097
let header_ptr = ( response. user_header ( ) as * const CustomHeaderMarker ) as * const u8 ;
@@ -1098,6 +1100,172 @@ mod service_request_response {
1098
1100
}
1099
1101
}
1100
1102
1103
+ #[ test]
1104
+ fn send_increasing_requests_with_static_allocation_strategy_fails < Sut : Service > ( ) {
1105
+ const SLICE_SIZE : usize = 1024 ;
1106
+ let service_name = generate_service_name ( ) ;
1107
+ let config = generate_isolated_config ( ) ;
1108
+ let node = NodeBuilder :: new ( ) . config ( & config) . create :: < Sut > ( ) . unwrap ( ) ;
1109
+
1110
+ let service = node
1111
+ . service_builder ( & service_name)
1112
+ . request_response :: < [ u8 ] , u64 > ( )
1113
+ . create ( )
1114
+ . unwrap ( ) ;
1115
+
1116
+ let client = service
1117
+ . client_builder ( )
1118
+ . initial_max_slice_len ( SLICE_SIZE )
1119
+ . allocation_strategy ( AllocationStrategy :: Static )
1120
+ . create ( )
1121
+ . unwrap ( ) ;
1122
+
1123
+ let request = client. loan_slice ( SLICE_SIZE - 1 ) ;
1124
+ assert_that ! ( request, is_ok) ;
1125
+
1126
+ let request = client. loan_slice ( SLICE_SIZE ) ;
1127
+ assert_that ! ( request, is_ok) ;
1128
+
1129
+ let request = client. loan_slice ( SLICE_SIZE + 1 ) ;
1130
+ assert_that ! ( request. err( ) , eq Some ( LoanError :: ExceedsMaxLoanSize ) ) ;
1131
+ }
1132
+
1133
+ #[ test]
1134
+ fn send_increasing_responses_with_static_allocation_strategy_fails < Sut : Service > ( ) {
1135
+ const SLICE_SIZE : usize = 1024 ;
1136
+ let service_name = generate_service_name ( ) ;
1137
+ let config = generate_isolated_config ( ) ;
1138
+ let node = NodeBuilder :: new ( ) . config ( & config) . create :: < Sut > ( ) . unwrap ( ) ;
1139
+
1140
+ let service = node
1141
+ . service_builder ( & service_name)
1142
+ . request_response :: < u64 , [ u8 ] > ( )
1143
+ . create ( )
1144
+ . unwrap ( ) ;
1145
+
1146
+ let client = service. client_builder ( ) . create ( ) . unwrap ( ) ;
1147
+ let server = service
1148
+ . server_builder ( )
1149
+ . initial_max_slice_len ( SLICE_SIZE )
1150
+ . allocation_strategy ( AllocationStrategy :: Static )
1151
+ . create ( )
1152
+ . unwrap ( ) ;
1153
+ let _pending_response = client. send_copy ( 0 ) . unwrap ( ) ;
1154
+ let active_request = server. receive ( ) . unwrap ( ) . unwrap ( ) ;
1155
+
1156
+ let response = active_request. loan_slice ( SLICE_SIZE - 1 ) ;
1157
+ assert_that ! ( response, is_ok) ;
1158
+
1159
+ let response = active_request. loan_slice ( SLICE_SIZE ) ;
1160
+ assert_that ! ( response, is_ok) ;
1161
+
1162
+ let response = active_request. loan_slice ( SLICE_SIZE + 1 ) ;
1163
+ assert_that ! ( response. err( ) , eq Some ( LoanError :: ExceedsMaxLoanSize ) ) ;
1164
+ }
1165
+
1166
+ fn send_and_receive_increasing_requests_works < Sut : Service > (
1167
+ allocation_strategy : AllocationStrategy ,
1168
+ ) {
1169
+ const ITERATIONS : usize = 128 ;
1170
+ let service_name = generate_service_name ( ) ;
1171
+ let config = generate_isolated_config ( ) ;
1172
+ let node = NodeBuilder :: new ( ) . config ( & config) . create :: < Sut > ( ) . unwrap ( ) ;
1173
+
1174
+ let service = node
1175
+ . service_builder ( & service_name)
1176
+ . request_response :: < [ u8 ] , u64 > ( )
1177
+ . create ( )
1178
+ . unwrap ( ) ;
1179
+
1180
+ let client = service
1181
+ . client_builder ( )
1182
+ . initial_max_slice_len ( 1 )
1183
+ . allocation_strategy ( allocation_strategy)
1184
+ . create ( )
1185
+ . unwrap ( ) ;
1186
+ let server = service. server_builder ( ) . create ( ) . unwrap ( ) ;
1187
+
1188
+ for n in 0 ..ITERATIONS {
1189
+ let request_size = ( n + 1 ) * 32 ;
1190
+ let mut request = client. loan_slice ( request_size) . unwrap ( ) ;
1191
+ for byte in request. payload_mut ( ) {
1192
+ * byte = n as u8 ;
1193
+ }
1194
+
1195
+ let _pending_response = request. send ( ) . unwrap ( ) ;
1196
+
1197
+ let active_request = server. receive ( ) . unwrap ( ) . unwrap ( ) ;
1198
+ assert_that ! ( active_request. payload( ) , len request_size) ;
1199
+ for byte in active_request. payload ( ) {
1200
+ assert_that ! ( * byte, eq n as u8 ) ;
1201
+ }
1202
+ }
1203
+ }
1204
+
1205
+ #[ test]
1206
+ fn send_and_receive_increasing_requests_with_best_fit_allocation_works < Sut : Service > ( ) {
1207
+ send_and_receive_increasing_requests_works :: < Sut > ( AllocationStrategy :: BestFit ) ;
1208
+ }
1209
+
1210
+ #[ test]
1211
+ fn send_and_receive_increasing_requests_with_power_of_two_allocation_works < Sut : Service > ( ) {
1212
+ send_and_receive_increasing_requests_works :: < Sut > ( AllocationStrategy :: PowerOfTwo ) ;
1213
+ }
1214
+
1215
+ fn send_and_receive_increasing_responses_works < Sut : Service > (
1216
+ allocation_strategy : AllocationStrategy ,
1217
+ ) {
1218
+ const ITERATIONS : usize = 128 ;
1219
+ let service_name = generate_service_name ( ) ;
1220
+ let config = generate_isolated_config ( ) ;
1221
+ let node = NodeBuilder :: new ( ) . config ( & config) . create :: < Sut > ( ) . unwrap ( ) ;
1222
+
1223
+ let service = node
1224
+ . service_builder ( & service_name)
1225
+ . request_response :: < u64 , [ u8 ] > ( )
1226
+ . create ( )
1227
+ . unwrap ( ) ;
1228
+
1229
+ let client = service. client_builder ( ) . create ( ) . unwrap ( ) ;
1230
+ let server = service
1231
+ . server_builder ( )
1232
+ . initial_max_slice_len ( 1 )
1233
+ . allocation_strategy ( allocation_strategy)
1234
+ . create ( )
1235
+ . unwrap ( ) ;
1236
+ let pending_response = client. send_copy ( 0 ) . unwrap ( ) ;
1237
+ let active_request = server. receive ( ) . unwrap ( ) . unwrap ( ) ;
1238
+
1239
+ for n in 0 ..ITERATIONS {
1240
+ let response_size = ( n + 1 ) * 32 ;
1241
+ let mut response = active_request. loan_slice ( response_size) . unwrap ( ) ;
1242
+ for byte in response. payload_mut ( ) {
1243
+ * byte = n as u8 + 5 ;
1244
+ }
1245
+ response. send ( ) . unwrap ( ) ;
1246
+
1247
+ let response = pending_response. receive ( ) . unwrap ( ) . unwrap ( ) ;
1248
+ assert_that ! ( response. payload( ) , len response_size) ;
1249
+ for byte in response. payload ( ) {
1250
+ assert_that ! ( * byte, eq n as u8 + 5 ) ;
1251
+ }
1252
+ }
1253
+ }
1254
+
1255
+ #[ test]
1256
+ fn send_and_receive_increasing_responses_with_best_fit_allocation_strategy_works <
1257
+ Sut : Service ,
1258
+ > ( ) {
1259
+ send_and_receive_increasing_responses_works :: < Sut > ( AllocationStrategy :: BestFit ) ;
1260
+ }
1261
+
1262
+ #[ test]
1263
+ fn send_and_receive_increasing_responses_with_power_of_two_allocation_strategy_works <
1264
+ Sut : Service ,
1265
+ > ( ) {
1266
+ send_and_receive_increasing_responses_works :: < Sut > ( AllocationStrategy :: PowerOfTwo ) ;
1267
+ }
1268
+
1101
1269
#[ instantiate_tests( <iceoryx2:: service:: ipc:: Service >) ]
1102
1270
mod ipc { }
1103
1271
0 commit comments