# Regression test of # https://github.com/rstudio/httpuv/pull/219 context("frame completion") test_that("a close message with no payload is processed", { # Timing on CRAN build machines can be unreliable. skip_on_cran() elapsed <- NULL client_on_open_called <- FALSE random_port <- randomPort() srv <- startServer("127.0.0.1", random_port, list( onWSOpen = function(ws) { open_time <- as.numeric(Sys.time()) ws$onClose(function(e) { elapsed <<- as.numeric(Sys.time()) - open_time stopServer(srv) }) } )) on.exit(srv$stop()) # "Unnecessary" braces here to prevent `later` from attempting to # run callbacks if this test is pasted at the console { ws_client <- websocket::WebSocket$new(sprintf("ws://127.0.0.1:%s", random_port)) ws_client$onOpen(function(event) { client_on_open_called <<- TRUE # NOTE: Depends on websocketpp internals. # 0 below corresponds to close::status::blank, here: # https://github.com/rstudio/websocket/blob/f435899aef3eaecf97af9f3febd87687ecddc3a7/src/lib/websocketpp/close.hpp#L51-L52 ws_client$close(0) }) } loop_start <- as.numeric(Sys.time()) while (!client_on_open_called) { loop_elapsed <- as.numeric(Sys.time()) - loop_start if (loop_elapsed > 10) stop("run loop timed out") later::run_now(0.5) } # Run ws$onClose later::run_now(0.5) expect_true(elapsed < 1) })