std: Fix tests with io_error usage

This commit is contained in:
Alex Crichton 2014-01-30 14:10:53 -08:00
parent 29e7247fd8
commit 209642c651
21 changed files with 567 additions and 699 deletions

View File

@ -1252,7 +1252,7 @@ mod test {
spawn(proc() {
let _p = port;
});
task::try(proc() {
let _ = task::try(proc() {
chan.send(1);
});
}

View File

@ -88,7 +88,7 @@ impl<R: Reader> BufferedReader<R> {
impl<R: Reader> Buffer for BufferedReader<R> {
fn fill<'a>(&'a mut self) -> IoResult<&'a [u8]> {
while self.pos == self.cap {
if self.pos == self.cap {
self.cap = if_ok!(self.inner.read(self.buf));
self.pos = 0;
}
@ -360,13 +360,13 @@ mod test {
pub struct NullStream;
impl Reader for NullStream {
fn read(&mut self, _: &mut [u8]) -> Option<uint> {
None
fn read(&mut self, _: &mut [u8]) -> io::IoResult<uint> {
Err(io::standard_error(io::EndOfFile))
}
}
impl Writer for NullStream {
fn write(&mut self, _: &[u8]) { }
fn write(&mut self, _: &[u8]) -> io::IoResult<()> { Ok(()) }
}
/// A dummy reader intended at testing short-reads propagation.
@ -375,8 +375,11 @@ mod test {
}
impl Reader for ShortReader {
fn read(&mut self, _: &mut [u8]) -> Option<uint> {
self.lengths.shift()
fn read(&mut self, _: &mut [u8]) -> io::IoResult<uint> {
match self.lengths.shift() {
Some(i) => Ok(i),
None => Err(io::standard_error(io::EndOfFile))
}
}
}
@ -387,24 +390,24 @@ mod test {
let mut buf = [0, 0, 0];
let nread = reader.read(buf);
assert_eq!(Some(2), nread);
assert_eq!(Ok(2), nread);
assert_eq!([0, 1, 0], buf);
let mut buf = [0];
let nread = reader.read(buf);
assert_eq!(Some(1), nread);
assert_eq!(Ok(1), nread);
assert_eq!([2], buf);
let mut buf = [0, 0, 0];
let nread = reader.read(buf);
assert_eq!(Some(1), nread);
assert_eq!(Ok(1), nread);
assert_eq!([3, 0, 0], buf);
let nread = reader.read(buf);
assert_eq!(Some(1), nread);
assert_eq!(Ok(1), nread);
assert_eq!([4, 0, 0], buf);
assert_eq!(None, reader.read(buf));
assert!(reader.read(buf).is_err());
}
#[test]
@ -412,35 +415,35 @@ mod test {
let inner = MemWriter::new();
let mut writer = BufferedWriter::with_capacity(2, inner);
writer.write([0, 1]);
writer.write([0, 1]).unwrap();
assert_eq!([], writer.get_ref().get_ref());
writer.write([2]);
writer.write([2]).unwrap();
assert_eq!([0, 1], writer.get_ref().get_ref());
writer.write([3]);
writer.write([3]).unwrap();
assert_eq!([0, 1], writer.get_ref().get_ref());
writer.flush();
writer.flush().unwrap();
assert_eq!([0, 1, 2, 3], writer.get_ref().get_ref());
writer.write([4]);
writer.write([5]);
writer.write([4]).unwrap();
writer.write([5]).unwrap();
assert_eq!([0, 1, 2, 3], writer.get_ref().get_ref());
writer.write([6]);
writer.write([6]).unwrap();
assert_eq!([0, 1, 2, 3, 4, 5],
writer.get_ref().get_ref());
writer.write([7, 8]);
writer.write([7, 8]).unwrap();
assert_eq!([0, 1, 2, 3, 4, 5, 6],
writer.get_ref().get_ref());
writer.write([9, 10, 11]);
writer.write([9, 10, 11]).unwrap();
assert_eq!([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
writer.get_ref().get_ref());
writer.flush();
writer.flush().unwrap();
assert_eq!([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
writer.get_ref().get_ref());
}
@ -448,7 +451,7 @@ mod test {
#[test]
fn test_buffered_writer_inner_flushes() {
let mut w = BufferedWriter::with_capacity(3, MemWriter::new());
w.write([0, 1]);
w.write([0, 1]).unwrap();
assert_eq!([], w.get_ref().get_ref());
let w = w.unwrap();
assert_eq!([0, 1], w.get_ref());
@ -461,47 +464,49 @@ mod test {
struct S;
impl io::Writer for S {
fn write(&mut self, _: &[u8]) {}
fn write(&mut self, _: &[u8]) -> io::IoResult<()> { Ok(()) }
}
impl io::Reader for S {
fn read(&mut self, _: &mut [u8]) -> Option<uint> { None }
fn read(&mut self, _: &mut [u8]) -> io::IoResult<uint> {
Err(io::standard_error(io::EndOfFile))
}
}
let mut stream = BufferedStream::new(S);
let mut buf = [];
stream.read(buf);
stream.write(buf);
stream.flush();
assert!(stream.read(buf).is_err());
stream.write(buf).unwrap();
stream.flush().unwrap();
}
#[test]
fn test_read_until() {
let inner = MemReader::new(~[0, 1, 2, 1, 0]);
let mut reader = BufferedReader::with_capacity(2, inner);
assert_eq!(reader.read_until(0), Some(~[0]));
assert_eq!(reader.read_until(2), Some(~[1, 2]));
assert_eq!(reader.read_until(1), Some(~[1]));
assert_eq!(reader.read_until(8), Some(~[0]));
assert_eq!(reader.read_until(9), None);
assert_eq!(reader.read_until(0), Ok(~[0]));
assert_eq!(reader.read_until(2), Ok(~[1, 2]));
assert_eq!(reader.read_until(1), Ok(~[1]));
assert_eq!(reader.read_until(8), Ok(~[0]));
assert!(reader.read_until(9).is_err());
}
#[test]
fn test_line_buffer() {
let mut writer = LineBufferedWriter::new(MemWriter::new());
writer.write([0]);
writer.write([0]).unwrap();
assert_eq!(writer.get_ref().get_ref(), []);
writer.write([1]);
writer.write([1]).unwrap();
assert_eq!(writer.get_ref().get_ref(), []);
writer.flush();
writer.flush().unwrap();
assert_eq!(writer.get_ref().get_ref(), [0, 1]);
writer.write([0, '\n' as u8, 1, '\n' as u8, 2]);
writer.write([0, '\n' as u8, 1, '\n' as u8, 2]).unwrap();
assert_eq!(writer.get_ref().get_ref(),
[0, 1, 0, '\n' as u8, 1, '\n' as u8]);
writer.flush();
writer.flush().unwrap();
assert_eq!(writer.get_ref().get_ref(),
[0, 1, 0, '\n' as u8, 1, '\n' as u8, 2]);
writer.write([3, '\n' as u8]);
writer.write([3, '\n' as u8]).unwrap();
assert_eq!(writer.get_ref().get_ref(),
[0, 1, 0, '\n' as u8, 1, '\n' as u8, 2, 3, '\n' as u8]);
}
@ -510,10 +515,10 @@ mod test {
fn test_read_line() {
let in_buf = MemReader::new(bytes!("a\nb\nc").to_owned());
let mut reader = BufferedReader::with_capacity(2, in_buf);
assert_eq!(reader.read_line(), Some(~"a\n"));
assert_eq!(reader.read_line(), Some(~"b\n"));
assert_eq!(reader.read_line(), Some(~"c"));
assert_eq!(reader.read_line(), None);
assert_eq!(reader.read_line(), Ok(~"a\n"));
assert_eq!(reader.read_line(), Ok(~"b\n"));
assert_eq!(reader.read_line(), Ok(~"c"));
assert!(reader.read_line().is_err());
}
#[test]
@ -532,20 +537,20 @@ mod test {
let inner = ShortReader{lengths: ~[0, 1, 2, 0, 1, 0]};
let mut reader = BufferedReader::new(inner);
let mut buf = [0, 0];
assert_eq!(reader.read(buf), Some(0));
assert_eq!(reader.read(buf), Some(1));
assert_eq!(reader.read(buf), Some(2));
assert_eq!(reader.read(buf), Some(0));
assert_eq!(reader.read(buf), Some(1));
assert_eq!(reader.read(buf), Some(0));
assert_eq!(reader.read(buf), None);
assert_eq!(reader.read(buf), Ok(0));
assert_eq!(reader.read(buf), Ok(1));
assert_eq!(reader.read(buf), Ok(2));
assert_eq!(reader.read(buf), Ok(0));
assert_eq!(reader.read(buf), Ok(1));
assert_eq!(reader.read(buf), Ok(0));
assert!(reader.read(buf).is_err());
}
#[test]
fn read_char_buffered() {
let buf = [195u8, 159u8];
let mut reader = BufferedReader::with_capacity(1, BufReader::new(buf));
assert_eq!(reader.read_char(), Some('ß'));
assert_eq!(reader.read_char(), Ok('ß'));
}
#[bench]

View File

@ -133,36 +133,28 @@ mod test {
let mut buf = ~[0u8, ..3];
assert_eq!(Some(0), reader.read([]));
assert_eq!(Ok(0), reader.read([]));
assert_eq!(Some(3), reader.read(buf));
assert_eq!(Ok(3), reader.read(buf));
assert_eq!(~[1,2,3], buf);
assert_eq!(Some(3), reader.read(buf));
assert_eq!(Ok(3), reader.read(buf));
assert_eq!(~[4,5,6], buf);
assert_eq!(Some(2), reader.read(buf));
assert_eq!(Ok(2), reader.read(buf));
assert_eq!(~[7,8,6], buf);
let mut err = None;
let result = io::io_error::cond.trap(|io::standard_error(k, _, _)| {
err = Some(k)
}).inside(|| {
reader.read(buf)
});
assert_eq!(Some(io::EndOfFile), err);
assert_eq!(None, result);
match reader.read(buf) {
Ok(..) => fail!(),
Err(e) => assert_eq!(e.kind, io::EndOfFile),
}
assert_eq!(~[7,8,6], buf);
// Ensure it continues to fail in the same way.
err = None;
let result = io::io_error::cond.trap(|io::standard_error(k, _, _)| {
err = Some(k)
}).inside(|| {
reader.read(buf)
});
assert_eq!(Some(io::EndOfFile), err);
assert_eq!(None, result);
match reader.read(buf) {
Ok(..) => fail!(),
Err(e) => assert_eq!(e.kind, io::EndOfFile),
}
assert_eq!(~[7,8,6], buf);
}
@ -170,18 +162,15 @@ mod test {
fn test_chan_writer() {
let (port, chan) = Chan::new();
let mut writer = ChanWriter::new(chan);
writer.write_be_u32(42);
writer.write_be_u32(42).unwrap();
let wanted = ~[0u8, 0u8, 0u8, 42u8];
let got = task::try(proc() { port.recv() }).unwrap();
assert_eq!(wanted, got);
let mut err = None;
io::io_error::cond.trap(|io::IoError { kind, .. } | {
err = Some(kind)
}).inside(|| {
writer.write_u8(1)
});
assert_eq!(Some(io::BrokenPipe), err);
match writer.write_u8(1) {
Ok(..) => fail!(),
Err(e) => assert_eq!(e.kind, io::BrokenPipe),
}
}
}

View File

@ -125,23 +125,22 @@ pub fn u64_from_be_bytes(data: &[u8],
#[cfg(test)]
mod test {
use unstable::finally::Finally;
use prelude::*;
use io;
use io::{MemReader, MemWriter};
use io::{io_error, placeholder_error};
struct InitialZeroByteReader {
count: int,
}
impl Reader for InitialZeroByteReader {
fn read(&mut self, buf: &mut [u8]) -> Option<uint> {
fn read(&mut self, buf: &mut [u8]) -> io::IoResult<uint> {
if self.count == 0 {
self.count = 1;
Some(0)
Ok(0)
} else {
buf[0] = 10;
Some(1)
Ok(1)
}
}
}
@ -149,17 +148,16 @@ mod test {
struct EofReader;
impl Reader for EofReader {
fn read(&mut self, _: &mut [u8]) -> Option<uint> {
None
fn read(&mut self, _: &mut [u8]) -> io::IoResult<uint> {
Err(io::standard_error(io::EndOfFile))
}
}
struct ErroringReader;
impl Reader for ErroringReader {
fn read(&mut self, _: &mut [u8]) -> Option<uint> {
io_error::cond.raise(placeholder_error());
None
fn read(&mut self, _: &mut [u8]) -> io::IoResult<uint> {
Err(io::standard_error(io::InvalidInput))
}
}
@ -168,16 +166,16 @@ mod test {
}
impl Reader for PartialReader {
fn read(&mut self, buf: &mut [u8]) -> Option<uint> {
fn read(&mut self, buf: &mut [u8]) -> io::IoResult<uint> {
if self.count == 0 {
self.count = 1;
buf[0] = 10;
buf[1] = 11;
Some(2)
Ok(2)
} else {
buf[0] = 12;
buf[1] = 13;
Some(2)
Ok(2)
}
}
}
@ -187,14 +185,13 @@ mod test {
}
impl Reader for ErroringLaterReader {
fn read(&mut self, buf: &mut [u8]) -> Option<uint> {
fn read(&mut self, buf: &mut [u8]) -> io::IoResult<uint> {
if self.count == 0 {
self.count = 1;
buf[0] = 10;
Some(1)
Ok(1)
} else {
io_error::cond.raise(placeholder_error());
None
Err(io::standard_error(io::InvalidInput))
}
}
}
@ -204,19 +201,19 @@ mod test {
}
impl Reader for ThreeChunkReader {
fn read(&mut self, buf: &mut [u8]) -> Option<uint> {
fn read(&mut self, buf: &mut [u8]) -> io::IoResult<uint> {
if self.count == 0 {
self.count = 1;
buf[0] = 10;
buf[1] = 11;
Some(2)
Ok(2)
} else if self.count == 1 {
self.count = 2;
buf[0] = 12;
buf[1] = 13;
Some(2)
Ok(2)
} else {
None
Err(io::standard_error(io::EndOfFile))
}
}
}
@ -225,7 +222,7 @@ mod test {
fn read_byte() {
let mut reader = MemReader::new(~[10]);
let byte = reader.read_byte();
assert!(byte == Some(10));
assert!(byte == Ok(10));
}
#[test]
@ -234,24 +231,21 @@ mod test {
count: 0,
};
let byte = reader.read_byte();
assert!(byte == Some(10));
assert!(byte == Ok(10));
}
#[test]
fn read_byte_eof() {
let mut reader = EofReader;
let byte = reader.read_byte();
assert!(byte == None);
assert!(byte.is_err());
}
#[test]
fn read_byte_error() {
let mut reader = ErroringReader;
io_error::cond.trap(|_| {
}).inside(|| {
let byte = reader.read_byte();
assert!(byte == None);
});
let byte = reader.read_byte();
assert!(byte.is_err());
}
#[test]
@ -267,23 +261,21 @@ mod test {
fn bytes_eof() {
let mut reader = EofReader;
let byte = reader.bytes().next();
assert!(byte == None);
assert!(byte.is_none());
}
#[test]
fn bytes_error() {
let mut reader = ErroringReader;
let mut it = reader.bytes();
io_error::cond.trap(|_| ()).inside(|| {
let byte = it.next();
assert!(byte == None);
})
let byte = it.next();
assert!(byte.is_none());
}
#[test]
fn read_bytes() {
let mut reader = MemReader::new(~[10, 11, 12, 13]);
let bytes = reader.read_bytes(4);
let bytes = reader.read_bytes(4).unwrap();
assert!(bytes == ~[10, 11, 12, 13]);
}
@ -292,24 +284,21 @@ mod test {
let mut reader = PartialReader {
count: 0,
};
let bytes = reader.read_bytes(4);
let bytes = reader.read_bytes(4).unwrap();
assert!(bytes == ~[10, 11, 12, 13]);
}
#[test]
fn read_bytes_eof() {
let mut reader = MemReader::new(~[10, 11]);
io_error::cond.trap(|_| {
}).inside(|| {
assert!(reader.read_bytes(4) == ~[10, 11]);
})
assert!(reader.read_bytes(4).is_err());
}
#[test]
fn push_bytes() {
let mut reader = MemReader::new(~[10, 11, 12, 13]);
let mut buf = ~[8, 9];
reader.push_bytes(&mut buf, 4);
reader.push_bytes(&mut buf, 4).unwrap();
assert!(buf == ~[8, 9, 10, 11, 12, 13]);
}
@ -319,7 +308,7 @@ mod test {
count: 0,
};
let mut buf = ~[8, 9];
reader.push_bytes(&mut buf, 4);
reader.push_bytes(&mut buf, 4).unwrap();
assert!(buf == ~[8, 9, 10, 11, 12, 13]);
}
@ -327,11 +316,8 @@ mod test {
fn push_bytes_eof() {
let mut reader = MemReader::new(~[10, 11]);
let mut buf = ~[8, 9];
io_error::cond.trap(|_| {
}).inside(|| {
reader.push_bytes(&mut buf, 4);
assert!(buf == ~[8, 9, 10, 11]);
})
assert!(reader.push_bytes(&mut buf, 4).is_err());
assert!(buf == ~[8, 9, 10, 11]);
}
#[test]
@ -340,38 +326,16 @@ mod test {
count: 0,
};
let mut buf = ~[8, 9];
io_error::cond.trap(|_| { } ).inside(|| {
reader.push_bytes(&mut buf, 4);
});
assert!(reader.push_bytes(&mut buf, 4).is_err());
assert!(buf == ~[8, 9, 10]);
}
#[test]
#[should_fail]
#[ignore] // borrow issues with RefCell
fn push_bytes_fail_reset_len() {
// push_bytes unsafely sets the vector length. This is testing that
// upon failure the length is reset correctly.
let _reader = ErroringLaterReader {
count: 0,
};
// FIXME (#7049): Figure out some other way to do this.
//let buf = RefCell::new(~[8, 9]);
(|| {
//reader.push_bytes(buf.borrow_mut().get(), 4);
}).finally(|| {
// NB: Using rtassert here to trigger abort on failure since this is a should_fail test
// FIXME: #7049 This fails because buf is still borrowed
//rtassert!(buf.borrow().get() == ~[8, 9, 10]);
})
}
#[test]
fn read_to_end() {
let mut reader = ThreeChunkReader {
count: 0,
};
let buf = reader.read_to_end();
let buf = reader.read_to_end().unwrap();
assert!(buf == ~[10, 11, 12, 13]);
}
@ -381,7 +345,7 @@ mod test {
let mut reader = ThreeChunkReader {
count: 0,
};
let buf = reader.read_to_end();
let buf = reader.read_to_end().unwrap();
assert!(buf == ~[10, 11]);
}
@ -391,12 +355,12 @@ mod test {
let mut writer = MemWriter::new();
for i in uints.iter() {
writer.write_le_u64(*i);
writer.write_le_u64(*i).unwrap();
}
let mut reader = MemReader::new(writer.unwrap());
for i in uints.iter() {
assert!(reader.read_le_u64() == *i);
assert!(reader.read_le_u64().unwrap() == *i);
}
}
@ -407,12 +371,12 @@ mod test {
let mut writer = MemWriter::new();
for i in uints.iter() {
writer.write_be_u64(*i);
writer.write_be_u64(*i).unwrap();
}
let mut reader = MemReader::new(writer.unwrap());
for i in uints.iter() {
assert!(reader.read_be_u64() == *i);
assert!(reader.read_be_u64().unwrap() == *i);
}
}
@ -422,14 +386,14 @@ mod test {
let mut writer = MemWriter::new();
for i in ints.iter() {
writer.write_be_i32(*i);
writer.write_be_i32(*i).unwrap();
}
let mut reader = MemReader::new(writer.unwrap());
for i in ints.iter() {
// this tests that the sign extension is working
// (comparing the values as i32 would not test this)
assert!(reader.read_be_int_n(4) == *i as i64);
assert!(reader.read_be_int_n(4).unwrap() == *i as i64);
}
}
@ -439,10 +403,10 @@ mod test {
let buf = ~[0x41, 0x02, 0x00, 0x00];
let mut writer = MemWriter::new();
writer.write(buf);
writer.write(buf).unwrap();
let mut reader = MemReader::new(writer.unwrap());
let f = reader.read_be_f32();
let f = reader.read_be_f32().unwrap();
assert!(f == 8.1250);
}
@ -451,12 +415,12 @@ mod test {
let f:f32 = 8.1250;
let mut writer = MemWriter::new();
writer.write_be_f32(f);
writer.write_le_f32(f);
writer.write_be_f32(f).unwrap();
writer.write_le_f32(f).unwrap();
let mut reader = MemReader::new(writer.unwrap());
assert!(reader.read_be_f32() == 8.1250);
assert!(reader.read_le_f32() == 8.1250);
assert!(reader.read_be_f32().unwrap() == 8.1250);
assert!(reader.read_le_f32().unwrap() == 8.1250);
}
#[test]

View File

@ -681,8 +681,7 @@ impl path::Path {
#[allow(unused_imports)]
mod test {
use prelude::*;
use io::{SeekSet, SeekCur, SeekEnd, io_error, Read, Open,
ReadWrite};
use io::{SeekSet, SeekCur, SeekEnd, Read, Open, ReadWrite};
use io;
use str;
use io::fs::{File, rmdir, mkdir, readdir, rmdir_recursive,
@ -712,7 +711,7 @@ mod test {
// Gee, seeing how we're testing the fs module I sure hope that we
// at least implement this correctly!
let TempDir(ref p) = *self;
io::fs::rmdir_recursive(p);
io::fs::rmdir_recursive(p).unwrap();
}
}
@ -720,7 +719,7 @@ mod test {
use os;
use rand;
let ret = os::tmpdir().join(format!("rust-{}", rand::random::<u32>()));
io::fs::mkdir(&ret, io::UserRWX);
io::fs::mkdir(&ret, io::UserRWX).unwrap();
TempDir(ret)
}
@ -730,7 +729,7 @@ mod test {
let filename = &tmpdir.join("file_rt_io_file_test.txt");
{
let mut write_stream = File::open_mode(filename, Open, ReadWrite);
write_stream.write(message.as_bytes());
write_stream.write(message.as_bytes()).unwrap();
}
{
let mut read_stream = File::open_mode(filename, Open, Read);
@ -741,30 +740,20 @@ mod test {
};
assert_eq!(read_str, message.to_owned());
}
unlink(filename);
unlink(filename).unwrap();
})
iotest!(fn invalid_path_raises() {
let tmpdir = tmpdir();
let filename = &tmpdir.join("file_that_does_not_exist.txt");
let mut called = false;
io_error::cond.trap(|_| {
called = true;
}).inside(|| {
let result = File::open_mode(filename, Open, Read);
assert!(result.is_none());
});
assert!(called);
let result = File::open_mode(filename, Open, Read);
assert!(result.is_err());
})
iotest!(fn file_test_iounlinking_invalid_path_should_raise_condition() {
let tmpdir = tmpdir();
let filename = &tmpdir.join("file_another_file_that_does_not_exist.txt");
let mut called = false;
io_error::cond.trap(|_| {
called = true;
}).inside(|| unlink(filename));
assert!(called);
assert!(unlink(filename).is_err());
})
iotest!(fn file_test_io_non_positional_read() {
@ -774,20 +763,20 @@ mod test {
let filename = &tmpdir.join("file_rt_io_file_test_positional.txt");
{
let mut rw_stream = File::open_mode(filename, Open, ReadWrite);
rw_stream.write(message.as_bytes());
rw_stream.write(message.as_bytes()).unwrap();
}
{
let mut read_stream = File::open_mode(filename, Open, Read);
{
let read_buf = read_mem.mut_slice(0, 4);
read_stream.read(read_buf);
read_stream.read(read_buf).unwrap();
}
{
let read_buf = read_mem.mut_slice(4, 8);
read_stream.read(read_buf);
read_stream.read(read_buf).unwrap();
}
}
unlink(filename);
unlink(filename).unwrap();
let read_str = str::from_utf8(read_mem).unwrap();
assert_eq!(read_str, message);
})
@ -802,16 +791,16 @@ mod test {
let filename = &tmpdir.join("file_rt_io_file_test_seeking.txt");
{
let mut rw_stream = File::open_mode(filename, Open, ReadWrite);
rw_stream.write(message.as_bytes());
rw_stream.write(message.as_bytes()).unwrap();
}
{
let mut read_stream = File::open_mode(filename, Open, Read);
read_stream.seek(set_cursor as i64, SeekSet);
tell_pos_pre_read = read_stream.tell();
read_stream.read(read_mem);
tell_pos_post_read = read_stream.tell();
read_stream.seek(set_cursor as i64, SeekSet).unwrap();
tell_pos_pre_read = read_stream.tell().unwrap();
read_stream.read(read_mem).unwrap();
tell_pos_post_read = read_stream.tell().unwrap();
}
unlink(filename);
unlink(filename).unwrap();
let read_str = str::from_utf8(read_mem).unwrap();
assert_eq!(read_str, message.slice(4, 8));
assert_eq!(tell_pos_pre_read, set_cursor);
@ -828,15 +817,15 @@ mod test {
let filename = &tmpdir.join("file_rt_io_file_test_seek_and_write.txt");
{
let mut rw_stream = File::open_mode(filename, Open, ReadWrite);
rw_stream.write(initial_msg.as_bytes());
rw_stream.seek(seek_idx as i64, SeekSet);
rw_stream.write(overwrite_msg.as_bytes());
rw_stream.write(initial_msg.as_bytes()).unwrap();
rw_stream.seek(seek_idx as i64, SeekSet).unwrap();
rw_stream.write(overwrite_msg.as_bytes()).unwrap();
}
{
let mut read_stream = File::open_mode(filename, Open, Read);
read_stream.read(read_mem);
read_stream.read(read_mem).unwrap();
}
unlink(filename);
unlink(filename).unwrap();
let read_str = str::from_utf8(read_mem).unwrap();
assert!(read_str == final_msg.to_owned());
})
@ -852,24 +841,24 @@ mod test {
let filename = &tmpdir.join("file_rt_io_file_test_seek_shakedown.txt");
{
let mut rw_stream = File::open_mode(filename, Open, ReadWrite);
rw_stream.write(initial_msg.as_bytes());
rw_stream.write(initial_msg.as_bytes()).unwrap();
}
{
let mut read_stream = File::open_mode(filename, Open, Read);
read_stream.seek(-4, SeekEnd);
read_stream.read(read_mem);
read_stream.seek(-4, SeekEnd).unwrap();
read_stream.read(read_mem).unwrap();
assert_eq!(str::from_utf8(read_mem).unwrap(), chunk_three);
read_stream.seek(-9, SeekCur);
read_stream.read(read_mem);
read_stream.seek(-9, SeekCur).unwrap();
read_stream.read(read_mem).unwrap();
assert_eq!(str::from_utf8(read_mem).unwrap(), chunk_two);
read_stream.seek(0, SeekSet);
read_stream.read(read_mem);
read_stream.seek(0, SeekSet).unwrap();
read_stream.read(read_mem).unwrap();
assert_eq!(str::from_utf8(read_mem).unwrap(), chunk_one);
}
unlink(filename);
unlink(filename).unwrap();
})
iotest!(fn file_test_stat_is_correct_on_is_file() {
@ -878,36 +867,36 @@ mod test {
{
let mut fs = File::open_mode(filename, Open, ReadWrite);
let msg = "hw";
fs.write(msg.as_bytes());
fs.write(msg.as_bytes()).unwrap();
}
let stat_res = stat(filename);
let stat_res = stat(filename).unwrap();
assert_eq!(stat_res.kind, io::TypeFile);
unlink(filename);
unlink(filename).unwrap();
})
iotest!(fn file_test_stat_is_correct_on_is_dir() {
let tmpdir = tmpdir();
let filename = &tmpdir.join("file_stat_correct_on_is_dir");
mkdir(filename, io::UserRWX);
let stat_res = filename.stat();
mkdir(filename, io::UserRWX).unwrap();
let stat_res = filename.stat().unwrap();
assert!(stat_res.kind == io::TypeDirectory);
rmdir(filename);
rmdir(filename).unwrap();
})
iotest!(fn file_test_fileinfo_false_when_checking_is_file_on_a_directory() {
let tmpdir = tmpdir();
let dir = &tmpdir.join("fileinfo_false_on_dir");
mkdir(dir, io::UserRWX);
mkdir(dir, io::UserRWX).unwrap();
assert!(dir.is_file() == false);
rmdir(dir);
rmdir(dir).unwrap();
})
iotest!(fn file_test_fileinfo_check_exists_before_and_after_file_creation() {
let tmpdir = tmpdir();
let file = &tmpdir.join("fileinfo_check_exists_b_and_a.txt");
File::create(file).write(bytes!("foo"));
File::create(file).write(bytes!("foo")).unwrap();
assert!(file.exists());
unlink(file);
unlink(file).unwrap();
assert!(!file.exists());
})
@ -915,10 +904,10 @@ mod test {
let tmpdir = tmpdir();
let dir = &tmpdir.join("before_and_after_dir");
assert!(!dir.exists());
mkdir(dir, io::UserRWX);
mkdir(dir, io::UserRWX).unwrap();
assert!(dir.exists());
assert!(dir.is_dir());
rmdir(dir);
rmdir(dir).unwrap();
assert!(!dir.exists());
})
@ -926,21 +915,21 @@ mod test {
use std::str;
let tmpdir = tmpdir();
let dir = &tmpdir.join("di_readdir");
mkdir(dir, io::UserRWX);
mkdir(dir, io::UserRWX).unwrap();
let prefix = "foo";
for n in range(0,3) {
let f = dir.join(format!("{}.txt", n));
let mut w = File::create(&f);
let mut w = File::create(&f).unwrap();
let msg_str = (prefix + n.to_str().to_owned()).to_owned();
let msg = msg_str.as_bytes();
w.write(msg);
w.write(msg).unwrap();
}
let files = readdir(dir);
let files = readdir(dir).unwrap();
let mut mem = [0u8, .. 4];
for f in files.iter() {
{
let n = f.filestem_str();
File::open(f).read(mem);
File::open(f).read(mem).unwrap();
let read_str = str::from_utf8(mem).unwrap();
let expected = match n {
None|Some("") => fail!("really shouldn't happen.."),
@ -948,13 +937,13 @@ mod test {
};
assert_eq!(expected.as_slice(), read_str);
}
unlink(f);
unlink(f).unwrap();
}
rmdir(dir);
rmdir(dir).unwrap();
})
iotest!(fn recursive_mkdir_slash() {
mkdir_recursive(&Path::new("/"), io::UserRWX);
mkdir_recursive(&Path::new("/"), io::UserRWX).unwrap();
})
iotest!(fn unicode_path_is_dir() {
@ -965,12 +954,12 @@ mod test {
let mut dirpath = tmpdir.path().clone();
dirpath.push(format!("test-가一ー你好"));
mkdir(&dirpath, io::UserRWX);
mkdir(&dirpath, io::UserRWX).unwrap();
assert!(dirpath.is_dir());
let mut filepath = dirpath;
filepath.push("unicode-file-\uac00\u4e00\u30fc\u4f60\u597d.rs");
File::create(&filepath); // ignore return; touch only
File::create(&filepath).unwrap(); // ignore return; touch only
assert!(!filepath.is_dir());
assert!(filepath.exists());
})
@ -982,7 +971,7 @@ mod test {
let tmpdir = tmpdir();
let unicode = tmpdir.path();
let unicode = unicode.join(format!("test-각丁ー再见"));
mkdir(&unicode, io::UserRWX);
mkdir(&unicode, io::UserRWX).unwrap();
assert!(unicode.exists());
assert!(!Path::new("test/unicode-bogus-path-각丁ー再见").exists());
})
@ -990,7 +979,7 @@ mod test {
iotest!(fn copy_file_does_not_exist() {
let from = Path::new("test/nonexistent-bogus-path");
let to = Path::new("test/other-bogus-path");
match io::result(|| copy(&from, &to)) {
match copy(&from, &to) {
Ok(..) => fail!(),
Err(..) => {
assert!(!from.exists());
@ -1004,20 +993,20 @@ mod test {
let input = tmpdir.join("in.txt");
let out = tmpdir.join("out.txt");
File::create(&input).write(bytes!("hello"));
copy(&input, &out);
let contents = File::open(&out).read_to_end();
File::create(&input).write(bytes!("hello")).unwrap();
copy(&input, &out).unwrap();
let contents = File::open(&out).read_to_end().unwrap();
assert_eq!(contents.as_slice(), bytes!("hello"));
assert_eq!(input.stat().perm, out.stat().perm);
assert_eq!(input.stat().unwrap().perm, out.stat().unwrap().perm);
})
iotest!(fn copy_file_dst_dir() {
let tmpdir = tmpdir();
let out = tmpdir.join("out");
File::create(&out);
match io::result(|| copy(&out, tmpdir.path())) {
File::create(&out).unwrap();
match copy(&out, tmpdir.path()) {
Ok(..) => fail!(), Err(..) => {}
}
})
@ -1027,11 +1016,11 @@ mod test {
let input = tmpdir.join("in");
let output = tmpdir.join("out");
File::create(&input).write("foo".as_bytes());
File::create(&output).write("bar".as_bytes());
copy(&input, &output);
File::create(&input).write("foo".as_bytes()).unwrap();
File::create(&output).write("bar".as_bytes()).unwrap();
copy(&input, &output).unwrap();
assert_eq!(File::open(&output).read_to_end(),
assert_eq!(File::open(&output).read_to_end().unwrap(),
(bytes!("foo")).to_owned());
})
@ -1039,7 +1028,7 @@ mod test {
let tmpdir = tmpdir();
let out = tmpdir.join("out");
match io::result(|| copy(tmpdir.path(), &out)) {
match copy(tmpdir.path(), &out) {
Ok(..) => fail!(), Err(..) => {}
}
assert!(!out.exists());
@ -1050,13 +1039,13 @@ mod test {
let input = tmpdir.join("in.txt");
let out = tmpdir.join("out.txt");
File::create(&input);
chmod(&input, io::UserRead);
copy(&input, &out);
assert!(out.stat().perm & io::UserWrite == 0);
File::create(&input).unwrap();
chmod(&input, io::UserRead).unwrap();
copy(&input, &out).unwrap();
assert!(out.stat().unwrap().perm & io::UserWrite == 0);
chmod(&input, io::UserFile);
chmod(&out, io::UserFile);
chmod(&input, io::UserFile).unwrap();
chmod(&out, io::UserFile).unwrap();
})
#[cfg(not(windows))] // FIXME(#10264) operation not permitted?
@ -1065,26 +1054,27 @@ mod test {
let input = tmpdir.join("in.txt");
let out = tmpdir.join("out.txt");
File::create(&input).write("foobar".as_bytes());
symlink(&input, &out);
File::create(&input).write("foobar".as_bytes()).unwrap();
symlink(&input, &out).unwrap();
if cfg!(not(windows)) {
assert_eq!(lstat(&out).kind, io::TypeSymlink);
assert_eq!(lstat(&out).unwrap().kind, io::TypeSymlink);
}
assert_eq!(stat(&out).size, stat(&input).size);
assert_eq!(File::open(&out).read_to_end(), (bytes!("foobar")).to_owned());
assert_eq!(stat(&out).unwrap().size, stat(&input).unwrap().size);
assert_eq!(File::open(&out).read_to_end().unwrap(),
(bytes!("foobar")).to_owned());
})
#[cfg(not(windows))] // apparently windows doesn't like symlinks
iotest!(fn symlink_noexist() {
let tmpdir = tmpdir();
// symlinks can point to things that don't exist
symlink(&tmpdir.join("foo"), &tmpdir.join("bar"));
symlink(&tmpdir.join("foo"), &tmpdir.join("bar")).unwrap();
assert!(readlink(&tmpdir.join("bar")).unwrap() == tmpdir.join("foo"));
})
iotest!(fn readlink_not_symlink() {
let tmpdir = tmpdir();
match io::result(|| readlink(tmpdir.path())) {
match readlink(tmpdir.path()) {
Ok(..) => fail!("wanted a failure"),
Err(..) => {}
}
@ -1095,22 +1085,23 @@ mod test {
let input = tmpdir.join("in.txt");
let out = tmpdir.join("out.txt");
File::create(&input).write("foobar".as_bytes());
link(&input, &out);
File::create(&input).write("foobar".as_bytes()).unwrap();
link(&input, &out).unwrap();
if cfg!(not(windows)) {
assert_eq!(lstat(&out).kind, io::TypeFile);
assert_eq!(stat(&out).unstable.nlink, 2);
assert_eq!(lstat(&out).unwrap().kind, io::TypeFile);
assert_eq!(stat(&out).unwrap().unstable.nlink, 2);
}
assert_eq!(stat(&out).size, stat(&input).size);
assert_eq!(File::open(&out).read_to_end(), (bytes!("foobar")).to_owned());
assert_eq!(stat(&out).unwrap().size, stat(&input).unwrap().size);
assert_eq!(File::open(&out).read_to_end().unwrap(),
(bytes!("foobar")).to_owned());
// can't link to yourself
match io::result(|| link(&input, &input)) {
match link(&input, &input) {
Ok(..) => fail!("wanted a failure"),
Err(..) => {}
}
// can't link to something that doesn't exist
match io::result(|| link(&tmpdir.join("foo"), &tmpdir.join("bar"))) {
match link(&tmpdir.join("foo"), &tmpdir.join("bar")) {
Ok(..) => fail!("wanted a failure"),
Err(..) => {}
}
@ -1120,17 +1111,17 @@ mod test {
let tmpdir = tmpdir();
let file = tmpdir.join("in.txt");
File::create(&file);
assert!(stat(&file).perm & io::UserWrite == io::UserWrite);
chmod(&file, io::UserRead);
assert!(stat(&file).perm & io::UserWrite == 0);
File::create(&file).unwrap();
assert!(stat(&file).unwrap().perm & io::UserWrite == io::UserWrite);
chmod(&file, io::UserRead).unwrap();
assert!(stat(&file).unwrap().perm & io::UserWrite == 0);
match io::result(|| chmod(&tmpdir.join("foo"), io::UserRWX)) {
match chmod(&tmpdir.join("foo"), io::UserRWX) {
Ok(..) => fail!("wanted a failure"),
Err(..) => {}
}
chmod(&file, io::UserFile);
chmod(&file, io::UserFile).unwrap();
})
iotest!(fn sync_doesnt_kill_anything() {
@ -1138,11 +1129,11 @@ mod test {
let path = tmpdir.join("in.txt");
let mut file = File::open_mode(&path, io::Open, io::ReadWrite).unwrap();
file.fsync();
file.datasync();
file.write(bytes!("foo"));
file.fsync();
file.datasync();
file.fsync().unwrap();
file.datasync().unwrap();
file.write(bytes!("foo")).unwrap();
file.fsync().unwrap();
file.datasync().unwrap();
drop(file);
})
@ -1151,28 +1142,28 @@ mod test {
let path = tmpdir.join("in.txt");
let mut file = File::open_mode(&path, io::Open, io::ReadWrite).unwrap();
file.write(bytes!("foo"));
file.fsync();
file.write(bytes!("foo")).unwrap();
file.fsync().unwrap();
// Do some simple things with truncation
assert_eq!(stat(&path).size, 3);
file.truncate(10);
assert_eq!(stat(&path).size, 10);
file.write(bytes!("bar"));
file.fsync();
assert_eq!(stat(&path).size, 10);
assert_eq!(File::open(&path).read_to_end(),
assert_eq!(stat(&path).unwrap().size, 3);
file.truncate(10).unwrap();
assert_eq!(stat(&path).unwrap().size, 10);
file.write(bytes!("bar")).unwrap();
file.fsync().unwrap();
assert_eq!(stat(&path).unwrap().size, 10);
assert_eq!(File::open(&path).read_to_end().unwrap(),
(bytes!("foobar", 0, 0, 0, 0)).to_owned());
// Truncate to a smaller length, don't seek, and then write something.
// Ensure that the intermediate zeroes are all filled in (we're seeked
// past the end of the file).
file.truncate(2);
assert_eq!(stat(&path).size, 2);
file.write(bytes!("wut"));
file.fsync();
assert_eq!(stat(&path).size, 9);
assert_eq!(File::open(&path).read_to_end(),
file.truncate(2).unwrap();
assert_eq!(stat(&path).unwrap().size, 2);
file.write(bytes!("wut")).unwrap();
file.fsync().unwrap();
assert_eq!(stat(&path).unwrap().size, 9);
assert_eq!(File::open(&path).read_to_end().unwrap(),
(bytes!("fo", 0, 0, 0, 0, "wut")).to_owned());
drop(file);
})
@ -1180,8 +1171,7 @@ mod test {
iotest!(fn open_flavors() {
let tmpdir = tmpdir();
match io::result(|| File::open_mode(&tmpdir.join("a"), io::Open,
io::Read)) {
match File::open_mode(&tmpdir.join("a"), io::Open, io::Read) {
Ok(..) => fail!(), Err(..) => {}
}
File::open_mode(&tmpdir.join("b"), io::Open, io::Write).unwrap();
@ -1191,46 +1181,46 @@ mod test {
File::open_mode(&tmpdir.join("f"), io::Truncate, io::Write).unwrap();
File::open_mode(&tmpdir.join("g"), io::Truncate, io::ReadWrite).unwrap();
File::create(&tmpdir.join("h")).write("foo".as_bytes());
File::create(&tmpdir.join("h")).write("foo".as_bytes()).unwrap();
File::open_mode(&tmpdir.join("h"), io::Open, io::Read).unwrap();
{
let mut f = File::open_mode(&tmpdir.join("h"), io::Open,
io::Read).unwrap();
match io::result(|| f.write("wut".as_bytes())) {
match f.write("wut".as_bytes()) {
Ok(..) => fail!(), Err(..) => {}
}
}
assert_eq!(stat(&tmpdir.join("h")).size, 3);
assert_eq!(stat(&tmpdir.join("h")).unwrap().size, 3);
{
let mut f = File::open_mode(&tmpdir.join("h"), io::Append,
io::Write).unwrap();
f.write("bar".as_bytes());
f.write("bar".as_bytes()).unwrap();
}
assert_eq!(stat(&tmpdir.join("h")).size, 6);
assert_eq!(stat(&tmpdir.join("h")).unwrap().size, 6);
{
let mut f = File::open_mode(&tmpdir.join("h"), io::Truncate,
io::Write).unwrap();
f.write("bar".as_bytes());
f.write("bar".as_bytes()).unwrap();
}
assert_eq!(stat(&tmpdir.join("h")).size, 3);
assert_eq!(stat(&tmpdir.join("h")).unwrap().size, 3);
})
#[test]
fn utime() {
let tmpdir = tmpdir();
let path = tmpdir.join("a");
File::create(&path);
File::create(&path).unwrap();
change_file_times(&path, 1000, 2000);
assert_eq!(path.stat().accessed, 1000);
assert_eq!(path.stat().modified, 2000);
change_file_times(&path, 1000, 2000).unwrap();
assert_eq!(path.stat().unwrap().accessed, 1000);
assert_eq!(path.stat().unwrap().modified, 2000);
}
#[test]
fn utime_noexist() {
let tmpdir = tmpdir();
match io::result(|| change_file_times(&tmpdir.join("a"), 100, 200)) {
match change_file_times(&tmpdir.join("a"), 100, 200) {
Ok(..) => fail!(),
Err(..) => {}
}

View File

@ -314,33 +314,34 @@ mod test {
use prelude::*;
use super::*;
use io::*;
use io;
#[test]
fn test_mem_writer() {
let mut writer = MemWriter::new();
assert_eq!(writer.tell(), 0);
writer.write([0]);
assert_eq!(writer.tell(), 1);
writer.write([1, 2, 3]);
writer.write([4, 5, 6, 7]);
assert_eq!(writer.tell(), 8);
assert_eq!(writer.tell(), Ok(0));
writer.write([0]).unwrap();
assert_eq!(writer.tell(), Ok(1));
writer.write([1, 2, 3]).unwrap();
writer.write([4, 5, 6, 7]).unwrap();
assert_eq!(writer.tell(), Ok(8));
assert_eq!(writer.get_ref(), [0, 1, 2, 3, 4, 5, 6, 7]);
writer.seek(0, SeekSet);
assert_eq!(writer.tell(), 0);
writer.write([3, 4]);
writer.seek(0, SeekSet).unwrap();
assert_eq!(writer.tell(), Ok(0));
writer.write([3, 4]).unwrap();
assert_eq!(writer.get_ref(), [3, 4, 2, 3, 4, 5, 6, 7]);
writer.seek(1, SeekCur);
writer.write([0, 1]);
writer.seek(1, SeekCur).unwrap();
writer.write([0, 1]).unwrap();
assert_eq!(writer.get_ref(), [3, 4, 2, 0, 1, 5, 6, 7]);
writer.seek(-1, SeekEnd);
writer.write([1, 2]);
writer.seek(-1, SeekEnd).unwrap();
writer.write([1, 2]).unwrap();
assert_eq!(writer.get_ref(), [3, 4, 2, 0, 1, 5, 6, 1, 2]);
writer.seek(1, SeekEnd);
writer.write([1]);
writer.seek(1, SeekEnd).unwrap();
writer.write([1]).unwrap();
assert_eq!(writer.get_ref(), [3, 4, 2, 0, 1, 5, 6, 1, 2, 0, 1]);
}
@ -349,12 +350,12 @@ mod test {
let mut buf = [0 as u8, ..8];
{
let mut writer = BufWriter::new(buf);
assert_eq!(writer.tell(), 0);
writer.write([0]);
assert_eq!(writer.tell(), 1);
writer.write([1, 2, 3]);
writer.write([4, 5, 6, 7]);
assert_eq!(writer.tell(), 8);
assert_eq!(writer.tell(), Ok(0));
writer.write([0]).unwrap();
assert_eq!(writer.tell(), Ok(1));
writer.write([1, 2, 3]).unwrap();
writer.write([4, 5, 6, 7]).unwrap();
assert_eq!(writer.tell(), Ok(8));
}
assert_eq!(buf, [0, 1, 2, 3, 4, 5, 6, 7]);
}
@ -364,24 +365,24 @@ mod test {
let mut buf = [0 as u8, ..8];
{
let mut writer = BufWriter::new(buf);
assert_eq!(writer.tell(), 0);
writer.write([1]);
assert_eq!(writer.tell(), 1);
assert_eq!(writer.tell(), Ok(0));
writer.write([1]).unwrap();
assert_eq!(writer.tell(), Ok(1));
writer.seek(2, SeekSet);
assert_eq!(writer.tell(), 2);
writer.write([2]);
assert_eq!(writer.tell(), 3);
writer.seek(2, SeekSet).unwrap();
assert_eq!(writer.tell(), Ok(2));
writer.write([2]).unwrap();
assert_eq!(writer.tell(), Ok(3));
writer.seek(-2, SeekCur);
assert_eq!(writer.tell(), 1);
writer.write([3]);
assert_eq!(writer.tell(), 2);
writer.seek(-2, SeekCur).unwrap();
assert_eq!(writer.tell(), Ok(1));
writer.write([3]).unwrap();
assert_eq!(writer.tell(), Ok(2));
writer.seek(-1, SeekEnd);
assert_eq!(writer.tell(), 7);
writer.write([4]);
assert_eq!(writer.tell(), 8);
writer.seek(-1, SeekEnd).unwrap();
assert_eq!(writer.tell(), Ok(7));
writer.write([4]).unwrap();
assert_eq!(writer.tell(), Ok(8));
}
assert_eq!(buf, [1, 3, 2, 0, 0, 0, 0, 4]);
@ -391,35 +392,31 @@ mod test {
fn test_buf_writer_error() {
let mut buf = [0 as u8, ..2];
let mut writer = BufWriter::new(buf);
writer.write([0]);
writer.write([0]).unwrap();
let mut called = false;
io_error::cond.trap(|err| {
assert_eq!(err.kind, io::OtherIoError);
called = true;
}).inside(|| {
writer.write([0, 0]);
});
assert!(called);
match writer.write([0, 0]) {
Ok(..) => fail!(),
Err(e) => assert_eq!(e.kind, io::OtherIoError),
}
}
#[test]
fn test_mem_reader() {
let mut reader = MemReader::new(~[0, 1, 2, 3, 4, 5, 6, 7]);
let mut buf = [];
assert_eq!(reader.read(buf), Some(0));
assert_eq!(reader.tell(), 0);
assert_eq!(reader.read(buf), Ok(0));
assert_eq!(reader.tell(), Ok(0));
let mut buf = [0];
assert_eq!(reader.read(buf), Some(1));
assert_eq!(reader.tell(), 1);
assert_eq!(reader.read(buf), Ok(1));
assert_eq!(reader.tell(), Ok(1));
assert_eq!(buf, [0]);
let mut buf = [0, ..4];
assert_eq!(reader.read(buf), Some(4));
assert_eq!(reader.tell(), 5);
assert_eq!(reader.read(buf), Ok(4));
assert_eq!(reader.tell(), Ok(5));
assert_eq!(buf, [1, 2, 3, 4]);
assert_eq!(reader.read(buf), Some(3));
assert_eq!(reader.read(buf), Ok(3));
assert_eq!(buf.slice(0, 3), [5, 6, 7]);
assert_eq!(reader.read(buf), None);
assert!(reader.read(buf).is_err());
}
#[test]
@ -427,64 +424,64 @@ mod test {
let in_buf = ~[0, 1, 2, 3, 4, 5, 6, 7];
let mut reader = BufReader::new(in_buf);
let mut buf = [];
assert_eq!(reader.read(buf), Some(0));
assert_eq!(reader.tell(), 0);
assert_eq!(reader.read(buf), Ok(0));
assert_eq!(reader.tell(), Ok(0));
let mut buf = [0];
assert_eq!(reader.read(buf), Some(1));
assert_eq!(reader.tell(), 1);
assert_eq!(reader.read(buf), Ok(1));
assert_eq!(reader.tell(), Ok(1));
assert_eq!(buf, [0]);
let mut buf = [0, ..4];
assert_eq!(reader.read(buf), Some(4));
assert_eq!(reader.tell(), 5);
assert_eq!(reader.read(buf), Ok(4));
assert_eq!(reader.tell(), Ok(5));
assert_eq!(buf, [1, 2, 3, 4]);
assert_eq!(reader.read(buf), Some(3));
assert_eq!(reader.read(buf), Ok(3));
assert_eq!(buf.slice(0, 3), [5, 6, 7]);
assert_eq!(reader.read(buf), None);
assert!(reader.read(buf).is_err());
}
#[test]
fn test_read_char() {
let b = bytes!("Việt");
let mut r = BufReader::new(b);
assert_eq!(r.read_char(), Some('V'));
assert_eq!(r.read_char(), Some('i'));
assert_eq!(r.read_char(), Some('ệ'));
assert_eq!(r.read_char(), Some('t'));
assert_eq!(r.read_char(), None);
assert_eq!(r.read_char(), Ok('V'));
assert_eq!(r.read_char(), Ok('i'));
assert_eq!(r.read_char(), Ok('ệ'));
assert_eq!(r.read_char(), Ok('t'));
assert!(r.read_char().is_err());
}
#[test]
fn test_read_bad_char() {
let b = bytes!(0x80);
let mut r = BufReader::new(b);
assert_eq!(r.read_char(), None);
assert!(r.read_char().is_err());
}
#[test]
fn test_write_strings() {
let mut writer = MemWriter::new();
writer.write_str("testing");
writer.write_line("testing");
writer.write_str("testing");
writer.write_str("testing").unwrap();
writer.write_line("testing").unwrap();
writer.write_str("testing").unwrap();
let mut r = BufReader::new(writer.get_ref());
assert_eq!(r.read_to_str(), ~"testingtesting\ntesting");
assert_eq!(r.read_to_str().unwrap(), ~"testingtesting\ntesting");
}
#[test]
fn test_write_char() {
let mut writer = MemWriter::new();
writer.write_char('a');
writer.write_char('\n');
writer.write_char('ệ');
writer.write_char('a').unwrap();
writer.write_char('\n').unwrap();
writer.write_char('ệ').unwrap();
let mut r = BufReader::new(writer.get_ref());
assert_eq!(r.read_to_str(), ~"a\n");
assert_eq!(r.read_to_str().unwrap(), ~"a\n");
}
#[test]
fn test_read_whole_string_bad() {
let buf = [0xff];
let mut r = BufReader::new(buf);
match result(|| r.read_to_str()) {
match r.read_to_str() {
Ok(..) => fail!(),
Err(..) => {}
}

View File

@ -287,6 +287,7 @@ Out of scope
*/
#[allow(missing_doc)];
#[deny(unused_must_use)];
use cast;
use char::Char;
@ -1122,9 +1123,6 @@ pub trait Buffer: Reader {
}
}
}
if used == 0 {
break
}
self.consume(used);
}
self.consume(used);
@ -1141,15 +1139,14 @@ pub trait Buffer: Reader {
/// This function will raise on the `io_error` condition if a read error is
/// encountered.
fn read_char(&mut self) -> IoResult<char> {
let width = {
let available = if_ok!(self.fill());
str::utf8_char_width(available[0])
};
if width == 0 { return Err(standard_error(InvalidInput)) } // not uf8
let mut buf = [0, ..4];
let first_byte = if_ok!(self.read_byte());
let width = str::utf8_char_width(first_byte);
if width == 1 { return Ok(first_byte as char) }
if width == 0 { return Err(standard_error(InvalidInput)) } // not utf8
let mut buf = [first_byte, 0, 0, 0];
{
let mut start = 0;
loop {
let mut start = 1;
while start < width {
match if_ok!(self.read(buf.mut_slice(start, width))) {
n if n == width - start => break,
n if n < width - start => { start += n; }

View File

@ -116,6 +116,6 @@ mod test {
iotest!(fn issue_10663() {
// Something should happen here, but this certainly shouldn't cause
// everything to die. The actual outcome we don't care too much about.
get_host_addresses("example.com");
get_host_addresses("example.com").unwrap();
} #[ignore])
}

View File

@ -86,29 +86,19 @@ mod test {
// FIXME #11530 this fails on android because tests are run as root
iotest!(fn bind_error() {
let mut called = false;
io_error::cond.trap(|e| {
assert!(e.kind == PermissionDenied);
called = true;
}).inside(|| {
let addr = SocketAddr { ip: Ipv4Addr(0, 0, 0, 0), port: 1 };
let listener = TcpListener::bind(addr);
assert!(listener.is_none());
});
assert!(called);
let addr = SocketAddr { ip: Ipv4Addr(0, 0, 0, 0), port: 1 };
match TcpListener::bind(addr) {
Ok(..) => fail!(),
Err(e) => assert_eq!(e.kind, PermissionDenied),
}
} #[ignore(cfg(windows))] #[ignore(cfg(target_os = "android"))])
iotest!(fn connect_error() {
let mut called = false;
io_error::cond.trap(|e| {
assert_eq!(e.kind, ConnectionRefused);
called = true;
}).inside(|| {
let addr = SocketAddr { ip: Ipv4Addr(0, 0, 0, 0), port: 1 };
let stream = TcpStream::connect(addr);
assert!(stream.is_none());
});
assert!(called);
let addr = SocketAddr { ip: Ipv4Addr(0, 0, 0, 0), port: 1 };
match TcpStream::connect(addr) {
Ok(..) => fail!(),
Err(e) => assert_eq!(e.kind, ConnectionRefused),
}
})
iotest!(fn smoke_test_ip4() {
@ -118,14 +108,14 @@ mod test {
spawn(proc() {
port.recv();
let mut stream = TcpStream::connect(addr);
stream.write([99]);
stream.write([99]).unwrap();
});
let mut acceptor = TcpListener::bind(addr).listen();
chan.send(());
let mut stream = acceptor.accept();
let mut buf = [0];
stream.read(buf);
stream.read(buf).unwrap();
assert!(buf[0] == 99);
})
@ -136,14 +126,14 @@ mod test {
spawn(proc() {
port.recv();
let mut stream = TcpStream::connect(addr);
stream.write([99]);
stream.write([99]).unwrap();
});
let mut acceptor = TcpListener::bind(addr).listen();
chan.send(());
let mut stream = acceptor.accept();
let mut buf = [0];
stream.read(buf);
stream.read(buf).unwrap();
assert!(buf[0] == 99);
})
@ -162,7 +152,7 @@ mod test {
let mut stream = acceptor.accept();
let mut buf = [0];
let nread = stream.read(buf);
assert!(nread.is_none());
assert!(nread.is_err());
})
iotest!(fn read_eof_ip6() {
@ -180,7 +170,7 @@ mod test {
let mut stream = acceptor.accept();
let mut buf = [0];
let nread = stream.read(buf);
assert!(nread.is_none());
assert!(nread.is_err());
})
iotest!(fn read_eof_twice_ip4() {
@ -198,17 +188,14 @@ mod test {
let mut stream = acceptor.accept();
let mut buf = [0];
let nread = stream.read(buf);
assert!(nread.is_none());
io_error::cond.trap(|e| {
if cfg!(windows) {
assert_eq!(e.kind, NotConnected);
} else {
fail!();
}
}).inside(|| {
let nread = stream.read(buf);
assert!(nread.is_none());
})
assert!(nread.is_err());
match stream.read(buf) {
Ok(..) => fail!(),
Err(ref e) if cfg!(windows) => assert_eq!(e.kind, NotConnected),
Err(ref e) if cfg!(unix) => assert_eq!(e.kind, EndOfFile),
Err(..) => fail!(),
}
})
iotest!(fn read_eof_twice_ip6() {
@ -226,17 +213,14 @@ mod test {
let mut stream = acceptor.accept();
let mut buf = [0];
let nread = stream.read(buf);
assert!(nread.is_none());
io_error::cond.trap(|e| {
if cfg!(windows) {
assert_eq!(e.kind, NotConnected);
} else {
fail!();
}
}).inside(|| {
let nread = stream.read(buf);
assert!(nread.is_none());
})
assert!(nread.is_err());
match stream.read(buf) {
Ok(..) => fail!(),
Err(ref e) if cfg!(windows) => assert_eq!(e.kind, NotConnected),
Err(ref e) if cfg!(unix) => assert_eq!(e.kind, EndOfFile),
Err(..) => fail!(),
}
})
iotest!(fn write_close_ip4() {
@ -254,19 +238,16 @@ mod test {
let mut stream = acceptor.accept();
let buf = [0];
loop {
let mut stop = false;
io_error::cond.trap(|e| {
// NB: ECONNRESET on linux, EPIPE on mac, ECONNABORTED
// on windows
assert!(e.kind == ConnectionReset ||
e.kind == BrokenPipe ||
e.kind == ConnectionAborted,
"unknown error: {:?}", e);
stop = true;
}).inside(|| {
stream.write(buf);
});
if stop { break }
match stream.write(buf) {
Ok(..) => {}
Err(e) => {
assert!(e.kind == ConnectionReset ||
e.kind == BrokenPipe ||
e.kind == ConnectionAborted,
"unknown error: {:?}", e);
break;
}
}
}
})
@ -285,19 +266,16 @@ mod test {
let mut stream = acceptor.accept();
let buf = [0];
loop {
let mut stop = false;
io_error::cond.trap(|e| {
// NB: ECONNRESET on linux, EPIPE on mac, ECONNABORTED
// on windows
assert!(e.kind == ConnectionReset ||
e.kind == BrokenPipe ||
e.kind == ConnectionAborted,
"unknown error: {:?}", e);
stop = true;
}).inside(|| {
stream.write(buf);
});
if stop { break }
match stream.write(buf) {
Ok(..) => {}
Err(e) => {
assert!(e.kind == ConnectionReset ||
e.kind == BrokenPipe ||
e.kind == ConnectionAborted,
"unknown error: {:?}", e);
break;
}
}
}
})
@ -310,7 +288,7 @@ mod test {
port.recv();
for _ in range(0, max) {
let mut stream = TcpStream::connect(addr);
stream.write([99]);
stream.write([99]).unwrap();
}
});
@ -318,7 +296,7 @@ mod test {
chan.send(());
for ref mut stream in acceptor.incoming().take(max) {
let mut buf = [0];
stream.read(buf);
stream.read(buf).unwrap();
assert_eq!(buf[0], 99);
}
})
@ -332,7 +310,7 @@ mod test {
port.recv();
for _ in range(0, max) {
let mut stream = TcpStream::connect(addr);
stream.write([99]);
stream.write([99]).unwrap();
}
});
@ -340,7 +318,7 @@ mod test {
chan.send(());
for ref mut stream in acceptor.incoming().take(max) {
let mut buf = [0];
stream.read(buf);
stream.read(buf).unwrap();
assert_eq!(buf[0], 99);
}
})
@ -358,7 +336,7 @@ mod test {
spawn(proc() {
let mut stream = stream;
let mut buf = [0];
stream.read(buf);
stream.read(buf).unwrap();
assert!(buf[0] == i as u8);
debug!("read");
});
@ -377,7 +355,7 @@ mod test {
// Connect again before writing
connect(i + 1, addr);
debug!("writing");
stream.write([i as u8]);
stream.write([i as u8]).unwrap();
});
}
})
@ -395,7 +373,7 @@ mod test {
spawn(proc() {
let mut stream = stream;
let mut buf = [0];
stream.read(buf);
stream.read(buf).unwrap();
assert!(buf[0] == i as u8);
debug!("read");
});
@ -414,7 +392,7 @@ mod test {
// Connect again before writing
connect(i + 1, addr);
debug!("writing");
stream.write([i as u8]);
stream.write([i as u8]).unwrap();
});
}
})
@ -432,7 +410,7 @@ mod test {
spawn(proc() {
let mut stream = stream;
let mut buf = [0];
stream.read(buf);
stream.read(buf).unwrap();
assert!(buf[0] == 99);
debug!("read");
});
@ -451,7 +429,7 @@ mod test {
// Connect again before writing
connect(i + 1, addr);
debug!("writing");
stream.write([99]);
stream.write([99]).unwrap();
});
}
})
@ -469,7 +447,7 @@ mod test {
spawn(proc() {
let mut stream = stream;
let mut buf = [0];
stream.read(buf);
stream.read(buf).unwrap();
assert!(buf[0] == 99);
debug!("read");
});
@ -488,7 +466,7 @@ mod test {
// Connect again before writing
connect(i + 1, addr);
debug!("writing");
stream.write([99]);
stream.write([99]).unwrap();
});
}
})
@ -499,7 +477,7 @@ mod test {
// Make sure socket_name gives
// us the socket we binded to.
let so_name = listener.socket_name();
assert!(so_name.is_some());
assert!(so_name.is_ok());
assert_eq!(addr, so_name.unwrap());
}
@ -509,20 +487,20 @@ mod test {
spawn(proc() {
let mut acceptor = TcpListener::bind(addr).listen();
chan.send(());
acceptor.accept();
acceptor.accept().unwrap();
});
port.recv();
let stream = TcpStream::connect(addr);
assert!(stream.is_some());
assert!(stream.is_ok());
let mut stream = stream.unwrap();
// Make sure peer_name gives us the
// address/port of the peer we've
// connected to.
let peer_name = stream.peer_name();
assert!(peer_name.is_some());
assert!(peer_name.is_ok());
assert_eq!(addr, peer_name.unwrap());
}
@ -541,37 +519,33 @@ mod test {
let addr = next_test_ip4();
let (p, c) = Chan::new();
spawn(proc() {
let mut srv = TcpListener::bind(addr).listen();
let mut srv = TcpListener::bind(addr).listen().unwrap();
c.send(());
let mut cl = srv.accept().unwrap();
cl.write([10]);
cl.write([10]).unwrap();
let mut b = [0];
cl.read(b);
cl.read(b).unwrap();
c.send(());
});
p.recv();
let mut c = TcpStream::connect(addr).unwrap();
let mut b = [0, ..10];
assert_eq!(c.read(b), Some(1));
c.write([1]);
assert_eq!(c.read(b), Ok(1));
c.write([1]).unwrap();
p.recv();
})
iotest!(fn double_bind() {
let mut called = false;
io_error::cond.trap(|e| {
assert!(e.kind == ConnectionRefused || e.kind == OtherIoError);
called = true;
}).inside(|| {
let addr = next_test_ip4();
let listener = TcpListener::bind(addr).unwrap().listen();
assert!(listener.is_some());
let listener2 = TcpListener::bind(addr).and_then(|l|
l.listen());
assert!(listener2.is_none());
});
assert!(called);
let addr = next_test_ip4();
let listener = TcpListener::bind(addr).unwrap().listen();
assert!(listener.is_ok());
match TcpListener::bind(addr).listen() {
Ok(..) => fail!(),
Err(e) => {
assert!(e.kind == ConnectionRefused || e.kind == OtherIoError);
}
}
})
iotest!(fn fast_rebind() {
@ -580,7 +554,7 @@ mod test {
spawn(proc() {
port.recv();
let _stream = TcpStream::connect(addr);
let _stream = TcpStream::connect(addr).unwrap();
// Close
port.recv();
});
@ -589,7 +563,7 @@ mod test {
let mut acceptor = TcpListener::bind(addr).listen();
chan.send(());
{
let _stream = acceptor.accept();
let _stream = acceptor.accept().unwrap();
// Close client
chan.send(());
}

View File

@ -80,16 +80,11 @@ mod test {
// FIXME #11530 this fails on android because tests are run as root
iotest!(fn bind_error() {
let mut called = false;
io_error::cond.trap(|e| {
assert_eq!(e.kind, PermissionDenied);
called = true;
}).inside(|| {
let addr = SocketAddr { ip: Ipv4Addr(0, 0, 0, 0), port: 1 };
let socket = UdpSocket::bind(addr);
assert!(socket.is_none());
});
assert!(called);
let addr = SocketAddr { ip: Ipv4Addr(0, 0, 0, 0), port: 1 };
match UdpSocket::bind(addr) {
Ok(..) => fail!(),
Err(e) => assert_eq!(e.kind, PermissionDenied),
}
} #[ignore(cfg(windows))] #[ignore(cfg(target_os = "android"))])
iotest!(fn socket_smoke_test_ip4() {
@ -100,29 +95,29 @@ mod test {
spawn(proc() {
match UdpSocket::bind(client_ip) {
Some(ref mut client) => {
Ok(ref mut client) => {
port.recv();
client.sendto([99], server_ip)
client.sendto([99], server_ip).unwrap()
}
None => fail!()
Err(..) => fail!()
}
chan2.send(());
});
match UdpSocket::bind(server_ip) {
Some(ref mut server) => {
Ok(ref mut server) => {
chan.send(());
let mut buf = [0];
match server.recvfrom(buf) {
Some((nread, src)) => {
Ok((nread, src)) => {
assert_eq!(nread, 1);
assert_eq!(buf[0], 99);
assert_eq!(src, client_ip);
}
None => fail!()
Err(..) => fail!()
}
}
None => fail!()
Err(..) => fail!()
}
port2.recv();
})
@ -134,28 +129,28 @@ mod test {
spawn(proc() {
match UdpSocket::bind(client_ip) {
Some(ref mut client) => {
Ok(ref mut client) => {
port.recv();
client.sendto([99], server_ip)
client.sendto([99], server_ip).unwrap()
}
None => fail!()
Err(..) => fail!()
}
});
match UdpSocket::bind(server_ip) {
Some(ref mut server) => {
Ok(ref mut server) => {
chan.send(());
let mut buf = [0];
match server.recvfrom(buf) {
Some((nread, src)) => {
Ok((nread, src)) => {
assert_eq!(nread, 1);
assert_eq!(buf[0], 99);
assert_eq!(src, client_ip);
}
None => fail!()
Err(..) => fail!()
}
}
None => fail!()
Err(..) => fail!()
}
})
@ -167,32 +162,32 @@ mod test {
spawn(proc() {
match UdpSocket::bind(client_ip) {
Some(client) => {
Ok(client) => {
let client = ~client;
let mut stream = client.connect(server_ip);
port.recv();
stream.write([99]);
stream.write([99]).unwrap();
}
None => fail!()
Err(..) => fail!()
}
chan2.send(());
});
match UdpSocket::bind(server_ip) {
Some(server) => {
Ok(server) => {
let server = ~server;
let mut stream = server.connect(client_ip);
chan.send(());
let mut buf = [0];
match stream.read(buf) {
Some(nread) => {
Ok(nread) => {
assert_eq!(nread, 1);
assert_eq!(buf[0], 99);
}
None => fail!()
Err(..) => fail!()
}
}
None => fail!()
Err(..) => fail!()
}
port2.recv();
})
@ -205,32 +200,32 @@ mod test {
spawn(proc() {
match UdpSocket::bind(client_ip) {
Some(client) => {
Ok(client) => {
let client = ~client;
let mut stream = client.connect(server_ip);
port.recv();
stream.write([99]);
stream.write([99]).unwrap();
}
None => fail!()
Err(..) => fail!()
}
chan2.send(());
});
match UdpSocket::bind(server_ip) {
Some(server) => {
Ok(server) => {
let server = ~server;
let mut stream = server.connect(client_ip);
chan.send(());
let mut buf = [0];
match stream.read(buf) {
Some(nread) => {
Ok(nread) => {
assert_eq!(nread, 1);
assert_eq!(buf[0], 99);
}
None => fail!()
Err(..) => fail!()
}
}
None => fail!()
Err(..) => fail!()
}
port2.recv();
})
@ -238,13 +233,13 @@ mod test {
pub fn socket_name(addr: SocketAddr) {
let server = UdpSocket::bind(addr);
assert!(server.is_some());
assert!(server.is_ok());
let mut server = server.unwrap();
// Make sure socket_name gives
// us the socket we binded to.
let so_name = server.socket_name();
assert!(so_name.is_some());
assert!(so_name.is_ok());
assert_eq!(addr, so_name.unwrap());
}

View File

@ -151,39 +151,29 @@ mod tests {
#[test]
fn bind_error() {
let mut called = false;
io_error::cond.trap(|e| {
assert!(e.kind == PermissionDenied);
called = true;
}).inside(|| {
let listener = UnixListener::bind(&("path/to/nowhere"));
assert!(listener.is_none());
});
assert!(called);
match UnixListener::bind(&("path/to/nowhere")) {
Ok(..) => fail!(),
Err(e) => assert_eq!(e.kind, PermissionDenied),
}
}
#[test]
fn connect_error() {
let mut called = false;
io_error::cond.trap(|e| {
assert_eq!(e.kind,
if cfg!(windows) {OtherIoError} else {FileNotFound});
called = true;
}).inside(|| {
let stream = UnixStream::connect(&("path/to/nowhere"));
assert!(stream.is_none());
});
assert!(called);
match UnixStream::connect(&("path/to/nowhere")) {
Ok(..) => fail!(),
Err(e) => assert_eq!(e.kind,
if cfg!(windows) {OtherIoError} else {FileNotFound})
}
}
#[test]
fn smoke() {
smalltest(proc(mut server) {
let mut buf = [0];
server.read(buf);
server.read(buf).unwrap();
assert!(buf[0] == 99);
}, proc(mut client) {
client.write([99]);
client.write([99]).unwrap();
})
}
@ -191,8 +181,8 @@ mod tests {
fn read_eof() {
smalltest(proc(mut server) {
let mut buf = [0];
assert!(server.read(buf).is_none());
assert!(server.read(buf).is_none());
assert!(server.read(buf).is_err());
assert!(server.read(buf).is_err());
}, proc(_client) {
// drop the client
})
@ -202,15 +192,15 @@ mod tests {
fn write_begone() {
smalltest(proc(mut server) {
let buf = [0];
let mut stop = false;
while !stop{
io_error::cond.trap(|e| {
assert!(e.kind == BrokenPipe || e.kind == NotConnected,
"unknown error {:?}", e);
stop = true;
}).inside(|| {
server.write(buf);
})
loop {
match server.write(buf) {
Ok(..) => {}
Err(e) => {
assert!(e.kind == BrokenPipe || e.kind == NotConnected,
"unknown error {:?}", e);
break;
}
}
}
}, proc(_client) {
// drop the client
@ -228,7 +218,7 @@ mod tests {
port.recv();
for _ in range(0, times) {
let mut stream = UnixStream::connect(&path2);
stream.write([100]);
stream.write([100]).unwrap();
}
});
@ -237,7 +227,7 @@ mod tests {
for _ in range(0, times) {
let mut client = acceptor.accept();
let mut buf = [0];
client.read(buf);
client.read(buf).unwrap();
assert_eq!(buf[0], 100);
}
}

View File

@ -73,12 +73,12 @@ mod test {
let (p, c) = Chan::new();
spawn(proc() {
let mut out = out;
out.write([10]);
out.write([10]).unwrap();
p.recv(); // don't close the pipe until the other read has finished
});
let mut buf = [0, ..10];
input.read(buf);
input.read(buf).unwrap();
c.send(());
})
}

View File

@ -171,7 +171,6 @@ impl Drop for Process {
mod tests {
use io::process::{ProcessConfig, Process};
use prelude::*;
use str;
// FIXME(#10380)
#[cfg(unix, not(target_os="android"))]
@ -185,7 +184,7 @@ mod tests {
io: io,
};
let p = Process::new(args);
assert!(p.is_some());
assert!(p.is_ok());
let mut p = p.unwrap();
assert!(p.wait().success());
})
@ -201,7 +200,7 @@ mod tests {
cwd: None,
io: io,
};
match io::result(|| Process::new(args)) {
match Process::new(args) {
Ok(..) => fail!(),
Err(..) => {}
}
@ -219,7 +218,7 @@ mod tests {
io: io,
};
let p = Process::new(args);
assert!(p.is_some());
assert!(p.is_ok());
let mut p = p.unwrap();
assert!(p.wait().matches_exit_status(1));
})
@ -235,7 +234,7 @@ mod tests {
io: io,
};
let p = Process::new(args);
assert!(p.is_some());
assert!(p.is_ok());
let mut p = p.unwrap();
match p.wait() {
process::ExitSignal(1) => {},
@ -244,20 +243,12 @@ mod tests {
})
pub fn read_all(input: &mut Reader) -> ~str {
let mut ret = ~"";
let mut buf = [0, ..1024];
loop {
match input.read(buf) {
None => { break }
Some(n) => { ret.push_str(str::from_utf8(buf.slice_to(n)).unwrap()); }
}
}
return ret;
input.read_to_str().unwrap()
}
pub fn run_output(args: ProcessConfig) -> ~str {
let p = Process::new(args);
assert!(p.is_some());
assert!(p.is_ok());
let mut p = p.unwrap();
assert!(p.io[0].is_none());
assert!(p.io[1].is_some());
@ -307,8 +298,8 @@ mod tests {
cwd: None,
io: io,
};
let mut p = Process::new(args).expect("didn't create a proces?!");
p.io[0].get_mut_ref().write("foobar".as_bytes());
let mut p = Process::new(args).unwrap();
p.io[0].get_mut_ref().write("foobar".as_bytes()).unwrap();
p.io[0] = None; // close stdin;
let out = read_all(p.io[1].get_mut_ref() as &mut Reader);
assert!(p.wait().success());

View File

@ -80,59 +80,49 @@ impl<T, A: Acceptor<T>> Acceptor<T> for IoResult<A> {
mod test {
use prelude::*;
use super::super::mem::*;
use super::super::{PreviousIoError, io_error};
use io;
#[test]
fn test_option_writer() {
let mut writer: Option<MemWriter> = Some(MemWriter::new());
writer.write([0, 1, 2]);
writer.flush();
let mut writer: io::IoResult<MemWriter> = Ok(MemWriter::new());
writer.write([0, 1, 2]).unwrap();
writer.flush().unwrap();
assert_eq!(writer.unwrap().unwrap(), ~[0, 1, 2]);
}
#[test]
fn test_option_writer_error() {
let mut writer: Option<MemWriter> = None;
let mut writer: io::IoResult<MemWriter> =
Err(io::standard_error(io::EndOfFile));
let mut called = false;
io_error::cond.trap(|err| {
assert_eq!(err.kind, PreviousIoError);
called = true;
}).inside(|| {
writer.write([0, 0, 0]);
});
assert!(called);
let mut called = false;
io_error::cond.trap(|err| {
assert_eq!(err.kind, PreviousIoError);
called = true;
}).inside(|| {
writer.flush();
});
assert!(called);
match writer.write([0, 0, 0]) {
Ok(..) => fail!(),
Err(e) => assert_eq!(e.kind, io::EndOfFile),
}
match writer.flush() {
Ok(..) => fail!(),
Err(e) => assert_eq!(e.kind, io::EndOfFile),
}
}
#[test]
fn test_option_reader() {
let mut reader: Option<MemReader> = Some(MemReader::new(~[0, 1, 2, 3]));
let mut reader: io::IoResult<MemReader> =
Ok(MemReader::new(~[0, 1, 2, 3]));
let mut buf = [0, 0];
reader.read(buf);
reader.read(buf).unwrap();
assert_eq!(buf, [0, 1]);
}
#[test]
fn test_option_reader_error() {
let mut reader: Option<MemReader> = None;
let mut reader: io::IoResult<MemReader> =
Err(io::standard_error(io::EndOfFile));
let mut buf = [];
let mut called = false;
io_error::cond.trap(|err| {
assert_eq!(err.kind, PreviousIoError);
called = true;
}).inside(|| {
reader.read(buf);
});
assert!(called);
match reader.read(buf) {
Ok(..) => fail!(),
Err(e) => assert_eq!(e.kind, io::EndOfFile),
}
}
}

View File

@ -160,7 +160,7 @@ mod test {
#[test] #[cfg(unix, not(target_os="android"))] // FIXME(#10378)
fn test_io_signal_smoketest() {
let mut signal = Listener::new();
signal.register(Interrupt);
signal.register(Interrupt).unwrap();
sigint();
timer::sleep(10);
match signal.port.recv() {
@ -173,8 +173,8 @@ mod test {
fn test_io_signal_two_signal_one_signum() {
let mut s1 = Listener::new();
let mut s2 = Listener::new();
s1.register(Interrupt);
s2.register(Interrupt);
s1.register(Interrupt).unwrap();
s2.register(Interrupt).unwrap();
sigint();
timer::sleep(10);
match s1.port.recv() {
@ -191,8 +191,8 @@ mod test {
fn test_io_signal_unregister() {
let mut s1 = Listener::new();
let mut s2 = Listener::new();
s1.register(Interrupt);
s2.register(Interrupt);
s1.register(Interrupt).unwrap();
s2.register(Interrupt).unwrap();
s2.unregister(Interrupt);
sigint();
timer::sleep(10);

View File

@ -358,7 +358,7 @@ mod tests {
set_stdout(~w as ~Writer);
println!("hello!");
});
assert_eq!(r.read_to_str(), ~"hello!\n");
assert_eq!(r.read_to_str().unwrap(), ~"hello!\n");
})
iotest!(fn capture_stderr() {
@ -370,7 +370,7 @@ mod tests {
set_stderr(~w as ~Writer);
fail!("my special message");
});
let s = r.read_to_str();
let s = r.read_to_str().unwrap();
assert!(s.contains("my special message"));
})
}

View File

@ -183,6 +183,7 @@ pub fn copy<R: Reader, W: Writer>(r: &mut R, w: &mut W) -> io::IoResult<()> {
#[cfg(test)]
mod test {
use io;
use io::{MemReader, MemWriter};
use super::*;
use prelude::*;
@ -192,7 +193,7 @@ mod test {
let mut r = MemReader::new(~[0, 1, 2]);
{
let mut r = LimitReader::new(&mut r, 4);
assert_eq!(~[0, 1, 2], r.read_to_end());
assert_eq!(~[0, 1, 2], r.read_to_end().unwrap());
}
}
@ -201,24 +202,24 @@ mod test {
let mut r = MemReader::new(~[0, 1, 2]);
{
let mut r = LimitReader::new(&mut r, 2);
assert_eq!(~[0, 1], r.read_to_end());
assert_eq!(~[0, 1], r.read_to_end().unwrap());
}
assert_eq!(~[2], r.read_to_end());
assert_eq!(~[2], r.read_to_end().unwrap());
}
#[test]
fn test_null_writer() {
let mut s = NullWriter;
let buf = ~[0, 0, 0];
s.write(buf);
s.flush();
s.write(buf).unwrap();
s.flush().unwrap();
}
#[test]
fn test_zero_reader() {
let mut s = ZeroReader;
let mut buf = ~[1, 2, 3];
assert_eq!(s.read(buf), Some(3));
assert_eq!(s.read(buf), Ok(3));
assert_eq!(~[0, 0, 0], buf);
}
@ -226,7 +227,7 @@ mod test {
fn test_null_reader() {
let mut r = NullReader;
let mut buf = ~[0];
assert_eq!(r.read(buf), None);
assert!(r.read(buf).is_err());
}
#[test]
@ -236,21 +237,23 @@ mod test {
struct TestWriter;
impl Writer for TestWriter {
fn write(&mut self, _buf: &[u8]) {
fn write(&mut self, _buf: &[u8]) -> io::IoResult<()> {
unsafe { writes += 1 }
Ok(())
}
fn flush(&mut self) {
fn flush(&mut self) -> io::IoResult<()> {
unsafe { flushes += 1 }
Ok(())
}
}
let mut multi = MultiWriter::new(~[~TestWriter as ~Writer,
~TestWriter as ~Writer]);
multi.write([1, 2, 3]);
multi.write([1, 2, 3]).unwrap();
assert_eq!(2, unsafe { writes });
assert_eq!(0, unsafe { flushes });
multi.flush();
multi.flush().unwrap();
assert_eq!(2, unsafe { writes });
assert_eq!(2, unsafe { flushes });
}
@ -260,14 +263,14 @@ mod test {
let rs = ~[MemReader::new(~[0, 1]), MemReader::new(~[]),
MemReader::new(~[2, 3])];
let mut r = ChainedReader::new(rs.move_iter());
assert_eq!(~[0, 1, 2, 3], r.read_to_end());
assert_eq!(~[0, 1, 2, 3], r.read_to_end().unwrap());
}
#[test]
fn test_tee_reader() {
let mut r = TeeReader::new(MemReader::new(~[0, 1, 2]),
MemWriter::new());
assert_eq!(~[0, 1, 2], r.read_to_end());
assert_eq!(~[0, 1, 2], r.read_to_end().unwrap());
let (_, w) = r.unwrap();
assert_eq!(~[0, 1, 2], w.unwrap());
}
@ -276,7 +279,7 @@ mod test {
fn test_copy() {
let mut r = MemReader::new(~[0, 1, 2, 3, 4]);
let mut w = MemWriter::new();
copy(&mut r, &mut w);
copy(&mut r, &mut w).unwrap();
assert_eq!(~[0, 1, 2, 3, 4], w.unwrap());
}
}

View File

@ -1492,7 +1492,6 @@ mod tests {
use result::{Ok, Err};
use os::*;
use libc::*;
use io;
use io::fs;
#[cfg(unix)]
@ -1537,8 +1536,7 @@ mod tests {
close(fd);
}
let _guard = io::ignore_io_error();
fs::unlink(&path);
fs::unlink(&path).unwrap();
}
// More recursive_mkdir tests are in extra::tempfile

View File

@ -11,6 +11,7 @@
//! Utilities for spawning and managing processes
#[allow(missing_doc)];
#[deny(unused_must_use)];
use comm::SharedChan;
use io::Reader;
@ -258,10 +259,10 @@ impl Process {
* On Posix OSs SIGTERM will be sent to the process. On Win32
* TerminateProcess(..) will be called.
*/
pub fn destroy(&mut self) {
// This should never fail because we own the process
self.inner.signal(io::process::PleaseExitSignal).unwrap();
pub fn destroy(&mut self) -> io::IoResult<()> {
let ret = self.inner.signal(io::process::PleaseExitSignal);
self.finish();
return ret;
}
/**
@ -271,10 +272,11 @@ impl Process {
* On Posix OSs SIGKILL will be sent to the process. On Win32
* TerminateProcess(..) will be called.
*/
pub fn force_destroy(&mut self) {
pub fn force_destroy(&mut self) -> io::IoResult<()> {
// This should never fail because we own the process
self.inner.signal(io::process::MustDieSignal).unwrap();
let ret = self.inner.signal(io::process::MustDieSignal);
self.finish();
return ret;
}
}
@ -330,33 +332,25 @@ mod tests {
use task::spawn;
use unstable::running_on_valgrind;
use io::pipe::PipeStream;
use io::{io_error, FileNotFound};
use io::{FileNotFound};
use libc::c_int;
#[test]
#[cfg(not(target_os="android"))] // FIXME(#10380)
fn test_process_status() {
let mut status = run::process_status("false", []).expect("failed to exec `false`");
let mut status = run::process_status("false", []).unwrap();
assert!(status.matches_exit_status(1));
status = run::process_status("true", []).expect("failed to exec `true`");
status = run::process_status("true", []).unwrap();
assert!(status.success());
}
#[test]
fn test_process_output_fail_to_start() {
// If the executable does not exist, then the io_error condition should be raised with
// IoErrorKind FileNotFound.
let mut trapped_io_error = false;
let opt_outp = io_error::cond.trap(|e| {
trapped_io_error = true;
assert_eq!(e.kind, FileNotFound);
}).inside(|| -> Option<run::ProcessOutput> {
run::process_output("/no-binary-by-this-name-should-exist", [])
});
assert!(trapped_io_error);
assert!(opt_outp.is_none());
match run::process_output("/no-binary-by-this-name-should-exist", []) {
Err(e) => assert_eq!(e.kind, FileNotFound),
Ok(..) => fail!()
}
}
#[test]
@ -364,7 +358,7 @@ mod tests {
fn test_process_output_output() {
let run::ProcessOutput {status, output, error}
= run::process_output("echo", [~"hello"]).expect("failed to exec `echo`");
= run::process_output("echo", [~"hello"]).unwrap();
let output_str = str::from_utf8_owned(output).unwrap();
assert!(status.success());
@ -380,7 +374,7 @@ mod tests {
fn test_process_output_error() {
let run::ProcessOutput {status, output, error}
= run::process_output("mkdir", [~"."]).expect("failed to exec `mkdir`");
= run::process_output("mkdir", [~"."]).unwrap();
assert!(status.matches_exit_status(1));
assert_eq!(output, ~[]);
@ -401,7 +395,7 @@ mod tests {
in_fd: Some(pipe_in.input),
out_fd: Some(pipe_out.out),
err_fd: Some(pipe_err.out)
}).expect("failed to exec `cat`");
}).unwrap();
os::close(pipe_in.input as int);
os::close(pipe_out.out as int);
@ -419,27 +413,18 @@ mod tests {
fn writeclose(fd: c_int, s: &str) {
let mut writer = PipeStream::open(fd);
writer.write(s.as_bytes());
writer.write(s.as_bytes()).unwrap();
}
fn readclose(fd: c_int) -> ~str {
let mut res = ~[];
let mut reader = PipeStream::open(fd);
let mut buf = [0, ..1024];
loop {
match reader.read(buf) {
Some(n) => { res.push_all(buf.slice_to(n)); }
None => break
}
}
str::from_utf8_owned(res).unwrap()
PipeStream::open(fd).read_to_str().unwrap()
}
#[test]
#[cfg(not(target_os="android"))] // FIXME(#10380)
fn test_finish_once() {
let mut prog = run::Process::new("false", [], run::ProcessOptions::new())
.expect("failed to exec `false`");
.unwrap();
assert!(prog.finish().matches_exit_status(1));
}
@ -447,7 +432,7 @@ mod tests {
#[cfg(not(target_os="android"))] // FIXME(#10380)
fn test_finish_twice() {
let mut prog = run::Process::new("false", [], run::ProcessOptions::new())
.expect("failed to exec `false`");
.unwrap();
assert!(prog.finish().matches_exit_status(1));
assert!(prog.finish().matches_exit_status(1));
}
@ -457,7 +442,7 @@ mod tests {
fn test_finish_with_output_once() {
let mut prog = run::Process::new("echo", [~"hello"], run::ProcessOptions::new())
.expect("failed to exec `echo`");
.unwrap();
let run::ProcessOutput {status, output, error}
= prog.finish_with_output();
let output_str = str::from_utf8_owned(output).unwrap();
@ -475,7 +460,7 @@ mod tests {
fn test_finish_with_output_twice() {
let mut prog = run::Process::new("echo", [~"hello"], run::ProcessOptions::new())
.expect("failed to exec `echo`");
.unwrap();
let run::ProcessOutput {status, output, error}
= prog.finish_with_output();
@ -504,14 +489,14 @@ mod tests {
run::Process::new("pwd", [], run::ProcessOptions {
dir: dir,
.. run::ProcessOptions::new()
}).expect("failed to exec `pwd`")
}).unwrap()
}
#[cfg(unix,target_os="android")]
fn run_pwd(dir: Option<&Path>) -> run::Process {
run::Process::new("/system/bin/sh", [~"-c",~"pwd"], run::ProcessOptions {
dir: dir,
.. run::ProcessOptions::new()
}).expect("failed to exec `/system/bin/sh`")
}).unwrap()
}
#[cfg(windows)]
@ -519,7 +504,7 @@ mod tests {
run::Process::new("cmd", [~"/c", ~"cd"], run::ProcessOptions {
dir: dir,
.. run::ProcessOptions::new()
}).expect("failed to run `cmd`")
}).unwrap()
}
#[test]
@ -530,8 +515,8 @@ mod tests {
let parent_dir = os::getcwd();
let child_dir = Path::new(output.trim());
let parent_stat = parent_dir.stat();
let child_stat = child_dir.stat();
let parent_stat = parent_dir.stat().unwrap();
let child_stat = child_dir.stat().unwrap();
assert_eq!(parent_stat.unstable.device, child_stat.unstable.device);
assert_eq!(parent_stat.unstable.inode, child_stat.unstable.inode);
@ -547,8 +532,8 @@ mod tests {
let output = str::from_utf8_owned(prog.finish_with_output().output).unwrap();
let child_dir = Path::new(output.trim());
let parent_stat = parent_dir.stat();
let child_stat = child_dir.stat();
let parent_stat = parent_dir.stat().unwrap();
let child_stat = child_dir.stat().unwrap();
assert_eq!(parent_stat.unstable.device, child_stat.unstable.device);
assert_eq!(parent_stat.unstable.inode, child_stat.unstable.inode);
@ -559,14 +544,14 @@ mod tests {
run::Process::new("env", [], run::ProcessOptions {
env: env,
.. run::ProcessOptions::new()
}).expect("failed to exec `env`")
}).unwrap()
}
#[cfg(unix,target_os="android")]
fn run_env(env: Option<~[(~str, ~str)]>) -> run::Process {
run::Process::new("/system/bin/sh", [~"-c",~"set"], run::ProcessOptions {
env: env,
.. run::ProcessOptions::new()
}).expect("failed to exec `/system/bin/sh`")
}).unwrap()
}
#[cfg(windows)]
@ -574,7 +559,7 @@ mod tests {
run::Process::new("cmd", [~"/c", ~"set"], run::ProcessOptions {
env: env,
.. run::ProcessOptions::new()
}).expect("failed to run `cmd`")
}).unwrap()
}
#[test]

View File

@ -541,7 +541,7 @@ fn test_avoid_copying_the_body_task_spawn() {
#[test]
fn test_avoid_copying_the_body_try() {
avoid_copying_the_body(|f| {
try(proc() {
let _ = try(proc() {
f()
});
})

View File

@ -200,7 +200,7 @@ mod tests {
// accesses will also fail.
let x = Exclusive::new(1);
let x2 = x.clone();
task::try(proc() {
let _ = task::try(proc() {
x2.with(|one| assert_eq!(*one, 2))
});
x.with(|one| assert_eq!(*one, 1));