Commit 7e0a40d8 authored by jan.koester's avatar jan.koester
Browse files

test

parent d6f9c77a
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -297,3 +297,9 @@ else()
    target_link_libraries(threadpool_bounded_queue_test netplus-static)
endif()
add_test(NAME threadpool_bounded_queue_test COMMAND threadpool_bounded_queue_test)

if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
    add_executable(socketwait_disconnect_test socketwait_disconnect_test.cpp)
    target_link_libraries(socketwait_disconnect_test netplus-static)
    add_test(NAME socketwait_disconnect_test COMMAND socketwait_disconnect_test)
endif()
+52 −0
Original line number Diff line number Diff line
#include <chrono>
#include <iostream>
#include <thread>

#include <sys/socket.h>
#include <unistd.h>

#include "eventapi.h"

int main() {
    int fds[2];
    if (::socketpair(AF_UNIX, SOCK_STREAM, 0, fds) != 0) return 1;

    netplus::tcp client(fds[0]);
    netplus::socketwait wait;
    if (wait.isDisconnected(client)) {
        std::cerr << "open socket reported disconnected\n";
        ::close(fds[1]);
        return 1;
    }

    const char byte = 'x';
    if (::write(fds[1], &byte, 1) != 1 || wait.isDisconnected(client)) {
        std::cerr << "readable data reported disconnected\n";
        ::close(fds[1]);
        return 1;
    }
    char received;
    if (::read(fds[0], &received, 1) != 1) {
        ::close(fds[1]);
        return 1;
    }

    if (::shutdown(fds[1], SHUT_WR) != 0) {
        ::close(fds[1]);
        return 1;
    }
    bool disconnected = false;
    for (int i = 0; i < 100; ++i) {
        if (wait.isDisconnected(client)) {
            disconnected = true;
            break;
        }
        std::this_thread::sleep_for(std::chrono::milliseconds(1));
    }
    ::close(fds[1]);
    if (!disconnected) {
        std::cerr << "peer FIN was not detected\n";
        return 1;
    }
    return 0;
}