Skip to content

Commit 301e93f

Browse files
六滔bergwolf
六滔
authored andcommitted
api/server: add unit test for fuser server api
Signed-off-by: Qinqi Qu <[email protected]>
1 parent ecc1422 commit 301e93f

File tree

2 files changed

+189
-0
lines changed

2 files changed

+189
-0
lines changed

Diff for: src/api/server/mod.rs

+40
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,8 @@ impl<'a, F: FileSystem, S: BitmapSlice> SrvContext<'a, F, S> {
213213
#[cfg(test)]
214214
mod tests {
215215
use super::*;
216+
#[cfg(feature = "fusedev")]
217+
use crate::transport::FuseBuf;
216218

217219
#[test]
218220
fn test_extract_cstrs() {
@@ -249,4 +251,42 @@ mod tests {
249251
ServerUtil::extract_two_cstrs(&[0x1u8, 0x2u8, 0x0]).unwrap_err();
250252
ServerUtil::extract_two_cstrs(&[0x1u8, 0x2u8]).unwrap_err();
251253
}
254+
255+
#[cfg(feature = "fusedev")]
256+
#[test]
257+
fn test_get_message_body() {
258+
let mut read_buf = [0u8; 4096];
259+
260+
let mut r = Reader::<()>::from_fuse_buffer(FuseBuf::new(&mut read_buf)).unwrap();
261+
let in_header = InHeader {
262+
len: 0x1000,
263+
..Default::default()
264+
};
265+
let buf = ServerUtil::get_message_body(&mut r, &in_header, 0).unwrap();
266+
assert_eq!(buf.len(), 0x1000 - size_of::<InHeader>());
267+
268+
let mut r = Reader::<()>::from_fuse_buffer(FuseBuf::new(&mut read_buf)).unwrap();
269+
let in_header = InHeader {
270+
len: 0x1000,
271+
..Default::default()
272+
};
273+
let buf = ServerUtil::get_message_body(&mut r, &in_header, 0x100).unwrap();
274+
assert_eq!(buf.len(), 0x1000 - size_of::<InHeader>() - 0x100);
275+
276+
let mut r = Reader::<()>::from_fuse_buffer(FuseBuf::new(&mut read_buf)).unwrap();
277+
let in_header = InHeader {
278+
len: 0x1000,
279+
..Default::default()
280+
};
281+
// shoutld fail because of invalid sub header size
282+
assert!(ServerUtil::get_message_body(&mut r, &in_header, 0x1000).is_err());
283+
284+
let mut r = Reader::<()>::from_fuse_buffer(FuseBuf::new(&mut read_buf)).unwrap();
285+
let in_header = InHeader {
286+
len: 0x1000,
287+
..Default::default()
288+
};
289+
// shoutld fail because of invalid sub header size
290+
assert!(ServerUtil::get_message_body(&mut r, &in_header, 0x1001).is_err());
291+
}
252292
}

Diff for: src/api/server/sync_io.rs

+149
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)