Как проверить socketConnection под Windows? - PullRequest
1 голос
/ 10 марта 2020

Я реализовал клиентский протокол для BaseX (база данных с открытым исходным кодом XML) в R-пакете (RBaseX). Люди из CRAN попросили меня добавить testthat -тесты к источникам, и благодаря этим тестам я обнаружил (и исправил) некоторые ошибки.

Пакет был разработан на linux -клиенте. BaseX также был установлен на клиенте.
Когда не работает ни один basexserver, все тесты должны провалиться. Поэтому каждый test_that -раздел начинается с вызова следующей функции, которая проверяет, можно ли создать socketConnection:

skip_unless_socket_available <- function() {
    tryCatch({
    sock <- base::socketConnection(
      host = "localhost", 1984,
      open = "w+b", server = FALSE, blocking = TRUE, encoding = "utf-8")
    close(sock)
    TRUE
  }, error = function(e) {
    skip(paste0("basexserver not available:\n'", conditionMessage(e), "'"))
  })
}

На клиенте linux - или Windows с работающим сервером basexserver. доступно, test_check("RBaseX") завершается без ошибок. Когда недоступен basexserver, клиент linux test_check("RBaseX") также завершает работу без ошибок.
Но клиент Windows зависает, не возвращая ошибок или предупреждений.

Как правильно проверить в Windows возможность создания socketConnection для подключения к серверу?

Ben

1 Ответ

0 голосов
/ 11 марта 2020

Windows и linux ведут себя по-разному, когда от ресурса вообще нет ответа. При использовании linux и при вызове 'socketConnection' без явной установки тайм-аута вызов немедленно прерывается.
В Windows необходимо указать значение тайм-аута. 'timeout = 1' решил мою проблему.

Бен

...