std: Get stdtest all passing again

This commit brings the library up-to-date in order to get all tests passing
again
This commit is contained in:
Alex Crichton 2013-12-12 21:38:57 -08:00
parent d830fcc6eb
commit 018d60509c
29 changed files with 461 additions and 600 deletions

View file

@ -24,7 +24,7 @@ define CP_HOST_STAGE_N
# Note: $(3) and $(4) are both the same!
$$(HBIN$(2)_H_$(4))/rustc$$(X_$(4)): \
$$(TBIN$(1)_T_$(4)_H_$(3))/rustc$$(X_$(4))
$$(TBIN$(1)_T_$(4)_H_$(3))/rustc$$(X_$(4)) \
$$(HLIBRUSTC_DEFAULT$(2)_H_$(4)) \
| $$(HBIN$(2)_H_$(4))/
@$$(call E, cp: $$@)

View file

@ -348,13 +348,13 @@ STDTESTDEP_$(1)_$(2)_$(3) =
endif
$(3)/stage$(1)/test/stdtest-$(2)$$(X_$(2)): \
$$(STDLIB_CRATE) $$(STDLIB_INPUTS) \
$$(STDLIB_CRATE) $$(STDLIB_INPUTS) \
$$(STDTESTDEP_$(1)_$(2)_$(3))
@$$(call E, compile_and_link: $$@)
$$(STAGE$(1)_T_$(2)_H_$(3)) -o $$@ $$< --test
$(3)/stage$(1)/test/extratest-$(2)$$(X_$(2)): \
$$(EXTRALIB_CRATE) $$(EXTRALIB_INPUTS) \
$$(EXTRALIB_CRATE) $$(EXTRALIB_INPUTS) \
$$(STDTESTDEP_$(1)_$(2)_$(3))
@$$(call E, compile_and_link: $$@)
$$(STAGE$(1)_T_$(2)_H_$(3)) -o $$@ $$< --test

View file

@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#[cfg(stage0)] extern mod green;
#[cfg(rustpkg)]
extern mod this = "rustpkg";

View file

@ -57,6 +57,8 @@ pub mod sleeper_list;
pub mod stack;
pub mod task;
#[cfg(test)] mod tests;
#[cfg(stage0)]
#[lang = "start"]
pub fn lang_start(main: *u8, argc: int, argv: **u8) -> int {

View file

@ -22,7 +22,7 @@ use std::rt::task::{Task, BlockedTask};
use std::rt::thread::Thread;
use std::rt;
use std::sync::atomics::{AtomicUint, SeqCst, INIT_ATOMIC_UINT};
use std::task::TaskOpts;
use std::task::{TaskOpts, default_task_opts};
use std::unstable::mutex::{Mutex, MUTEX_INIT};
use std::unstable::stack;
@ -73,9 +73,14 @@ pub fn new() -> ~Task {
return task;
}
/// Spawns a function with the default configuration
pub fn spawn(f: proc()) {
spawn_opts(default_task_opts(), f)
}
/// Spawns a new task given the configuration options and a procedure to run
/// inside the task.
pub fn spawn(opts: TaskOpts, f: proc()) {
pub fn spawn_opts(opts: TaskOpts, f: proc()) {
// must happen before the spawn, no need to synchronize with a lock.
unsafe { THREAD_CNT.fetch_add(1, SeqCst); }
@ -238,7 +243,7 @@ impl rt::Runtime for Ops {
cur_task.put_runtime(self as ~rt::Runtime);
Local::put(cur_task);
task::spawn(opts, f);
task::spawn_opts(opts, f);
}
fn local_io<'a>(&'a mut self) -> Option<rtio::LocalIo<'a>> {

View file

@ -119,7 +119,7 @@ impl<'a> AnyMutRefExt<'a> for &'a mut Any {
/// Extension methods for a owning `Any` trait object
pub trait AnyOwnExt {
/// Returns the boxed value if it is of type `T`, or
/// `None` if it isn't.
/// `Err(Self)` if it isn't.
fn move<T: 'static>(self) -> Result<~T, Self>;
}
@ -156,9 +156,8 @@ impl<'a> ToStr for &'a Any {
#[cfg(test)]
mod tests {
use prelude::*;
use super::*;
use super::AnyRefExt;
use option::{Some, None};
#[deriving(Eq)]
struct Test;
@ -385,8 +384,14 @@ mod tests {
let a = ~8u as ~Any;
let b = ~Test as ~Any;
assert_eq!(a.move(), Ok(~8u));
assert_eq!(b.move(), Ok(~Test));
match a.move::<uint>() {
Ok(a) => { assert_eq!(a, ~8u); }
Err(..) => fail!()
}
match b.move::<Test>() {
Ok(a) => { assert_eq!(a, ~Test); }
Err(..) => fail!()
}
let a = ~8u as ~Any;
let b = ~Test as ~Any;

View file

@ -251,18 +251,21 @@ macro_rules! test (
mod $name {
#[allow(unused_imports)];
use util;
use super::super::*;
use native;
use prelude::*;
use super::*;
use super::super::*;
use task;
use util;
fn f() $b
$($a)* #[test] fn uv() { f() }
$($a)* #[test]
#[ignore(cfg(windows))] // FIXME(#11003)
fn native() {
use unstable::run_in_bare_thread;
run_in_bare_thread(f);
$($a)* #[test] fn native() {
use native;
let (p, c) = Chan::new();
do native::task::spawn { c.send(f()) }
p.recv();
}
}
)
@ -889,10 +892,16 @@ impl<T: Send> Drop for Port<T> {
mod test {
use prelude::*;
use task;
use rt::thread::Thread;
use native;
use os;
use super::*;
use rt::test::*;
pub fn stress_factor() -> uint {
match os::getenv("RUST_TEST_STRESS") {
Some(val) => from_str::<uint>(val).unwrap(),
None => 1,
}
}
test!(fn smoke() {
let (p, c) = Chan::new();
@ -919,99 +928,88 @@ mod test {
assert_eq!(p.recv(), 1);
})
#[test]
fn smoke_threads() {
test!(fn smoke_threads() {
let (p, c) = Chan::new();
do task::spawn_sched(task::SingleThreaded) {
do spawn {
c.send(1);
}
assert_eq!(p.recv(), 1);
}
})
#[test] #[should_fail]
fn smoke_port_gone() {
test!(fn smoke_port_gone() {
let (p, c) = Chan::new();
drop(p);
c.send(1);
}
} #[should_fail])
#[test] #[should_fail]
fn smoke_shared_port_gone() {
test!(fn smoke_shared_port_gone() {
let (p, c) = SharedChan::new();
drop(p);
c.send(1);
}
} #[should_fail])
#[test] #[should_fail]
fn smoke_shared_port_gone2() {
test!(fn smoke_shared_port_gone2() {
let (p, c) = SharedChan::new();
drop(p);
let c2 = c.clone();
drop(c);
c2.send(1);
}
} #[should_fail])
#[test] #[should_fail]
fn port_gone_concurrent() {
test!(fn port_gone_concurrent() {
let (p, c) = Chan::new();
do task::spawn_sched(task::SingleThreaded) {
do spawn {
p.recv();
}
loop { c.send(1) }
}
} #[should_fail])
#[test] #[should_fail]
fn port_gone_concurrent_shared() {
test!(fn port_gone_concurrent_shared() {
let (p, c) = SharedChan::new();
let c1 = c.clone();
do task::spawn_sched(task::SingleThreaded) {
do spawn {
p.recv();
}
loop {
c.send(1);
c1.send(1);
}
}
} #[should_fail])
#[test] #[should_fail]
fn smoke_chan_gone() {
test!(fn smoke_chan_gone() {
let (p, c) = Chan::<int>::new();
drop(c);
p.recv();
}
} #[should_fail])
#[test] #[should_fail]
fn smoke_chan_gone_shared() {
test!(fn smoke_chan_gone_shared() {
let (p, c) = SharedChan::<()>::new();
let c2 = c.clone();
drop(c);
drop(c2);
p.recv();
}
} #[should_fail])
#[test] #[should_fail]
fn chan_gone_concurrent() {
test!(fn chan_gone_concurrent() {
let (p, c) = Chan::new();
do task::spawn_sched(task::SingleThreaded) {
do spawn {
c.send(1);
c.send(1);
}
loop { p.recv(); }
}
} #[should_fail])
#[test]
fn stress() {
test!(fn stress() {
let (p, c) = Chan::new();
do task::spawn_sched(task::SingleThreaded) {
do spawn {
for _ in range(0, 10000) { c.send(1); }
}
for _ in range(0, 10000) {
assert_eq!(p.recv(), 1);
}
}
})
#[test]
fn stress_shared() {
test!(fn stress_shared() {
static AMT: uint = 10000;
static NTHREADS: uint = 8;
let (p, c) = SharedChan::<int>::new();
@ -1027,47 +1025,53 @@ mod test {
for _ in range(0, NTHREADS) {
let c = c.clone();
do task::spawn_sched(task::SingleThreaded) {
do spawn {
for _ in range(0, AMT) { c.send(1); }
}
}
p1.recv();
}
})
#[test]
#[ignore(cfg(windows))] // FIXME(#11003)
fn send_from_outside_runtime() {
let (p, c) = Chan::<int>::new();
let (p1, c1) = Chan::new();
let (port, chan) = SharedChan::new();
let chan2 = chan.clone();
do spawn {
c1.send(());
for _ in range(0, 40) {
assert_eq!(p.recv(), 1);
}
chan2.send(());
}
p1.recv();
let t = do Thread::start {
do native::task::spawn {
for _ in range(0, 40) {
c.send(1);
}
};
t.join();
chan.send(());
}
port.recv();
port.recv();
}
#[test]
#[ignore(cfg(windows))] // FIXME(#11003)
fn recv_from_outside_runtime() {
let (p, c) = Chan::<int>::new();
let t = do Thread::start {
let (dp, dc) = Chan::new();
do native::task::spawn {
for _ in range(0, 40) {
assert_eq!(p.recv(), 1);
}
dc.send(());
};
for _ in range(0, 40) {
c.send(1);
}
t.join();
dp.recv();
}
#[test]
@ -1075,173 +1079,132 @@ mod test {
fn no_runtime() {
let (p1, c1) = Chan::<int>::new();
let (p2, c2) = Chan::<int>::new();
let t1 = do Thread::start {
let (port, chan) = SharedChan::new();
let chan2 = chan.clone();
do native::task::spawn {
assert_eq!(p1.recv(), 1);
c2.send(2);
};
let t2 = do Thread::start {
chan2.send(());
}
do native::task::spawn {
c1.send(1);
assert_eq!(p2.recv(), 2);
};
t1.join();
t2.join();
}
#[test]
fn oneshot_single_thread_close_port_first() {
// Simple test of closing without sending
do run_in_newsched_task {
let (port, _chan) = Chan::<int>::new();
{ let _p = port; }
chan.send(());
}
port.recv();
port.recv();
}
#[test]
fn oneshot_single_thread_close_chan_first() {
test!(fn oneshot_single_thread_close_port_first() {
// Simple test of closing without sending
do run_in_newsched_task {
let (_port, chan) = Chan::<int>::new();
{ let _c = chan; }
}
}
let (port, _chan) = Chan::<int>::new();
{ let _p = port; }
})
#[test] #[should_fail]
fn oneshot_single_thread_send_port_close() {
test!(fn oneshot_single_thread_close_chan_first() {
// Simple test of closing without sending
let (_port, chan) = Chan::<int>::new();
{ let _c = chan; }
})
test!(fn oneshot_single_thread_send_port_close() {
// Testing that the sender cleans up the payload if receiver is closed
let (port, chan) = Chan::<~int>::new();
{ let _p = port; }
chan.send(~0);
}
} #[should_fail])
#[test]
fn oneshot_single_thread_recv_chan_close() {
test!(fn oneshot_single_thread_recv_chan_close() {
// Receiving on a closed chan will fail
do run_in_newsched_task {
let res = do spawntask_try {
let (port, chan) = Chan::<~int>::new();
{ let _c = chan; }
port.recv();
};
// What is our res?
assert!(res.is_err());
}
}
#[test]
fn oneshot_single_thread_send_then_recv() {
do run_in_newsched_task {
let res = do task::try {
let (port, chan) = Chan::<~int>::new();
chan.send(~10);
{ let _c = chan; }
port.recv();
};
// What is our res?
assert!(res.is_err());
})
test!(fn oneshot_single_thread_send_then_recv() {
let (port, chan) = Chan::<~int>::new();
chan.send(~10);
assert!(port.recv() == ~10);
})
test!(fn oneshot_single_thread_try_send_open() {
let (port, chan) = Chan::<int>::new();
assert!(chan.try_send(10));
assert!(port.recv() == 10);
})
test!(fn oneshot_single_thread_try_send_closed() {
let (port, chan) = Chan::<int>::new();
{ let _p = port; }
assert!(!chan.try_send(10));
})
test!(fn oneshot_single_thread_try_recv_open() {
let (port, chan) = Chan::<int>::new();
chan.send(10);
assert!(port.try_recv() == Some(10));
})
test!(fn oneshot_single_thread_try_recv_closed() {
let (port, chan) = Chan::<int>::new();
{ let _c = chan; }
assert!(port.recv_opt() == None);
})
test!(fn oneshot_single_thread_peek_data() {
let (port, chan) = Chan::<int>::new();
assert!(port.try_recv().is_none());
chan.send(10);
assert!(port.try_recv().is_some());
})
test!(fn oneshot_single_thread_peek_close() {
let (port, chan) = Chan::<int>::new();
{ let _c = chan; }
assert!(port.try_recv().is_none());
assert!(port.try_recv().is_none());
})
test!(fn oneshot_single_thread_peek_open() {
let (port, _) = Chan::<int>::new();
assert!(port.try_recv().is_none());
})
test!(fn oneshot_multi_task_recv_then_send() {
let (port, chan) = Chan::<~int>::new();
do spawn {
assert!(port.recv() == ~10);
}
}
#[test]
fn oneshot_single_thread_try_send_open() {
do run_in_newsched_task {
let (port, chan) = Chan::<int>::new();
assert!(chan.try_send(10));
assert!(port.recv() == 10);
chan.send(~10);
})
test!(fn oneshot_multi_task_recv_then_close() {
let (port, chan) = Chan::<~int>::new();
do spawn {
let _chan = chan;
}
}
let res = do task::try {
assert!(port.recv() == ~10);
};
assert!(res.is_err());
})
#[test]
fn oneshot_single_thread_try_send_closed() {
do run_in_newsched_task {
let (port, chan) = Chan::<int>::new();
{ let _p = port; }
assert!(!chan.try_send(10));
}
}
#[test]
fn oneshot_single_thread_try_recv_open() {
do run_in_newsched_task {
let (port, chan) = Chan::<int>::new();
chan.send(10);
assert!(port.try_recv() == Some(10));
}
}
#[test]
fn oneshot_single_thread_try_recv_closed() {
do run_in_newsched_task {
let (port, chan) = Chan::<int>::new();
{ let _c = chan; }
assert!(port.recv_opt() == None);
}
}
#[test]
fn oneshot_single_thread_peek_data() {
do run_in_newsched_task {
let (port, chan) = Chan::<int>::new();
assert!(port.try_recv().is_none());
chan.send(10);
assert!(port.try_recv().is_some());
}
}
#[test]
fn oneshot_single_thread_peek_close() {
do run_in_newsched_task {
let (port, chan) = Chan::<int>::new();
{ let _c = chan; }
assert!(port.try_recv().is_none());
assert!(port.try_recv().is_none());
}
}
#[test]
fn oneshot_single_thread_peek_open() {
do run_in_newsched_task {
let (port, _) = Chan::<int>::new();
assert!(port.try_recv().is_none());
}
}
#[test]
fn oneshot_multi_task_recv_then_send() {
do run_in_newsched_task {
let (port, chan) = Chan::<~int>::new();
do spawntask {
assert!(port.recv() == ~10);
}
chan.send(~10);
}
}
#[test]
fn oneshot_multi_task_recv_then_close() {
do run_in_newsched_task {
let (port, chan) = Chan::<~int>::new();
do spawntask_later {
let _chan = chan;
}
let res = do spawntask_try {
assert!(port.recv() == ~10);
};
assert!(res.is_err());
}
}
#[test]
fn oneshot_multi_thread_close_stress() {
test!(fn oneshot_multi_thread_close_stress() {
stress_factor().times(|| {
do run_in_newsched_task {
let (port, chan) = Chan::<int>::new();
let thread = do spawntask_thread {
let _p = port;
};
let _chan = chan;
thread.join();
let (port, chan) = Chan::<int>::new();
do spawn {
let _p = port;
}
let _chan = chan;
})
}
})
#[test]
fn oneshot_multi_thread_send_close_stress() {
test!(fn oneshot_multi_thread_send_close_stress() {
stress_factor().times(|| {
let (port, chan) = Chan::<int>::new();
do spawn {
@ -1251,10 +1214,9 @@ mod test {
chan.send(1);
};
})
}
})
#[test]
fn oneshot_multi_thread_recv_close_stress() {
test!(fn oneshot_multi_thread_recv_close_stress() {
stress_factor().times(|| {
let (port, chan) = Chan::<int>::new();
do spawn {
@ -1271,10 +1233,9 @@ mod test {
}
};
})
}
})
#[test]
fn oneshot_multi_thread_send_recv_stress() {
test!(fn oneshot_multi_thread_send_recv_stress() {
stress_factor().times(|| {
let (port, chan) = Chan::<~int>::new();
do spawn {
@ -1284,10 +1245,9 @@ mod test {
assert!(port.recv() == ~10);
}
})
}
})
#[test]
fn stream_send_recv_stress() {
test!(fn stream_send_recv_stress() {
stress_factor().times(|| {
let (port, chan) = Chan::<~int>::new();
@ -1297,7 +1257,7 @@ mod test {
fn send(chan: Chan<~int>, i: int) {
if i == 10 { return }
do spawntask_random {
do spawn {
chan.send(~i);
send(chan, i + 1);
}
@ -1306,44 +1266,37 @@ mod test {
fn recv(port: Port<~int>, i: int) {
if i == 10 { return }
do spawntask_random {
do spawn {
assert!(port.recv() == ~i);
recv(port, i + 1);
};
}
})
}
})
#[test]
fn recv_a_lot() {
test!(fn recv_a_lot() {
// Regression test that we don't run out of stack in scheduler context
do run_in_newsched_task {
let (port, chan) = Chan::new();
10000.times(|| { chan.send(()) });
10000.times(|| { port.recv() });
}
}
let (port, chan) = Chan::new();
10000.times(|| { chan.send(()) });
10000.times(|| { port.recv() });
})
#[test]
fn shared_chan_stress() {
do run_in_mt_newsched_task {
let (port, chan) = SharedChan::new();
let total = stress_factor() + 100;
total.times(|| {
let chan_clone = chan.clone();
do spawntask_random {
chan_clone.send(());
}
});
test!(fn shared_chan_stress() {
let (port, chan) = SharedChan::new();
let total = stress_factor() + 100;
total.times(|| {
let chan_clone = chan.clone();
do spawn {
chan_clone.send(());
}
});
total.times(|| {
port.recv();
});
}
}
total.times(|| {
port.recv();
});
})
#[test]
fn test_nested_recv_iter() {
test!(fn test_nested_recv_iter() {
let (port, chan) = Chan::<int>::new();
let (total_port, total_chan) = Chan::<int>::new();
@ -1360,10 +1313,9 @@ mod test {
chan.send(2);
drop(chan);
assert_eq!(total_port.recv(), 6);
}
})
#[test]
fn test_recv_iter_break() {
test!(fn test_recv_iter_break() {
let (port, chan) = Chan::<int>::new();
let (count_port, count_chan) = Chan::<int>::new();
@ -1385,5 +1337,5 @@ mod test {
chan.try_send(2);
drop(chan);
assert_eq!(count_port.recv(), 4);
}
})
}

View file

@ -51,11 +51,11 @@ use ops::Drop;
use option::{Some, None, Option};
use ptr::RawPtr;
use result::{Ok, Err};
use rt::thread::Thread;
use rt::local::Local;
use rt::task::Task;
use super::{Packet, Port};
use sync::atomics::{Relaxed, SeqCst};
use task;
use uint;
macro_rules! select {
@ -310,6 +310,7 @@ impl Iterator<*mut Packet> for PacketIterator {
}
#[cfg(test)]
#[allow(unused_imports)]
mod test {
use super::super::*;
use prelude::*;
@ -365,19 +366,16 @@ mod test {
)
})
#[test]
fn unblocks() {
use std::io::timer;
test!(fn unblocks() {
let (mut p1, c1) = Chan::<int>::new();
let (mut p2, _c2) = Chan::<int>::new();
let (p3, c3) = Chan::<int>::new();
do spawn {
timer::sleep(3);
20.times(task::deschedule);
c1.send(1);
p3.recv();
timer::sleep(3);
20.times(task::deschedule);
}
select! (
@ -389,18 +387,15 @@ mod test {
a = p1.recv_opt() => { assert_eq!(a, None); },
_b = p2.recv() => { fail!() }
)
}
#[test]
fn both_ready() {
use std::io::timer;
})
test!(fn both_ready() {
let (mut p1, c1) = Chan::<int>::new();
let (mut p2, c2) = Chan::<int>::new();
let (p3, c3) = Chan::<()>::new();
do spawn {
timer::sleep(3);
20.times(task::deschedule);
c1.send(1);
c2.send(2);
p3.recv();
@ -414,11 +409,12 @@ mod test {
a = p1.recv() => { assert_eq!(a, 1); },
a = p2.recv() => { assert_eq!(a, 2); }
)
assert_eq!(p1.try_recv(), None);
assert_eq!(p2.try_recv(), None);
c3.send(());
}
})
#[test]
fn stress() {
test!(fn stress() {
static AMT: int = 10000;
let (mut p1, c1) = Chan::<int>::new();
let (mut p2, c2) = Chan::<int>::new();
@ -442,69 +438,5 @@ mod test {
)
c3.send(());
}
}
#[test]
#[ignore(cfg(windows))] // FIXME(#11003)
fn stress_native() {
use std::rt::thread::Thread;
use std::unstable::run_in_bare_thread;
static AMT: int = 10000;
do run_in_bare_thread {
let (mut p1, c1) = Chan::<int>::new();
let (mut p2, c2) = Chan::<int>::new();
let (p3, c3) = Chan::<()>::new();
let t = do Thread::start {
for i in range(0, AMT) {
if i % 2 == 0 {
c1.send(i);
} else {
c2.send(i);
}
p3.recv();
}
};
for i in range(0, AMT) {
select! (
i1 = p1.recv() => { assert!(i % 2 == 0 && i == i1); },
i2 = p2.recv() => { assert!(i % 2 == 1 && i == i2); }
)
c3.send(());
}
t.join();
}
}
#[test]
#[ignore(cfg(windows))] // FIXME(#11003)
fn native_both_ready() {
use std::rt::thread::Thread;
use std::unstable::run_in_bare_thread;
do run_in_bare_thread {
let (mut p1, c1) = Chan::<int>::new();
let (mut p2, c2) = Chan::<int>::new();
let (p3, c3) = Chan::<()>::new();
let t = do Thread::start {
c1.send(1);
c2.send(2);
p3.recv();
};
select! (
a = p1.recv() => { assert_eq!(a, 1); },
b = p2.recv() => { assert_eq!(b, 2); }
)
select! (
a = p1.recv() => { assert_eq!(a, 1); },
b = p2.recv() => { assert_eq!(b, 2); }
)
c3.send(());
t.join();
}
}
})
}

View file

@ -714,7 +714,7 @@ mod test {
}
}
fn tmpdir() -> TempDir {
pub fn tmpdir() -> TempDir {
use os;
use rand;
let ret = os::tmpdir().join(format!("rust-{}", rand::random::<u32>()));
@ -722,32 +722,7 @@ mod test {
TempDir(ret)
}
macro_rules! test (
{ fn $name:ident() $b:block } => (
mod $name {
use prelude::*;
use io::{SeekSet, SeekCur, SeekEnd, io_error, Read, Open,
ReadWrite};
use io;
use str;
use io::fs::{File, rmdir, mkdir, readdir, rmdir_recursive,
mkdir_recursive, copy, unlink, stat, symlink, link,
readlink, chmod, lstat, change_file_times};
use io::fs::test::tmpdir;
use util;
fn f() $b
#[test] fn uv() { f() }
#[test] fn native() {
use rt::test::run_in_newsched_task;
run_in_newsched_task(f);
}
}
)
)
test!(fn file_test_io_smoke_test() {
iotest!(fn file_test_io_smoke_test() {
let message = "it's alright. have a good time";
let tmpdir = tmpdir();
let filename = &tmpdir.join("file_rt_io_file_test.txt");
@ -767,7 +742,7 @@ mod test {
unlink(filename);
})
test!(fn invalid_path_raises() {
iotest!(fn invalid_path_raises() {
let tmpdir = tmpdir();
let filename = &tmpdir.join("file_that_does_not_exist.txt");
let mut called = false;
@ -780,7 +755,7 @@ mod test {
assert!(called);
})
test!(fn file_test_iounlinking_invalid_path_should_raise_condition() {
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;
@ -790,7 +765,7 @@ mod test {
assert!(called);
})
test!(fn file_test_io_non_positional_read() {
iotest!(fn file_test_io_non_positional_read() {
let message: &str = "ten-four";
let mut read_mem = [0, .. 8];
let tmpdir = tmpdir();
@ -815,7 +790,7 @@ mod test {
assert_eq!(read_str, message);
})
test!(fn file_test_io_seek_and_tell_smoke_test() {
iotest!(fn file_test_io_seek_and_tell_smoke_test() {
let message = "ten-four";
let mut read_mem = [0, .. 4];
let set_cursor = 4 as u64;
@ -841,7 +816,7 @@ mod test {
assert_eq!(tell_pos_post_read, message.len() as u64);
})
test!(fn file_test_io_seek_and_write() {
iotest!(fn file_test_io_seek_and_write() {
let initial_msg = "food-is-yummy";
let overwrite_msg = "-the-bar!!";
let final_msg = "foo-the-bar!!";
@ -864,7 +839,7 @@ mod test {
assert!(read_str == final_msg.to_owned());
})
test!(fn file_test_io_seek_shakedown() {
iotest!(fn file_test_io_seek_shakedown() {
use std::str; // 01234567890123
let initial_msg = "qwer-asdf-zxcv";
let chunk_one: &str = "qwer";
@ -895,7 +870,7 @@ mod test {
unlink(filename);
})
test!(fn file_test_stat_is_correct_on_is_file() {
iotest!(fn file_test_stat_is_correct_on_is_file() {
let tmpdir = tmpdir();
let filename = &tmpdir.join("file_stat_correct_on_is_file.txt");
{
@ -908,7 +883,7 @@ mod test {
unlink(filename);
})
test!(fn file_test_stat_is_correct_on_is_dir() {
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);
@ -917,7 +892,7 @@ mod test {
rmdir(filename);
})
test!(fn file_test_fileinfo_false_when_checking_is_file_on_a_directory() {
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);
@ -925,7 +900,7 @@ mod test {
rmdir(dir);
})
test!(fn file_test_fileinfo_check_exists_before_and_after_file_creation() {
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"));
@ -934,7 +909,7 @@ mod test {
assert!(!file.exists());
})
test!(fn file_test_directoryinfo_check_exists_before_and_after_mkdir() {
iotest!(fn file_test_directoryinfo_check_exists_before_and_after_mkdir() {
let tmpdir = tmpdir();
let dir = &tmpdir.join("before_and_after_dir");
assert!(!dir.exists());
@ -945,7 +920,7 @@ mod test {
assert!(!dir.exists());
})
test!(fn file_test_directoryinfo_readdir() {
iotest!(fn file_test_directoryinfo_readdir() {
use std::str;
let tmpdir = tmpdir();
let dir = &tmpdir.join("di_readdir");
@ -976,11 +951,11 @@ mod test {
rmdir(dir);
})
test!(fn recursive_mkdir_slash() {
iotest!(fn recursive_mkdir_slash() {
mkdir_recursive(&Path::new("/"), io::UserRWX);
})
test!(fn unicode_path_is_dir() {
iotest!(fn unicode_path_is_dir() {
assert!(Path::new(".").is_dir());
assert!(!Path::new("test/stdtest/fs.rs").is_dir());
@ -998,7 +973,7 @@ mod test {
assert!(filepath.exists());
})
test!(fn unicode_path_exists() {
iotest!(fn unicode_path_exists() {
assert!(Path::new(".").exists());
assert!(!Path::new("test/nonexistent-bogus-path").exists());
@ -1010,7 +985,7 @@ mod test {
assert!(!Path::new("test/unicode-bogus-path-각丁ー再见").exists());
})
test!(fn copy_file_does_not_exist() {
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)) {
@ -1022,7 +997,7 @@ mod test {
}
})
test!(fn copy_file_ok() {
iotest!(fn copy_file_ok() {
let tmpdir = tmpdir();
let input = tmpdir.join("in.txt");
let out = tmpdir.join("out.txt");
@ -1035,7 +1010,7 @@ mod test {
assert_eq!(input.stat().perm, out.stat().perm);
})
test!(fn copy_file_dst_dir() {
iotest!(fn copy_file_dst_dir() {
let tmpdir = tmpdir();
let out = tmpdir.join("out");
@ -1045,7 +1020,7 @@ mod test {
}
})
test!(fn copy_file_dst_exists() {
iotest!(fn copy_file_dst_exists() {
let tmpdir = tmpdir();
let input = tmpdir.join("in");
let output = tmpdir.join("out");
@ -1058,7 +1033,7 @@ mod test {
(bytes!("foo")).to_owned());
})
test!(fn copy_file_src_dir() {
iotest!(fn copy_file_src_dir() {
let tmpdir = tmpdir();
let out = tmpdir.join("out");
@ -1068,7 +1043,7 @@ mod test {
assert!(!out.exists());
})
test!(fn copy_file_preserves_perm_bits() {
iotest!(fn copy_file_preserves_perm_bits() {
let tmpdir = tmpdir();
let input = tmpdir.join("in.txt");
let out = tmpdir.join("out.txt");
@ -1083,7 +1058,7 @@ mod test {
})
#[cfg(not(windows))] // FIXME(#10264) operation not permitted?
test!(fn symlinks_work() {
iotest!(fn symlinks_work() {
let tmpdir = tmpdir();
let input = tmpdir.join("in.txt");
let out = tmpdir.join("out.txt");
@ -1098,14 +1073,14 @@ mod test {
})
#[cfg(not(windows))] // apparently windows doesn't like symlinks
test!(fn symlink_noexist() {
iotest!(fn symlink_noexist() {
let tmpdir = tmpdir();
// symlinks can point to things that don't exist
symlink(&tmpdir.join("foo"), &tmpdir.join("bar"));
assert!(readlink(&tmpdir.join("bar")).unwrap() == tmpdir.join("foo"));
})
test!(fn readlink_not_symlink() {
iotest!(fn readlink_not_symlink() {
let tmpdir = tmpdir();
match io::result(|| readlink(&*tmpdir)) {
Ok(..) => fail!("wanted a failure"),
@ -1113,7 +1088,7 @@ mod test {
}
})
test!(fn links_work() {
iotest!(fn links_work() {
let tmpdir = tmpdir();
let input = tmpdir.join("in.txt");
let out = tmpdir.join("out.txt");
@ -1139,7 +1114,7 @@ mod test {
}
})
test!(fn chmod_works() {
iotest!(fn chmod_works() {
let tmpdir = tmpdir();
let file = tmpdir.join("in.txt");
@ -1156,7 +1131,7 @@ mod test {
chmod(&file, io::UserFile);
})
test!(fn sync_doesnt_kill_anything() {
iotest!(fn sync_doesnt_kill_anything() {
let tmpdir = tmpdir();
let path = tmpdir.join("in.txt");
@ -1169,7 +1144,7 @@ mod test {
drop(file);
})
test!(fn truncate_works() {
iotest!(fn truncate_works() {
let tmpdir = tmpdir();
let path = tmpdir.join("in.txt");
@ -1200,7 +1175,7 @@ mod test {
drop(file);
})
test!(fn open_flavors() {
iotest!(fn open_flavors() {
let tmpdir = tmpdir();
match io::result(|| File::open_mode(&tmpdir.join("a"), io::Open,

View file

@ -313,6 +313,10 @@ pub use self::net::udp::UdpStream;
pub use self::pipe::PipeStream;
pub use self::process::Process;
/// Testing helpers
#[cfg(test)]
mod test;
/// Synchronous, non-blocking filesystem operations.
pub mod fs;

View file

@ -176,7 +176,7 @@ mod test {
#[test]
fn smoke_test_ip4() {
let addr = next_test_ip4();
let (port, chan) = oneshot();
let (port, chan) = Chan::new();
do spawn {
port.recv();
@ -195,7 +195,7 @@ mod test {
#[test]
fn smoke_test_ip6() {
let addr = next_test_ip6();
let (port, chan) = oneshot();
let (port, chan) = Chan::new();
do spawn {
port.recv();
@ -214,7 +214,7 @@ mod test {
#[test]
fn read_eof_ip4() {
let addr = next_test_ip4();
let (port, chan) = oneshot();
let (port, chan) = Chan::new();
do spawn {
port.recv();
@ -233,7 +233,7 @@ mod test {
#[test]
fn read_eof_ip6() {
let addr = next_test_ip6();
let (port, chan) = oneshot();
let (port, chan) = Chan::new();
do spawn {
port.recv();
@ -252,10 +252,10 @@ mod test {
#[test]
fn read_eof_twice_ip4() {
let addr = next_test_ip4();
let (port, chan) = oneshot();
let (port, chan) = Chan::new();
do spawn {
port.take().recv();
port.recv();
let _stream = TcpStream::connect(addr);
// Close
}
@ -281,7 +281,7 @@ mod test {
#[test]
fn read_eof_twice_ip6() {
let addr = next_test_ip6();
let (port, chan) = oneshot();
let (port, chan) = Chan::new();
do spawn {
port.recv();
@ -310,7 +310,7 @@ mod test {
#[test]
fn write_close_ip4() {
let addr = next_test_ip4();
let (port, chan) = oneshot();
let (port, chan) = Chan::new();
do spawn {
port.recv();
@ -342,7 +342,7 @@ mod test {
#[test]
fn write_close_ip6() {
let addr = next_test_ip6();
let (port, chan) = oneshot();
let (port, chan) = Chan::new();
do spawn {
port.recv();
@ -375,7 +375,7 @@ mod test {
fn multiple_connect_serial_ip4() {
let addr = next_test_ip4();
let max = 10;
let (port, chan) = oneshot();
let (port, chan) = Chan::new();
do spawn {
port.recv();
@ -398,7 +398,7 @@ mod test {
fn multiple_connect_serial_ip6() {
let addr = next_test_ip6();
let max = 10;
let (port, chan) = oneshot();
let (port, chan) = Chan::new();
do spawn {
port.recv();
@ -421,16 +421,15 @@ mod test {
fn multiple_connect_interleaved_greedy_schedule_ip4() {
let addr = next_test_ip4();
static MAX: int = 10;
let (port, chan) = oneshot();
let (port, chan) = Chan::new();
do spawn {
let mut acceptor = TcpListener::bind(addr).listen();
chan.send(());
for (i, stream) in acceptor.incoming().enumerate().take(MAX as uint) {
let stream = Cell::new(stream);
// Start another task to handle the connection
do spawn {
let mut stream = stream.take();
let mut stream = stream;
let mut buf = [0];
stream.read(buf);
assert!(buf[0] == i as u8);
@ -460,15 +459,15 @@ mod test {
fn multiple_connect_interleaved_greedy_schedule_ip6() {
let addr = next_test_ip6();
static MAX: int = 10;
let (port, chan) = oneshot();
let (port, chan) = Chan::<()>::new();
do spawn {
let mut acceptor = TcpListener::bind(addr).listen();
chan.send(());
for (i, stream) in acceptor.incoming().enumerate().take(MAX as uint) {
let stream = Cell::new(stream);
// Start another task to handle the connection
do spawn {
let mut stream = stream.take();
let mut stream = stream;
let mut buf = [0];
stream.read(buf);
assert!(buf[0] == i as u8);
@ -498,16 +497,15 @@ mod test {
fn multiple_connect_interleaved_lazy_schedule_ip4() {
let addr = next_test_ip4();
static MAX: int = 10;
let (port, chan) = oneshot();
let (port, chan) = Chan::new();
do spawn {
let mut acceptor = TcpListener::bind(addr).listen();
chan.send(());
for stream in acceptor.incoming().take(MAX as uint) {
let stream = Cell::new(stream);
// Start another task to handle the connection
do spawn {
let mut stream = stream.take();
let mut stream = stream;
let mut buf = [0];
stream.read(buf);
assert!(buf[0] == 99);
@ -536,16 +534,15 @@ mod test {
fn multiple_connect_interleaved_lazy_schedule_ip6() {
let addr = next_test_ip6();
static MAX: int = 10;
let (port, chan) = oneshot();
let (port, chan) = Chan::new();
do spawn {
let mut acceptor = TcpListener::bind(addr).listen();
chan.send(());
for stream in acceptor.incoming().take(MAX as uint) {
let stream = Cell::new(stream);
// Start another task to handle the connection
do spawn {
let mut stream = stream.take();
let mut stream = stream;
let mut buf = [0];
stream.read(buf);
assert!(buf[0] == 99);
@ -573,23 +570,18 @@ mod test {
#[cfg(test)]
fn socket_name(addr: SocketAddr) {
do run_in_mt_newsched_task {
do spawntask {
let mut listener = TcpListener::bind(addr).unwrap();
let mut listener = TcpListener::bind(addr).unwrap();
// Make sure socket_name gives
// us the socket we binded to.
let so_name = listener.socket_name();
assert!(so_name.is_some());
assert_eq!(addr, so_name.unwrap());
}
}
// Make sure socket_name gives
// us the socket we binded to.
let so_name = listener.socket_name();
assert!(so_name.is_some());
assert_eq!(addr, so_name.unwrap());
}
#[cfg(test)]
fn peer_name(addr: SocketAddr) {
let (port, chan) = oneshot();
let (port, chan) = Chan::new();
do spawn {
let mut acceptor = TcpListener::bind(addr).listen();

View file

@ -101,6 +101,7 @@ mod test {
use super::*;
use io::net::ip::{Ipv4Addr, SocketAddr};
use io::*;
use io::test::*;
use prelude::*;
#[test] #[ignore]
@ -121,7 +122,7 @@ mod test {
fn socket_smoke_test_ip4() {
let server_ip = next_test_ip4();
let client_ip = next_test_ip4();
let (port, chan) = oneshot();
let (port, chan) = Chan::new();
do spawn {
match UdpSocket::bind(client_ip) {
@ -154,7 +155,7 @@ mod test {
fn socket_smoke_test_ip6() {
let server_ip = next_test_ip6();
let client_ip = next_test_ip6();
let (port, chan) = oneshot();
let (port, chan) = Chan::<()>::new();
do spawn {
match UdpSocket::bind(client_ip) {
@ -168,7 +169,7 @@ mod test {
match UdpSocket::bind(server_ip) {
Some(ref mut server) => {
chan.take().send(());
chan.send(());
let mut buf = [0];
match server.recvfrom(buf) {
Some((nread, src)) => {
@ -187,7 +188,7 @@ mod test {
fn stream_smoke_test_ip4() {
let server_ip = next_test_ip4();
let client_ip = next_test_ip4();
let (port, chan) = oneshot();
let (port, chan) = Chan::new();
do spawn {
match UdpSocket::bind(client_ip) {
@ -223,7 +224,7 @@ mod test {
fn stream_smoke_test_ip6() {
let server_ip = next_test_ip6();
let client_ip = next_test_ip6();
let (port, chan) = oneshot();
let (port, chan) = Chan::new();
do spawn {
match UdpSocket::bind(client_ip) {

View file

@ -141,11 +141,12 @@ mod tests {
use prelude::*;
use super::*;
use io::*;
use io::test::*;
fn smalltest(server: proc(UnixStream), client: proc(UnixStream)) {
let path1 = next_test_unix();
let path2 = path1.clone();
let (port, chan) = oneshot();
let (port, chan) = Chan::new();
do spawn {
port.recv();
@ -229,7 +230,7 @@ mod tests {
let times = 10;
let path1 = next_test_unix();
let path2 = path1.clone();
let (port, chan) = oneshot();
let (port, chan) = Chan::new();
do spawn {
port.recv();

View file

@ -308,23 +308,10 @@ impl Writer for StdWriter {
#[cfg(test)]
mod tests {
use super::*;
use rt::test::run_in_newsched_task;
#[test]
fn smoke_uv() {
iotest!(fn smoke() {
// Just make sure we can acquire handles
stdin();
stdout();
stderr();
}
#[test]
fn smoke_native() {
do run_in_newsched_task {
stdin();
stdout();
stderr();
}
}
})
}

View file

@ -8,9 +8,48 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#[macro_escape];
use os;
use prelude::*;
use rand;
use rand::Rng;
use std::io::net::ip::*;
use sync::atomics::{AtomicUint, INIT_ATOMIC_UINT, Relaxed};
macro_rules! iotest (
{ fn $name:ident() $b:block } => (
mod $name {
#[allow(unused_imports)];
use super::super::*;
use super::*;
use io;
use prelude::*;
use io::*;
use io::fs::*;
use io::net::tcp::*;
use io::net::ip::*;
use io::net::udp::*;
use io::net::unix::*;
use str;
use util;
fn f() $b
#[test] fn green() { f() }
#[test] fn native() {
use native;
let (p, c) = Chan::new();
do native::task::spawn { c.send(f()) }
p.recv();
}
}
)
)
/// Get a port number, starting at 9600, for use in tests
pub fn next_test_port() -> u16 {
use unstable::atomics::{AtomicUint, INIT_ATOMIC_UINT, Relaxed};
static mut next_offset: AtomicUint = INIT_ATOMIC_UINT;
unsafe {
base_port() + next_offset.fetch_add(1, Relaxed) as u16
@ -44,9 +83,6 @@ all want to use ports. This function figures out which workspace
it is running in and assigns a port range based on it.
*/
fn base_port() -> u16 {
use os;
use str::StrSlice;
use vec::ImmutableVector;
let base = 9600u16;
let range = 1000u16;

View file

@ -65,13 +65,15 @@
// When testing libstd, bring in libuv as the I/O backend so tests can print
// things and all of the std::io tests have an I/O interface to run on top
// of
#[cfg(test)] extern mod rustuv = "rustuv#0.9-pre";
#[cfg(test)] extern mod rustuv = "rustuv";
#[cfg(test)] extern mod native = "native";
#[cfg(test)] extern mod green = "green";
// Make extra accessible for benchmarking
#[cfg(test)] extern mod extra = "extra#0.9-pre";
#[cfg(test)] extern mod extra = "extra";
// Make std testable by not duplicating lang items. See #2912
#[cfg(test)] extern mod realstd = "std#0.9-pre";
#[cfg(test)] extern mod realstd = "std";
#[cfg(test)] pub use kinds = realstd::kinds;
#[cfg(test)] pub use ops = realstd::ops;
#[cfg(test)] pub use cmp = realstd::cmp;

View file

@ -432,6 +432,7 @@ mod tests {
}
#[test]
#[allow(dead_code)]
fn test_tls_overwrite_multiple_types() {
static str_key: Key<~str> = &Key;
static box_key: Key<@()> = &Key;

View file

@ -49,7 +49,6 @@ impl Local<local_ptr::Borrowed<Task>> for Task {
mod test {
use option::None;
use unstable::run_in_bare_thread;
use rt::test::*;
use super::*;
use rt::task::Task;
use rt::local_ptr;
@ -58,8 +57,7 @@ mod test {
fn thread_local_task_smoke_test() {
do run_in_bare_thread {
local_ptr::init();
let mut sched = ~new_test_uv_sched();
let task = ~Task::new_root(&mut sched.stack_pool, None, proc(){});
let task = ~Task::new();
Local::put(task);
let task: ~Task = Local::take();
cleanup_task(task);
@ -70,12 +68,11 @@ mod test {
fn thread_local_task_two_instances() {
do run_in_bare_thread {
local_ptr::init();
let mut sched = ~new_test_uv_sched();
let task = ~Task::new_root(&mut sched.stack_pool, None, proc(){});
let task = ~Task::new();
Local::put(task);
let task: ~Task = Local::take();
cleanup_task(task);
let task = ~Task::new_root(&mut sched.stack_pool, None, proc(){});
let task = ~Task::new();
Local::put(task);
let task: ~Task = Local::take();
cleanup_task(task);
@ -87,8 +84,7 @@ mod test {
fn borrow_smoke_test() {
do run_in_bare_thread {
local_ptr::init();
let mut sched = ~new_test_uv_sched();
let task = ~Task::new_root(&mut sched.stack_pool, None, proc(){});
let task = ~Task::new();
Local::put(task);
unsafe {
@ -103,8 +99,7 @@ mod test {
fn borrow_with_return() {
do run_in_bare_thread {
local_ptr::init();
let mut sched = ~new_test_uv_sched();
let task = ~Task::new_root(&mut sched.stack_pool, None, proc(){});
let task = ~Task::new();
Local::put(task);
{
@ -116,5 +111,9 @@ mod test {
}
}
fn cleanup_task(mut t: ~Task) {
t.destroyed = true;
}
}

View file

@ -176,8 +176,12 @@ impl Task {
// Cleanup the dynamic borrowck debugging info
borrowck::clear_task_borrow_list();
// TODO: dox
unsafe {
let me: *mut Task = Local::unsafe_borrow();
(*me).death.collect_failure((*me).unwinder.result());
}
let mut me: ~Task = Local::take();
me.death.collect_failure(me.unwinder.result());
me.destroyed = true;
return me;
}
@ -375,92 +379,76 @@ impl Drop for Death {
#[cfg(test)]
mod test {
use super::*;
use rt::test::*;
use prelude::*;
use task;
#[test]
fn local_heap() {
do run_in_newsched_task() {
let a = @5;
let b = a;
assert!(*a == 5);
assert!(*b == 5);
}
let a = @5;
let b = a;
assert!(*a == 5);
assert!(*b == 5);
}
#[test]
fn tls() {
use local_data;
do run_in_newsched_task() {
local_data_key!(key: @~str)
local_data::set(key, @~"data");
assert!(*local_data::get(key, |k| k.map(|k| *k)).unwrap() == ~"data");
local_data_key!(key2: @~str)
local_data::set(key2, @~"data");
assert!(*local_data::get(key2, |k| k.map(|k| *k)).unwrap() == ~"data");
}
local_data_key!(key: @~str)
local_data::set(key, @~"data");
assert!(*local_data::get(key, |k| k.map(|k| *k)).unwrap() == ~"data");
local_data_key!(key2: @~str)
local_data::set(key2, @~"data");
assert!(*local_data::get(key2, |k| k.map(|k| *k)).unwrap() == ~"data");
}
#[test]
fn unwind() {
do run_in_newsched_task() {
let result = spawntask_try(proc()());
rtdebug!("trying first assert");
assert!(result.is_ok());
let result = spawntask_try(proc() fail!());
rtdebug!("trying second assert");
assert!(result.is_err());
}
let result = task::try(proc()());
rtdebug!("trying first assert");
assert!(result.is_ok());
let result = task::try::<()>(proc() fail!());
rtdebug!("trying second assert");
assert!(result.is_err());
}
#[test]
fn rng() {
do run_in_uv_task() {
use rand::{rng, Rng};
let mut r = rng();
let _ = r.next_u32();
}
use rand::{rng, Rng};
let mut r = rng();
let _ = r.next_u32();
}
#[test]
fn logging() {
do run_in_uv_task() {
info!("here i am. logging in a newsched task");
}
info!("here i am. logging in a newsched task");
}
#[test]
fn comm_stream() {
do run_in_newsched_task() {
let (port, chan) = Chan::new();
chan.send(10);
assert!(port.recv() == 10);
}
let (port, chan) = Chan::new();
chan.send(10);
assert!(port.recv() == 10);
}
#[test]
fn comm_shared_chan() {
do run_in_newsched_task() {
let (port, chan) = SharedChan::new();
chan.send(10);
assert!(port.recv() == 10);
}
let (port, chan) = SharedChan::new();
chan.send(10);
assert!(port.recv() == 10);
}
#[test]
fn heap_cycles() {
use option::{Option, Some, None};
do run_in_newsched_task {
struct List {
next: Option<@mut List>,
}
let a = @mut List { next: None };
let b = @mut List { next: Some(a) };
a.next = Some(b);
struct List {
next: Option<@mut List>,
}
let a = @mut List { next: None };
let b = @mut List { next: Some(a) };
a.next = Some(b);
}
#[test]
@ -471,8 +459,8 @@ mod test {
#[test]
fn block_and_wake() {
do with_test_task |task| {
BlockedTask::block(task).wake().unwrap()
}
let task = ~Task::new();
let mut task = BlockedTask::block(task).wake().unwrap();
task.destroyed = true;
}
}

View file

@ -426,13 +426,13 @@ mod tests {
}
fn writeclose(fd: c_int, s: &str) {
let mut writer = PipeStream::open(fd as int);
let mut writer = PipeStream::open(fd);
writer.write(s.as_bytes());
}
fn readclose(fd: c_int) -> ~str {
let mut res = ~[];
let mut reader = PipeStream::open(fd as int);
let mut reader = PipeStream::open(fd);
let mut buf = [0, ..1024];
loop {
match reader.read(buf) {

View file

@ -131,7 +131,6 @@ impl<T> Drop for UnsafeArc<T>{
mod tests {
use prelude::*;
use super::UnsafeArc;
use task;
use mem::size_of;
#[test]

View file

@ -163,8 +163,8 @@ impl<T: Send> Clone for Queue<T> {
mod tests {
use prelude::*;
use option::*;
use task;
use super::Queue;
use native;
#[test]
fn test() {
@ -172,14 +172,17 @@ mod tests {
let nmsgs = 1000u;
let mut q = Queue::with_capacity(nthreads*nmsgs);
assert_eq!(None, q.pop());
let (port, chan) = SharedChan::new();
for _ in range(0, nthreads) {
let q = q.clone();
do task::spawn_sched(task::SingleThreaded) {
let chan = chan.clone();
do native::task::spawn {
let mut q = q;
for i in range(0, nmsgs) {
assert!(q.push(i));
}
chan.send(());
}
}
@ -188,7 +191,7 @@ mod tests {
let (completion_port, completion_chan) = Chan::new();
completion_ports.push(completion_port);
let q = q.clone();
do task::spawn_sched(task::SingleThreaded) {
do native::task::spawn {
let mut q = q;
let mut i = 0u;
loop {
@ -207,5 +210,8 @@ mod tests {
for completion_port in completion_ports.mut_iter() {
assert_eq!(nmsgs, completion_port.recv());
}
for _ in range(0, nthreads) {
port.recv();
}
}
}

View file

@ -203,8 +203,8 @@ impl<T: Send, P: Send> Consumer<T, P> {
mod tests {
use prelude::*;
use task;
use super::{queue, Data, Empty, Inconsistent};
use native;
#[test]
fn test_full() {
@ -222,14 +222,17 @@ mod tests {
Empty => {}
Inconsistent | Data(..) => fail!()
}
let (port, chan) = SharedChan::new();
for _ in range(0, nthreads) {
let q = p.clone();
do task::spawn_sched(task::SingleThreaded) {
let chan = chan.clone();
do native::task::spawn {
let mut q = q;
for i in range(0, nmsgs) {
q.push(i);
}
chan.send(());
}
}
@ -240,6 +243,9 @@ mod tests {
Data(_) => { i += 1 }
}
}
for _ in range(0, nthreads) {
port.recv();
}
}
}

View file

@ -268,7 +268,7 @@ impl<T: Send, P: Send> Drop for State<T, P> {
mod test {
use prelude::*;
use super::queue;
use task;
use native;
#[test]
fn smoke() {
@ -314,7 +314,8 @@ mod test {
fn stress_bound(bound: uint) {
let (c, mut p) = queue(bound, ());
do task::spawn_sched(task::SingleThreaded) {
let (port, chan) = Chan::new();
do native::task::spawn {
let mut c = c;
for _ in range(0, 100000) {
loop {
@ -325,10 +326,12 @@ mod test {
}
}
}
chan.send(());
}
for _ in range(0, 100000) {
p.push(1);
}
port.recv();
}
}
}

View file

@ -64,6 +64,7 @@ use send_str::{SendStr, IntoSendStr};
use str::Str;
use util;
#[cfg(test)] use any::{AnyOwnExt, AnyRefExt};
#[cfg(test)] use comm::SharedChan;
#[cfg(test)] use ptr;
#[cfg(test)] use result;
@ -385,59 +386,43 @@ pub fn failing() -> bool {
#[test]
fn test_unnamed_task() {
use rt::test::run_in_uv_task;
do run_in_uv_task {
do spawn {
with_task_name(|name| {
assert!(name.is_none());
})
}
do spawn {
with_task_name(|name| {
assert!(name.is_none());
})
}
}
#[test]
fn test_owned_named_task() {
use rt::test::run_in_uv_task;
do run_in_uv_task {
let mut t = task();
t.name(~"ada lovelace");
do t.spawn {
with_task_name(|name| {
assert!(name.unwrap() == "ada lovelace");
})
}
let mut t = task();
t.name(~"ada lovelace");
do t.spawn {
with_task_name(|name| {
assert!(name.unwrap() == "ada lovelace");
})
}
}
#[test]
fn test_static_named_task() {
use rt::test::run_in_uv_task;
do run_in_uv_task {
let mut t = task();
t.name("ada lovelace");
do t.spawn {
with_task_name(|name| {
assert!(name.unwrap() == "ada lovelace");
})
}
let mut t = task();
t.name("ada lovelace");
do t.spawn {
with_task_name(|name| {
assert!(name.unwrap() == "ada lovelace");
})
}
}
#[test]
fn test_send_named_task() {
use rt::test::run_in_uv_task;
do run_in_uv_task {
let mut t = task();
t.name("ada lovelace".into_send_str());
do t.spawn {
with_task_name(|name| {
assert!(name.unwrap() == "ada lovelace");
})
}
let mut t = task();
t.name("ada lovelace".into_send_str());
do t.spawn {
with_task_name(|name| {
assert!(name.unwrap() == "ada lovelace");
})
}
}
@ -508,28 +493,19 @@ fn test_try_fail() {
}
}
#[cfg(test)]
fn get_sched_id() -> int {
use rt::sched::Scheduler;
let mut sched = Local::borrow(None::<Scheduler>);
sched.get().sched_id() as int
}
#[test]
fn test_spawn_sched() {
use clone::Clone;
let (po, ch) = SharedChan::new();
fn f(i: int, ch: SharedChan<()>) {
let parent_sched_id = get_sched_id();
do spawn_sched(SingleThreaded) {
let child_sched_id = get_sched_id();
assert!(parent_sched_id != child_sched_id);
let ch = ch.clone();
do spawn {
if (i == 0) {
ch.send(());
} else {
f(i - 1, ch.clone());
f(i - 1, ch);
}
};
@ -542,16 +518,9 @@ fn test_spawn_sched() {
fn test_spawn_sched_childs_on_default_sched() {
let (po, ch) = Chan::new();
// Assuming tests run on the default scheduler
let default_id = get_sched_id();
do spawn_sched(SingleThreaded) {
do spawn {
let ch = ch;
let parent_sched_id = get_sched_id();
do spawn {
let child_sched_id = get_sched_id();
assert!(parent_sched_id != child_sched_id);
assert_eq!(child_sched_id, default_id);
ch.send(());
};
};
@ -562,6 +531,7 @@ fn test_spawn_sched_childs_on_default_sched() {
#[test]
fn test_spawn_sched_blocking() {
use unstable::mutex::Mutex;
use num::Times;
unsafe {
@ -574,7 +544,7 @@ fn test_spawn_sched_blocking() {
let mut lock = Mutex::new();
let lock2 = lock.clone();
do spawn_sched(SingleThreaded) {
do spawn {
let mut lock = lock2;
lock.lock();
@ -681,11 +651,7 @@ fn test_child_doesnt_ref_parent() {
#[test]
fn test_simple_newsched_spawn() {
use rt::test::run_in_uv_task;
do run_in_uv_task {
spawn(proc()())
}
spawn(proc()())
}
#[test]

View file

@ -333,12 +333,12 @@ mod test {
fn somke_cond() {
static mut lock: Mutex = MUTEX_INIT;
unsafe {
lock.lock();
let t = do Thread::start {
lock.lock();
lock.signal();
lock.unlock();
};
lock.lock();
lock.wait();
lock.unlock();
t.join();

View file

@ -24,11 +24,6 @@
//! detection is not guaranteed to continue in the future. Usage of this module
//! is discouraged unless absolutely necessary.
use rt::task::Task;
use option::None;
use rt::local::Local;
use unstable::intrinsics;
static RED_ZONE: uint = 20 * 1024;
/// This function is invoked from rust's current __morestack function. Segmented
@ -41,6 +36,10 @@ static RED_ZONE: uint = 20 * 1024;
// irrelevant for documentation purposes.
#[cfg(not(test))] // in testing, use the original libstd's version
pub extern "C" fn rust_stack_exhausted() {
use rt::task::Task;
use option::None;
use rt::local::Local;
use unstable::intrinsics;
unsafe {
// We're calling this function because the stack just ran out. We need

View file

@ -161,9 +161,8 @@ impl<T:Send> Exclusive<T> {
mod tests {
use option::*;
use prelude::*;
use super::{Exclusive, UnsafeArc, atomic};
use super::Exclusive;
use task;
use mem::size_of;
#[test]
fn exclusive_new_arc() {

View file

@ -2874,7 +2874,6 @@ impl<A> Extendable<A> for ~[A] {
#[cfg(test)]
mod tests {
use option::{None, Some};
use mem;
use vec::*;
use cmp::*;