diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2020-02-26 05:50:25 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-26 11:50:25 +0100 |
commit | 3d03d7e83b855a0eaef083f9ba249b1927eba51c (patch) | |
tree | 06e267c395b48ec962605ecd088e76ee86b6fbe7 | |
parent | 0e37184ca8084c257948d466c066fdb875ee44f3 (diff) |
Fix flaky tests (#4134)
-rw-r--r-- | cli/test_util.rs | 33 | ||||
-rwxr-xr-x | tools/http_server.py | 22 |
2 files changed, 27 insertions, 28 deletions
diff --git a/cli/test_util.rs b/cli/test_util.rs index d2a49d05f..d487d0dac 100644 --- a/cli/test_util.rs +++ b/cli/test_util.rs @@ -67,39 +67,32 @@ fn kill_http_server() { pub fn http_server() -> HttpServerGuard { SERVER_COUNT.fetch_add(1, Ordering::SeqCst); - { let mut server_guard = SERVER.lock().unwrap(); if server_guard.is_none() { println!("tools/http_server.py starting..."); let mut child = Command::new("python") .current_dir(root_path()) - .args(&[ - "-u", - "tools/http_server.py", - "--certfile", - root_path() - .join("std/http/testdata/tls/localhost.crt") - .to_str() - .unwrap(), - "--keyfile", - root_path() - .join("std/http/testdata/tls/localhost.key") - .to_str() - .unwrap(), - ]) + .args(&["-u", "tools/http_server.py"]) .stdout(Stdio::piped()) .spawn() .expect("failed to execute child"); let stdout = child.stdout.as_mut().unwrap(); use std::io::{BufRead, BufReader}; - let mut lines = BufReader::new(stdout).lines(); - let line = lines.next().unwrap().unwrap(); - assert!(line.starts_with("ready")); - server_guard.replace(child); + let lines = BufReader::new(stdout).lines(); + // Wait for "ready" on stdout. See tools/http_server.py + for maybe_line in lines { + if let Ok(line) = maybe_line { + if line.starts_with("ready") { + server_guard.replace(child); + break; + } + } else { + panic!(maybe_line.unwrap_err()); + } + } } } - HttpServerGuard {} } diff --git a/tools/http_server.py b/tools/http_server.py index 2097c153d..7cb2e28f9 100755 --- a/tools/http_server.py +++ b/tools/http_server.py @@ -21,14 +21,11 @@ REDIRECT_PORT = 4546 ANOTHER_REDIRECT_PORT = 4547 DOUBLE_REDIRECTS_PORT = 4548 INF_REDIRECTS_PORT = 4549 - HTTPS_PORT = 5545 def create_http_arg_parser(): parser = argparse.ArgumentParser() - parser.add_argument('--certfile') - parser.add_argument('--keyfile') parser.add_argument('--verbose', '-v', action='store_true') return parser @@ -36,8 +33,8 @@ def create_http_arg_parser(): HttpArgParser = create_http_arg_parser() args, unknown = HttpArgParser.parse_known_args(sys.argv[1:]) -CERT_FILE = args.certfile -KEY_FILE = args.keyfile +CERT_FILE = os.path.join(root_path, "std/http/testdata/tls/localhost.crt") +KEY_FILE = os.path.join(root_path, "std/http/testdata/tls/localhost.key") QUIET = not args.verbose @@ -314,10 +311,19 @@ def start(s): def spawn(): servers = (server(), redirect_server(), another_redirect_server(), double_redirects_server(), https_server()) - while any(not s.thread.is_alive() for s in servers): - sleep(0.01) + # In order to wait for each of the servers to be ready, we try connecting to + # them with a tcp socket. + for running_server in servers: + client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + port = running_server.server.server_address[1] + client.connect(("127.0.0.1", port)) + print "connected", port + client.close() + assert running_server.thread.is_alive() + # The following output "ready" is specificly looked for in cli/test_util.rs + # to prevent race conditions. + print "ready" try: - print "ready" yield servers finally: for s in servers: |