test_that("long-running queries can be cancelled", {
  skip_if_not_installed("callr")
  # Skip on Windows for R < 4.4, the signal doesn't seem to make it through
  # (but works for the toy repository)
  skip_if(getRversion() < "4.4.0" && .Platform$OS.type == "windows")

  r_session <- callr::r_session$new()

  r_session$run(function() {
    .GlobalEnv$con <- DBI::dbConnect(duckdb::duckdb())
    DBI::dbExecute(.GlobalEnv$con, "CREATE TABLE data AS SELECT unnest(generate_series(1, 100000)) AS a")
  })

  r_session$call(function() {
    .GlobalEnv$interrupted <- FALSE
    tryCatch(
      DBI::dbGetQuery(.GlobalEnv$con, "SELECT COUNT(*) FROM data JOIN data AS data2 ON data.a != data2.a"),
      interrupt = function(e) {
        .GlobalEnv$interrupted <- TRUE
      }
    )
  })

  start_time <- Sys.time()

  Sys.sleep(0.2)
  expect_equal(r_session$get_state(), "busy")
  polled <- r_session$poll_process(200)
  expect_equal(polled, "timeout")
  r_session$interrupt()
  polled <- r_session$poll_process(200)
  expect_equal(polled, "ready")
  expect_equal(r_session$read()$code, 200)
  expect_equal(r_session$get_state(), "idle")

  expect_true(r_session$run(function() .GlobalEnv$interrupted))

  end_time <- Sys.time()
  expect_lt(end_time - start_time, 1)

  r_session$run(function() DBI::dbDisconnect(.GlobalEnv$con))
  r_session$close()
})
