12
12
// ZettaScale Zenoh Team, <zenoh@zettascale.tech>
13
13
//
14
14
15
- import { Config , Session , Query , Reply , KeyExpr , Receiver , ZBytes , Selector , ReplyError , Parameters , Sample } from "@eclipse-zenoh/zenoh-ts" ;
16
- import { assert_eq } from "./common/assertions.ts" ;
15
+ import { Config , Session , Query , Reply , KeyExpr , Receiver , ZBytes , Selector , ReplyError , Parameters , Sample , QueryTarget } from "@eclipse-zenoh/zenoh-ts" ;
16
+ import { assert_eq , run_test } from "./common/assertions.ts" ;
17
17
18
- async function queryableGetCallbackTest ( ) {
18
+ async function queryableSessionGetCallbackTest ( ) {
19
19
const ke_queryable = new KeyExpr ( "zenoh/test/*" ) ;
20
20
const ke_get = new KeyExpr ( "zenoh/test/1" ) ;
21
21
const queries : Query [ ] = [ ] ;
@@ -84,7 +84,7 @@ async function queryableGetCallbackTest() {
84
84
await session2 . close ( ) ;
85
85
}
86
86
87
- async function queryableGetChannelTest ( ) {
87
+ async function queryableSessionGetChannelTest ( ) {
88
88
const ke = new KeyExpr ( "zenoh/test/*" ) ;
89
89
const selector = new KeyExpr ( "zenoh/test/1" ) ;
90
90
@@ -147,5 +147,160 @@ async function queryableGetChannelTest() {
147
147
await session2 . close ( ) ;
148
148
}
149
149
150
- await queryableGetCallbackTest ( ) ;
151
- await queryableGetChannelTest ( ) ;
150
+ async function queriableQuerierGetChannelTest ( ) {
151
+ const ke = new KeyExpr ( "zenoh/test/*" ) ;
152
+ const selector = new KeyExpr ( "zenoh/test/1" ) ;
153
+
154
+ const session1 = await Session . open ( new Config ( "ws/127.0.0.1:10000" ) ) ;
155
+ const session2 = await Session . open ( new Config ( "ws/127.0.0.1:10000" ) ) ;
156
+
157
+ const queryable = session1 . declare_queryable ( ke , { complete : true } ) ;
158
+
159
+ // sleep for 1 second to ensure the queryable is ready
160
+ await new Promise ( ( resolve ) => setTimeout ( resolve , 1000 ) ) ;
161
+
162
+ const querier = session2 . declare_querier ( selector , {
163
+ target : QueryTarget . BestMatching
164
+ } ) ;
165
+
166
+ // First query with ok parameters
167
+ const receiver1 = await querier . get ( new Parameters ( "p=ok" ) , { payload : "1" } ) ;
168
+ let query = await queryable . receive ( ) ;
169
+ assert_eq ( query instanceof Query , true , "Expected query to be an instance of Query" ) ;
170
+ if ( query instanceof Query ) {
171
+ assert_eq ( query . key_expr ( ) . toString ( ) , selector . toString ( ) , "Key mismatch" ) ;
172
+ assert_eq ( query . parameters ( ) . toString ( ) , "p=ok" , "Parameters mismatch" ) ;
173
+ assert_eq ( query . payload ( ) ?. to_string ( ) , "1" , "Payload mismatch" ) ;
174
+ query . reply ( query . key_expr ( ) , "1" ) ;
175
+ }
176
+
177
+ // sleep to ensure the reply is processed
178
+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
179
+
180
+ if ( receiver1 ) {
181
+ let reply = await receiver1 . receive ( ) ;
182
+ assert_eq ( reply instanceof Reply , true , "Expected reply to be an instance of Reply" ) ;
183
+ if ( reply instanceof Reply ) {
184
+ const result = reply . result ( ) ;
185
+ assert_eq ( result instanceof ReplyError , false , "Reply should be OK" ) ;
186
+ if ( ! ( result instanceof ReplyError ) ) {
187
+ assert_eq ( result . payload ( ) . to_string ( ) , "1" , "Reply payload mismatch" ) ;
188
+ }
189
+ }
190
+ }
191
+
192
+ // Second query using the same querier with error parameters
193
+ const receiver2 = await querier . get ( new Parameters ( "p=err" ) , { payload : "2" } ) ;
194
+ query = await queryable . receive ( ) ;
195
+ assert_eq ( query instanceof Query , true , "Expected query to be an instance of Query" ) ;
196
+ if ( query instanceof Query ) {
197
+ assert_eq ( query . key_expr ( ) . toString ( ) , selector . toString ( ) , "Key mismatch" ) ;
198
+ assert_eq ( query . parameters ( ) . toString ( ) , "p=err" , "Parameters mismatch" ) ;
199
+ assert_eq ( query . payload ( ) ?. to_string ( ) , "2" , "Payload mismatch" ) ;
200
+ query . reply_err ( "err" ) ;
201
+ }
202
+
203
+ // sleep to ensure the reply is processed
204
+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
205
+
206
+ if ( receiver2 ) {
207
+ let reply = await receiver2 . receive ( ) ;
208
+ assert_eq ( reply instanceof Reply , true , "Expected reply to be an instance of Reply" ) ;
209
+ if ( reply instanceof Reply ) {
210
+ const result = reply . result ( ) ;
211
+ assert_eq ( result instanceof ReplyError , true , "Reply should be an error" ) ;
212
+ if ( result instanceof ReplyError ) {
213
+ assert_eq ( result . payload ( ) . to_string ( ) , "err" , "Error payload mismatch" ) ;
214
+ }
215
+ }
216
+ }
217
+
218
+ querier . undeclare ( ) ;
219
+ await queryable . undeclare ( ) ;
220
+ await session1 . close ( ) ;
221
+ await session2 . close ( ) ;
222
+ }
223
+
224
+ async function queriableQuerierGetCallbackTest ( ) {
225
+ const ke = new KeyExpr ( "zenoh/test/*" ) ;
226
+ const selector = new KeyExpr ( "zenoh/test/1" ) ;
227
+ const queries : Query [ ] = [ ] ;
228
+ const replies : Reply [ ] = [ ] ;
229
+
230
+ const session1 = await Session . open ( new Config ( "ws/127.0.0.1:10000" ) ) ;
231
+ const session2 = await Session . open ( new Config ( "ws/127.0.0.1:10000" ) ) ;
232
+
233
+ const queryable = session1 . declare_queryable ( ke , { complete : true } ) ;
234
+
235
+ // sleep for 1 second to ensure the queryable is ready
236
+ await new Promise ( ( resolve ) => setTimeout ( resolve , 1000 ) ) ;
237
+
238
+ const querier = session2 . declare_querier ( selector , {
239
+ target : QueryTarget . BestMatching
240
+ } ) ;
241
+
242
+ const handler = async ( reply : Reply ) => { replies . push ( reply ) ; } ;
243
+
244
+ // First query with ok parameters
245
+ querier . get ( new Parameters ( "p=ok" ) , {
246
+ payload : "1" ,
247
+ handler : handler
248
+ } ) ;
249
+
250
+ // sleep to ensure the request is handled
251
+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
252
+
253
+ let query = await queryable . receive ( ) ;
254
+ assert_eq ( query instanceof Query , true , "Expected query to be an instance of Query" ) ;
255
+ if ( query instanceof Query ) {
256
+ queries . push ( query ) ;
257
+ assert_eq ( query . key_expr ( ) . toString ( ) , selector . toString ( ) , "Key mismatch" ) ;
258
+ assert_eq ( query . parameters ( ) . toString ( ) , "p=ok" , "Parameters mismatch" ) ;
259
+ assert_eq ( query . payload ( ) ?. to_string ( ) , "1" , "Payload mismatch" ) ;
260
+ query . reply ( query . key_expr ( ) , "1" ) ;
261
+ }
262
+
263
+ // Second query using the same querier with error parameters
264
+ querier . get ( new Parameters ( "p=err" ) , {
265
+ payload : "2" ,
266
+ handler : handler
267
+ } ) ;
268
+
269
+ // sleep to ensure the request is handled
270
+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
271
+
272
+ query = await queryable . receive ( ) ;
273
+ assert_eq ( query instanceof Query , true , "Expected query to be an instance of Query" ) ;
274
+ if ( query instanceof Query ) {
275
+ queries . push ( query ) ;
276
+ assert_eq ( query . key_expr ( ) . toString ( ) , selector . toString ( ) , "Key mismatch" ) ;
277
+ assert_eq ( query . parameters ( ) . toString ( ) , "p=err" , "Parameters mismatch" ) ;
278
+ assert_eq ( query . payload ( ) ?. to_string ( ) , "2" , "Payload mismatch" ) ;
279
+ query . reply_err ( "err" ) ;
280
+ }
281
+
282
+ // sleep to ensure replies are processed
283
+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
284
+
285
+ assert_eq ( queries . length , 2 , "Queries received" ) ;
286
+ assert_eq ( replies . length , 2 , "Replies received" ) ;
287
+
288
+ assert_eq ( replies [ 0 ] . result ( ) instanceof Sample , true , "Reply 0 should be Sample" ) ;
289
+ if ( ! ( replies [ 0 ] . result ( ) instanceof ReplyError ) ) {
290
+ assert_eq ( replies [ 0 ] . result ( ) . payload ( ) . to_string ( ) , "1" , "Reply payload mismatch" ) ;
291
+ }
292
+ assert_eq ( replies [ 1 ] . result ( ) instanceof ReplyError , true , "Reply 1 should be ReplyError" ) ;
293
+ if ( replies [ 1 ] . result ( ) instanceof ReplyError ) {
294
+ assert_eq ( replies [ 1 ] . result ( ) . payload ( ) . to_string ( ) , "err" , "Error payload mismatch" ) ;
295
+ }
296
+
297
+ querier . undeclare ( ) ;
298
+ await queryable . undeclare ( ) ;
299
+ await session1 . close ( ) ;
300
+ await session2 . close ( ) ;
301
+ }
302
+
303
+ await run_test ( queryableSessionGetCallbackTest ) ;
304
+ await run_test ( queryableSessionGetChannelTest ) ;
305
+ await run_test ( queriableQuerierGetChannelTest ) ;
306
+ await run_test ( queriableQuerierGetCallbackTest ) ;
0 commit comments