diff --git a/include/tinycsocket.h b/include/tinycsocket.h index 2794d23..5036e60 100644 --- a/include/tinycsocket.h +++ b/include/tinycsocket.h @@ -29,7 +29,7 @@ #ifndef TINYCSOCKET_INTERNAL_H_ #define TINYCSOCKET_INTERNAL_H_ -static const char* const TCS_VERSION_TXT = "v0.3.58"; +static const char* const TCS_VERSION_TXT = "v0.3.59"; static const char* const TCS_LICENSE_TXT = "Copyright 2018 Markus Lindelöw\n" "\n" @@ -277,13 +277,17 @@ struct TcsAddress } data; }; +#ifndef TCS_INTERFACE_NAME_SIZE +#define TCS_INTERFACE_NAME_SIZE 64 +#endif + /** * @brief Network Interface Information */ struct TcsInterface { TcsInterfaceId id; - char name[32]; + char name[TCS_INTERFACE_NAME_SIZE]; }; struct TcsInterfaceAddress @@ -2710,7 +2714,7 @@ static inline int tds_map_remove(void** keys, #include // Flags for ifaddrs #include // pretty much everything #include // POSIX.1 compatibility -#include // UIO_MAXIOV +#include // struct iovec #include // close() #if TCS_HAS_GETIFADDRS @@ -2783,12 +2787,20 @@ const int TCS_SO_BROADCAST = SO_BROADCAST; const int TCS_SO_KEEPALIVE = SO_KEEPALIVE; const int TCS_SO_LINGER = SO_LINGER; const int TCS_SO_REUSEADDR = SO_REUSEADDR; +#ifdef SO_REUSEPORT const int TCS_SO_REUSEPORT = SO_REUSEPORT; +#else +const int TCS_SO_REUSEPORT = -1; +#endif const int TCS_SO_RCVBUF = SO_RCVBUF; const int TCS_SO_RCVTIMEO = SO_RCVTIMEO; const int TCS_SO_SNDBUF = SO_SNDBUF; const int TCS_SO_OOBINLINE = SO_OOBINLINE; +#ifdef SO_PRIORITY const int TCS_SO_PRIORITY = SO_PRIORITY; +#else +const int TCS_SO_PRIORITY = -1; +#endif // IP options const int TCS_SO_IP_NODELAY = TCP_NODELAY; @@ -3286,7 +3298,7 @@ TcsResult tcs_sendv(TcsSocket socket_ctx, if (flags & TCS_MSG_SENDALL) return TCS_ERROR_NOT_IMPLEMENTED; - if (buffer_count > UIO_MAXIOV) + if (buffer_count > IOV_MAX) return TCS_ERROR_INVALID_ARGUMENT; struct iovec stack_iovec[TCS_SENDV_STACK_MAX]; @@ -3321,7 +3333,7 @@ TcsResult tcs_sendv(TcsSocket socket_ctx, msg.msg_namelen = 0; msg.msg_iov = my_iovec; // msg_iovlen type varies across platforms (int on POSIX, size_t on glibc). - // buffer_count is already validated against UIO_MAXIOV above. + // buffer_count is already validated against IOV_MAX above. #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #pragma GCC diagnostic ignored "-Wsign-conversion" @@ -4021,8 +4033,8 @@ TcsResult tcs_interface_list(struct TcsInterface* found_interfaces, { for (size_t i = 0; i < interfaces_length && interfaces[i].if_index != 0; ++i) { - strncpy(found_interfaces[i].name, interfaces[i].if_name, 31); - found_interfaces[i].name[31] = '\0'; + strncpy(found_interfaces[i].name, interfaces[i].if_name, TCS_INTERFACE_NAME_SIZE - 1); + found_interfaces[i].name[TCS_INTERFACE_NAME_SIZE - 1] = '\0'; found_interfaces[i].id = interfaces[i].if_index; if (interfaces_populated != NULL) *interfaces_populated += 1; @@ -4207,8 +4219,8 @@ TcsResult tcs_address_list(unsigned int interface_id_filter, return errno2retcode(errno); } - strncpy(interface_addresses[populated].iface.name, iter->ifa_name, 31); - interface_addresses[populated].iface.name[31] = '\0'; + strncpy(interface_addresses[populated].iface.name, iter->ifa_name, TCS_INTERFACE_NAME_SIZE - 1); + interface_addresses[populated].iface.name[TCS_INTERFACE_NAME_SIZE - 1] = '\0'; interface_addresses[populated].iface.id = interface_id; interface_addresses[populated].address = address; populated++; @@ -4330,12 +4342,13 @@ TcsResult tcs_address_socket_family(TcsSocket socket_ctx, TcsAddressFamily* out_ #include "dbg_wrap.h" #endif -#define WIN32_LEAN_AND_MEAN // Header only should not need other files #ifndef TINYDATASTRUCTURES_H_ #include "tinydatastructures.h" #endif // before windows.h +#define WIN32_LEAN_AND_MEAN +#define NOMINMAX #include // sockets #include @@ -4367,10 +4380,6 @@ typedef struct #pragma comment(lib, "Iphlpapi.lib") #endif -#ifdef __cplusplus -using std::min; -#endif - #ifndef ULIST_SOC #define ULIST_SOC TDS_ULIST_IMPL(SOCKET, soc) @@ -5819,8 +5828,8 @@ TcsResult tcs_interface_list(struct TcsInterface interfaces[], size_t capacity, if (!is_up) continue; - memset(interfaces[i].name, '\0', 32); - TcsResult name_sts = adapter_get_friendly_name(iter, interfaces[i].name, 31); + memset(interfaces[i].name, '\0', TCS_INTERFACE_NAME_SIZE); + TcsResult name_sts = adapter_get_friendly_name(iter, interfaces[i].name, TCS_INTERFACE_NAME_SIZE - 1); if (name_sts != TCS_SUCCESS) { free(adapters); @@ -6029,8 +6038,9 @@ TcsResult tcs_address_list(unsigned int interface_id_filter, if (interface_addresses != NULL && populated < capacity) { - memset(interface_addresses[populated].iface.name, '\0', 32); - TcsResult name_sts = adapter_get_friendly_name(iter, interface_addresses[populated].iface.name, 31); + memset(interface_addresses[populated].iface.name, '\0', TCS_INTERFACE_NAME_SIZE); + TcsResult name_sts = adapter_get_friendly_name( + iter, interface_addresses[populated].iface.name, TCS_INTERFACE_NAME_SIZE - 1); if (name_sts != TCS_SUCCESS) { free(adapters); @@ -6635,9 +6645,9 @@ TcsResult tcs_raw_str(TcsSocket* socket_ctx, const char* interface_name, uint16_ if (interface_name == NULL) return TCS_ERROR_INVALID_ARGUMENT; - struct TcsInterface interfaces[32]; + struct TcsInterface interfaces[16]; // TODO: use heap if more size_t count = 0; - TcsResult res = tcs_interface_list(interfaces, 32, &count); + TcsResult res = tcs_interface_list(interfaces, 16, &count); if (res != TCS_SUCCESS) return res; @@ -6686,9 +6696,9 @@ TcsResult tcs_packet_str(TcsSocket* socket_ctx, const char* interface_name, uint if (interface_name == NULL) return TCS_ERROR_INVALID_ARGUMENT; - struct TcsInterface interfaces[32]; + struct TcsInterface interfaces[16]; size_t count = 0; - TcsResult res = tcs_interface_list(interfaces, 32, &count); + TcsResult res = tcs_interface_list(interfaces, 16, &count); if (res != TCS_SUCCESS) return res; diff --git a/src/tinycsocket_common.c b/src/tinycsocket_common.c index 1ec931c..231be87 100644 --- a/src/tinycsocket_common.c +++ b/src/tinycsocket_common.c @@ -518,9 +518,9 @@ TcsResult tcs_raw_str(TcsSocket* socket_ctx, const char* interface_name, uint16_ if (interface_name == NULL) return TCS_ERROR_INVALID_ARGUMENT; - struct TcsInterface interfaces[32]; + struct TcsInterface interfaces[16]; // TODO: use heap if more size_t count = 0; - TcsResult res = tcs_interface_list(interfaces, 32, &count); + TcsResult res = tcs_interface_list(interfaces, 16, &count); if (res != TCS_SUCCESS) return res; @@ -569,9 +569,9 @@ TcsResult tcs_packet_str(TcsSocket* socket_ctx, const char* interface_name, uint if (interface_name == NULL) return TCS_ERROR_INVALID_ARGUMENT; - struct TcsInterface interfaces[32]; + struct TcsInterface interfaces[16]; size_t count = 0; - TcsResult res = tcs_interface_list(interfaces, 32, &count); + TcsResult res = tcs_interface_list(interfaces, 16, &count); if (res != TCS_SUCCESS) return res; diff --git a/src/tinycsocket_internal.h b/src/tinycsocket_internal.h index b1e1ee9..a2c5b27 100644 --- a/src/tinycsocket_internal.h +++ b/src/tinycsocket_internal.h @@ -23,7 +23,7 @@ #ifndef TINYCSOCKET_INTERNAL_H_ #define TINYCSOCKET_INTERNAL_H_ -static const char* const TCS_VERSION_TXT = "v0.3.58"; +static const char* const TCS_VERSION_TXT = "v0.3.59"; static const char* const TCS_LICENSE_TXT = "Copyright 2018 Markus Lindelöw\n" "\n" @@ -271,13 +271,17 @@ struct TcsAddress } data; }; +#ifndef TCS_INTERFACE_NAME_SIZE +#define TCS_INTERFACE_NAME_SIZE 64 +#endif + /** * @brief Network Interface Information */ struct TcsInterface { TcsInterfaceId id; - char name[32]; + char name[TCS_INTERFACE_NAME_SIZE]; }; struct TcsInterfaceAddress diff --git a/src/tinycsocket_posix.c b/src/tinycsocket_posix.c index 869a9f2..aee17cd 100644 --- a/src/tinycsocket_posix.c +++ b/src/tinycsocket_posix.c @@ -66,7 +66,7 @@ #include // Flags for ifaddrs #include // pretty much everything #include // POSIX.1 compatibility -#include // UIO_MAXIOV +#include // struct iovec #include // close() #if TCS_HAS_GETIFADDRS @@ -139,12 +139,20 @@ const int TCS_SO_BROADCAST = SO_BROADCAST; const int TCS_SO_KEEPALIVE = SO_KEEPALIVE; const int TCS_SO_LINGER = SO_LINGER; const int TCS_SO_REUSEADDR = SO_REUSEADDR; +#ifdef SO_REUSEPORT const int TCS_SO_REUSEPORT = SO_REUSEPORT; +#else +const int TCS_SO_REUSEPORT = -1; +#endif const int TCS_SO_RCVBUF = SO_RCVBUF; const int TCS_SO_RCVTIMEO = SO_RCVTIMEO; const int TCS_SO_SNDBUF = SO_SNDBUF; const int TCS_SO_OOBINLINE = SO_OOBINLINE; +#ifdef SO_PRIORITY const int TCS_SO_PRIORITY = SO_PRIORITY; +#else +const int TCS_SO_PRIORITY = -1; +#endif // IP options const int TCS_SO_IP_NODELAY = TCP_NODELAY; @@ -642,7 +650,7 @@ TcsResult tcs_sendv(TcsSocket socket_ctx, if (flags & TCS_MSG_SENDALL) return TCS_ERROR_NOT_IMPLEMENTED; - if (buffer_count > UIO_MAXIOV) + if (buffer_count > IOV_MAX) return TCS_ERROR_INVALID_ARGUMENT; struct iovec stack_iovec[TCS_SENDV_STACK_MAX]; @@ -677,7 +685,7 @@ TcsResult tcs_sendv(TcsSocket socket_ctx, msg.msg_namelen = 0; msg.msg_iov = my_iovec; // msg_iovlen type varies across platforms (int on POSIX, size_t on glibc). - // buffer_count is already validated against UIO_MAXIOV above. + // buffer_count is already validated against IOV_MAX above. #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #pragma GCC diagnostic ignored "-Wsign-conversion" @@ -1377,8 +1385,8 @@ TcsResult tcs_interface_list(struct TcsInterface* found_interfaces, { for (size_t i = 0; i < interfaces_length && interfaces[i].if_index != 0; ++i) { - strncpy(found_interfaces[i].name, interfaces[i].if_name, 31); - found_interfaces[i].name[31] = '\0'; + strncpy(found_interfaces[i].name, interfaces[i].if_name, TCS_INTERFACE_NAME_SIZE - 1); + found_interfaces[i].name[TCS_INTERFACE_NAME_SIZE - 1] = '\0'; found_interfaces[i].id = interfaces[i].if_index; if (interfaces_populated != NULL) *interfaces_populated += 1; @@ -1563,8 +1571,8 @@ TcsResult tcs_address_list(unsigned int interface_id_filter, return errno2retcode(errno); } - strncpy(interface_addresses[populated].iface.name, iter->ifa_name, 31); - interface_addresses[populated].iface.name[31] = '\0'; + strncpy(interface_addresses[populated].iface.name, iter->ifa_name, TCS_INTERFACE_NAME_SIZE - 1); + interface_addresses[populated].iface.name[TCS_INTERFACE_NAME_SIZE - 1] = '\0'; interface_addresses[populated].iface.id = interface_id; interface_addresses[populated].address = address; populated++; diff --git a/src/tinycsocket_win32.c b/src/tinycsocket_win32.c index 0779221..2ba58c3 100644 --- a/src/tinycsocket_win32.c +++ b/src/tinycsocket_win32.c @@ -28,12 +28,13 @@ #include "dbg_wrap.h" #endif -#define WIN32_LEAN_AND_MEAN // Header only should not need other files #ifndef TINYDATASTRUCTURES_H_ #include "tinydatastructures.h" #endif // before windows.h +#define WIN32_LEAN_AND_MEAN +#define NOMINMAX #include // sockets #include @@ -65,10 +66,6 @@ typedef struct #pragma comment(lib, "Iphlpapi.lib") #endif -#ifdef __cplusplus -using std::min; -#endif - #ifndef ULIST_SOC #define ULIST_SOC TDS_ULIST_IMPL(SOCKET, soc) @@ -1517,8 +1514,8 @@ TcsResult tcs_interface_list(struct TcsInterface interfaces[], size_t capacity, if (!is_up) continue; - memset(interfaces[i].name, '\0', 32); - TcsResult name_sts = adapter_get_friendly_name(iter, interfaces[i].name, 31); + memset(interfaces[i].name, '\0', TCS_INTERFACE_NAME_SIZE); + TcsResult name_sts = adapter_get_friendly_name(iter, interfaces[i].name, TCS_INTERFACE_NAME_SIZE - 1); if (name_sts != TCS_SUCCESS) { free(adapters); @@ -1727,8 +1724,9 @@ TcsResult tcs_address_list(unsigned int interface_id_filter, if (interface_addresses != NULL && populated < capacity) { - memset(interface_addresses[populated].iface.name, '\0', 32); - TcsResult name_sts = adapter_get_friendly_name(iter, interface_addresses[populated].iface.name, 31); + memset(interface_addresses[populated].iface.name, '\0', TCS_INTERFACE_NAME_SIZE); + TcsResult name_sts = adapter_get_friendly_name( + iter, interface_addresses[populated].iface.name, TCS_INTERFACE_NAME_SIZE - 1); if (name_sts != TCS_SUCCESS) { free(adapters); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 750d25a..4786d4d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -4,6 +4,17 @@ include(CTest) add_executable(tests "tests.cpp" "mock.cpp" "mock.h") target_compile_options(tests PUBLIC "-DDO_WRAP") target_link_libraries(tests PRIVATE tinycsocket_wrapped) +# doctest's signal handling needs POSIX feature test macros to expose +# sigaltstack/sigaction/SA_ONSTACK/SIGSTKSZ on Cygwin and glibc with -std=c++11. +# Set them only on test targets to avoid leaking into header-only consumers. +if(NOT MSVC) + target_compile_definitions(tests PRIVATE + _XOPEN_SOURCE=600 + _POSIX_C_SOURCE=200112L + _DEFAULT_SOURCE + _ISOC99_SOURCE + ) +endif() set_target_properties(tests PROPERTIES FOLDER tinycsocket/tests) add_definitions(-DDOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING) if(MINGW) @@ -68,7 +79,6 @@ if(NOT CMAKE_SYSTEM_NAME STREQUAL "Android" AND NOT MSVC) find_package(Threads REQUIRED) target_link_libraries(tests_header_only PRIVATE Threads::Threads) endif() -target_compile_options(tests_header_only PUBLIC "-DDO_WRAP") target_link_libraries(tests_header_only PRIVATE tinycsocket_header) target_include_directories( tests_header_only diff --git a/tests/tests.cpp b/tests/tests.cpp index 92e98fb..6e8ea91 100644 --- a/tests/tests.cpp +++ b/tests/tests.cpp @@ -20,6 +20,9 @@ * SOFTWARE. */ +#include "tinycsocket.h" +#include "tinydatastructures.h" + #define DOCTEST_CONFIG_IMPLEMENT #ifndef _MSC_VER #pragma GCC diagnostic push @@ -35,9 +38,6 @@ #endif #include "mock.h" -#include "tinycsocket.h" -#include "tinydatastructures.h" - #include #include @@ -47,6 +47,15 @@ #define CHECK_POSIX WARN #endif +// We need to be able to run the tests without wrap due to header_only clashes +#ifdef DO_WRAP +#define TCS_MEM_DIFF() (MOCK_ALLOC_COUNTER - MOCK_FREE_COUNTER) +#define CHECK_NO_LEAK(pre) CHECK(TCS_MEM_DIFF() == (pre)) +#else +#define TCS_MEM_DIFF() 0 +#define CHECK_NO_LEAK(pre) ((void)0) +#endif + int main(int argc, char** argv) { #ifdef _MSC_VER @@ -65,6 +74,7 @@ int main(int argc, char** argv) return res; // the result from doctest is propagated here as well } +#ifdef DO_WRAP TEST_CASE("Check mock") { int pre_alloc = MOCK_ALLOC_COUNTER; @@ -74,6 +84,7 @@ TEST_CASE("Check mock") CHECK(MOCK_ALLOC_COUNTER > pre_alloc); CHECK(MOCK_FREE_COUNTER > pre_free); } +#endif TEST_CASE("Example from README") { @@ -98,15 +109,14 @@ TEST_CASE("Example from README") TEST_CASE("Init Test") { // Given - int pre_mem_diff = MOCK_ALLOC_COUNTER - MOCK_FREE_COUNTER; + int pre_mem_diff = TCS_MEM_DIFF(); // When CHECK(tcs_lib_init() == TCS_SUCCESS); CHECK(tcs_lib_free() == TCS_SUCCESS); - int post_mem_diff = MOCK_ALLOC_COUNTER - MOCK_FREE_COUNTER; // Then - CHECK(post_mem_diff == pre_mem_diff); + CHECK_NO_LEAK(pre_mem_diff); } TEST_CASE("Create socket") @@ -116,16 +126,15 @@ TEST_CASE("Create socket") // Given TcsSocket socket = TCS_SOCKET_INVALID; - int pre_mem_diff = MOCK_ALLOC_COUNTER - MOCK_FREE_COUNTER; + int pre_mem_diff = TCS_MEM_DIFF(); // When TcsResult sts = tcs_socket_preset(&socket, TCS_PRESET_UDP_IP4); - int post_mem_diff = MOCK_ALLOC_COUNTER - MOCK_FREE_COUNTER; // Then CHECK(sts == TCS_SUCCESS); CHECK(socket != TCS_SOCKET_INVALID); - CHECK(post_mem_diff == pre_mem_diff); + CHECK_NO_LEAK(pre_mem_diff); // Clean up CHECK(tcs_close(&socket) == TCS_SUCCESS); @@ -588,16 +597,15 @@ TEST_CASE("tcs_pool simple memory check") REQUIRE(tcs_lib_init() == TCS_SUCCESS); // Given - int pre_mem_diff = MOCK_ALLOC_COUNTER - MOCK_FREE_COUNTER; + int pre_mem_diff = TCS_MEM_DIFF(); // When struct TcsPool* pool = NULL; CHECK(tcs_pool_create(&pool) == TCS_SUCCESS); CHECK(tcs_pool_destroy(&pool) == TCS_SUCCESS); - int post_mem_diff = MOCK_ALLOC_COUNTER - MOCK_FREE_COUNTER; // Then - CHECK(pre_mem_diff == post_mem_diff); + CHECK_NO_LEAK(pre_mem_diff); // Clean up REQUIRE(tcs_lib_free() == TCS_SUCCESS); @@ -609,7 +617,7 @@ TEST_CASE("tcs_pool_poll simple write") REQUIRE(tcs_lib_init() == TCS_SUCCESS); // Given - int pre_mem_diff = MOCK_ALLOC_COUNTER - MOCK_FREE_COUNTER; + int pre_mem_diff = TCS_MEM_DIFF(); TcsSocket socket = TCS_SOCKET_INVALID; CHECK(tcs_socket_preset(&socket, TCS_PRESET_UDP_IP4) == TCS_SUCCESS); @@ -630,7 +638,6 @@ TEST_CASE("tcs_pool_poll simple write") TcsPollEvent ev = TCS_POOL_EVENT_EMPTY; CHECK(tcs_pool_poll(pool, &ev, 1, &populated, 5000) == TCS_SUCCESS); CHECK(tcs_pool_destroy(&pool) == TCS_SUCCESS); - int post_mem_diff = MOCK_ALLOC_COUNTER - MOCK_FREE_COUNTER; // Then CHECK(populated == 1); @@ -639,7 +646,7 @@ TEST_CASE("tcs_pool_poll simple write") CHECK(ev.error == TCS_SUCCESS); CHECK(ev.user_data == &user_data); CHECK(*(int*)(ev.user_data) == user_data); - CHECK(pre_mem_diff == post_mem_diff); + CHECK_NO_LEAK(pre_mem_diff); // Clean up CHECK(tcs_close(&socket) == TCS_SUCCESS); @@ -655,7 +662,7 @@ TEST_CASE("tcs_pool_poll simple read") TcsSocket socket = TCS_SOCKET_INVALID; CHECK(tcs_socket_preset(&socket, TCS_PRESET_UDP_IP4) == TCS_SUCCESS); - int allocation_diff_before = MOCK_ALLOC_COUNTER - MOCK_FREE_COUNTER; + int allocation_diff_before = TCS_MEM_DIFF(); struct TcsAddress local_address = TCS_ADDRESS_NONE; local_address.family = TCS_AF_IP4; local_address.data.ip4.address = TCS_ADDRESS_ANY_IP4; @@ -680,10 +687,9 @@ TEST_CASE("tcs_pool_poll simple read") CHECK(tcs_send_to(socket, (const uint8_t*)"hej", 4, TCS_FLAG_NONE, &receiver, NULL) == TCS_SUCCESS); CHECK(tcs_pool_poll(pool, &ev, 1, &populated, 10) == TCS_SUCCESS); CHECK(tcs_pool_destroy(&pool) == TCS_SUCCESS); - int allocation_diff_after = MOCK_ALLOC_COUNTER - MOCK_FREE_COUNTER; // Then - CHECK(allocation_diff_before == allocation_diff_after); + CHECK_NO_LEAK(allocation_diff_before); CHECK(populated == 1); CHECK(ev.can_read == true); CHECK(ev.can_write == false); @@ -828,7 +834,7 @@ TEST_CASE("Get loopback address") size_t ifaddrs_count = 0; struct TcsInterfaceAddress ifaddrs[8]; bool found_loopback = false; - int pre_mem_diff = MOCK_ALLOC_COUNTER - MOCK_FREE_COUNTER; + int pre_mem_diff = TCS_MEM_DIFF(); // When WARN(tcs_address_list(0, TCS_AF_ANY, ifaddrs, 8, &ifaddrs_count) == TCS_SUCCESS); @@ -844,12 +850,10 @@ TEST_CASE("Get loopback address") } } - int post_mem_diff = MOCK_ALLOC_COUNTER - MOCK_FREE_COUNTER; - // Then WARN(ifaddrs_count > 0); WARN(found_loopback); - CHECK(post_mem_diff == pre_mem_diff); + CHECK_NO_LEAK(pre_mem_diff); // Clean up REQUIRE(tcs_lib_free() == TCS_SUCCESS); // We are in C++, we should use defer @@ -1315,20 +1319,22 @@ TEST_CASE("Multicast Add-Drop-Add Membership") REQUIRE(tcs_lib_free() == TCS_SUCCESS); } +#if defined(__linux__) TEST_CASE("Simple AVTP talker") { // Setup REQUIRE(tcs_lib_init() == TCS_SUCCESS); TcsSocket socket = TCS_SOCKET_INVALID; - CHECK_POSIX(tcs_socket_preset(&socket, TCS_PRESET_RAW) == TCS_SUCCESS); + CHECK(tcs_socket_preset(&socket, TCS_PRESET_RAW) == TCS_SUCCESS); TcsAddress address = TCS_ADDRESS_NONE; tcs_address_parse("", &address); - CHECK_POSIX(tcs_close(&socket) == TCS_SUCCESS); + CHECK(tcs_close(&socket) == TCS_SUCCESS); REQUIRE(tcs_lib_free() == TCS_SUCCESS); } +#endif // ************* TINY DATA STRUCTURE (TDS) UNIT TESTS ************* @@ -1547,6 +1553,7 @@ TEST_CASE("TdsMap_int_double add and remove") CHECK(tds_map_mymap_destroy(&map) == 0); } +#if defined(__linux__) const uint8_t AVTP_DEST_ADDR[6] = {0x91, 0xe0, 0xf0, 0x00, 0xfe, 0x00}; TEST_CASE("Create packet socket") @@ -1558,11 +1565,11 @@ TEST_CASE("Create packet socket") TcsSocket socket = TCS_SOCKET_INVALID; // When - CHECK_POSIX(tcs_socket_preset(&socket, TCS_PRESET_RAW) == TCS_SUCCESS); + CHECK(tcs_socket_preset(&socket, TCS_PRESET_RAW) == TCS_SUCCESS); // Then - CHECK_POSIX(socket != TCS_SOCKET_INVALID); - CHECK_POSIX(tcs_close(&socket) == TCS_SUCCESS); + CHECK(socket != TCS_SOCKET_INVALID); + CHECK(tcs_close(&socket) == TCS_SUCCESS); // Clean up REQUIRE(tcs_lib_free() == TCS_SUCCESS); @@ -1577,11 +1584,11 @@ TEST_CASE("Create AVTP socket") TcsSocket socket = TCS_SOCKET_INVALID; // When - CHECK_POSIX(tcs_socket(&socket, TCS_AF_PACKET, TCS_SOCK_DGRAM, 0x22F0) == TCS_SUCCESS); + CHECK(tcs_socket(&socket, TCS_AF_PACKET, TCS_SOCK_DGRAM, 0x22F0) == TCS_SUCCESS); // Then - CHECK_POSIX(socket != TCS_SOCKET_INVALID); - CHECK_POSIX(tcs_close(&socket) == TCS_SUCCESS); + CHECK(socket != TCS_SOCKET_INVALID); + CHECK(tcs_close(&socket) == TCS_SUCCESS); // Clean up REQUIRE(tcs_lib_free() == TCS_SUCCESS); @@ -1596,13 +1603,13 @@ TEST_CASE("AVTP Create talker socket sendto") TcsSocket socket = TCS_SOCKET_INVALID; // When - CHECK_POSIX(tcs_socket(&socket, TCS_AF_PACKET, TCS_SOCK_DGRAM, 0x22F0) == TCS_SUCCESS); + CHECK(tcs_socket(&socket, TCS_AF_PACKET, TCS_SOCK_DGRAM, 0x22F0) == TCS_SUCCESS); - CHECK_POSIX(tcs_opt_priority_set(socket, 6) == TCS_SUCCESS); // Set priority to 6 (VLAN priority 6) + CHECK(tcs_opt_priority_set(socket, 6) == TCS_SUCCESS); // Set priority to 6 (VLAN priority 6) struct TcsInterfaceAddress addrs[8]; size_t addresses_found = 0; - CHECK_POSIX(tcs_address_list(0, TCS_AF_PACKET, addrs, 8, &addresses_found) == TCS_SUCCESS); - CHECK_POSIX(addresses_found > 0); + CHECK(tcs_address_list(0, TCS_AF_PACKET, addrs, 8, &addresses_found) == TCS_SUCCESS); + CHECK(addresses_found > 0); TcsAddress address = TCS_ADDRESS_NONE; address.family = TCS_AF_PACKET; @@ -1612,9 +1619,9 @@ TEST_CASE("AVTP Create talker socket sendto") uint8_t msg[] = "hello world\n"; size_t bytes_sent = 0; - CHECK_POSIX(tcs_send_to(socket, msg, sizeof(msg), TCS_FLAG_NONE, &address, &bytes_sent) == TCS_SUCCESS); - CHECK_POSIX(bytes_sent == sizeof(msg)); - CHECK_POSIX(tcs_close(&socket) == TCS_SUCCESS); + CHECK(tcs_send_to(socket, msg, sizeof(msg), TCS_FLAG_NONE, &address, &bytes_sent) == TCS_SUCCESS); + CHECK(bytes_sent == sizeof(msg)); + CHECK(tcs_close(&socket) == TCS_SUCCESS); // Then @@ -1631,13 +1638,13 @@ TEST_CASE("TSN Create talker socket bind") TcsSocket socket = TCS_SOCKET_INVALID; // When - CHECK_POSIX(tcs_socket_preset(&socket, TCS_PRESET_RAW) == TCS_SUCCESS); + CHECK(tcs_socket_preset(&socket, TCS_PRESET_RAW) == TCS_SUCCESS); - CHECK_POSIX(tcs_opt_priority_set(socket, 6) == TCS_SUCCESS); // Set priority to 6 (VLAN priority 6) + CHECK(tcs_opt_priority_set(socket, 6) == TCS_SUCCESS); // Set priority to 6 (VLAN priority 6) struct TcsInterfaceAddress addr[8]; size_t addresses_found = 0; - CHECK_POSIX(tcs_address_list(0, TCS_AF_PACKET, addr, 8, &addresses_found) == TCS_SUCCESS); - CHECK_POSIX(addresses_found > 0); + CHECK(tcs_address_list(0, TCS_AF_PACKET, addr, 8, &addresses_found) == TCS_SUCCESS); + CHECK(addresses_found > 0); TcsAddress address = TCS_ADDRESS_NONE; address.family = TCS_AF_PACKET; @@ -1645,7 +1652,7 @@ TEST_CASE("TSN Create talker socket bind") address.data.packet.protocol = 0x22F0; // Ethertype for AVTP memcpy(address.data.packet.mac, AVTP_DEST_ADDR, sizeof(AVTP_DEST_ADDR)); - CHECK_POSIX(tcs_bind(socket, &address) == TCS_SUCCESS); + CHECK(tcs_bind(socket, &address) == TCS_SUCCESS); // SOCK_RAW requires a complete Ethernet frame: [6 dst MAC][6 src MAC][2 EtherType][payload] uint8_t frame[64] = {0}; @@ -1656,9 +1663,9 @@ TEST_CASE("TSN Create talker socket bind") memcpy(&frame[14], "hello world\n", 12); // Payload size_t bytes_sent = 0; - CHECK_POSIX(tcs_send_to(socket, frame, sizeof(frame), TCS_FLAG_NONE, &address, &bytes_sent) == TCS_SUCCESS); - CHECK_POSIX(bytes_sent == sizeof(frame)); - CHECK_POSIX(tcs_close(&socket) == TCS_SUCCESS); + CHECK(tcs_send_to(socket, frame, sizeof(frame), TCS_FLAG_NONE, &address, &bytes_sent) == TCS_SUCCESS); + CHECK(bytes_sent == sizeof(frame)); + CHECK(tcs_close(&socket) == TCS_SUCCESS); // Then @@ -1675,12 +1682,12 @@ TEST_CASE("TSN Create listener") TcsSocket socket = TCS_SOCKET_INVALID; // When - CHECK_POSIX(tcs_socket_preset(&socket, TCS_PRESET_RAW) == TCS_SUCCESS); + CHECK(tcs_socket_preset(&socket, TCS_PRESET_RAW) == TCS_SUCCESS); struct TcsInterfaceAddress addr[8]; size_t addresses_found = 0; - CHECK_POSIX(tcs_address_list(0, TCS_AF_PACKET, addr, 8, &addresses_found) == TCS_SUCCESS); - CHECK_POSIX(addresses_found > 0); + CHECK(tcs_address_list(0, TCS_AF_PACKET, addr, 8, &addresses_found) == TCS_SUCCESS); + CHECK(addresses_found > 0); TcsAddress address = TCS_ADDRESS_NONE; address.family = TCS_AF_PACKET; @@ -1688,13 +1695,13 @@ TEST_CASE("TSN Create listener") memcpy(address.data.packet.mac, AVTP_DEST_ADDR, sizeof(AVTP_DEST_ADDR)); address.data.packet.protocol = 0x22F0; // Ethertype for TSN - CHECK_POSIX(tcs_bind(socket, &address) == TCS_SUCCESS); + CHECK(tcs_bind(socket, &address) == TCS_SUCCESS); - CHECK_POSIX(tcs_opt_membership_add(socket, &address) == TCS_SUCCESS); + CHECK(tcs_opt_membership_add(socket, &address) == TCS_SUCCESS); // Then // tcs_receive... - CHECK_POSIX(tcs_close(&socket) == TCS_SUCCESS); + CHECK(tcs_close(&socket) == TCS_SUCCESS); // Clean up REQUIRE(tcs_lib_free() == TCS_SUCCESS); @@ -1709,11 +1716,11 @@ TEST_CASE("Create DGRAM packet socket with preset") TcsSocket socket = TCS_SOCKET_INVALID; // When - CHECK_POSIX(tcs_socket_preset(&socket, TCS_PRESET_PACKET) == TCS_SUCCESS); + CHECK(tcs_socket_preset(&socket, TCS_PRESET_PACKET) == TCS_SUCCESS); // Then - CHECK_POSIX(socket != TCS_SOCKET_INVALID); - CHECK_POSIX(tcs_close(&socket) == TCS_SUCCESS); + CHECK(socket != TCS_SOCKET_INVALID); + CHECK(tcs_close(&socket) == TCS_SUCCESS); // Clean up REQUIRE(tcs_lib_free() == TCS_SUCCESS); @@ -1728,8 +1735,8 @@ TEST_CASE("tcs_packet bind") TcsSocket socket = TCS_SOCKET_INVALID; struct TcsInterfaceAddress addrs[8]; size_t addresses_found = 0; - CHECK_POSIX(tcs_address_list(0, TCS_AF_PACKET, addrs, 8, &addresses_found) == TCS_SUCCESS); - CHECK_POSIX(addresses_found > 0); + CHECK(tcs_address_list(0, TCS_AF_PACKET, addrs, 8, &addresses_found) == TCS_SUCCESS); + CHECK(addresses_found > 0); struct TcsAddress bind_address = TCS_ADDRESS_NONE; bind_address.family = TCS_AF_PACKET; @@ -1737,11 +1744,11 @@ TEST_CASE("tcs_packet bind") bind_address.data.packet.protocol = 0x22F0; // When - CHECK_POSIX(tcs_packet(&socket, &bind_address) == TCS_SUCCESS); + CHECK(tcs_packet(&socket, &bind_address) == TCS_SUCCESS); // Then - CHECK_POSIX(socket != TCS_SOCKET_INVALID); - CHECK_POSIX(tcs_close(&socket) == TCS_SUCCESS); + CHECK(socket != TCS_SOCKET_INVALID); + CHECK(tcs_close(&socket) == TCS_SUCCESS); // Clean up REQUIRE(tcs_lib_free() == TCS_SUCCESS); @@ -1756,15 +1763,15 @@ TEST_CASE("tcs_packet sendto") TcsSocket socket = TCS_SOCKET_INVALID; struct TcsInterfaceAddress addrs[8]; size_t addresses_found = 0; - CHECK_POSIX(tcs_address_list(0, TCS_AF_PACKET, addrs, 8, &addresses_found) == TCS_SUCCESS); - CHECK_POSIX(addresses_found > 0); + CHECK(tcs_address_list(0, TCS_AF_PACKET, addrs, 8, &addresses_found) == TCS_SUCCESS); + CHECK(addresses_found > 0); struct TcsAddress bind_address = TCS_ADDRESS_NONE; bind_address.family = TCS_AF_PACKET; bind_address.data.packet.interface_id = addrs[0].iface.id; bind_address.data.packet.protocol = 0x22F0; - CHECK_POSIX(tcs_packet(&socket, &bind_address) == TCS_SUCCESS); + CHECK(tcs_packet(&socket, &bind_address) == TCS_SUCCESS); // When - sendto with explicit destination struct TcsAddress dest_address = TCS_ADDRESS_NONE; @@ -1775,11 +1782,11 @@ TEST_CASE("tcs_packet sendto") uint8_t msg[] = "hello world\n"; size_t bytes_sent = 0; - CHECK_POSIX(tcs_send_to(socket, msg, sizeof(msg), TCS_FLAG_NONE, &dest_address, &bytes_sent) == TCS_SUCCESS); - CHECK_POSIX(bytes_sent == sizeof(msg)); + CHECK(tcs_send_to(socket, msg, sizeof(msg), TCS_FLAG_NONE, &dest_address, &bytes_sent) == TCS_SUCCESS); + CHECK(bytes_sent == sizeof(msg)); // Then - CHECK_POSIX(tcs_close(&socket) == TCS_SUCCESS); + CHECK(tcs_close(&socket) == TCS_SUCCESS); // Clean up REQUIRE(tcs_lib_free() == TCS_SUCCESS); @@ -1813,15 +1820,16 @@ TEST_CASE("tcs_packet_str bind") } // When - CHECK_POSIX(tcs_packet_str(&socket, iface_name, 0x22F0) == TCS_SUCCESS); + CHECK(tcs_packet_str(&socket, iface_name, 0x22F0) == TCS_SUCCESS); // Then - CHECK_POSIX(socket != TCS_SOCKET_INVALID); - CHECK_POSIX(tcs_close(&socket) == TCS_SUCCESS); + CHECK(socket != TCS_SOCKET_INVALID); + CHECK(tcs_close(&socket) == TCS_SUCCESS); // Clean up REQUIRE(tcs_lib_free() == TCS_SUCCESS); } +#endif TEST_CASE("tcs_packet invalid arguments") {