//! Standard generated devices discard writes and retain their read behavior across opens. use sausage_vfs::{Device, Generated, Layer, Open}; #[tokio::test] async fn generated_devices() { let mut layer = Generated::default(); for (name, device) in [ ("null", Device::Null), ("zero", Device::Zero), ("urandom", Device::Random), ] { layer.insert_device(&format!("/{name}"), device); } assert_eq!(layer.list("/").await.unwrap().len(), 3); for name in ["null", "zero", "urandom"] { let file = layer .open( &format!("/{name}"), Open { write: true, create: true, truncate: true, ..Default::default() }, ) .await .unwrap(); assert_eq!(file.write(100, b"discard".to_vec()).await.unwrap(), 7); assert_eq!(file.append(b"discard".to_vec()).await.unwrap(), 7); file.set_size(100).await.unwrap(); file.sync().await.unwrap(); assert_eq!(file.stat().await.unwrap().size, 0); let reopened = layer .open(&format!("/{name}"), Open::default()) .await .unwrap(); let bytes = reopened.read(100, 64).await.unwrap(); match name { "null" => assert!(bytes.is_empty()), "zero" => assert_eq!(bytes, vec![0; 64]), _ => { assert_eq!(bytes.len(), 64); assert_ne!(bytes, reopened.read(0, 64).await.unwrap()); } } } }