From 84aeed89141862a6b4f423118bece4fe23dd3193 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Wed, 21 Aug 2019 09:54:11 +0200 Subject: [PATCH] stub for companion storage tests --- companion/src/CMakeLists.txt | 4 + companion/src/tests/CMakeLists.txt | 33 ++++++ companion/src/tests/conversions.cpp | 13 +++ companion/src/tests/eeprom_22_x9d+.bin | Bin 0 -> 32768 bytes companion/src/tests/gtests.cpp | 149 +++++++++++++++++++++++++ companion/src/tests/gtests.h | 96 ++++++++++++++++ companion/src/tests/location.h.in | 1 + 7 files changed, 296 insertions(+) create mode 100644 companion/src/tests/CMakeLists.txt create mode 100644 companion/src/tests/conversions.cpp create mode 100644 companion/src/tests/eeprom_22_x9d+.bin create mode 100644 companion/src/tests/gtests.cpp create mode 100644 companion/src/tests/gtests.h create mode 100644 companion/src/tests/location.h.in diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt index d5fd9976d..58ae89720 100644 --- a/companion/src/CMakeLists.txt +++ b/companion/src/CMakeLists.txt @@ -326,6 +326,10 @@ set(simu_SRCS simulator.cpp ) add_executable(${SIMULATOR_NAME} MACOSX_BUNDLE ${WIN_EXECUTABLE_TYPE} ${simu_SRCS} ${icon_RC}) target_link_libraries(${SIMULATOR_NAME} PRIVATE ${CPN_COMMON_LIB}) +if(NOT MSVC) + add_subdirectory(tests) +endif() + ############# Install #################### # Generate list of simulator plugins, used by all platforms diff --git a/companion/src/tests/CMakeLists.txt b/companion/src/tests/CMakeLists.txt new file mode 100644 index 000000000..12511e8b6 --- /dev/null +++ b/companion/src/tests/CMakeLists.txt @@ -0,0 +1,33 @@ +set(GTEST_ROOT /usr CACHE STRING "Base path to Google Test headers and source.") + +find_path(GTEST_INCDIR gtest/gtest.h HINTS "${GTEST_ROOT}/include" DOC "Path to Google Test header files folder ('gtest/gtest.h').") +find_path(GTEST_SRCDIR src/gtest-all.cc HINTS "${GTEST_ROOT}" "${GTEST_ROOT}/src/gtest" DOC "Path of Google Test 'src' folder.") + +if(GTEST_INCDIR AND GTEST_SRCDIR AND Qt5Widgets_FOUND) + add_library(gtests-cpn-lib STATIC EXCLUDE_FROM_ALL ${GTEST_SRCDIR}/src/gtest-all.cc ) + target_include_directories(gtests-cpn-lib PUBLIC ${GTEST_INCDIR} ${GTEST_INCDIR}/gtest ${GTEST_SRCDIR}) + add_definitions(-DGTESTS) + set(TESTS_PATH ${COMPANION_SRC_DIRECTORY}/tests) + configure_file(${TESTS_PATH}/location.h.in ${CMAKE_CURRENT_BINARY_DIR}/location.h @ONLY) + + include_directories(${CMAKE_CURRENT_BINARY_DIR}) + + if(WIN32) + target_include_directories(gtests-cpn-lib PUBLIC ${WIN_INCLUDE_DIRS}) + target_link_libraries(gtests-cpn-lib PRIVATE ${WIN_LINK_LIBRARIES}) + endif(WIN32) + + file(GLOB TEST_SRC_FILES ${TESTS_PATH}/*.cpp) + + set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 ${WARNING_FLAGS}") + + use_cxx11() # ensure gnu++11 in CXX_FLAGS with CMake < 3.1 + + add_executable(gtests-cpn EXCLUDE_FROM_ALL ${TEST_SRC_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/location.h) + add_dependencies(gtests-cpn gtests-cpn-lib) + target_link_libraries(gtests-cpn gtests-cpn-lib pthread Qt5::Core Qt5::Widgets ${CPN_COMMON_LIB}) + message(STATUS "Added optional gtests-cpn target") +else() + message(WARNING "WARNING: gtests target will not be available (check that GTEST_INCDIR, GTEST_SRCDIR, and Qt5Widgets are configured).") +endif() diff --git a/companion/src/tests/conversions.cpp b/companion/src/tests/conversions.cpp new file mode 100644 index 000000000..23354f973 --- /dev/null +++ b/companion/src/tests/conversions.cpp @@ -0,0 +1,13 @@ +#include "gtests.h" +#include "location.h" +#include "storage/storage.h" + +TEST(Conversions, test_conversion) +{ + QString error; + RadioData simuData; + Storage store = Storage(TESTS_PATH "/eeprom_22_x9d+.bin"); + + EXPECT_EQ(true, store.load(simuData)); + qDebug() << store.error(); +} diff --git a/companion/src/tests/eeprom_22_x9d+.bin b/companion/src/tests/eeprom_22_x9d+.bin new file mode 100644 index 0000000000000000000000000000000000000000..cfd4140499ca688c633813dc54bc2c3500b970de GIT binary patch literal 32768 zcmd_ybyQS&7>DtDXFw4PySux)8&R>l6}vl7$L<=j8@m;|6}tnwyIZl{b!TKb%ewCS zu0DV6$QkdM=ldBB_lM``@u;g|x)?u-Rs|8{qL`Z z|GWQ5?P9ux^&$7Pm1(iN*#g5ko&s(;zKl-Rm>-_|neT)BT!TORMSt?e*3)#K=pJ(a zqdC9+M!)_|YyG$L3v!&^5Z7;~7ijS^zyAomy%C+Cznr28+v-qi*KjrypT@M zW{YIl8d^La{?gewPbqTP`}fm#-^Gmbm;VLrVnz-1Z=C1h={&kRW_Y`szw_j5oIjc36x{wF4<*e2?>OvmG zm9tvosS9}!U(RYxpf2P=LOH87k-CrviRG-;B2Fw)tDiw0q>!^(Q>qJj zkV?*KO|35EK^i%$HLbdk2kGRj*7WK^9%PWSS~IE(d5}rYYR#-JOvkAkh59~stb8gNX}|4 ztS;n15jm^1sJf5`#pJBk;_5;kl#sJpOR5Wbp#1Sh#*SKAUC4tna#pLSx{wED<*ZgO zbs-PR$yu%C)rCB$AZN9Ds|$HhQO;_uq%Pz^WjU+0in@>oRpqSKYU)BBRF|__Yp4r( zP*cuot)(vHL2Ws!wT`-w2X*DF)_Uqf9@Lk!S{tYfdC*YKYHg%0XSKFe7xJK$oYmS|UC4tra#m|wbs-Ph$yu%K)rCChAZN99 zR2TA~lbqGsSzXA3E^=0DS9Ku|y2)9s-PMIW=pkpd_EZ=0pqHH0+FM=717A6-wU4@x z2YuzN)_&?j9ytC296kCYZ5RWf9|-**=m$eT1p1-S4}*R<^dq1j3H>POM?*gb`mxZD zgMK{pcIYQS?+5)v=qEux8Tu*EPlbLO^wXiA0sTzqXF)$3`Z>_gh29_fdC<>?egX6g zp1H_!(|{}%dp(7%WN1N0xE{{;PK=)XY! z8}z?J{}p<}WN%-b82TpAH-+8@`ex8KhrR{$Eun7( zeQW63K;IVncF?znz610fq3;BJXXv{?-xd09(07Nv2lPFm?*)Bt=zXE@1ASlU`$2Dm zzCZK>pdSeRAm|4}KLq-r&<}%tIP@c+9|`>^=to082KuqkkAr?Z^mgbcK<@|rMCd0$ zKN6}q2CAne&`QCe-QdZ&>x2W2=qsxKL-7A=ubd@68clnpN2jN`ZLg +#include +#include +#include +#include +#include "gtests.h" + +#include "storage.h" +#include "opentxinterface.h" +#include "customdebug.h" + + +using ::testing::TestEventListener; +using ::testing::EmptyTestEventListener; +using ::testing::Test; +using ::testing::TestCase; +using ::testing::TestEventListeners; +using ::testing::TestInfo; +using ::testing::TestPartResult; +using ::testing::UnitTest; +using ::testing::InitGoogleTest; + +namespace { + +void printColorCode(int color) +{ +#if !GTEST_OS_WINDOWS + if (isatty(fileno(stdout))) + fprintf(stdout, "\033[0;%dm", color); +#endif +} + +/** + * Replaces gtest's PrettyUnitTestResultPrinter with something less verbose. + * Uses the default printer if/when the messages might be interesting, + * e.g. for full error info or tests summary. +*/ +class TersePrinter : public EmptyTestEventListener { + public: + explicit TersePrinter(TestEventListener * prettyPrinter) + : prettyPrinter(prettyPrinter), currentTestInfo(NULL) + { + } + void OnTestProgramStart(const UnitTest & unit_test) + { + prettyPrinter->OnTestProgramStart(unit_test); + } + void OnTestIterationStart(const UnitTest & unit_test, int iteration) + { + printColorCode(36); + fprintf(stdout, "############ "); + fprintf(stdout, "Running %d test(s) from %d test case(s), iteration: %d.\n", unit_test.test_to_run_count(), unit_test.test_case_to_run_count(), iteration + 1); + printColorCode(0); + fflush(stdout); + } + void OnTestCaseStart(const TestCase & test_case) + { + prettyPrinter->OnTestCaseStart(test_case); + } + void OnTestStart(const TestInfo & test_info) + { + currentTestInfo = &test_info; + } + void OnTestPartResult(const TestPartResult & test_part_result) + { + if (test_part_result.failed()) { + prettyPrinter->OnTestStart(*currentTestInfo); + prettyPrinter->OnTestPartResult(test_part_result); + } + } + void OnTestEnd(const TestInfo & test_info) + { + currentTestInfo = NULL; + if (test_info.result()->Failed()) { + prettyPrinter->OnTestEnd(test_info); + } + else { + printColorCode(32); + fprintf(stdout, "+"); + printColorCode(0); + fflush(stdout); + } + } + void OnTestCaseEnd(const TestCase & test_case) + { + fprintf(stdout, "\n"); + fflush(stdout); + } + void OnTestIterationEnd(const UnitTest & unit_test, int iteration) + { + prettyPrinter->OnTestIterationEnd(unit_test, iteration); + } + void OnTestProgramEnd(const UnitTest & unit_test) + { + prettyPrinter->OnTestProgramEnd(unit_test); + } + + private: + // gtest's default unit test result printer. + std::unique_ptr prettyPrinter; + // The currently running TestInfo, if any. + const TestInfo * currentTestInfo; +}; + +} // anonymous namespace + +int main(int argc, char **argv) +{ + QCoreApplication app(argc, argv); + + CustomDebug::setFilterRules(); + registerStorageFactories(); + registerOpenTxFirmwares(); + + InitGoogleTest(&argc, argv); + + // use --verbose option to revert to gtest's default output format + bool verbose = false; + if (argc > 1 && !strcmp(argv[1], "--verbose")) + verbose = true; + + if (!verbose) { + TestEventListeners & listeners = UnitTest::GetInstance()->listeners(); + TestEventListener * defaultPrinter = listeners.Release(listeners.default_result_printer()); + listeners.Append(new TersePrinter(defaultPrinter)); + } + + return RUN_ALL_TESTS(); +} diff --git a/companion/src/tests/gtests.h b/companion/src/tests/gtests.h new file mode 100644 index 000000000..cd22e2624 --- /dev/null +++ b/companion/src/tests/gtests.h @@ -0,0 +1,96 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef _GTESTS_H_ +#define _GTESTS_H_ + +#include +#include +#include + +// #if defined(PCBTARANIS) || defined(PCBHORUS) +// #define RADIO_RESET() \ +// g_eeGeneral.switchConfig = 0x00007bff +// #else +// #define RADIO_RESET() +// #endif + +// inline void SYSTEM_RESET() +// { +// #if defined(EEPROM) +// memset(modelHeaders, 0, sizeof(modelHeaders)); +// #endif +// generalDefault(); +// g_eeGeneral.templateSetup = 0; +// for (int i=0; i