@@ -394,6 +394,47 @@ mod tests {
394
394
}
395
395
}
396
396
397
+ /// Tests the expected flow of types in a higher-level UEFI API.
398
+ #[ test]
399
+ fn test_uefi_flow ( ) {
400
+ fn efi_retrieve_efi_ip_addr ( addr : & mut IpAddress , is_ipv6 : bool ) {
401
+ // SAFETY: Alignment is guaranteed and memory is initialized.
402
+ unsafe {
403
+ addr. v4 . 0 [ 0 ] = 42 ;
404
+ addr. v4 . 0 [ 1 ] = 42 ;
405
+ addr. v4 . 0 [ 2 ] = 42 ;
406
+ addr. v4 . 0 [ 3 ] = 42 ;
407
+ }
408
+ if is_ipv6 {
409
+ unsafe {
410
+ addr. v6 . 0 [ 14 ] = 42 ;
411
+ addr. v6 . 0 [ 15 ] = 42 ;
412
+ }
413
+ }
414
+ }
415
+
416
+ fn high_level_retrieve_ip ( is_ipv6 : bool ) -> StdIpAddr {
417
+ let mut efi_ip_addr = IpAddress :: new_zeroed ( ) ;
418
+ efi_retrieve_efi_ip_addr ( & mut efi_ip_addr, is_ipv6) ;
419
+ unsafe { efi_ip_addr. into_std_ip_addr ( is_ipv6) }
420
+ }
421
+
422
+ let ipv4_addr = high_level_retrieve_ip ( false ) ;
423
+ let ipv4_addr: StdIpv4Addr = match ipv4_addr {
424
+ StdIpAddr :: V4 ( ipv4_addr) => ipv4_addr,
425
+ StdIpAddr :: V6 ( _) => panic ! ( "should not happen" ) ,
426
+ } ;
427
+ assert_eq ! ( ipv4_addr. octets( ) , [ 42 , 42 , 42 , 42 ] ) ;
428
+
429
+ let ipv6_addr = high_level_retrieve_ip ( true ) ;
430
+ let ipv6_addr: StdIpv6Addr = match ipv6_addr {
431
+ StdIpAddr :: V6 ( ipv6_addr) => ipv6_addr,
432
+ StdIpAddr :: V4 ( _) => panic ! ( "should not happen" ) ,
433
+ } ;
434
+ let expected = [ 42 , 42 , 42 , 42 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 42 , 42 ] ;
435
+ assert_eq ! ( ipv6_addr. octets( ) , expected) ;
436
+ }
437
+
397
438
#[ test]
398
439
fn test_efi_ip_address_abi ( ) {
399
440
#[ repr( C , packed) ]
0 commit comments