1
0
mirror of https://github.com/fluencelabs/wasm-bindgen synced 2025-04-05 03:41:05 +00:00

Merge pull request from fitzgen/issue-1183

wasm-bindgen-test: Capture more console logging methods' output
This commit is contained in:
Alex Crichton 2019-01-15 14:25:46 -08:00 committed by GitHub
commit 0d3f9eb02b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 115 additions and 82 deletions
crates
cli/src/bin/wasm-bindgen-test-runner
test/src/rt

@ -3,39 +3,36 @@
<meta content="text/html;charset=utf-8" http-equiv="Content-Type"/> <meta content="text/html;charset=utf-8" http-equiv="Content-Type"/>
</head> </head>
<body> <body>
<pre id='output'>Loading scripts...</pre> <pre id="output">Loading scripts...</pre>
<pre id='console_log'></pre> <pre id="console_debug"></pre>
<pre id='console_error'></pre> <pre id="console_log"></pre>
<pre id="console_info"></pre>
<pre id="console_warn"></pre>
<pre id="console_error"></pre>
<script> <script>
const orig_console_log = function(...args) { const orig = id => (...args) => {
const logs = document.getElementById('console_log'); const logs = document.getElementById(id);
for (let msg of args) { for (let msg of args) {
logs.innerHTML += `${msg}\n`; logs.innerHTML += `${msg}\n`;
} }
}; };
const orig_console_error = function(...args) { const wrap = method => {
const logs = document.getElementById('console_error'); const og = orig(`console_${method}`);
for (let msg of args) { const on_method = `on_console_${method}`;
logs.innerHTML += `${msg}\n`; console[method] = function (...args) {
if (window[on_method]) {
window[on_method](args);
} }
og.apply(this, args);
};
}; };
console.log = function(...args) { wrap("debug");
if (window.on_console_log) { wrap("log");
window.on_console_log(args); wrap("info");
} wrap("warn");
wrap("error");
orig_console_log.apply(this, args);
};
console.error = function(...args) {
if (window.on_console_error) {
window.on_console_error(args);
}
orig_console_error.apply(this, args);
};
window.__wbg_test_invoke = f => f(); window.__wbg_test_invoke = f => f();
</script> </script>

@ -5,24 +5,22 @@
<body> <body>
<pre id='output'>Loading scripts...</pre> <pre id='output'>Loading scripts...</pre>
<script> <script>
const orig_console_log = console.log; const wrap = method => {
const orig_console_error = console.error; const og = console[method];
const on_method = `on_console_${method}`;
console.log = function(...args) { console[method] = function (...args) {
if (window.on_console_log) { if (window[on_method]) {
window.on_console_log(args); window[on_method](args);
} }
og.apply(this, args);
orig_console_log.apply(this, args); };
}; };
console.error = function(...args) { wrap("debug");
if (window.on_console_error) { wrap("log");
window.on_console_error(args); wrap("info");
} wrap("warn");
wrap("error");
orig_console_error.apply(this, args);
};
window.__wbg_test_invoke = f => f(); window.__wbg_test_invoke = f => f();
</script> </script>

@ -16,26 +16,27 @@ pub fn execute(
r#" r#"
const {{ exit }} = require('process'); const {{ exit }} = require('process');
let on_console_log = null; const handlers = {{}};
let on_console_error = null;
// override `console.log` and `console.error` before we import tests to const wrap = method => {{
const og = console[method];
const on_method = `on_console_${{method}}`;
console[method] = function (...args) {{
if (handlers[on_method]) {{
handlers[on_method](args);
}}
og.apply(this, args);
}};
}};
// override `console.log` and `console.error` etc... before we import tests to
// ensure they're bound correctly in wasm. This'll allow us to intercept // ensure they're bound correctly in wasm. This'll allow us to intercept
// all these calls and capture the output of tests // all these calls and capture the output of tests
const prev_log = console.log; wrap("debug");
console.log = function(...args) {{ wrap("log");
if (on_console_log) {{ wrap("info");
on_console_log(args); wrap("warn");
}} wrap("error");
prev_log.apply(null, args);
}};
const prev_error = console.error;
console.error = function(...args) {{
if (on_console_error) {{
on_console_error(args);
}}
prev_error.apply(null, args);
}};
global.__wbg_test_invoke = f => f(); global.__wbg_test_invoke = f => f();
@ -44,8 +45,11 @@ pub fn execute(
const wasm = require("./{0}_bg"); const wasm = require("./{0}_bg");
cx = new support.Context(); cx = new support.Context();
on_console_log = support.__wbgtest_console_log; handlers.on_console_debug = support.__wbgtest_console_debug;
on_console_error = support.__wbgtest_console_error; handlers.on_console_log = support.__wbgtest_console_log;
handlers.on_console_info = support.__wbgtest_console_info;
handlers.on_console_warn = support.__wbgtest_console_warn;
handlers.on_console_error = support.__wbgtest_console_error;
// Forward runtime arguments. These arguments are also arguments to the // Forward runtime arguments. These arguments are also arguments to the
// `wasm-bindgen-test-runner` which forwards them to node which we // `wasm-bindgen-test-runner` which forwards them to node which we

@ -17,7 +17,14 @@ pub fn spawn(
) -> Result<Server<impl Fn(&Request) -> Response + Send + Sync>, Error> { ) -> Result<Server<impl Fn(&Request) -> Response + Send + Sync>, Error> {
let mut js_to_execute = format!( let mut js_to_execute = format!(
r#" r#"
import {{ Context, __wbgtest_console_log, __wbgtest_console_error }} from './{0}'; import {{
Context,
__wbgtest_console_debug,
__wbgtest_console_log,
__wbgtest_console_info,
__wbgtest_console_warn,
__wbgtest_console_error
}} from './{0}';
import * as wasm from './{0}_bg'; import * as wasm from './{0}_bg';
// Now that we've gotten to the point where JS is executing, update our // Now that we've gotten to the point where JS is executing, update our
@ -31,7 +38,10 @@ pub fn spawn(
await wasm.booted; await wasm.booted;
const cx = new Context(); const cx = new Context();
window.on_console_debug = __wbgtest_console_debug;
window.on_console_log = __wbgtest_console_log; window.on_console_log = __wbgtest_console_log;
window.on_console_info = __wbgtest_console_info;
window.on_console_warn = __wbgtest_console_warn;
window.on_console_error = __wbgtest_console_error; window.on_console_error = __wbgtest_console_error;
// Forward runtime arguments. These arguments are also arguments to the // Forward runtime arguments. These arguments are also arguments to the

@ -164,7 +164,10 @@ struct Test {
/// Captured output of each test. /// Captured output of each test.
#[derive(Default)] #[derive(Default)]
struct Output { struct Output {
debug: String,
log: String, log: String,
info: String,
warn: String,
error: String, error: String,
} }
@ -309,9 +312,25 @@ pub fn __wbgtest_console_log(args: &Array) {
record(args, |output| &mut output.log) record(args, |output| &mut output.log)
} }
/// Handler for `console.error` invocations. /// Handler for `console.debug` invocations. See above.
/// #[wasm_bindgen]
/// Works the same as `console_log` above. pub fn __wbgtest_console_debug(args: &Array) {
record(args, |output| &mut output.debug)
}
/// Handler for `console.info` invocations. See above.
#[wasm_bindgen]
pub fn __wbgtest_console_info(args: &Array) {
record(args, |output| &mut output.info)
}
/// Handler for `console.warn` invocations. See above.
#[wasm_bindgen]
pub fn __wbgtest_console_warn(args: &Array) {
record(args, |output| &mut output.warn)
}
/// Handler for `console.error` invocations. See above.
#[wasm_bindgen] #[wasm_bindgen]
pub fn __wbgtest_console_error(args: &Array) { pub fn __wbgtest_console_error(args: &Array) {
record(args, |output| &mut output.error) record(args, |output| &mut output.error)
@ -477,19 +496,24 @@ impl State {
)); ));
} }
fn accumulate_console_output(&self, logs: &mut String, which: &str, output: &str) {
if output.is_empty() {
return;
}
logs.push_str(which);
logs.push_str(" output:\n");
logs.push_str(&tab(output));
logs.push('\n');
}
fn print_failure(&self, test: &Test, error: &JsValue) { fn print_failure(&self, test: &Test, error: &JsValue) {
let mut logs = String::new(); let mut logs = String::new();
let output = test.output.borrow(); let output = test.output.borrow();
if output.log.len() > 0 { self.accumulate_console_output(&mut logs, "debug", &output.debug);
logs.push_str("log output:\n"); self.accumulate_console_output(&mut logs, "log", &output.log);
logs.push_str(&tab(&output.log)); self.accumulate_console_output(&mut logs, "info", &output.info);
logs.push_str("\n"); self.accumulate_console_output(&mut logs, "warn", &output.warn);
} self.accumulate_console_output(&mut logs, "error", &output.error);
if output.error.len() > 0 {
logs.push_str("error output:\n");
logs.push_str(&tab(&output.error));
logs.push_str("\n");
}
logs.push_str("JS exception that was thrown:\n"); logs.push_str("JS exception that was thrown:\n");
let error_string = self.formatter.stringify_error(error); let error_string = self.formatter.stringify_error(error);
logs.push_str(&tab(&error_string)); logs.push_str(&tab(&error_string));