@@ -156,7 +156,10 @@ namespace cppcurl | |||
{ return _handle.get(); } | |||
void easy::reset() | |||
{ curl_easy_reset(_handle.get()); } | |||
{ | |||
_header.reset(); | |||
curl_easy_reset(_handle.get()); | |||
} | |||
void easy::perform() | |||
{ | |||
@@ -16,21 +16,26 @@ Set ( CPPCURL_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/.. | |||
Set ( CPPCURL_GENERATED_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated/include ) | |||
Configure_File ( ${CMAKE_CURRENT_SOURCE_DIR}/../cmake/config.h.in | |||
${CPPCURL_GENERATED_INCLUDE_DIR}/cppcurl/config.h ) | |||
Add_Library ( cppcurl INTERFACE ) | |||
Target_Include_Directories ( cppcurl | |||
Add_Library ( cppcurl-mock INTERFACE ) | |||
Get_Target_Property ( CURL_INCLUDE CURL::libcurl INTERFACE_INCLUDE_DIRECTORIES ) | |||
Target_Include_Directories ( cppcurl-mock | |||
INTERFACE | |||
${CURL_INCLUDE} | |||
$<BUILD_INTERFACE:${CPPCURL_INCLUDE_DIR}> | |||
$<BUILD_INTERFACE:${CPPCURL_GENERATED_INCLUDE_DIR}> | |||
$<INSTALL_INTERFACE:${CPPCURL_INSTALL_DIR_INCLUDE}> ) | |||
Target_Link_Libraries ( cppcurl | |||
INTERFACE | |||
CURL::libcurl ) | |||
If ( CPPCURL_HAS_CPPCORE ) | |||
Target_Link_Libraries ( cppcurl | |||
Target_Link_Libraries ( cppcurl-mock | |||
INTERFACE | |||
cppcore::cppcore ) | |||
EndIf ( ) | |||
Add_Library ( cppcurl INTERFACE ) | |||
Target_Link_Libraries ( cppcurl | |||
INTERFACE | |||
CURL::libcurl | |||
cppcurl-mock ) | |||
# Install ######################################################################################### | |||
Set ( CPPCURL_HAS_EXPORT False PARENT_SCOPE ) | |||
@@ -44,6 +49,9 @@ If ( CPPCURL_INSTALL_HEADER ) | |||
DESTINATION ${CPPCURL_INSTALL_DIR_INCLUDE} ) | |||
Install ( DIRECTORY ${CPPCURL_GENERATED_INCLUDE_DIR}/cppcurl | |||
DESTINATION ${CPPCURL_INSTALL_DIR_INCLUDE} ) | |||
Install ( TARGETS cppcurl-mock | |||
EXPORT cppcurl | |||
DESTINATION ${CPPCURL_INSTALL_DIR_INCLUDE} ) | |||
Install ( TARGETS cppcurl | |||
EXPORT cppcurl | |||
DESTINATION ${CPPCURL_INSTALL_DIR_INCLUDE} ) | |||
@@ -4,6 +4,22 @@ Include ( cotire OPTIONAL RESULT_VARIABLE HAS_COTIRE | |||
Include ( pedantic OPTIONAL RESULT_VARIABLE HAS_PEDANTIC ) | |||
Include ( cmake_tests OPTIONAL RESULT_VARIABLE HAS_CMAKE_TESTS ) | |||
# Test Helper ##################################################################################### | |||
File ( GLOB_RECURSE SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/helper/*.cpp ) | |||
Add_Library ( cppcurl-test-helper STATIC ${SOURCE_FILES} ) | |||
Target_Include_Directories ( cppcurl-test-helper | |||
PUBLIC | |||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/helper> | |||
$<INSTALL_INTERFACE:${CPPCURL_INSTALL_DIR_INCLUDE}> ) | |||
Target_Include_Directories ( cppcurl-test-helper | |||
SYSTEM PUBLIC | |||
${MICROHTTPD_INCLUDE_DIRS} ) | |||
Target_Link_Libraries ( cppcurl-test-helper | |||
PUBLIC | |||
cppcurl-mock | |||
GMock::GMock ) | |||
# Test ############################################################################################ | |||
Find_Package ( GTest ) | |||
@@ -17,7 +33,7 @@ File ( GLOB_RECURSE CPPCURL_TEST_INLINE_FILES | |||
${CMAKE_CURRENT_SOURCE_DIR}/*.inl ) | |||
File ( GLOB_RECURSE CPPCURL_TEST_SOURCE_FILES | |||
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} | |||
${CMAKE_CURRENT_SOURCE_DIR}/*.cpp ) | |||
${CMAKE_CURRENT_SOURCE_DIR}/cppcurl/*.cpp ) | |||
ForEach ( FILE IN LISTS CPPCURL_TEST_SOURCE_FILES ) | |||
# add test | |||
@@ -0,0 +1,242 @@ | |||
#include "libcurl_mock.h" | |||
#pragma GCC diagnostic ignored "-Wvarargs" | |||
libcurl_mock * libcurl_mock::instance = nullptr; | |||
extern "C" | |||
{ | |||
CURLcode curl_global_init ( long flags ) | |||
{ | |||
return libcurl_mock::instance | |||
? libcurl_mock::instance->curl_global_init(flags) | |||
: CURLE_OK; | |||
} | |||
void curl_global_cleanup ( void ) | |||
{ | |||
if (libcurl_mock::instance) | |||
libcurl_mock::instance->curl_global_cleanup(); | |||
} | |||
struct curl_slist * curl_slist_append ( struct curl_slist * list, | |||
const char * elem) | |||
{ | |||
return libcurl_mock::instance | |||
? libcurl_mock::instance->curl_slist_append(list, elem) | |||
: nullptr; | |||
} | |||
void curl_slist_free_all ( struct curl_slist * list ) | |||
{ | |||
if (libcurl_mock::instance) | |||
libcurl_mock::instance->curl_slist_free_all(list); | |||
} | |||
CURL * curl_easy_init(void) | |||
{ | |||
return libcurl_mock::instance | |||
? libcurl_mock::instance->curl_easy_init() | |||
: nullptr; | |||
} | |||
void curl_easy_cleanup(CURL * curl) | |||
{ | |||
if (libcurl_mock::instance) | |||
libcurl_mock::instance->curl_easy_cleanup(curl); | |||
} | |||
CURLcode curl_easy_setopt(CURL * curl, | |||
CURLoption option, | |||
...) | |||
{ | |||
if (!libcurl_mock::instance) | |||
return CURLE_OK; | |||
va_list args; | |||
va_start(args, option); | |||
if (option >= CURLOPTTYPE_OFF_T) | |||
return libcurl_mock::instance->curl_easy_setopt_off(curl, option, va_arg(args, curl_off_t)); | |||
else if (option >= CURLOPTTYPE_FUNCTIONPOINT) | |||
return libcurl_mock::instance->curl_easy_setopt_ptr(curl, option, va_arg(args, void *)); | |||
else if (option >= CURLOPTTYPE_STRINGPOINT) | |||
return libcurl_mock::instance->curl_easy_setopt_ptr(curl, option, va_arg(args, void *)); | |||
else if (option >= CURLOPTTYPE_OBJECTPOINT) | |||
return libcurl_mock::instance->curl_easy_setopt_ptr(curl, option, va_arg(args, void *)); | |||
else if (option >= CURLOPTTYPE_LONG) | |||
return libcurl_mock::instance->curl_easy_setopt_long(curl, option, va_arg(args, long)); | |||
return CURLE_OK; | |||
} | |||
CURLcode curl_easy_perform(CURL * curl) | |||
{ | |||
return libcurl_mock::instance | |||
? libcurl_mock::instance->curl_easy_perform(curl) | |||
: CURLE_OK; | |||
} | |||
CURLcode curl_easy_getinfo(CURL * curl, | |||
CURLINFO info, | |||
...) | |||
{ | |||
if (!libcurl_mock::instance) | |||
return CURLE_OK; | |||
va_list args; | |||
va_start(args, info); | |||
if (info >= CURLINFO_OFF_T) | |||
return libcurl_mock::instance->curl_easy_getinfo_off(curl, info, va_arg(args, curl_off_t *)); | |||
else if (info >= CURLINFO_SOCKET) | |||
return libcurl_mock::instance->curl_easy_getinfo_socket(curl, info, va_arg(args, curl_socket_t *)); | |||
else if (info >= CURLINFO_PTR) | |||
return libcurl_mock::instance->curl_easy_getinfo_ptr(curl, info, va_arg(args, void *)); | |||
else if (info >= CURLINFO_SLIST) | |||
return libcurl_mock::instance->curl_easy_getinfo_ptr(curl, info, va_arg(args, void *)); | |||
else if (info >= CURLINFO_DOUBLE) | |||
return libcurl_mock::instance->curl_easy_getinfo_double(curl, info, va_arg(args, double *)); | |||
else if (info >= CURLINFO_LONG) | |||
return libcurl_mock::instance->curl_easy_getinfo_long(curl, info, va_arg(args, long *)); | |||
else if (info >= CURLINFO_STRING) | |||
return libcurl_mock::instance->curl_easy_getinfo_str(curl, info, va_arg(args, char **)); | |||
return CURLE_OK; | |||
} | |||
CURL * curl_easy_duphandle(CURL *curl) | |||
{ | |||
return libcurl_mock::instance | |||
? libcurl_mock::instance->curl_easy_duphandle(curl) | |||
: nullptr; | |||
} | |||
void curl_easy_reset(CURL *curl) | |||
{ | |||
if (libcurl_mock::instance) | |||
libcurl_mock::instance->curl_easy_reset(curl); | |||
} | |||
CURLcode curl_easy_recv(CURL * curl, | |||
void * buffer, | |||
size_t buflen, | |||
size_t * n) | |||
{ | |||
return libcurl_mock::instance | |||
? libcurl_mock::instance->curl_easy_recv(curl, buffer, buflen, n) | |||
: CURLE_OK; | |||
} | |||
CURLcode curl_easy_send(CURL * curl, | |||
const void * buffer, | |||
size_t buflen, | |||
size_t * n) | |||
{ | |||
return libcurl_mock::instance | |||
? libcurl_mock::instance->curl_easy_send(curl, buffer, buflen, n) | |||
: CURLE_OK; | |||
} | |||
const char * curl_easy_strerror ( CURLcode code ) | |||
{ | |||
return libcurl_mock::instance | |||
? libcurl_mock::instance->curl_easy_strerror(code) | |||
: nullptr; | |||
} | |||
const char * curl_multi_strerror ( CURLMcode code ) | |||
{ | |||
return libcurl_mock::instance | |||
? libcurl_mock::instance->curl_multi_strerror(code) | |||
: nullptr; | |||
} | |||
CURLM * curl_multi_init ( void ) | |||
{ | |||
return libcurl_mock::instance | |||
? libcurl_mock::instance->curl_multi_init() | |||
: nullptr; | |||
} | |||
CURLMcode curl_multi_cleanup ( CURLM *multi_handle ) | |||
{ | |||
return libcurl_mock::instance | |||
? libcurl_mock::instance->curl_multi_cleanup(multi_handle) | |||
: CURLM_OK; | |||
} | |||
CURLMcode curl_multi_add_handle ( CURLM * multi_handle, | |||
CURL * curl_handle ) | |||
{ | |||
return libcurl_mock::instance | |||
? libcurl_mock::instance->curl_multi_add_handle(multi_handle, curl_handle) | |||
: CURLM_OK; | |||
} | |||
CURLMcode curl_multi_remove_handle ( CURLM * multi_handle, | |||
CURL * curl_handle ) | |||
{ | |||
return libcurl_mock::instance | |||
? libcurl_mock::instance->curl_multi_remove_handle(multi_handle, curl_handle) | |||
: CURLM_OK; | |||
} | |||
CURLMcode curl_multi_fdset ( CURLM * multi_handle, | |||
fd_set * read_fd_set, | |||
fd_set * write_fd_set, | |||
fd_set * exc_fd_set, | |||
int * max_fd) | |||
{ | |||
return libcurl_mock::instance | |||
? libcurl_mock::instance->curl_multi_fdset(multi_handle, read_fd_set, write_fd_set, exc_fd_set, max_fd) | |||
: CURLM_OK; | |||
} | |||
CURLMcode curl_multi_wait ( CURLM * multi_handle, | |||
struct curl_waitfd extra_fds[], | |||
unsigned int extra_nfds, | |||
int timeout_ms, | |||
int * ret) | |||
{ | |||
return libcurl_mock::instance | |||
? libcurl_mock::instance->curl_multi_wait(multi_handle, extra_fds, extra_nfds, timeout_ms, ret) | |||
: CURLM_OK; | |||
} | |||
CURLMcode curl_multi_perform ( CURLM * multi_handle, | |||
int * running_handles) | |||
{ | |||
return libcurl_mock::instance | |||
? libcurl_mock::instance->curl_multi_perform(multi_handle, running_handles) | |||
: CURLM_OK; | |||
} | |||
CURLMsg * curl_multi_info_read ( CURLM * multi_handle, | |||
int * msgs_in_queue ) | |||
{ | |||
return libcurl_mock::instance | |||
? libcurl_mock::instance->curl_multi_info_read(multi_handle, msgs_in_queue) | |||
: nullptr; | |||
} | |||
CURLMcode curl_multi_timeout ( CURLM * multi_handle, | |||
long * milliseconds ) | |||
{ | |||
return libcurl_mock::instance | |||
? libcurl_mock::instance->curl_multi_timeout(multi_handle, milliseconds) | |||
: CURLM_OK; | |||
} | |||
} |
@@ -0,0 +1,183 @@ | |||
#pragma once | |||
#include <curl/curl.h> | |||
#include <gmock/gmock.h> | |||
struct libcurl_mock | |||
{ | |||
public: | |||
MOCK_METHOD1( | |||
curl_global_init, | |||
CURLcode ( long flags )); | |||
MOCK_METHOD0( | |||
curl_global_cleanup, | |||
void ( void ) ); | |||
MOCK_METHOD2 ( | |||
curl_slist_append, | |||
struct curl_slist * ( struct curl_slist *, | |||
const char *)); | |||
MOCK_METHOD1(curl_slist_free_all, | |||
void ( struct curl_slist * list )); | |||
MOCK_METHOD0( | |||
curl_easy_init, | |||
CURL * ( void )); | |||
MOCK_METHOD1( | |||
curl_easy_cleanup, | |||
void ( CURL * curl )); | |||
MOCK_METHOD1( | |||
curl_easy_perform, | |||
CURLcode ( CURL * curl )); | |||
MOCK_METHOD3( | |||
curl_easy_setopt_off, | |||
CURLcode( CURL * curl, | |||
CURLoption option, | |||
curl_off_t value )); | |||
MOCK_METHOD3( | |||
curl_easy_setopt_ptr, | |||
CURLcode ( CURL * curl, | |||
CURLoption option, | |||
void * value )); | |||
MOCK_METHOD3( | |||
curl_easy_setopt_long, | |||
CURLcode ( CURL * curl, | |||
CURLoption option, | |||
long value )); | |||
MOCK_METHOD3( | |||
curl_easy_getinfo_off, | |||
CURLcode ( CURL * curl, | |||
CURLINFO info, | |||
curl_off_t * value)); | |||
MOCK_METHOD3( | |||
curl_easy_getinfo_socket, | |||
CURLcode ( CURL * curl, | |||
CURLINFO info, | |||
curl_socket_t * value)); | |||
MOCK_METHOD3( | |||
curl_easy_getinfo_ptr, | |||
CURLcode ( CURL * curl, | |||
CURLINFO info, | |||
void * value)); | |||
MOCK_METHOD3( | |||
curl_easy_getinfo_double, | |||
CURLcode ( CURL * curl, | |||
CURLINFO info, | |||
double * value)); | |||
MOCK_METHOD3( | |||
curl_easy_getinfo_long, | |||
CURLcode ( CURL * curl, | |||
CURLINFO info, | |||
long * value)); | |||
MOCK_METHOD3( | |||
curl_easy_getinfo_str, | |||
CURLcode ( CURL * curl, | |||
CURLINFO info, | |||
char ** value)); | |||
MOCK_METHOD1( | |||
curl_easy_duphandle, | |||
CURL * ( CURL *curl )); | |||
MOCK_METHOD1( | |||
curl_easy_reset, | |||
void ( CURL *curl )); | |||
MOCK_METHOD4( | |||
curl_easy_recv, | |||
CURLcode ( CURL * curl, | |||
void * buffer, | |||
size_t buflen, | |||
size_t * n)); | |||
MOCK_METHOD4( | |||
curl_easy_send, | |||
CURLcode ( CURL * curl, | |||
const void * buffer, | |||
size_t buflen, | |||
size_t * n)); | |||
MOCK_METHOD1( | |||
curl_easy_strerror, | |||
const char * ( CURLcode mode )); | |||
MOCK_METHOD1( | |||
curl_multi_strerror, | |||
const char * ( CURLMcode mode )); | |||
MOCK_METHOD0( | |||
curl_multi_init, | |||
CURLM * ( void )); | |||
MOCK_METHOD1( | |||
curl_multi_cleanup, | |||
CURLMcode ( CURLM *multi_handle )); | |||
MOCK_METHOD2( | |||
curl_multi_add_handle, | |||
CURLMcode ( CURLM * multi_handle, | |||
CURL * curl_handle )); | |||
MOCK_METHOD2( | |||
curl_multi_remove_handle, | |||
CURLMcode ( CURLM * multi_handle, | |||
CURL * curl_handle )); | |||
MOCK_METHOD5( | |||
curl_multi_fdset, | |||
CURLMcode ( CURLM * multi_handle, | |||
fd_set * read_fd_set, | |||
fd_set * write_fd_set, | |||
fd_set * exc_fd_set, | |||
int * max_fd)); | |||
MOCK_METHOD5( | |||
curl_multi_wait, | |||
CURLMcode ( CURLM * multi_handle, | |||
struct curl_waitfd extra_fds[], | |||
unsigned int extra_nfds, | |||
int timeout_ms, | |||
int * ret)); | |||
MOCK_METHOD2( | |||
curl_multi_perform, | |||
CURLMcode ( CURLM * multi_handle, | |||
int * running_handles)); | |||
MOCK_METHOD2( | |||
curl_multi_info_read, | |||
CURLMsg * ( CURLM *multi_handle, | |||
int *msgs_in_queue)); | |||
MOCK_METHOD2( | |||
curl_multi_timeout, | |||
CURLMcode ( CURLM * multi_handle, | |||
long * milliseconds )); | |||
public: | |||
inline libcurl_mock() | |||
{ | |||
instance = this; | |||
} | |||
inline ~libcurl_mock() | |||
{ | |||
if (instance == this) | |||
instance = nullptr; | |||
} | |||
public: | |||
static libcurl_mock * instance; | |||
}; |