@@ -1401,3 +1401,152 @@ fn add_dirent<S: BitmapSlice>(
1401
1401
Ok ( total_len)
1402
1402
}
1403
1403
}
1404
+
1405
+ #[ cfg( test) ]
1406
+ mod tests {
1407
+
1408
+ #[ cfg( all( feature = "fusedev" , target_os = "linux" ) ) ]
1409
+ mod tests_fusedev {
1410
+ use super :: super :: * ;
1411
+ use crate :: passthrough:: { Config , PassthroughFs } ;
1412
+ use crate :: transport:: FuseBuf ;
1413
+
1414
+ use std:: fs:: File ;
1415
+ use std:: os:: unix:: io:: AsRawFd ;
1416
+ use vmm_sys_util:: tempfile:: TempFile ;
1417
+
1418
+ fn prepare_srvcontext < ' a > (
1419
+ read_buf : & ' a mut [ u8 ] ,
1420
+ write_buf : & ' a mut [ u8 ] ,
1421
+ ) -> ( SrvContext < ' a , PassthroughFs > , File ) {
1422
+ let file = TempFile :: new ( ) . unwrap ( ) . into_file ( ) ;
1423
+ let reader = Reader :: < ( ) > :: from_fuse_buffer ( FuseBuf :: new ( read_buf) ) . unwrap ( ) ;
1424
+ let writer = FuseDevWriter :: < ( ) > :: new ( file. as_raw_fd ( ) , write_buf) . unwrap ( ) ;
1425
+ let in_header = InHeader :: default ( ) ;
1426
+ (
1427
+ SrvContext :: < PassthroughFs > :: new ( in_header, reader, writer. into ( ) ) ,
1428
+ file,
1429
+ )
1430
+ }
1431
+
1432
+ #[ test]
1433
+ fn test_server_init ( ) {
1434
+ let fs = PassthroughFs :: < ( ) > :: new ( Config :: default ( ) ) . unwrap ( ) ;
1435
+ let server = Server :: new ( fs) ;
1436
+
1437
+ let mut read_buf = [
1438
+ 0x8u8 , 0x0 , 0x0 , 0x0 , // major = 0x0008
1439
+ 0x0u8 , 0x0 , 0x0 , 0x0 , // minor = 0x0008
1440
+ 0x0 , 0x0 , 0x0 , 0x0 , // max_readahead = 0x0000
1441
+ 0x0 , 0x0 , 0x0 , 0x0 , // flags = 0x0000
1442
+ ] ;
1443
+ let mut write_buf = [ 0u8 ; 4096 ] ;
1444
+ let ( ctx, _file) = prepare_srvcontext ( & mut read_buf, & mut write_buf) ;
1445
+
1446
+ let res = server. init ( ctx) . unwrap ( ) ;
1447
+ assert_eq ! ( res, 80 ) ;
1448
+
1449
+ let mut read_buf1 = [
1450
+ 0x7u8 , 0x0 , 0x0 , 0x0 , // major = 0x0007
1451
+ 0x0u8 , 0x0 , 0x0 , 0x0 , // minor = 0x0000
1452
+ 0x0 , 0x0 , 0x0 , 0x0 , // max_readahead = 0x0000
1453
+ 0x0 , 0x0 , 0x0 , 0x0 , // flags = 0x0000
1454
+ ] ;
1455
+ let mut write_buf1 = [ 0u8 ; 4096 ] ;
1456
+ let ( ctx1, _file) = prepare_srvcontext ( & mut read_buf1, & mut write_buf1) ;
1457
+
1458
+ let res = server. init ( ctx1) . unwrap ( ) ;
1459
+ assert_eq ! ( res, 24 ) ;
1460
+ }
1461
+
1462
+ #[ test]
1463
+ fn test_server_write ( ) {
1464
+ let fs = PassthroughFs :: < ( ) > :: new ( Config :: default ( ) ) . unwrap ( ) ;
1465
+ let server = Server :: new ( fs) ;
1466
+
1467
+ let mut read_buf = [ 0u8 ; 4096 ] ;
1468
+ let mut write_buf = [ 0u8 ; 4096 ] ;
1469
+ let ( ctx, _file) = prepare_srvcontext ( & mut read_buf, & mut write_buf) ;
1470
+
1471
+ let res = server. write ( ctx) . unwrap ( ) ;
1472
+ assert_eq ! ( res, 16 ) ;
1473
+ }
1474
+
1475
+ #[ test]
1476
+ fn test_server_read ( ) {
1477
+ let fs = PassthroughFs :: < ( ) > :: new ( Config :: default ( ) ) . unwrap ( ) ;
1478
+ let server = Server :: new ( fs) ;
1479
+
1480
+ let mut read_buf = [ 0u8 ; 4096 ] ;
1481
+ let mut write_buf = [ 0u8 ; 4096 ] ;
1482
+ let ( ctx, _file) = prepare_srvcontext ( & mut read_buf, & mut write_buf) ;
1483
+
1484
+ let res = server. read ( ctx) . unwrap ( ) ;
1485
+ assert_eq ! ( res, 16 ) ;
1486
+ }
1487
+
1488
+ #[ test]
1489
+ fn test_server_readdir ( ) {
1490
+ let fs = PassthroughFs :: < ( ) > :: new ( Config :: default ( ) ) . unwrap ( ) ;
1491
+ let server = Server :: new ( fs) ;
1492
+
1493
+ let mut read_buf = [ 0u8 ; 4096 ] ;
1494
+ let mut write_buf = [ 0u8 ; 4096 ] ;
1495
+ let ( ctx, _file) = prepare_srvcontext ( & mut read_buf, & mut write_buf) ;
1496
+
1497
+ let res = server. do_readdir ( ctx, true ) . unwrap ( ) ;
1498
+ assert_eq ! ( res, 16 ) ;
1499
+ }
1500
+
1501
+ #[ test]
1502
+ fn test_server_ioctl ( ) {
1503
+ let fs = PassthroughFs :: < ( ) > :: new ( Config :: default ( ) ) . unwrap ( ) ;
1504
+ let server = Server :: new ( fs) ;
1505
+
1506
+ let mut read_buf = [ 0u8 ; 4096 ] ;
1507
+ let mut write_buf = [ 0u8 ; 4096 ] ;
1508
+ let ( ctx, _file) = prepare_srvcontext ( & mut read_buf, & mut write_buf) ;
1509
+
1510
+ let res = server. ioctl ( ctx) . unwrap ( ) ;
1511
+ assert ! ( res > 0 ) ;
1512
+
1513
+ // construct IoctlIn with invalid in_size
1514
+ let mut read_buf_fail = [
1515
+ 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , //fh = 0
1516
+ 0x0 , 0x0 , 0x0 , 0x0 , //flags = 0
1517
+ 0x0 , 0x0 , 0x0 , 0x0 , //cmd = 0
1518
+ 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , //arg = 0
1519
+ 0x7u8 , 0x3u8 , 0x0 , 0x0 , //in_size = 0x307
1520
+ 0x0 , 0x0 , 0x0 , 0x0 , //out_size = 0
1521
+ ] ;
1522
+ let mut write_buf_fail = [ 0u8 ; 48 ] ;
1523
+ let ( ctx_fail, _file) = prepare_srvcontext ( & mut read_buf_fail, & mut write_buf_fail) ;
1524
+ let res = server. ioctl ( ctx_fail) . unwrap ( ) ;
1525
+ assert ! ( res > 0 ) ;
1526
+ }
1527
+
1528
+ #[ test]
1529
+ fn test_server_batch_forget ( ) {
1530
+ let fs = PassthroughFs :: < ( ) > :: new ( Config :: default ( ) ) . unwrap ( ) ;
1531
+ let server = Server :: new ( fs) ;
1532
+
1533
+ let mut read_buf = [ 0u8 ; 4096 ] ;
1534
+ let mut write_buf = [ 0u8 ; 4096 ] ;
1535
+ let ( ctx, _file) = prepare_srvcontext ( & mut read_buf, & mut write_buf) ;
1536
+ // forget should return 0 anyway
1537
+ assert_eq ! ( server. batch_forget( ctx) . unwrap( ) , 0 ) ;
1538
+ }
1539
+
1540
+ #[ test]
1541
+ fn test_server_forget ( ) {
1542
+ let fs = PassthroughFs :: < ( ) > :: new ( Config :: default ( ) ) . unwrap ( ) ;
1543
+ let server = Server :: new ( fs) ;
1544
+
1545
+ let mut read_buf = [ 0x1u8 , 0x2u8 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 , 0x0 ] ;
1546
+ let mut write_buf = [ 0u8 ; 4096 ] ;
1547
+ let ( ctx, _file) = prepare_srvcontext ( & mut read_buf, & mut write_buf) ;
1548
+
1549
+ assert_eq ! ( server. forget( ctx) . unwrap( ) , 0 ) ;
1550
+ }
1551
+ }
1552
+ }
0 commit comments