tests/testthat/test-poll-connections.R

test_that("poll a connection", {

  px <- get_tool("px")
  p <- process$new(px, c("sleep", ".5", "outln", "foobar"), stdout = "|")
  on.exit(p$kill())
  out <- p$get_output_connection()

  ## Timeout
  expect_equal(poll(list(out), 0)[[1]], "timeout")

  expect_equal(poll(list(out), 2000)[[1]], "ready")

  p$read_output_lines()
  expect_equal(poll(list(out), 2000)[[1]], "ready")

  close(out)
  expect_equal(poll(list(out), 0)[[1]], "closed")
})

test_that("poll a connection and a process", {

  px <- get_tool("px")
  p1 <- process$new(px, c("sleep", ".5", "outln", "foobar"), stdout = "|")
  p2 <- process$new(px, c("sleep", ".5", "outln", "foobar"), stdout = "|")
  on.exit(p1$kill(), add = TRUE)
  on.exit(p2$kill(), add = TRUE)
  out <- p1$get_output_connection()

  ## Timeout
  expect_equal(
    poll(list(out, p2), 0),
    list(
      "timeout",
      c(output = "timeout", error = "nopipe", process = "nopipe"))
  )

  ## At least one of them is ready. Usually both on Unix, but on Windows
  ## it is different because the IOCP is a queue
  pr <- poll(list(out, p2), 2000)
  expect_true(pr[[1]] == "ready"  || pr[[2]][["output"]] == "ready")

  p1$poll_io(2000)
  p2$poll_io(2000)
  p1$read_output_lines()
  p2$read_output_lines()
  pr <- poll(list(out, p2), 2000)
  expect_true(pr[[1]] == "ready"  || pr[[2]][["output"]] == "ready")

  p1$kill(close_connections = FALSE)
  p2$kill(close_connections = FALSE)
  pr <- poll(list(out, p2), 2000)
  expect_true(pr[[1]] == "ready"  || pr[[2]][["output"]] == "ready")

  close(out)
  close(p2$get_output_connection())
  expect_equal(
    poll(list(out, p2), 2000),
    list("closed", c(output = "closed", error = "nopipe", process = "nopipe"))
  )
})

Try the processx package in your browser

Any scripts or data that you put into this service are public.

processx documentation built on July 9, 2023, 5:34 p.m.