summaryrefslogtreecommitdiff
path: root/cli/tests/integration/run_tests.rs
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2023-11-17 11:57:11 -0500
committerGitHub <noreply@github.com>2023-11-17 16:57:11 +0000
commitdaab366b036632f305dc4b3333d9b420f28d8f20 (patch)
treeadf9ecd0d54018a6afb12a9cbe457bd9f041813f /cli/tests/integration/run_tests.rs
parent9a1c697045cee8675ff07e3a0abde1e30fea5362 (diff)
ci: fix flaky stdio_streams_are_locked_in_permission_prompt (#21238)
Part of #21187
Diffstat (limited to 'cli/tests/integration/run_tests.rs')
-rw-r--r--cli/tests/integration/run_tests.rs72
1 files changed, 51 insertions, 21 deletions
diff --git a/cli/tests/integration/run_tests.rs b/cli/tests/integration/run_tests.rs
index ac379d7fc..43c893071 100644
--- a/cli/tests/integration/run_tests.rs
+++ b/cli/tests/integration/run_tests.rs
@@ -4402,32 +4402,62 @@ fn file_fetcher_preserves_permissions() {
#[test]
fn stdio_streams_are_locked_in_permission_prompt() {
+ if !util::pty::Pty::is_supported() {
+ // Don't deal with the logic below if the with_pty
+ // block doesn't even run (ex. on Windows CI)
+ return;
+ }
+
let context = TestContextBuilder::new()
.use_http_server()
.use_copy_temp_dir("run/stdio_streams_are_locked_in_permission_prompt")
.build();
- context
- .new_command()
- .args("repl --allow-read")
- .with_pty(|mut console| {
- console.write_line(r#"const url = "file://" + Deno.cwd().replace("\\", "/") + "/run/stdio_streams_are_locked_in_permission_prompt/worker.js";"#);
- console.expect("undefined");
- // ensure this file exists
- console.write_line(r#"const _file = Deno.readTextFileSync("./run/stdio_streams_are_locked_in_permission_prompt/worker.js");"#);
- console.expect("undefined");
- console.write_line(r#"new Worker(url, { type: "module" }); await Deno.writeTextFile("./text.txt", "some code");"#);
- console.expect("Allow? [y/n/A] (y = yes, allow; n = no, deny; A = allow all write permissions)");
- std::thread::sleep(Duration::from_millis(50)); // give the other thread some time to output
- console.write_line_raw("invalid");
- console.expect("Unrecognized option.");
- console.expect("Allow? [y/n/A] (y = yes, allow; n = no, deny; A = allow all write permissions)");
- console.write_line_raw("y");
- console.expect("Granted write access to");
+ let mut passed_test = false;
+ let mut i = 0;
+ while !passed_test {
+ i += 1;
+ if i > 5 {
+ panic!("Output happened before permission prompt too many times");
+ }
- // this output should now be shown below and not above
- let expected_output = r#"Are you sure you want to continue?"#;
- console.expect(expected_output);
- });
+ context
+ .new_command()
+ .args("repl --allow-read")
+ .with_pty(|mut console| {
+ let malicious_output = r#"Are you sure you want to continue?"#;
+
+ console.write_line(r#"const url = "file://" + Deno.cwd().replace("\\", "/") + "/run/stdio_streams_are_locked_in_permission_prompt/worker.js";"#);
+ console.expect("undefined");
+ // ensure this file exists
+ console.write_line(r#"const _file = Deno.readTextFileSync("./run/stdio_streams_are_locked_in_permission_prompt/worker.js");"#);
+ console.expect("undefined");
+ console.write_line(r#"new Worker(url, { type: "module" }); await Deno.writeTextFile("./text.txt", "some code");"#);
+ console.expect("Allow? [y/n/A] (y = yes, allow; n = no, deny; A = allow all write permissions)");
+
+ // Due to the main thread being slow, it may occur that the worker thread outputs
+ // before the permission prompt is shown. This is not a bug and just a timing issue
+ // when dealing with multiple threads. If this occurs, detect such a case and then
+ // retry running the test.
+ if let Some(malicious_index) = console.all_output().find(malicious_output) {
+ let prompt_index = console.all_output().find("Allow?").unwrap();
+ // Ensure the malicious output is shown before the prompt as we
+ // expect in this scenario. If not, that would indicate a bug.
+ assert!(malicious_index < prompt_index);
+ return;
+ }
+
+ std::thread::sleep(Duration::from_millis(50)); // give the other thread some time to output
+ console.write_line_raw("invalid");
+ console.expect("Unrecognized option.");
+ console.expect("Allow? [y/n/A] (y = yes, allow; n = no, deny; A = allow all write permissions)");
+ console.write_line_raw("y");
+ console.expect("Granted write access to");
+
+ // this output should now be shown below and not above
+ console.expect(malicious_output);
+ passed_test = true;
+ });
+ }
}
#[test]