| 3895 | } |
| 3896 | |
| 3897 | fn seek_hole_common(direct: bool) { |
| 3898 | with_default_file(0x30000, direct, |mut file| { |
| 3899 | // File consisting entirely of a hole |
| 3900 | assert_eq!(file.seek_hole(0).unwrap(), Some(0)); |
| 3901 | assert_eq!(seek_cur(&mut file), 0); |
| 3902 | assert_eq!(file.seek_hole(0xFFFF).unwrap(), Some(0xFFFF)); |
| 3903 | assert_eq!(seek_cur(&mut file), 0xFFFF); |
| 3904 | |
| 3905 | // seek_hole at or after the end of the file should return None |
| 3906 | file.rewind().unwrap(); |
| 3907 | assert_eq!(file.seek_hole(0x30000).unwrap(), None); |
| 3908 | assert_eq!(seek_cur(&mut file), 0); |
| 3909 | assert_eq!(file.seek_hole(0x30001).unwrap(), None); |
| 3910 | assert_eq!(seek_cur(&mut file), 0); |
| 3911 | |
| 3912 | // Write some data to [0x10000, 0x20000) |
| 3913 | let b = [0x55u8; 0x10000]; |
| 3914 | file.seek(SeekFrom::Start(0x10000)).unwrap(); |
| 3915 | file.write_all(&b).unwrap(); |
| 3916 | |
| 3917 | // seek_hole within a hole should return the same offset |
| 3918 | assert_eq!(file.seek_hole(0).unwrap(), Some(0)); |
| 3919 | assert_eq!(seek_cur(&mut file), 0); |
| 3920 | assert_eq!(file.seek_hole(0xFFFF).unwrap(), Some(0xFFFF)); |
| 3921 | assert_eq!(seek_cur(&mut file), 0xFFFF); |
| 3922 | |
| 3923 | // seek_hole within data should return the next hole |
| 3924 | file.rewind().unwrap(); |
| 3925 | assert_eq!(file.seek_hole(0x10000).unwrap(), Some(0x20000)); |
| 3926 | assert_eq!(seek_cur(&mut file), 0x20000); |
| 3927 | file.rewind().unwrap(); |
| 3928 | assert_eq!(file.seek_hole(0x10001).unwrap(), Some(0x20000)); |
| 3929 | assert_eq!(seek_cur(&mut file), 0x20000); |
| 3930 | file.rewind().unwrap(); |
| 3931 | assert_eq!(file.seek_hole(0x1FFFF).unwrap(), Some(0x20000)); |
| 3932 | assert_eq!(seek_cur(&mut file), 0x20000); |
| 3933 | file.rewind().unwrap(); |
| 3934 | assert_eq!(file.seek_hole(0xFFFF).unwrap(), Some(0xFFFF)); |
| 3935 | assert_eq!(seek_cur(&mut file), 0xFFFF); |
| 3936 | file.rewind().unwrap(); |
| 3937 | assert_eq!(file.seek_hole(0x10000).unwrap(), Some(0x20000)); |
| 3938 | assert_eq!(seek_cur(&mut file), 0x20000); |
| 3939 | file.rewind().unwrap(); |
| 3940 | assert_eq!(file.seek_hole(0x1FFFF).unwrap(), Some(0x20000)); |
| 3941 | assert_eq!(seek_cur(&mut file), 0x20000); |
| 3942 | file.rewind().unwrap(); |
| 3943 | assert_eq!(file.seek_hole(0x20000).unwrap(), Some(0x20000)); |
| 3944 | assert_eq!(seek_cur(&mut file), 0x20000); |
| 3945 | file.rewind().unwrap(); |
| 3946 | assert_eq!(file.seek_hole(0x20001).unwrap(), Some(0x20001)); |
| 3947 | assert_eq!(seek_cur(&mut file), 0x20001); |
| 3948 | |
| 3949 | // seek_hole at EOF should return None |
| 3950 | file.rewind().unwrap(); |
| 3951 | assert_eq!(file.seek_hole(0x30000).unwrap(), None); |
| 3952 | assert_eq!(seek_cur(&mut file), 0); |
| 3953 | |
| 3954 | // Write some data to [0x20000, 0x30000) |