@@ -272,6 +272,77 @@ 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) =
294
+ Wormhole :: connect_without_code ( transfer:: APP_CONFIG . id ( TEST_APPID ) , 2 , Some ( seed_ability) )
295
+ . await ?;
296
+ code_tx. send ( welcome. code ) . unwrap ( ) ;
297
+ let mut wormhole = connector. await ?;
298
+ let seed = wormhole. take_seed ( ) ;
299
+ wormhole. close ( ) . await ?;
300
+ eyre:: Result :: < _ > :: Ok ( seed)
301
+ } ) ?;
302
+ let seed_2 = async_std:: task:: Builder :: new ( )
303
+ . name ( "follower" . to_owned ( ) )
304
+ . spawn ( async {
305
+ let code = code_rx. await ?;
306
+ let ( _welcome, mut wormhole) =
307
+ Wormhole :: connect_with_code ( transfer:: APP_CONFIG . id ( TEST_APPID ) , code, Some ( seed_ability2) )
308
+ . await ?;
309
+ let seed = wormhole. take_seed ( ) ;
310
+ wormhole. close ( ) . await ?;
311
+ eyre:: Result :: < _ > :: Ok ( seed)
312
+ } ) ?;
313
+
314
+ let seed_1 = seed_1. await ?. expect ( "Seed must be Some" ) ;
315
+ let seed_2 = seed_2. await ?. expect ( "Seed must be Some" ) ;
316
+
317
+ assert_eq ! ( seed_1. session_seed. seed, seed_2. session_seed. seed) ;
318
+ assert_eq ! ( seed_1. session_seed. display_names, seed_2. session_seed. display_names) ;
319
+ assert_eq ! ( seed_1. existing_seeds, seed_2. existing_seeds) ;
320
+
321
+ /* Resume the seed */
322
+
323
+ let task_1 = async_std:: task:: Builder :: new ( )
324
+ . name ( "leader" . to_owned ( ) )
325
+ . spawn ( async move {
326
+ let wormhole =
327
+ Wormhole :: connect_with_seed ( transfer:: APP_CONFIG . id ( TEST_APPID ) , seed_1. session_seed . seed ) . await ?;
328
+ wormhole. close ( ) . await ?;
329
+ eyre:: Result :: < _ > :: Ok ( ( ) )
330
+ } ) ?;
331
+ let task_2 = async_std:: task:: Builder :: new ( )
332
+ . name ( "follower" . to_owned ( ) )
333
+ . spawn ( async move {
334
+ let wormhole =
335
+ Wormhole :: connect_with_seed ( transfer:: APP_CONFIG . id ( TEST_APPID ) , seed_2. session_seed . seed ) . await ?;
336
+ wormhole. close ( ) . await ?;
337
+ eyre:: Result :: < _ > :: Ok ( ( ) )
338
+ } ) ?;
339
+
340
+ task_1. await ?;
341
+ task_2. await ?;
342
+
343
+ Ok ( ( ) )
344
+ }
345
+
275
346
#[ test]
276
347
fn test_phase ( ) {
277
348
let p = Phase :: PAKE ;
0 commit comments