Skip to content

Commit 828d067

Browse files
committed
libstd: Handle test results in serial
Issue #782
1 parent 891dc84 commit 828d067

File tree

1 file changed

+44
-33
lines changed

1 file changed

+44
-33
lines changed

src/libstd/test.rs

+44-33
Original file line numberDiff line numberDiff line change
@@ -102,13 +102,44 @@ type console_test_state =
102102
fn run_tests_console(opts: test_opts,
103103
tests: [test_desc]) -> bool {
104104

105-
fn callback(event: testevent, st: console_test_state) {
106-
alt event {
105+
let log_out = alt opts.logfile {
106+
some(path) {
107+
alt io::file_writer(path, [io::create, io::truncate]) {
108+
result::ok(w) { some(w) }
109+
result::err(s) {
110+
fail(#fmt("can't open output file: %s", s))
111+
}
112+
}
113+
}
114+
none { none }
115+
};
116+
117+
let st =
118+
@{out: io::stdout(),
119+
log_out: log_out,
120+
use_color: use_color(),
121+
mut total: 0u,
122+
mut passed: 0u,
123+
mut failed: 0u,
124+
mut ignored: 0u,
125+
mut failures: []};
126+
127+
let p = comm::port::<testevent>();
128+
let reporter = comm::chan(p);
129+
130+
task::spawn {||
131+
run_tests(opts, tests, reporter);
132+
};
133+
134+
while true {
135+
alt comm::recv(p) {
107136
te_filtered(filtered_tests) {
108137
st.total = vec::len(filtered_tests);
109138
st.out.write_line(#fmt["\nrunning %u tests", st.total]);
110139
}
111-
te_wait(test) { st.out.write_str(#fmt["test %s ... ", test.name]); }
140+
te_wait(test) {
141+
st.out.write_str(#fmt["test %s ... ", test.name]);
142+
}
112143
te_result(test, result) {
113144
alt st.log_out {
114145
some(f) {
@@ -135,33 +166,12 @@ fn run_tests_console(opts: test_opts,
135166
}
136167
}
137168
}
169+
te_done {
170+
break;
171+
}
138172
}
139173
}
140174

141-
let log_out = alt opts.logfile {
142-
some(path) {
143-
alt io::file_writer(path, [io::create, io::truncate]) {
144-
result::ok(w) { some(w) }
145-
result::err(s) {
146-
fail(#fmt("can't open output file: %s", s))
147-
}
148-
}
149-
}
150-
none { none }
151-
};
152-
153-
let st =
154-
@{out: io::stdout(),
155-
log_out: log_out,
156-
use_color: use_color(),
157-
mut total: 0u,
158-
mut passed: 0u,
159-
mut failed: 0u,
160-
mut ignored: 0u,
161-
mut failures: []};
162-
163-
run_tests(opts, tests, bind callback(_, st));
164-
165175
assert (st.passed + st.failed + st.ignored == st.total);
166176
let success = st.failed == 0u;
167177

@@ -171,7 +181,6 @@ fn run_tests_console(opts: test_opts,
171181

172182
st.out.write_str(#fmt["\nresult: "]);
173183
if success {
174-
// There's no parallelism at this point so it's safe to use color
175184
write_ok(st.out, true);
176185
} else { write_failed(st.out, true); }
177186
st.out.write_str(#fmt[". %u passed; %u failed; %u ignored\n\n", st.passed,
@@ -264,15 +273,16 @@ enum testevent {
264273
te_filtered([test_desc]),
265274
te_wait(test_desc),
266275
te_result(test_desc, test_result),
276+
te_done,
267277
}
268278

269279
type monitor_msg = (test_desc, test_result);
270280

271281
fn run_tests(opts: test_opts, tests: [test_desc],
272-
callback: fn@(testevent)) {
282+
reporter: comm::chan<testevent>) {
273283

274284
let mut filtered_tests = filter_tests(opts, tests);
275-
callback(te_filtered(filtered_tests));
285+
comm::send(reporter, te_filtered(filtered_tests));
276286

277287
// It's tempting to just spawn all the tests at once, but since we have
278288
// many tests that run in other processes we would be making a big mess.
@@ -294,7 +304,7 @@ fn run_tests(opts: test_opts, tests: [test_desc],
294304
// We are doing one test at a time so we can print the name
295305
// of the test before we run it. Useful for debugging tests
296306
// that hang forever.
297-
callback(te_wait(test));
307+
comm::send(reporter, te_wait(test));
298308
}
299309
run_test(test, ch);
300310
wait_idx += 1u;
@@ -303,12 +313,13 @@ fn run_tests(opts: test_opts, tests: [test_desc],
303313

304314
let (test, result) = comm::recv(p);
305315
if concurrency != 1u {
306-
callback(te_wait(test));
316+
comm::send(reporter, te_wait(test));
307317
}
308-
callback(te_result(test, result));
318+
comm::send(reporter, te_result(test, result));
309319
wait_idx -= 1u;
310320
done_idx += 1u;
311321
}
322+
comm::send(reporter, te_done);
312323
}
313324

314325
// Windows tends to dislike being overloaded with threads.

0 commit comments

Comments
 (0)