diff --git a/CMakeLists.txt b/CMakeLists.txt index a6f4a56..1ce9f12 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,7 @@ set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake_mo #User options option(USE_SSL "Use SSL" ON) option(BUILD_EXAMPLES "Build frnetlib examples" ON) +option(BUILD_TESTS "Build frnetlib tests" ON) set(FRNETLIB_BUILD_SHARED_LIBS false CACHE BOOL "Build shared library.") if(USE_SSL) @@ -66,6 +67,13 @@ if(USE_SSL) endif() endif() +#Build Tests if needbe +if(BUILD_TESTS) + set(EXT_PROJECTS_DIR ${PROJECT_SOURCE_DIR}/ext) + add_subdirectory(${EXT_PROJECTS_DIR}/gtest) + add_subdirectory(tests) +endif() + #Build examples if needbe if(BUILD_EXAMPLES) add_subdirectory(examples) @@ -81,4 +89,4 @@ install( install( DIRECTORY include DESTINATION . -) +) \ No newline at end of file diff --git a/ext/gtest/CMakeLists.txt b/ext/gtest/CMakeLists.txt new file mode 100644 index 0000000..709dbc6 --- /dev/null +++ b/ext/gtest/CMakeLists.txt @@ -0,0 +1,31 @@ +cmake_minimum_required(VERSION 2.8.8) +project(gtest_builder C CXX) +include(ExternalProject) + +set(GTEST_FORCE_SHARED_CRT ON) +set(GTEST_DISABLE_PTHREADS OFF) + +if(MINGW) + set(GTEST_DISABLE_PTHREADS ON) +endif() + +ExternalProject_Add(googletest + GIT_REPOSITORY https://github.com/google/googletest.git + CMAKE_ARGS -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG:PATH=DebugLibs + -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE:PATH=ReleaseLibs + -DCMAKE_CXX_FLAGS=${MSVC_COMPILER_DEFS} + -Dgtest_force_shared_crt=${GTEST_FORCE_SHARED_CRT} + -Dgtest_disable_pthreads=${GTEST_DISABLE_PTHREADS} + -DBUILD_GTEST=ON + PREFIX "${CMAKE_CURRENT_BINARY_DIR}" + # Disable install step + INSTALL_COMMAND "" + ) + +# Specify include dir +ExternalProject_Get_Property(googletest source_dir) +set(GTEST_INCLUDE_DIRS ${source_dir}/googletest/include PARENT_SCOPE) + +# Specify MainTest's link libraries +ExternalProject_Get_Property(googletest binary_dir) +set(GTEST_LIBS_DIR ${binary_dir}/googlemock/gtest PARENT_SCOPE) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..074bfff --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,28 @@ +enable_testing() +set(FRNETLIB_TEST ${FRNETLIB_TEST_STR}_test) +include_directories(${GTEST_INCLUDE_DIRS} ${COMMON_INCLUDES}) + +file(GLOB TEST_SRC_FILES ${PROJECT_SOURCE_DIR}/tests/*.cpp) +add_executable(${FRNETLIB_TEST} ${TEST_SRC_FILES}) +add_dependencies(${FRNETLIB_TEST} googletest) + + +if(NOT WIN32 OR MINGW) + target_link_libraries(${FRNETLIB_TEST} + ${GTEST_LIBS_DIR}/libgtest.a + ${GTEST_LIBS_DIR}/libgtest_main.a + ) +else() + target_link_libraries(${FRNETLIB_TEST} + debug ${GTEST_LIBS_DIR}/DebugLibs/${CMAKE_FIND_LIBRARY_PREFIXES}gtest${CMAKE_FIND_LIBRARY_SUFFIXES} + optimized ${GTEST_LIBS_DIR}/ReleaseLibs/${CMAKE_FIND_LIBRARY_PREFIXES}gtest${CMAKE_FIND_LIBRARY_SUFFIXES} + ) + target_link_libraries(${FRNETLIB_TEST} + debug ${GTEST_LIBS_DIR}/DebugLibs/${CMAKE_FIND_LIBRARY_PREFIXES}gtest_main${CMAKE_FIND_LIBRARY_SUFFIXES} + optimized ${GTEST_LIBS_DIR}/ReleaseLibs/${CMAKE_FIND_LIBRARY_PREFIXES}gtest_main${CMAKE_FIND_LIBRARY_SUFFIXES} + ) +endif() + +target_link_libraries(${FRNETLIB_TEST} ${CMAKE_THREAD_LIBS_INIT}) + +add_test(test1 ${FRNETLIB_TEST}) \ No newline at end of file diff --git a/tests/PacketableTest.cpp b/tests/PacketableTest.cpp new file mode 100644 index 0000000..93e170d --- /dev/null +++ b/tests/PacketableTest.cpp @@ -0,0 +1,45 @@ +#include +#include "gtest/gtest.h" +#include +#include + +class CustomClass : public fr::Packetable +{ +public: + CustomClass() + { + member1 = "hello"; + member2 = 7; + } + + bool operator==(const CustomClass &o) const + { + return o.member1 == member1 && o.member2 == member2; + } + + virtual void pack(fr::Packet &destination) const + { + destination << member1 << member2; + } + + virtual void unpack(fr::Packet &source) + { + source >> member1 >> member2; + } + +private: + std::string member1; + int member2; +}; + +TEST(PacketableTest, pack_and_unpack) +{ + fr::Packet packet; + CustomClass custom; + packet << custom; + + CustomClass custom2; + packet >> custom2; + + ASSERT_EQ(custom, custom2); +}