From 301de3ac5c7cf8a5eaaf3c58157251db781841d6 Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Thu, 24 May 2018 14:59:39 -0700 Subject: fixes #486 Revisit SOVERSION and VERSION fixes #485 Honor BUILD_SHARED_LIBS fixes #483 Don't expose private symbols in shared library fixes #481 Export CMake target This is a "large" commit involving changes that don't affect the code directly, but which have an impact on how we package and build our project. The most significant of these changes is that we now build only either a shared or a static library, depending on the setting of the BUILD_SHARED_LIBS option. We also suppress private symbols from being exposed when the underlying toolchain lets us do so. Minor updates to the way we version the ABI are used, and we now have a nice exported CMake project. To import this project in another, simply do find_package(nng) and you can add target_link_libraries(nng::nng) to your targets. CMake does the rest for you. --- tests/CMakeLists.txt | 193 ++++++++++++++++++++++++++------------------------- tests/errors.c | 4 +- tests/httpclient.c | 7 +- tests/httpserver.c | 24 +++---- tests/sock.c | 5 +- tests/trantest.h | 6 +- 6 files changed, 120 insertions(+), 119 deletions(-) (limited to 'tests') diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e7d751ac..31b5fe29 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,10 +1,10 @@ # +# Copyright 2018 Staysail Systems, Inc. +# Copyright 2018 Capitar IT Group BV # Copyright (c) 2012 Martin Sustrik All rights reserved. # Copyright (c) 2013 GoPivotal, Inc. All rights reserved. # Copyright (c) 2015-2016 Jack R. Dunaway. All rights reserved. # Copyright 2016 Franklin "Snaipe" Mathieu -# Copyright 2018 Staysail Systems, Inc. -# Copyright 2018 Capitar IT Group BV # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), @@ -27,37 +27,31 @@ # Build unit tests. +# Note that tests which depend on internal (not public) APIs are not +# enabled unless a static library is built. This is because on some +# systems (e.g. Windows) we do not expose symbols that are not in the +# public API. (When CMake learns more about using mapfiles to suppress +# symbol visibility we will do this even more, to protect the namespace +# of the user.) + include_directories(AFTER SYSTEM ${PROJECT_SOURCE_DIR}/src) if (NNG_TESTS) - if (THREADS_HAVE_PTHREAD_ARG) - add_definitions (-pthread) - endif() - # convey tests -- verify the test framework works! add_executable(convey_test convey_test.c convey.c) - if (CMAKE_THREAD_LIBS_INIT) - target_link_libraries (convey_test "${CMAKE_THREAD_LIBS_INIT}") - endif() + target_link_libraries (convey_test Threads::Threads) add_test (NAME convey_test COMMAND convey_test -v -d -p ENV_TEST=ON -p ANOTHERNAME -p AGAIN=yes extra) - set_tests_properties( convey_test PROPERTIES TIMEOUT 2) - list (APPEND all_tests convey_test) - - set (TEST_PORT 12100) - macro (add_nng_test NAME TIMEOUT COND) - if (${COND}) - list (APPEND all_tests ${NAME}) - add_executable (${NAME} ${NAME}.c convey.c) - target_link_libraries (${NAME} ${PROJECT_NAME}_static) - target_link_libraries (${NAME} ${NNG_REQUIRED_LIBRARIES}) - target_compile_definitions(${NAME} PUBLIC -DNNG_STATIC_LIB) - - add_test (NAME ${NAME} COMMAND ${NAME} -v -p TEST_PORT=${TEST_PORT}) - set_tests_properties (${NAME} PROPERTIES TIMEOUT ${TIMEOUT}) - math (EXPR TEST_PORT "${TEST_PORT}+20") - endif() + set_tests_properties (convey_test PROPERTIES TIMEOUT 2) + + set (NNG_TEST_PORT 13000) + macro (add_nng_test NAME TIMEOUT) + add_executable (${NAME} ${NAME}.c convey.c) + target_link_libraries (${NAME} ${PROJECT_NAME} Threads::Threads) + add_test (NAME ${NAME} COMMAND ${NAME} -v -p TEST_PORT=${NNG_TEST_PORT}) + set_tests_properties (${NAME} PROPERTIES TIMEOUT ${TIMEOUT}) + math (EXPR NNG_TEST_PORT "${NNG_TEST_PORT}+20") endmacro (add_nng_test) # Compatibility tests are only added if all of the legacy protocols @@ -73,17 +67,14 @@ if (NNG_TESTS) NNG_PROTO_PULL0) macro (add_nng_compat_test NAME TIMEOUT) - list (APPEND all_tests ${NAME}) add_executable (${NAME} ${NAME}.c compat_testutil.c) - target_link_libraries (${NAME} ${PROJECT_NAME}_static) - target_link_libraries (${NAME} ${NNG_REQUIRED_LIBRARIES}) - target_compile_definitions(${NAME} PUBLIC -DNNG_STATIC_LIB) + target_link_libraries (${NAME} ${PROJECT_NAME}) target_include_directories(${NAME} PUBLIC ${PROJECT_SOURCE_DIR}/src/compat) - add_test (NAME ${NAME} COMMAND ${NAME} ${TEST_PORT}) + add_test (NAME ${NAME} COMMAND ${NAME} ${NNG_TEST_PORT}) set_tests_properties (${NAME} PROPERTIES TIMEOUT ${TIMEOUT}) - math (EXPR TEST_PORT "${TEST_PORT}+10") + math (EXPR NNG_TEST_PORT "${NNG_TEST_PORT}+20") endmacro (add_nng_compat_test) else () macro (add_nng_compat_test NAME TIMEOUT) @@ -94,87 +85,103 @@ if (NNG_TESTS) macro (add_nng_cpp_test NAME TIMEOUT) if (NOT NNG_ENABLE_COVERAGE) enable_language (CXX) - list (APPEND all_tests ${NAME}) add_executable (${NAME} ${NAME}.cc) - target_link_libraries (${NAME} ${PROJECT_NAME}_static) - target_link_libraries (${NAME} ${NNG_REQUIRED_LIBRARIES}) - target_compile_definitions(${NAME} PUBLIC -DNNG_STATIC_LIB) - + target_link_libraries (${NAME} ${PROJECT_NAME}) add_test (NAME ${NAME} COMMAND ${NAME} ${TEST_PORT}) set_tests_properties (${NAME} PROPERTIES TIMEOUT ${TIMEOUT}) - math (EXPR TEST_PORT "${TEST_PORT}+10") + math (EXPR TEST_PORT "${NNG_TEST_PORT}+20") endif() endmacro (add_nng_cpp_test) - macro (add_nng_proto_test NAME TIMEOUT P1 P2) - if (${P1} AND ${P2}) + macro (add_nng_test1 NAME TIMEOUT COND1) + if (${COND1}) + add_nng_test(${NAME} ${TIMEOUT}) + else() + message (STATUS "Test ${NAME} disabled (unconfigured)") + endif() + endmacro() + + macro (add_nng_test2 NAME TIMEOUT COND1 COND2) + if (${COND1} AND ${COND2}) + add_nng_test(${NAME} ${TIMEOUT}) + else() + message (STATUS "Test ${NAME} disabled (unconfigured)") + endif() + endmacro() + + macro (add_nng_test3 NAME TIMEOUT COND1 COND2 COND3) + if (${COND1} AND ${COND2} AND ${COND3}) add_nng_test(${NAME} ${TIMEOUT} ON) else() - message (STATUS "Protocol test ${NAME} disabled (unconfigured)") + message (STATUS "Test ${NAME} disabled (unconfigured)") endif() endmacro() else () - macro (add_nng_test NAME TIMEOUT COND) + macro (add_nng_test NAME TIMEOUT) endmacro (add_nng_test) macro (add_nng_compat_test NAME TIMEOUT) endmacro (add_nng_compat_test) macro (add_nng_cpp_test NAME TIMEOUT) endmacro (add_nng_cpp_test) - macro (add_nng_proto_test NAME TIMEOUT P1 P2) - endmacro() + macro (add_nng_test1 NAME TIMEOUT COND1) + endmacro(add_nng_test1) + macro (add_nng_test2 NAME TIMEOUT COND1 COND2) + endmacro(add_nng_test2) + macro (add_nng_test3 NAME TIMEOUT COND1 COND2 COND3) + endmacro(add_nng_test3) endif () -add_nng_test(aio 5 ON) -add_nng_test(bufsz 5 NNG_PROTO_PAIR0) -add_nng_test(base64 5 NNG_SUPP_BASE64) -add_nng_test(device 5 ON) -add_nng_test(errors 2 ON) -add_nng_test(files 5 ON) -add_nng_test(httpclient 60 NNG_SUPP_HTTP) -add_nng_test(httpserver 30 NNG_SUPP_HTTP) -add_nng_test(idhash 5 ON) -add_nng_test(inproc 5 NNG_TRANSPORT_INPROC) -add_nng_test(ipc 5 NNG_TRANSPORT_IPC) -add_nng_test(ipcperms 5 NNG_TRANSPORT_IPC) -add_nng_test(ipcwinsec 5 NNG_TRANSPORT_IPC) -add_nng_test(list 5 ON) -add_nng_test(message 5 ON) -add_nng_test(multistress 60 ON) -add_nng_test(nonblock 60 ON) -add_nng_test(options 5 ON) -add_nng_test(pipe 5 ON) -add_nng_test(platform 5 ON) -add_nng_test(pollfd 5 ON) -add_nng_test(reconnect 5 ON) -add_nng_test(resolv 10 ON) +add_nng_test(aio 5) +add_nng_test2(base64 5 NNG_STATIC_LIB NNG_SUPP_BASE64) +add_nng_test1(bufsz 5 NNG_PROTO_PAIR0) +add_nng_test(device 5) +add_nng_test(errors 2) +add_nng_test1(files 5 NNG_STATIC_LIB) +add_nng_test1(httpclient 60 NNG_SUPP_HTTP) +add_nng_test2(httpserver 30 NNG_STATIC_LIB NNG_SUPP_HTTP) +add_nng_test1(idhash 5 NNG_STATIC_LIB) +add_nng_test1(inproc 5 NNG_TRANSPORT_INPROC) +add_nng_test1(ipc 5 NNG_TRANSPORT_IPC) +add_nng_test1(ipcperms 5 NNG_TRANSPORT_IPC) +add_nng_test1(ipcwinsec 5 NNG_TRANSPORT_IPC) +add_nng_test1(list 5 NNG_STATIC_LIB) +add_nng_test(message 5) +add_nng_test(multistress 60) +add_nng_test(nonblock 60) +add_nng_test(options 5) +add_nng_test(pipe 5) +add_nng_test(platform 5) +add_nng_test(pollfd 5) +add_nng_test(reconnect 5) +add_nng_test1(resolv 10 NNG_STATIC_LIB) add_nng_test(scalability 20 ON) -add_nng_test(sha1 5 NNG_SUPP_SHA1) -add_nng_test(sock 5 ON) -add_nng_test(synch 5 ON) -add_nng_test(tls 60 NNG_TRANSPORT_TLS) -add_nng_test(tcp 180 NNG_TRANSPORT_TCP) -add_nng_test(tcp6 60 NNG_TRANSPORT_TCP) -add_nng_test(transport 5 ON) -add_nng_test(udp 5 ON) -add_nng_test(url 5 ON) -add_nng_test(ws 30 NNG_TRANSPORT_WS) -add_nng_test(wss 30 NNG_TRANSPORT_WSS) -add_nng_test(wssfile 30 NNG_TRANSPORT_WSS) -add_nng_test(zt 60 NNG_TRANSPORT_ZEROTIER) - -add_nng_proto_test(bus 5 NNG_PROTO_BUS0 NNG_PROTO_BUS0) -add_nng_test(pipeline 5 NNG_PROTO_PULL0 NNG_PROTO_PIPELINE0) -add_nng_proto_test(pair1 5 NNG_PROTO_PAIR1 NNG_PROTO_PAIR1) -add_nng_proto_test(pubsub 5 NNG_PROTO_PUB0 NNG_PROTO_SUB0) -add_nng_proto_test(reqctx 5 NNG_PROTO_REQ0 NNG_PROTO_REP0) -add_nng_proto_test(reqpoll 5 NNG_PROTO_REQ0 NNG_PROTO_REP0) -add_nng_proto_test(reqrep 5 NNG_PROTO_REQ0 NNG_PROTO_REP0) -add_nng_proto_test(reqstress 60 NNG_PROTO_REQ0 NNG_PROTO_REP0) -add_nng_proto_test(respondpoll 5 NNG_PROTO_SURVEYOR0 NNG_PROTO_RESPONDENT0) -add_nng_test(survey 5 NNG_PROTO_SURVEYOR0 NNG_PROTO_RESPONDENT0) -add_nng_proto_test(surveyctx 5 NNG_PROTO_SURVEYOR0 NNG_PROTO_RESPONDENT0) -add_nng_proto_test(surveypoll 5 NNG_PROTO_SURVEYOR0 NNG_PROTO_RESPONDENT0) +add_nng_test2(sha1 5 NNG_STATIC_LIB NNG_SUPP_SHA1) +add_nng_test(sock 5) +add_nng_test1(synch 5 NNG_STATIC_LIB) +add_nng_test2(tls 60 NNG_STATIC_LIB NNG_TRANSPORT_TLS) +add_nng_test1(tcp 180 NNG_TRANSPORT_TCP) +add_nng_test2(tcp6 60 NNG_STATIC_LIB NNG_TRANSPORT_TCP) +add_nng_test1(transport 5 NNG_STATIC_LIB) +add_nng_test1(udp 5 NNG_STATIC_LIB) +add_nng_test(url 5) +add_nng_test1(ws 30 NNG_TRANSPORT_WS) +add_nng_test1(wss 30 NNG_TRANSPORT_WSS) +add_nng_test2(wssfile 30 NNG_STATIC_LIB NNG_TRANSPORT_WSS) +add_nng_test1(zt 60 NNG_TRANSPORT_ZEROTIER) + +add_nng_test1(bus 5 NNG_PROTO_BUS0) +add_nng_test2(pipeline 5 NNG_PROTO_PULL0 NNG_PROTO_PUSH0) +add_nng_test1(pair1 5 NNG_PROTO_PAIR1) +add_nng_test2(pubsub 5 NNG_PROTO_PUB0 NNG_PROTO_SUB0) +add_nng_test2(reqctx 5 NNG_PROTO_REQ0 NNG_PROTO_REP0) +add_nng_test2(reqpoll 5 NNG_PROTO_REQ0 NNG_PROTO_REP0) +add_nng_test2(reqrep 5 NNG_PROTO_REQ0 NNG_PROTO_REP0) +add_nng_test2(reqstress 60 NNG_PROTO_REQ0 NNG_PROTO_REP0) +add_nng_test2(respondpoll 5 NNG_PROTO_SURVEYOR0 NNG_PROTO_RESPONDENT0) +add_nng_test2(survey 5 NNG_PROTO_SURVEYOR0 NNG_PROTO_RESPONDENT0) +add_nng_test2(surveyctx 5 NNG_PROTO_SURVEYOR0 NNG_PROTO_RESPONDENT0) +add_nng_test2(surveypoll 5 NNG_PROTO_SURVEYOR0 NNG_PROTO_RESPONDENT0) # compatbility tests # We only support these if ALL the legacy protocols are supported. This @@ -201,7 +208,7 @@ add_nng_compat_test(compat_ws 60) # These are special tests for compat mode, not inherited from the # legacy libnanomsg suite. -add_nng_test(compat_options 5 NNG_PROTO_REP0) +add_nng_test1(compat_options 5 NNG_PROTO_REP0) # c++ tests add_nng_cpp_test(cplusplus_pair 5) diff --git a/tests/errors.c b/tests/errors.c index f5e857e2..06747c24 100644 --- a/tests/errors.c +++ b/tests/errors.c @@ -8,12 +8,11 @@ // #include "convey.h" -#include "nng.c" +#include "nng.h" #include #include TestMain("Error messages work", { - Convey("Known errors work", { So(strcmp(nng_strerror(NNG_ECLOSED), "Object closed") == 0); So(strcmp(nng_strerror(NNG_ETIMEDOUT), "Timed out") == 0); @@ -28,6 +27,5 @@ TestMain("Error messages work", { strerror(ENOENT)) == 0); So(strcmp(nng_strerror(NNG_ESYSERR + EINVAL), strerror(EINVAL)) == 0); - }); }) diff --git a/tests/httpclient.c b/tests/httpclient.c index e167587e..96597d0c 100644 --- a/tests/httpclient.c +++ b/tests/httpclient.c @@ -18,6 +18,7 @@ // Basic HTTP client tests. #include "core/nng_impl.h" #include "supplemental/http/http.h" +#include "supplemental/sha1/sha1.c" #include "supplemental/sha1/sha1.h" #include "supplemental/tls/tls.h" @@ -26,8 +27,6 @@ const uint8_t example_sum[20] = { 0x0e, 0x97, 0x3b, 0x59, 0xf4, 0x76, 0x00, 0xc0 }; TestMain("HTTP Client", { - - nni_init(); atexit(nng_fini); Convey("Given a TCP connection to httpbin.org", { @@ -86,9 +85,9 @@ TestMain("HTTP Client", { sz = atoi(cstr); So(sz > 0); - data = nni_alloc(sz); + data = nng_alloc(sz); So(data != NULL); - Reset({ nni_free(data, sz); }); + Reset({ nng_free(data, sz); }); iov.iov_buf = data; iov.iov_len = sz; diff --git a/tests/httpserver.c b/tests/httpserver.c index fb8e300e..9898a0ff 100644 --- a/tests/httpserver.c +++ b/tests/httpserver.c @@ -73,7 +73,7 @@ httpdo(nng_url *url, nng_http_req *req, nng_http_res *res, void **datap, if (clen > 0) { nng_iov iov; - data = nni_alloc(clen); + data = nng_alloc(clen); iov.iov_buf = data; iov.iov_len = clen; nng_aio_set_iov(aio, 1, &iov); @@ -128,7 +128,7 @@ httpget(const char *addr, void **datap, size_t *sizep, uint16_t *statp, if (clen > 0) { if ((ptr = nng_http_res_get_header(res, "Content-Type")) != NULL) { - ctype = nni_strdup(ptr); + ctype = strdup(ptr); } } @@ -139,9 +139,9 @@ httpget(const char *addr, void **datap, size_t *sizep, uint16_t *statp, fail: if (rv != 0) { if (data != NULL) { - nni_free(data, clen); + nng_free(data, clen); } - nni_strfree(ctype); + free(ctype); } if (url != NULL) { nni_url_free(url); @@ -289,19 +289,19 @@ TestMain("HTTP Server", { Reset({ nng_http_server_release(s); - nni_strfree(tmpdir); + free(tmpdir); nni_file_delete(file1); nni_file_delete(file2); nni_file_delete(file3); nni_file_delete(subdir1); nni_file_delete(subdir2); nni_file_delete(workdir); - nni_strfree(workdir); - nni_strfree(file1); - nni_strfree(file2); - nni_strfree(file3); - nni_strfree(subdir1); - nni_strfree(subdir2); + free(workdir); + free(file1); + free(file2); + free(file3); + free(subdir1); + free(subdir2); nng_url_free(url); }); @@ -325,7 +325,7 @@ TestMain("HTTP Server", { So(size == strlen(doc1)); So(memcmp(data, doc1, size) == 0); So(strcmp(ctype, "text/html") == 0); - nni_strfree(ctype); + free(ctype); nng_free(data, size); }); diff --git a/tests/sock.c b/tests/sock.c index 37b713dd..29043cb3 100644 --- a/tests/sock.c +++ b/tests/sock.c @@ -25,7 +25,6 @@ #define SECONDS(x) ((x) *1000) TestMain("Socket Operations", { - atexit(nng_fini); // Reset({ nng_fini(); }); Reset({ nng_closeall(); }); @@ -98,7 +97,7 @@ TestMain("Socket Operations", { So(nng_getopt( s1, NNG_OPT_SOCKNAME, name, &sz) == 0); So(sz > 0 && sz < 64); - So(sz == nni_strnlen(name, 64) + 1); + So(sz == strlen(name) + 1); So(atoi(name) == (int) s1.id); So(nng_setopt( @@ -409,7 +408,6 @@ TestMain("Socket Operations", { l.id = ep.id; So(nng_listener_start(l, 0) == NNG_ENOTSUP); }); - }); Convey("Listener creation ok", { @@ -496,7 +494,6 @@ TestMain("Socket Operations", { NNG_ENOENT); So(nng_listener_getopt_ms(l, NNG_OPT_SENDTIMEO, &t) == NNG_ENOENT); - }); Convey("We can send and receive messages", { diff --git a/tests/trantest.h b/tests/trantest.h index de82099c..92d1db09 100644 --- a/tests/trantest.h +++ b/tests/trantest.h @@ -124,7 +124,7 @@ trantest_next_address(char *out, const char *template) // start at a different port each time -- 5000 - 10000 -- // unless a specific port is given. - trantest_port = nni_clock() % 5000 + 5000; + trantest_port = nng_clock() % 5000 + 5000; if (((pstr = ConveyGetEnv("TEST_PORT")) != NULL) && (atoi(pstr) != 0)) { trantest_port = atoi(pstr); @@ -146,7 +146,7 @@ trantest_init(trantest *tt, const char *addr) { trantest_next_address(tt->addr, addr); -#if defined(NNG_HAVE_REQ0) && defined(NNG_HAVE_REP0) +#if defined(NNG_HAVE_REQ0) && defined(NNG_HAVE_REP0) && defined(NNG_STATIC_LIB) So(nng_req_open(&tt->reqsock) == 0); So(nng_rep_open(&tt->repsock) == 0); @@ -426,7 +426,7 @@ trantest_send_recv_large(trantest *tt) So((data = nng_alloc(size)) != NULL); for (int i = 0; (size_t) i < size; i++) { - data[i] = nni_random() & 0xff; + data[i] = nng_random() & 0xff; } So(trantest_listen(tt, &l) == 0); -- cgit v1.2.3-70-g09d2