diff options
Diffstat (limited to 'Tests/CMakeLib/testUVHandlePtr.cxx')
-rw-r--r-- | Tests/CMakeLib/testUVHandlePtr.cxx | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/Tests/CMakeLib/testUVHandlePtr.cxx b/Tests/CMakeLib/testUVHandlePtr.cxx new file mode 100644 index 0000000..17f672d --- /dev/null +++ b/Tests/CMakeLib/testUVHandlePtr.cxx @@ -0,0 +1,153 @@ +#include <functional> +#include <iostream> +#include <memory> + +#include <cm3p/uv.h> + +#include "cmGetPipes.h" +#include "cmUVHandlePtr.h" + +static bool testBool() +{ + cm::uv_async_ptr async; + cm::uv_handle_ptr handle; + cm::uv_idle_ptr idle; + cm::uv_pipe_ptr pipe; + cm::uv_process_ptr process; + cm::uv_signal_ptr signal; + cm::uv_stream_ptr stream; + cm::uv_timer_ptr timer; + cm::uv_tty_ptr tty; + return !async && !handle && !idle && !pipe && !process && !signal && + !stream && !timer && !tty; +} + +static bool testIdle() +{ + bool idled = false; + + cm::uv_loop_ptr loop; + loop.init(); + + auto cb = [](uv_idle_t* handle) { + auto idledPtr = static_cast<bool*>(handle->data); + *idledPtr = true; + uv_idle_stop(handle); + }; + + cm::uv_idle_ptr idle; + idle.init(*loop, &idled); + idle.start(cb); + uv_run(loop, UV_RUN_DEFAULT); + + if (!idled) { + std::cerr << "uv_idle_ptr did not trigger callback" << std::endl; + return false; + } + + idled = false; + + idle.start(cb); + idle.stop(); + uv_run(loop, UV_RUN_DEFAULT); + + if (idled) { + std::cerr << "uv_idle_ptr::stop did not stop callback" << std::endl; + return false; + } + + return true; +} + +static bool testTimer() +{ + bool timed = false; + + cm::uv_loop_ptr loop; + loop.init(); + + auto cb = [](uv_timer_t* handle) { + auto timedPtr = static_cast<bool*>(handle->data); + *timedPtr = true; + uv_timer_stop(handle); + }; + + cm::uv_timer_ptr timer; + timer.init(*loop, &timed); + timer.start(cb, 10, 0); + uv_run(loop, UV_RUN_DEFAULT); + + if (!timed) { + std::cerr << "uv_timer_ptr did not trigger callback" << std::endl; + return false; + } + + timed = false; + timer.start(cb, 10, 0); + timer.stop(); + uv_run(loop, UV_RUN_DEFAULT); + + if (timed) { + std::cerr << "uv_timer_ptr::stop did not stop callback" << std::endl; + return false; + } + + return true; +} + +static bool testWriteCallback() +{ + int pipe[] = { -1, -1 }; + if (cmGetPipes(pipe) < 0) { + std::cout << "cmGetPipes() returned an error" << std::endl; + return false; + } + + cm::uv_loop_ptr loop; + loop.init(); + + cm::uv_pipe_ptr pipeRead; + pipeRead.init(*loop, 0); + uv_pipe_open(pipeRead, pipe[0]); + + cm::uv_pipe_ptr pipeWrite; + pipeWrite.init(*loop, 0); + uv_pipe_open(pipeWrite, pipe[1]); + + char c = '.'; + uv_buf_t buf = uv_buf_init(&c, sizeof(c)); + int status = -1; + auto cb = std::make_shared<std::function<void(int)>>( + [&status](int s) { status = s; }); + + // Test getting a callback after the write is done. + cm::uv_write(pipeWrite, &buf, 1, cb); + uv_run(loop, UV_RUN_DEFAULT); + if (status != 0) { + std::cout << "cm::uv_write non-zero status: " << status << std::endl; + return false; + } + + // Test deleting the callback before it is made. + status = -1; + cm::uv_write(pipeWrite, &buf, 1, cb); + cb.reset(); + uv_run(loop, UV_RUN_DEFAULT); + if (status != -1) { + std::cout << "cm::uv_write callback incorrectly called with status: " + << status << std::endl; + return false; + } + + return true; +} + +int testUVHandlePtr(int, char** const) +{ + bool passed = true; + passed = testBool() && passed; + passed = testIdle() && passed; + passed = testTimer() && passed; + passed = testWriteCallback() && passed; + return passed ? 0 : -1; +} |