@@ -272,6 +272,92 @@ pub async fn test_crowded() -> eyre::Result<()> {
272
272
Ok ( ( ) )
273
273
}
274
274
275
+ /** Generate a seed and then use it */
276
+ #[ async_std:: test]
277
+ pub async fn test_seeds ( ) -> eyre:: Result < ( ) > {
278
+ init_logger ( ) ;
279
+
280
+ /* Generate the seed */
281
+
282
+ let seed_ability = magic_wormhole:: SeedAbility :: < false > {
283
+ display_names : vec ! [ "foo" . into( ) , "bar" . into( ) ] ,
284
+ known_seeds : [ Default :: default ( ) ] . into_iter ( ) . collect ( ) ,
285
+ } ;
286
+ let seed_ability2 = seed_ability. clone ( ) ;
287
+
288
+ let ( code_tx, code_rx) = futures:: channel:: oneshot:: channel ( ) ;
289
+
290
+ let seed_1 = async_std:: task:: Builder :: new ( )
291
+ . name ( "leader" . to_owned ( ) )
292
+ . spawn ( async {
293
+ let ( welcome, connector) = Wormhole :: connect_without_code (
294
+ transfer:: APP_CONFIG . id ( TEST_APPID ) ,
295
+ 2 ,
296
+ Some ( seed_ability) ,
297
+ )
298
+ . await ?;
299
+ code_tx. send ( welcome. code ) . unwrap ( ) ;
300
+ let mut wormhole = connector. await ?;
301
+ let seed = wormhole. take_seed ( ) ;
302
+ wormhole. close ( ) . await ?;
303
+ eyre:: Result :: < _ > :: Ok ( seed)
304
+ } ) ?;
305
+ let seed_2 = async_std:: task:: Builder :: new ( )
306
+ . name ( "follower" . to_owned ( ) )
307
+ . spawn ( async {
308
+ let code = code_rx. await ?;
309
+ let ( _welcome, mut wormhole) = Wormhole :: connect_with_code (
310
+ transfer:: APP_CONFIG . id ( TEST_APPID ) ,
311
+ code,
312
+ Some ( seed_ability2) ,
313
+ )
314
+ . await ?;
315
+ let seed = wormhole. take_seed ( ) ;
316
+ wormhole. close ( ) . await ?;
317
+ eyre:: Result :: < _ > :: Ok ( seed)
318
+ } ) ?;
319
+
320
+ let seed_1 = seed_1. await ?. expect ( "Seed must be Some" ) ;
321
+ let seed_2 = seed_2. await ?. expect ( "Seed must be Some" ) ;
322
+
323
+ assert_eq ! ( seed_1. session_seed. seed, seed_2. session_seed. seed) ;
324
+ assert_eq ! (
325
+ seed_1. session_seed. display_names,
326
+ seed_2. session_seed. display_names
327
+ ) ;
328
+ assert_eq ! ( seed_1. existing_seeds, seed_2. existing_seeds) ;
329
+
330
+ /* Resume the seed */
331
+
332
+ let task_1 = async_std:: task:: Builder :: new ( )
333
+ . name ( "leader" . to_owned ( ) )
334
+ . spawn ( async move {
335
+ let wormhole = Wormhole :: connect_with_seed (
336
+ transfer:: APP_CONFIG . id ( TEST_APPID ) ,
337
+ seed_1. session_seed . seed ,
338
+ )
339
+ . await ?;
340
+ wormhole. close ( ) . await ?;
341
+ eyre:: Result :: < _ > :: Ok ( ( ) )
342
+ } ) ?;
343
+ let task_2 = async_std:: task:: Builder :: new ( )
344
+ . name ( "follower" . to_owned ( ) )
345
+ . spawn ( async move {
346
+ let wormhole = Wormhole :: connect_with_seed (
347
+ transfer:: APP_CONFIG . id ( TEST_APPID ) ,
348
+ seed_2. session_seed . seed ,
349
+ )
350
+ . await ?;
351
+ wormhole. close ( ) . await ?;
352
+ eyre:: Result :: < _ > :: Ok ( ( ) )
353
+ } ) ?;
354
+
355
+ task_1. await ?;
356
+ task_2. await ?;
357
+
358
+ Ok ( ( ) )
359
+ }
360
+
275
361
#[ test]
276
362
fn test_phase ( ) {
277
363
let p = Phase :: PAKE ;
0 commit comments