@@ -1401,3 +1401,152 @@ fn add_dirent<S: BitmapSlice>(
14011401 Ok ( total_len)
14021402 }
14031403}
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