-
Notifications
You must be signed in to change notification settings - Fork 13.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
#![windows_subsystem = "windows"]
hides cargo test output
#67159
Comments
Thanks for the report. I have moved this to rust-lang/rust, as that is where issues for libtest are tracked. This looks to be an issue with the libtest harness. Interestingly, the output works when run from a cygwin/msys shell, but doesn't with cmd or powershell. As a workaround, perhaps something like this well help: #![cfg_attr(not(test), windows_subsystem = "windows")] |
Isn't this expected behavior? |
Good question, I have no idea! I could see an argument that when built with |
I'm pretty sure this is due to defaults regarding how console and windows processes inherit stdout/stdin differently. By default console processes will inherit stdout/stdin from the parent process while windows processes do not. I believe the reason we allow stdout/stdin to be inherited instead of explicitly piping it is to allow console processes to emit colors using the conhost color API, because otherwise colors would not work in some situations on Windows. |
This issue isn't limited to tests only. I build a GUI currently and want to avoid popping up a console on start. However using the cli version is not possible anymore because it does not output anything due to stdout/stdin not being attached to anything. |
Here's a workaround to not show a console on start, but still output the normal output when started from powershell or cmd: #![windows_subsystem = "windows"]
fn main() {
#[cfg(target_os = "windows")]
{
use winapi::um::wincon::{AttachConsole, ATTACH_PARENT_PROCESS};
unsafe {
AttachConsole(ATTACH_PARENT_PROCESS);
}
// ...
} from here: https://www.reddit.com/r/learnrust/comments/jaqfcx/windows_print_to_hidden_console_window/ |
That'll work but be aware that the console will not be waiting for output. This means the prompt may switch back to interactive mode while the program is still running. EDIT: Just clarify the "may" there, it should be fine when running from cargo or another console process that will wait for the "windows" process to exit. But if you run it directly from powershell or cmd then it won't wait. |
After testing, i can not recommend the above workaround. Like you said it doesn't make the console wait for the output, leading to weird output intermingling and undesired behaviour when the console is closed (program might get killed with broken pipe or it might not) |
This problem had me on a wild goose chase for a couple of hours yesterday. 🙂 As a relative newbie to Rust, it was a bit hard to know what to look for when I suddenly couldn't run my newly added tests. After some digging around, my solution to this specific problem is to attribute only the main() function instead of setting it as a crate level attribute. Maybe this needs to be mentioned somewhere in some docs relating to either Example:My example is a bit contrived, as I really don't need to switch the subsystem for this example, but it exists there only to show how you can place the attribute on the main function only, instead of as a crate level attribute. #[windows_subsystem = "windows"] // Just on main, not a crate level attribute (# vs #!)
fn main() {
println!("Works fine with cargo test!");
}
#[cfg(test)]
mod main_tests {
#[test]
fn it_works() {
let result = 2 + 2;
assert_eq!(result, 4);
}
} |
@MunchyYDL |
Ah, yes, my bad, I tricked myself into thinking it worked, but I only started the program from within VS Code, not as a standalone. DOH! Thanks for clearing that up for me! :) |
|
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] |
Changing the subsystem is something that should only be done in a binary crate. It makes no sense to set it in a library crate and I'd argue it should emit an error if it doesn't already in that case. |
Problem
Calling
cargo test
on a project that has the#![windows_subsystem = "windows"]
global attribute does not show the expected human-readable output.Instead of showing
it shows
which not quite as informative as the former message (it does not tell which tests failed).
Steps
This requires a Windows computer.
cargo new
.main.rs
file:cargo test
on your project.Possible Solution(s)
My guess is that this is due to executables targeting the Windows subsystem having no console and standard output initialized by default on Windows. Therefore, 2 possible solutions come to my mind:
cargo test
-compiled executables to target the console subsystem when compiled for Windows;AllocConsole()
function provided by the Windows API.Notes
Output of
cargo version
: this happens on pretty much any cargo version.Tested on
cargo 1.39.0 (1c6ec66d5 2019-09-30)
andcargo 1.41.0-nightly (626f0f40e 2019-12-03)
.Apologies if this has already been reported. I was unable to find a similar issue in the repository 😅
The text was updated successfully, but these errors were encountered: