tests/poll.R

library(rzmq)

# ZMQ inproc endpoint to use in tests cases.
test.ENDPOINT <- "inproc://poll"

# Testing helpers.
assert <- function(condition, message="Assertion Failed") if(!condition) stop(message)
assert.fails <- function(expr, message="Assertion Failed") {
    result <- try(expr, TRUE)
    assert(inherits(result, 'try-error'), message)
}

# Generate the power set of an input vector.
powerset <- function(x) do.call(c, Map(function(n) combn(x, n, simplify=FALSE), 1:length(x)))

# A basic test of poll functionality.
test.rzmq.poll.basic <- function() {
    ctx <- init.context()
    s.rep <- init.socket(ctx, "ZMQ_REP")
    s.req <- init.socket(ctx, "ZMQ_REQ")

    bind.socket(s.rep, test.ENDPOINT)
    connect.socket(s.req, test.ENDPOINT)

    pollrc <- poll.socket(list(s.rep), list("read"), timeout=0L)
    assert(pollrc[[1]]$read == FALSE, "Poll should return $read==FALSE")

    send.socket(s.req, "Hello")
    pollrc <- poll.socket(list(s.rep), list("read"), timeout=0L)
    assert(pollrc[[1]]$read == TRUE, "Poll should return $read==TRUE")

    receive.socket(s.rep)
    pollrc <- poll.socket(list(s.rep), list("read"), timeout=0L)
    assert(pollrc[[1]]$read == FALSE, "Poll should return $read==FALSE")
}

# Ensures that poll fails when supplied with invalid
# arguments.
test.rzmq.poll.invalidargs <- function() {
    ctx <- init.context()
    s.rep <- init.socket(ctx, "ZMQ_REP")
    bind.socket(s.rep, test.ENDPOINT)

    assert.fails(poll.socket(list(s.rep), list("read", "read")), "poll shall only accept socket and event lists of equal length.")
    assert.fails(poll.socket(list(s.rep), list("read2")), "poll shall only accept event names: read, write, and error.")
    assert.fails(poll.socket(list(s.rep), list(2)), "poll shall only accept event names: read, write, and error.")
    assert.fails(poll.socket(list(), list("read")), "poll shall not accept an empty list of sockets.")
}

# Tests the powerset of {read, write, error} to ensure
# poll returns the correct flags.
test.rzmq.poll.returntypes <- function() {
    ctx <- init.context()
    s.rep <- init.socket(ctx, "ZMQ_REP")
    bind.socket(s.rep, test.ENDPOINT)

    combinations <- powerset(c("read", "write", "error"))

    testEventInput <- function(events) {
        pollrc <- poll.socket(list(s.rep), list(events), timeout=0L)
        assert(all(names(pollrc[[1]]) == events), "poll shall only return logical flags for events that it has requested.")
    }
    for (events in combinations) testEventInput(events)
}

# Run tests.
test.rzmq.poll.basic()
test.rzmq.poll.invalidargs()
test.rzmq.poll.returntypes()

Try the rzmq package in your browser

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

rzmq documentation built on Oct. 4, 2024, 9:07 a.m.