123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- #![deny(rust_2018_idioms)]
- use std::io::{Read, Seek, SeekFrom, Write};
- use tempfile::{spooled_tempfile, SpooledTempFile};
- #[test]
- fn test_automatic_rollover() {
- let mut t = spooled_tempfile(10);
- let mut buf = Vec::new();
- assert!(!t.is_rolled());
- assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 0);
- assert_eq!(t.read_to_end(&mut buf).unwrap(), 0);
- assert_eq!(buf.as_slice(), b"");
- buf.clear();
- assert_eq!(t.write(b"abcde").unwrap(), 5);
- assert!(!t.is_rolled());
- assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
- assert_eq!(t.read_to_end(&mut buf).unwrap(), 5);
- assert_eq!(buf.as_slice(), b"abcde");
- assert_eq!(t.write(b"fghijklmno").unwrap(), 10);
- assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 15);
- assert!(t.is_rolled());
- }
- #[test]
- fn test_explicit_rollover() {
- let mut t = SpooledTempFile::new(100);
- assert_eq!(t.write(b"abcdefghijklmnopqrstuvwxyz").unwrap(), 26);
- assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 26);
- assert!(!t.is_rolled());
- // roll over explicitly
- assert!(t.roll().is_ok());
- assert!(t.is_rolled());
- assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 26);
- let mut buf = Vec::new();
- assert_eq!(t.read_to_end(&mut buf).unwrap(), 0);
- assert_eq!(buf.as_slice(), b"");
- buf.clear();
- assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
- assert_eq!(t.read_to_end(&mut buf).unwrap(), 26);
- assert_eq!(buf.as_slice(), b"abcdefghijklmnopqrstuvwxyz");
- assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 26);
- }
- // called by test_seek_{buffer, file}
- // assumes t is empty and offset is 0 to start
- fn test_seek(t: &mut SpooledTempFile) {
- assert_eq!(t.write(b"abcdefghijklmnopqrstuvwxyz").unwrap(), 26);
- assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 26); // tell()
- assert_eq!(t.seek(SeekFrom::Current(-1)).unwrap(), 25);
- assert_eq!(t.seek(SeekFrom::Current(1)).unwrap(), 26);
- assert_eq!(t.seek(SeekFrom::Current(1)).unwrap(), 27);
- assert_eq!(t.seek(SeekFrom::Current(-27)).unwrap(), 0);
- assert!(t.seek(SeekFrom::Current(-1)).is_err());
- assert!(t.seek(SeekFrom::Current(-1245)).is_err());
- assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
- assert_eq!(t.seek(SeekFrom::Start(1)).unwrap(), 1);
- assert_eq!(t.seek(SeekFrom::Start(26)).unwrap(), 26);
- assert_eq!(t.seek(SeekFrom::Start(27)).unwrap(), 27);
- // // these are build errors
- // assert!(t.seek(SeekFrom::Start(-1)).is_err());
- // assert!(t.seek(SeekFrom::Start(-1000)).is_err());
- assert_eq!(t.seek(SeekFrom::End(0)).unwrap(), 26);
- assert_eq!(t.seek(SeekFrom::End(-1)).unwrap(), 25);
- assert_eq!(t.seek(SeekFrom::End(-26)).unwrap(), 0);
- assert!(t.seek(SeekFrom::End(-27)).is_err());
- assert!(t.seek(SeekFrom::End(-99)).is_err());
- assert_eq!(t.seek(SeekFrom::End(1)).unwrap(), 27);
- assert_eq!(t.seek(SeekFrom::End(1)).unwrap(), 27);
- }
- #[test]
- fn test_seek_buffer() {
- let mut t = spooled_tempfile(100);
- test_seek(&mut t);
- }
- #[test]
- fn test_seek_file() {
- let mut t = SpooledTempFile::new(10);
- test_seek(&mut t);
- }
- fn test_seek_read(t: &mut SpooledTempFile) {
- assert_eq!(t.write(b"abcdefghijklmnopqrstuvwxyz").unwrap(), 26);
- let mut buf = Vec::new();
- // we're at the end
- assert_eq!(t.read_to_end(&mut buf).unwrap(), 0);
- assert_eq!(buf.as_slice(), b"");
- buf.clear();
- // seek to start, read whole thing
- assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
- assert_eq!(t.read_to_end(&mut buf).unwrap(), 26);
- assert_eq!(buf.as_slice(), b"abcdefghijklmnopqrstuvwxyz");
- buf.clear();
- // now we're at the end again
- assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 26); // tell()
- assert_eq!(t.read_to_end(&mut buf).unwrap(), 0);
- assert_eq!(buf.as_slice(), b"");
- buf.clear();
- // seek to somewhere in the middle, read a bit
- assert_eq!(t.seek(SeekFrom::Start(5)).unwrap(), 5);
- let mut buf = [0; 5];
- assert!(t.read_exact(&mut buf).is_ok());
- assert_eq!(buf, *b"fghij");
- // read again from current spot
- assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 10); // tell()
- assert!(t.read_exact(&mut buf).is_ok());
- assert_eq!(buf, *b"klmno");
- let mut buf = [0; 15];
- // partial read
- assert_eq!(t.read(&mut buf).unwrap(), 11);
- assert_eq!(buf[0..11], *b"pqrstuvwxyz");
- // try to read off the end: UnexpectedEof
- assert!(t.read_exact(&mut buf).is_err());
- }
- #[test]
- fn test_seek_read_buffer() {
- let mut t = spooled_tempfile(100);
- test_seek_read(&mut t);
- }
- #[test]
- fn test_seek_read_file() {
- let mut t = SpooledTempFile::new(10);
- test_seek_read(&mut t);
- }
- fn test_overwrite_middle(t: &mut SpooledTempFile) {
- assert_eq!(t.write(b"abcdefghijklmnopqrstuvwxyz").unwrap(), 26);
- assert_eq!(t.seek(SeekFrom::Start(10)).unwrap(), 10);
- assert_eq!(t.write(b"0123456789").unwrap(), 10);
- assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
- let mut buf = Vec::new();
- assert_eq!(t.read_to_end(&mut buf).unwrap(), 26);
- assert_eq!(buf.as_slice(), b"abcdefghij0123456789uvwxyz");
- }
- #[test]
- fn test_overwrite_middle_of_buffer() {
- let mut t = spooled_tempfile(100);
- test_overwrite_middle(&mut t);
- }
- #[test]
- fn test_overwrite_middle_of_file() {
- let mut t = SpooledTempFile::new(10);
- test_overwrite_middle(&mut t);
- }
- #[test]
- fn test_overwrite_and_extend_buffer() {
- let mut t = spooled_tempfile(100);
- assert_eq!(t.write(b"abcdefghijklmnopqrstuvwxyz").unwrap(), 26);
- assert_eq!(t.seek(SeekFrom::End(-5)).unwrap(), 21);
- assert_eq!(t.write(b"0123456789").unwrap(), 10);
- assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
- let mut buf = Vec::new();
- assert_eq!(t.read_to_end(&mut buf).unwrap(), 31);
- assert_eq!(buf.as_slice(), b"abcdefghijklmnopqrstu0123456789");
- assert!(!t.is_rolled());
- }
- #[test]
- fn test_overwrite_and_extend_rollover() {
- let mut t = SpooledTempFile::new(20);
- assert_eq!(t.write(b"abcdefghijklmno").unwrap(), 15);
- assert!(!t.is_rolled());
- assert_eq!(t.seek(SeekFrom::End(-5)).unwrap(), 10);
- assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 10); // tell()
- assert!(!t.is_rolled());
- assert_eq!(t.write(b"0123456789)!@#$%^&*(").unwrap(), 20);
- assert!(t.is_rolled());
- assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 30); // tell()
- let mut buf = Vec::new();
- assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
- assert_eq!(t.read_to_end(&mut buf).unwrap(), 30);
- assert_eq!(buf.as_slice(), b"abcdefghij0123456789)!@#$%^&*(");
- }
- fn test_sparse(t: &mut SpooledTempFile) {
- assert_eq!(t.write(b"abcde").unwrap(), 5);
- assert_eq!(t.seek(SeekFrom::Current(5)).unwrap(), 10);
- assert_eq!(t.write(b"klmno").unwrap(), 5);
- assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
- let mut buf = Vec::new();
- assert_eq!(t.read_to_end(&mut buf).unwrap(), 15);
- assert_eq!(buf.as_slice(), b"abcde\0\0\0\0\0klmno");
- }
- #[test]
- fn test_sparse_buffer() {
- let mut t = spooled_tempfile(100);
- test_sparse(&mut t);
- }
- #[test]
- fn test_sparse_file() {
- let mut t = SpooledTempFile::new(1);
- test_sparse(&mut t);
- }
- #[test]
- fn test_sparse_write_rollover() {
- let mut t = spooled_tempfile(10);
- assert_eq!(t.write(b"abcde").unwrap(), 5);
- assert!(!t.is_rolled());
- assert_eq!(t.seek(SeekFrom::Current(5)).unwrap(), 10);
- assert!(!t.is_rolled());
- assert_eq!(t.write(b"klmno").unwrap(), 5);
- assert!(t.is_rolled());
- assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
- let mut buf = Vec::new();
- assert_eq!(t.read_to_end(&mut buf).unwrap(), 15);
- assert_eq!(buf.as_slice(), b"abcde\0\0\0\0\0klmno");
- }
- fn test_set_len(t: &mut SpooledTempFile) {
- let mut buf: Vec<u8> = Vec::new();
- assert_eq!(t.write(b"abcdefghijklmnopqrstuvwxyz").unwrap(), 26);
- // truncate to 10 bytes
- assert!(t.set_len(10).is_ok());
- // position should not have moved
- assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 26); // tell()
- assert_eq!(t.read_to_end(&mut buf).unwrap(), 0);
- assert_eq!(buf.as_slice(), b"");
- assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 26); // tell()
- buf.clear();
- // read whole thing
- assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
- assert_eq!(t.read_to_end(&mut buf).unwrap(), 10);
- assert_eq!(buf.as_slice(), b"abcdefghij");
- buf.clear();
- // set_len to expand beyond the end
- assert!(t.set_len(40).is_ok());
- assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 10); // tell()
- assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
- assert_eq!(t.read_to_end(&mut buf).unwrap(), 40);
- assert_eq!(
- buf.as_slice(),
- &b"abcdefghij\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"[..]
- );
- }
- #[test]
- fn test_set_len_buffer() {
- let mut t = spooled_tempfile(100);
- test_set_len(&mut t);
- }
- #[test]
- fn test_set_len_file() {
- let mut t = spooled_tempfile(100);
- test_set_len(&mut t);
- }
- #[test]
- fn test_set_len_rollover() {
- let mut buf: Vec<u8> = Vec::new();
- let mut t = spooled_tempfile(10);
- assert_eq!(t.write(b"abcde").unwrap(), 5);
- assert!(!t.is_rolled());
- assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 5); // tell()
- assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
- assert_eq!(t.read_to_end(&mut buf).unwrap(), 5);
- assert_eq!(buf.as_slice(), b"abcde");
- assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 5); // tell()
- buf.clear();
- assert!(t.set_len(20).is_ok());
- assert!(t.is_rolled());
- assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 5); // tell()
- assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
- assert_eq!(t.read_to_end(&mut buf).unwrap(), 20);
- assert_eq!(buf.as_slice(), b"abcde\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0");
- }
|