core::rt: Don't directly create scheduler types in I/O tests

There are some better abstractions for this now
This commit is contained in:
Brian Anderson 2013-04-20 01:55:10 -07:00
parent 1a7561be4d
commit e564fc7f6b
2 changed files with 50 additions and 53 deletions

View file

@ -28,6 +28,22 @@ pub fn run_in_newsched_task(f: ~fn()) {
}
}
/// Create a new task and run it right now
pub fn spawn_immediately(f: ~fn()) {
use cell::Cell;
use super::*;
use super::sched::*;
let mut sched = local_sched::take();
let task = ~Task::new(&mut sched.stack_pool, f);
do sched.switch_running_tasks_and_then(task) |task| {
let task = Cell(task);
do local_sched::borrow |sched| {
sched.task_queue.push_front(task.take());
}
}
}
/// Get a port number, starting at 9600, for use in tests
pub fn next_test_port() -> u16 {
unsafe {

View file

@ -22,7 +22,7 @@ use super::sched::{Scheduler, local_sched};
#[cfg(test)] use uint;
#[cfg(test)] use unstable::run_in_bare_thread;
#[cfg(test)] use super::sched::Task;
#[cfg(test)] use super::test::next_test_port;
#[cfg(test)] use super::test::*;
pub struct UvEventLoop {
uvio: UvIoFactory
@ -336,35 +336,21 @@ impl Stream for UvStream {
#[test]
fn test_simple_io_no_connect() {
do run_in_bare_thread {
let mut sched = ~UvEventLoop::new_scheduler();
let task = ~do Task::new(&mut sched.stack_pool) {
let io = unsafe { local_sched::unsafe_borrow_io() };
let addr = Ipv4(127, 0, 0, 1, next_test_port());
let maybe_chan = io.connect(addr);
assert!(maybe_chan.is_none());
};
sched.task_queue.push_back(task);
sched.run();
do run_in_newsched_task {
let io = unsafe { local_sched::unsafe_borrow_io() };
let addr = Ipv4(127, 0, 0, 1, next_test_port());
let maybe_chan = io.connect(addr);
assert!(maybe_chan.is_none());
}
}
#[test]
fn test_simple_tcp_server_and_client() {
do run_in_bare_thread {
let mut sched = ~UvEventLoop::new_scheduler();
do run_in_newsched_task {
let addr = Ipv4(127, 0, 0, 1, next_test_port());
let client_task = ~do Task::new(&mut sched.stack_pool) {
unsafe {
let io = local_sched::unsafe_borrow_io();
let mut stream = io.connect(addr).unwrap();
stream.write([0, 1, 2, 3, 4, 5, 6, 7]);
stream.close();
}
};
let server_task = ~do Task::new(&mut sched.stack_pool) {
// Start the server first so it's listening when we connect
do spawn_immediately {
unsafe {
let io = local_sched::unsafe_borrow_io();
let mut listener = io.bind(addr).unwrap();
@ -379,32 +365,25 @@ fn test_simple_tcp_server_and_client() {
stream.close();
listener.close();
}
};
}
// Start the server first so it listens before the client connects
sched.task_queue.push_back(server_task);
sched.task_queue.push_back(client_task);
sched.run();
do spawn_immediately {
unsafe {
let io = local_sched::unsafe_borrow_io();
let mut stream = io.connect(addr).unwrap();
stream.write([0, 1, 2, 3, 4, 5, 6, 7]);
stream.close();
}
}
}
}
#[test] #[ignore(reason = "busted")]
fn test_read_and_block() {
do run_in_bare_thread {
let mut sched = ~UvEventLoop::new_scheduler();
do run_in_newsched_task {
let addr = Ipv4(127, 0, 0, 1, next_test_port());
let client_task = ~do Task::new(&mut sched.stack_pool) {
let io = unsafe { local_sched::unsafe_borrow_io() };
let mut stream = io.connect(addr).unwrap();
stream.write([0, 1, 2, 3, 4, 5, 6, 7]);
stream.write([0, 1, 2, 3, 4, 5, 6, 7]);
stream.write([0, 1, 2, 3, 4, 5, 6, 7]);
stream.write([0, 1, 2, 3, 4, 5, 6, 7]);
stream.close();
};
let server_task = ~do Task::new(&mut sched.stack_pool) {
do spawn_immediately {
let io = unsafe { local_sched::unsafe_borrow_io() };
let mut listener = io.bind(addr).unwrap();
let mut stream = listener.listen().unwrap();
@ -440,22 +419,27 @@ fn test_read_and_block() {
stream.close();
listener.close();
};
}
do spawn_immediately {
let io = unsafe { local_sched::unsafe_borrow_io() };
let mut stream = io.connect(addr).unwrap();
stream.write([0, 1, 2, 3, 4, 5, 6, 7]);
stream.write([0, 1, 2, 3, 4, 5, 6, 7]);
stream.write([0, 1, 2, 3, 4, 5, 6, 7]);
stream.write([0, 1, 2, 3, 4, 5, 6, 7]);
stream.close();
}
// Start the server first so it listens before the client connects
sched.task_queue.push_back(server_task);
sched.task_queue.push_back(client_task);
sched.run();
}
}
#[test] #[ignore(reason = "needs server")]
fn test_read_read_read() {
do run_in_bare_thread {
let mut sched = ~UvEventLoop::new_scheduler();
do run_in_newsched_task {
let addr = Ipv4(127, 0, 0, 1, next_test_port());
let client_task = ~do Task::new(&mut sched.stack_pool) {
do spawn_immediately {
let io = unsafe { local_sched::unsafe_borrow_io() };
let mut stream = io.connect(addr).unwrap();
let mut buf = [0, .. 2048];
@ -467,9 +451,6 @@ fn test_read_read_read() {
}
rtdebug_!("read %u bytes total", total_bytes_read as uint);
stream.close();
};
sched.task_queue.push_back(client_task);
sched.run();
}
}
}