From a708cbf58ffee4f26438c104b3884ee58322bbc5 Mon Sep 17 00:00:00 2001 From: Andreas Antener Date: Fri, 30 Jan 2015 11:21:05 +0100 Subject: [PATCH 01/10] implemented reset with excludes --- src/modules/systemlib/param/param.c | 25 +++++++++++++++++++++++++ src/modules/systemlib/param/param.h | 12 ++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/modules/systemlib/param/param.c b/src/modules/systemlib/param/param.c index 6b8d0e634135..0f609ed87e12 100644 --- a/src/modules/systemlib/param/param.c +++ b/src/modules/systemlib/param/param.c @@ -483,6 +483,31 @@ param_reset_all(void) param_notify_changes(); } +void +param_reset_excludes(const char* excludes[], int num_excludes) +{ + param_lock(); + + param_t param; + + for (param = 0; handle_in_range(param); param++) { + const char* name = param_name(param); + + for (int index = 0, len = strlen(excludes[index]); index < num_excludes; index ++) { + if((excludes[index][len - 1] == '*' + && strncmp(name, excludes[index], strlen(excludes[index]))) == 0 + || strcmp(name, excludes[index]) == 0) { + + param_reset(param); + } + } + } + + param_unlock(); + + param_notify_changes(); +} + static const char *param_default_file = "/eeprom/parameters"; static char *param_user_file = NULL; diff --git a/src/modules/systemlib/param/param.h b/src/modules/systemlib/param/param.h index dc73b37e914f..be9a43ec5ea3 100644 --- a/src/modules/systemlib/param/param.h +++ b/src/modules/systemlib/param/param.h @@ -188,6 +188,18 @@ __EXPORT void param_reset(param_t param); */ __EXPORT void param_reset_all(void); + +/** + * Reset all parameters to their default values except for excluded parameters. + * + * This function also releases the storage used by struct parameters. + * + * @param excludes Array of param names to exclude from resetting. Use a wildcard + * at the end to exclude parameters with a certain prefix. + * @param num_excludes The number of excludes provided. + */ + __EXPORT void param_reset_excludes(const char* excludes[], int num_excludes); + /** * Export changed parameters to a file. * From 6f8db44dda5e8e75bdb911793e1673574f4730ef Mon Sep 17 00:00:00 2001 From: Andreas Antener Date: Fri, 30 Jan 2015 11:21:47 +0100 Subject: [PATCH 02/10] implemented reset excludes in systemcmd "param", updated autoconfig parameter doc --- ROMFS/px4fmu_common/init.d/rcS | 4 ++-- src/modules/systemlib/system_params.c | 5 ++-- src/systemcmds/param/param.c | 34 ++++++++++++++++++++------- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/ROMFS/px4fmu_common/init.d/rcS b/ROMFS/px4fmu_common/init.d/rcS index 479a340fe532..3d49261b27b1 100644 --- a/ROMFS/px4fmu_common/init.d/rcS +++ b/ROMFS/px4fmu_common/init.d/rcS @@ -122,8 +122,8 @@ then # if param compare SYS_AUTOCONFIG 1 then - # Wipe out params - param reset_nostart + # Wipe out params except RC* + param reset_nostart RC* set AUTOCNF yes else set AUTOCNF no diff --git a/src/modules/systemlib/system_params.c b/src/modules/systemlib/system_params.c index a0988035c912..497b7da37568 100644 --- a/src/modules/systemlib/system_params.c +++ b/src/modules/systemlib/system_params.c @@ -52,8 +52,9 @@ PARAM_DEFINE_INT32(SYS_AUTOSTART, 0); /** * Automatically configure default values. * - * Set to 1 to set platform-specific parameters to their default - * values on next system startup. + * Set to 1 to reset parameters on next system startup (setting defaults). + * Platform-specific values are used if available. + * RC* parameters are preserved. * * @min 0 * @max 1 diff --git a/src/systemcmds/param/param.c b/src/systemcmds/param/param.c index 80ee204e8cec..f831d1b21ad4 100644 --- a/src/systemcmds/param/param.c +++ b/src/systemcmds/param/param.c @@ -64,8 +64,8 @@ static void do_show(const char* search_string); static void do_show_print(void *arg, param_t param); static void do_set(const char* name, const char* val, bool fail_on_not_found); static void do_compare(const char* name, char* vals[], unsigned comparisons); -static void do_reset(void); -static void do_reset_nostart(void); +static void do_reset(const char* excludes[], int num_excludes); +static void do_reset_nostart(const char* excludes[], int num_excludes); int param_main(int argc, char *argv[]) @@ -142,11 +142,19 @@ param_main(int argc, char *argv[]) } if (!strcmp(argv[1], "reset")) { - do_reset(); + if (argc >= 3) { + do_reset((const char**) &argv[2], argc - 2); + } else { + do_reset(NULL, 0); + } } if (!strcmp(argv[1], "reset_nostart")) { - do_reset_nostart(); + if (argc >= 3) { + do_reset_nostart((const char**) &argv[2], argc - 2); + } else { + do_reset_nostart(NULL, 0); + } } } @@ -421,10 +429,14 @@ do_compare(const char* name, char* vals[], unsigned comparisons) } static void -do_reset(void) +do_reset(const char* excludes[], int num_excludes) { - param_reset_all(); - + if (num_excludes > 0) { + param_reset_excludes(excludes, num_excludes); + } else { + param_reset_all(); + } + if (param_save_default()) { warnx("Param export failed."); exit(1); @@ -434,7 +446,7 @@ do_reset(void) } static void -do_reset_nostart(void) +do_reset_nostart(const char* excludes[], int num_excludes) { int32_t autostart; @@ -443,7 +455,11 @@ do_reset_nostart(void) (void)param_get(param_find("SYS_AUTOSTART"), &autostart); (void)param_get(param_find("SYS_AUTOCONFIG"), &autoconfig); - param_reset_all(); + if (num_excludes > 0) { + param_reset_excludes(excludes, num_excludes); + } else { + param_reset_all(); + } (void)param_set(param_find("SYS_AUTOSTART"), &autostart); (void)param_set(param_find("SYS_AUTOCONFIG"), &autoconfig); From 19b4221cabe678a42cf7c18550bd4e6db1d52ec4 Mon Sep 17 00:00:00 2001 From: Andreas Antener Date: Fri, 30 Jan 2015 11:33:51 +0100 Subject: [PATCH 03/10] renamed const name since it is a macro in a system header on OS X (/usr/include/sys/syslimits.h) --- unittests/sf0x_test.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/unittests/sf0x_test.cpp b/unittests/sf0x_test.cpp index ffaaaf04aad9..b161f1ffd060 100644 --- a/unittests/sf0x_test.cpp +++ b/unittests/sf0x_test.cpp @@ -10,8 +10,8 @@ #include "gtest/gtest.h" TEST(SF0XTest, SF0X) { - const char LINE_MAX = 20; - char _linebuf[LINE_MAX]; + const char _LINE_MAX = 20; + char _linebuf[_LINE_MAX]; _linebuf[0] = '\0'; const char *lines[] = {"0.01\r\n", @@ -34,7 +34,7 @@ TEST(SF0XTest, SF0X) { enum SF0X_PARSE_STATE state = SF0X_PARSE_STATE0_UNSYNC; float dist_m; - char _parserbuf[LINE_MAX]; + char _parserbuf[_LINE_MAX]; unsigned _parsebuf_index = 0; for (unsigned l = 0; l < sizeof(lines) / sizeof(lines[0]); l++) { From bbab1c1775064b9e0db400c4c865dfc58e97bd8c Mon Sep 17 00:00:00 2001 From: Andreas Antener Date: Sat, 31 Jan 2015 16:05:40 +0100 Subject: [PATCH 04/10] updated comparison --- src/modules/systemlib/param/param.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/systemlib/param/param.c b/src/modules/systemlib/param/param.c index 0f609ed87e12..4091219cb718 100644 --- a/src/modules/systemlib/param/param.c +++ b/src/modules/systemlib/param/param.c @@ -495,7 +495,7 @@ param_reset_excludes(const char* excludes[], int num_excludes) for (int index = 0, len = strlen(excludes[index]); index < num_excludes; index ++) { if((excludes[index][len - 1] == '*' - && strncmp(name, excludes[index], strlen(excludes[index]))) == 0 + && strncmp(name, excludes[index], len - 1)) == 0 || strcmp(name, excludes[index]) == 0) { param_reset(param); From 9fe0a0668a157af21a18b23e4f4ecde155e482f9 Mon Sep 17 00:00:00 2001 From: Andreas Antener Date: Mon, 2 Feb 2015 16:53:12 +0100 Subject: [PATCH 05/10] added test and stub --- src/modules/systemlib/param/param.c | 4 ++++ unittests/CMakeLists.txt | 11 +++++++++ unittests/param_test.cpp | 34 ++++++++++++++++++++++++++ unittests/stubs.cpp | 37 +++++++++++++++++++++++++++++ 4 files changed, 86 insertions(+) create mode 100644 unittests/param_test.cpp create mode 100644 unittests/stubs.cpp diff --git a/src/modules/systemlib/param/param.c b/src/modules/systemlib/param/param.c index 4091219cb718..fdaf7d2c8cb5 100644 --- a/src/modules/systemlib/param/param.c +++ b/src/modules/systemlib/param/param.c @@ -200,10 +200,14 @@ param_notify_changes(void) param_t param_find(const char *name) { + warn("debug info count %i\n", param_count()); + warn("start: %i\n", __param_start); + param_t param; /* perform a linear search of the known parameters */ for (param = 0; handle_in_range(param); param++) { + warn("param find: %s", param_info_base[param].name); if (!strcmp(param_info_base[param].name, name)) return param; } diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt index a87c23be226c..3c5920738110 100644 --- a/unittests/CMakeLists.txt +++ b/unittests/CMakeLists.txt @@ -77,3 +77,14 @@ add_gtest(st24_test) # sf0x_test add_executable(sf0x_test sf0x_test.cpp ${PX_SRC}/drivers/sf0x/sf0x_parser.cpp) add_gtest(sf0x_test) + +# param_test +add_executable(param_test param_test.cpp + hrt.cpp + stubs.cpp + ${PX_SRC}/modules/systemlib/visibility.h + ${PX_SRC}/modules/systemlib/param/param.c + ${PX_SRC}/modules/systemlib/bson/tinybson.c + ${PX_SRC}/drivers/drv_hrt.h + ) +add_gtest(param_test) diff --git a/unittests/param_test.cpp b/unittests/param_test.cpp new file mode 100644 index 000000000000..d4c10acaf495 --- /dev/null +++ b/unittests/param_test.cpp @@ -0,0 +1,34 @@ +#include +#include + +#include "gtest/gtest.h" + +//#PARAM_DEFINE_INT32(TEST_A, 5); + +struct param_info_s test = { + "test", + PARAM_TYPE_INT32, + .val.i = 2 +}; + + + +extern param_info_s *__param_start, *__param_end; +const struct param_info_s *ib = __param_start; +const struct param_info_s *il = __param_end; + +TEST(ParamTest, ResetAll) { + printf("diff: %i\n", (unsigned)(il - ib)); + printf("start: %i\n", __param_start); + printf("end: %i\n", __param_end); + + param_t testparam = param_find("test"); + ASSERT_NE(PARAM_INVALID, testparam) << "param_find failed"; + + int32_t value; + int result = param_get(testparam, &value); + ASSERT_EQ(0, result) << "param_get failed"; + ASSERT_EQ(2, value) << "wrong param value"; + + ASSERT_TRUE(false) << "fail"; +} diff --git a/unittests/stubs.cpp b/unittests/stubs.cpp new file mode 100644 index 000000000000..19415a83ffd3 --- /dev/null +++ b/unittests/stubs.cpp @@ -0,0 +1,37 @@ +#include +#include +//#include "gmock/gmock.h" + +#include "uORB/uORB.h" +#include + +/****************************************** + * uORB stubs +******************************************/ + +/* +struct orb_metadata { + const char *o_name; + const size_t o_size; +}; +typedef intptr_t orb_advert_t; +extern orb_advert_t orb_advertise(const struct orb_metadata *meta, const void *data); +extern int orb_publish(const struct orb_metadata *meta, orb_advert_t handle, const void *data); +*/ + +orb_advert_t orb_advertise(const struct orb_metadata *meta, const void *data) { + return (orb_advert_t)0; +} + +int orb_publish(const struct orb_metadata *meta, orb_advert_t handle, const void *data) { + return 0; +} + +/****************************************** + * param stubs +******************************************/ + +//extern param_info_s * __param_start, __param_end; +struct param_info_s param_info_base[5]; +param_info_s *__param_start = ¶m_info_base[0]; +param_info_s *__param_end = ¶m_info_base[4]; From 96404b52beda5d988e7445700a3fa0c3326fe6bf Mon Sep 17 00:00:00 2001 From: Andreas Antener Date: Mon, 2 Feb 2015 18:22:09 +0100 Subject: [PATCH 06/10] hard-code parameter array for verification --- src/modules/systemlib/param/param.c | 8 ++++---- unittests/CMakeLists.txt | 2 +- unittests/param_test.cpp | 9 ++++++--- unittests/stubs.cpp | 6 +++--- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/modules/systemlib/param/param.c b/src/modules/systemlib/param/param.c index fdaf7d2c8cb5..63e833eddcda 100644 --- a/src/modules/systemlib/param/param.c +++ b/src/modules/systemlib/param/param.c @@ -70,9 +70,9 @@ /** * Array of static parameter info. */ -extern char __param_start, __param_end; -static const struct param_info_s *param_info_base = (struct param_info_s *) &__param_start; -static const struct param_info_s *param_info_limit = (struct param_info_s *) &__param_end; +struct param_info_s param_array[2]; +static const struct param_info_s *param_info_base = (struct param_info_s *) ¶m_array[0]; +static const struct param_info_s *param_info_limit = (struct param_info_s *) ¶m_array[1]; #define param_info_count ((unsigned)(param_info_limit - param_info_base)) /** @@ -201,7 +201,7 @@ param_t param_find(const char *name) { warn("debug info count %i\n", param_count()); - warn("start: %i\n", __param_start); + //warn("start: %i\n", __param_start); param_t param; diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt index 3c5920738110..c2ef3965291e 100644 --- a/unittests/CMakeLists.txt +++ b/unittests/CMakeLists.txt @@ -60,7 +60,7 @@ add_executable(mixer_test mixer_test.cpp hrt.cpp ${PX_SRC}/modules/systemlib/mixer/mixer_simple.cpp ${PX_SRC}/modules/systemlib/pwm_limit/pwm_limit.c ${PX_SRC}/systemcmds/tests/test_mixer.cpp) -add_gtest(mixer_test) +#add_gtest(mixer_test) # conversion_test add_executable(conversion_test conversion_test.cpp ${PX_SRC}/systemcmds/tests/test_conv.cpp) diff --git a/unittests/param_test.cpp b/unittests/param_test.cpp index d4c10acaf495..2d71d3b4920c 100644 --- a/unittests/param_test.cpp +++ b/unittests/param_test.cpp @@ -5,19 +5,22 @@ //#PARAM_DEFINE_INT32(TEST_A, 5); -struct param_info_s test = { + +static const struct param_info_s testparam = { "test", PARAM_TYPE_INT32, .val.i = 2 }; - extern param_info_s *__param_start, *__param_end; +extern struct param_info_s param_array[]; const struct param_info_s *ib = __param_start; const struct param_info_s *il = __param_end; TEST(ParamTest, ResetAll) { + param_array[0] = testparam; + printf("diff: %i\n", (unsigned)(il - ib)); printf("start: %i\n", __param_start); printf("end: %i\n", __param_end); @@ -30,5 +33,5 @@ TEST(ParamTest, ResetAll) { ASSERT_EQ(0, result) << "param_get failed"; ASSERT_EQ(2, value) << "wrong param value"; - ASSERT_TRUE(false) << "fail"; + //ASSERT_TRUE(false) << "fail"; } diff --git a/unittests/stubs.cpp b/unittests/stubs.cpp index 19415a83ffd3..165d882ef8d4 100644 --- a/unittests/stubs.cpp +++ b/unittests/stubs.cpp @@ -32,6 +32,6 @@ int orb_publish(const struct orb_metadata *meta, orb_advert_t handle, const void ******************************************/ //extern param_info_s * __param_start, __param_end; -struct param_info_s param_info_base[5]; -param_info_s *__param_start = ¶m_info_base[0]; -param_info_s *__param_end = ¶m_info_base[4]; +struct param_info_s param_array[5]; +param_info_s *__param_start = ¶m_array[0]; +param_info_s *__param_end = ¶m_array[4]; From abd5d0a60a1a08de7bca141399228c6b73d34175 Mon Sep 17 00:00:00 2001 From: Andreas Antener Date: Tue, 3 Feb 2015 10:35:20 +0100 Subject: [PATCH 07/10] added unit test directive to switch out parameter storage --- src/modules/systemlib/param/param.c | 17 ++++++++++------- unittests/CMakeLists.txt | 5 ++--- unittests/param_test.cpp | 29 ++++++++++++----------------- unittests/uorb_stub.cpp | 21 +++++++++++++++++++++ 4 files changed, 45 insertions(+), 27 deletions(-) create mode 100644 unittests/uorb_stub.cpp diff --git a/src/modules/systemlib/param/param.c b/src/modules/systemlib/param/param.c index 63e833eddcda..aa10f19ec79d 100644 --- a/src/modules/systemlib/param/param.c +++ b/src/modules/systemlib/param/param.c @@ -70,9 +70,16 @@ /** * Array of static parameter info. */ -struct param_info_s param_array[2]; -static const struct param_info_s *param_info_base = (struct param_info_s *) ¶m_array[0]; -static const struct param_info_s *param_info_limit = (struct param_info_s *) ¶m_array[1]; +#ifdef _UNIT_TEST + extern struct param_info_s param_array[]; + extern struct param_info_s *param_info_base; + extern struct param_info_s *param_info_limit; +#else + extern char __param_start, __param_end; + static const struct param_info_s *param_info_base = (struct param_info_s *) &__param_start; + static const struct param_info_s *param_info_limit = (struct param_info_s *) &__param_end; +#endif + #define param_info_count ((unsigned)(param_info_limit - param_info_base)) /** @@ -200,14 +207,10 @@ param_notify_changes(void) param_t param_find(const char *name) { - warn("debug info count %i\n", param_count()); - //warn("start: %i\n", __param_start); - param_t param; /* perform a linear search of the known parameters */ for (param = 0; handle_in_range(param); param++) { - warn("param find: %s", param_info_base[param].name); if (!strcmp(param_info_base[param].name, name)) return param; } diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt index c2ef3965291e..e1f4120fc14b 100644 --- a/unittests/CMakeLists.txt +++ b/unittests/CMakeLists.txt @@ -31,6 +31,7 @@ add_definitions(-Dnoreturn_function=) add_definitions(-Dmain_t=int) add_definitions(-DERROR=-1) add_definitions(-DOK=0) +add_definitions(-D_UNIT_TEST=) # check add_custom_target(unittests COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure) @@ -81,10 +82,8 @@ add_gtest(sf0x_test) # param_test add_executable(param_test param_test.cpp hrt.cpp - stubs.cpp - ${PX_SRC}/modules/systemlib/visibility.h + uorb_stub.cpp ${PX_SRC}/modules/systemlib/param/param.c ${PX_SRC}/modules/systemlib/bson/tinybson.c - ${PX_SRC}/drivers/drv_hrt.h ) add_gtest(param_test) diff --git a/unittests/param_test.cpp b/unittests/param_test.cpp index 2d71d3b4920c..b3aff34e8d32 100644 --- a/unittests/param_test.cpp +++ b/unittests/param_test.cpp @@ -3,33 +3,28 @@ #include "gtest/gtest.h" -//#PARAM_DEFINE_INT32(TEST_A, 5); - - -static const struct param_info_s testparam = { - "test", +static const struct param_info_s test_1 = { + "TEST_1", PARAM_TYPE_INT32, .val.i = 2 }; - -extern param_info_s *__param_start, *__param_end; -extern struct param_info_s param_array[]; -const struct param_info_s *ib = __param_start; -const struct param_info_s *il = __param_end; +struct param_info_s param_array[256]; +struct param_info_s *param_info_base; +struct param_info_s *param_info_limit; TEST(ParamTest, ResetAll) { - param_array[0] = testparam; + param_array[0] = test_1; + param_info_base = (struct param_info_s *) ¶m_array[0]; + param_info_limit = (struct param_info_s *) ¶m_array[1]; - printf("diff: %i\n", (unsigned)(il - ib)); - printf("start: %i\n", __param_start); - printf("end: %i\n", __param_end); + printf("diff: %i\n", (unsigned)(param_info_limit - param_info_base)); - param_t testparam = param_find("test"); - ASSERT_NE(PARAM_INVALID, testparam) << "param_find failed"; + param_t test_1 = param_find("TEST_1"); + ASSERT_NE(PARAM_INVALID, test_1) << "param_find failed"; int32_t value; - int result = param_get(testparam, &value); + int result = param_get(test_1, &value); ASSERT_EQ(0, result) << "param_get failed"; ASSERT_EQ(2, value) << "wrong param value"; diff --git a/unittests/uorb_stub.cpp b/unittests/uorb_stub.cpp new file mode 100644 index 000000000000..fc039a408618 --- /dev/null +++ b/unittests/uorb_stub.cpp @@ -0,0 +1,21 @@ +#include +#include +//#include "gmock/gmock.h" + +#include "uORB/uORB.h" + +/****************************************** + * uORB stubs (incomplete) + * + * TODO: use googlemock +******************************************/ + +orb_advert_t orb_advertise(const struct orb_metadata *meta, const void *data) { + return (orb_advert_t)0; +} + +int orb_publish(const struct orb_metadata *meta, orb_advert_t handle, const void *data) { + return 0; +} + + From 301ba32c1ad2161ce786b6ca8c3ee445dbe64331 Mon Sep 17 00:00:00 2001 From: Andreas Antener Date: Tue, 3 Feb 2015 10:36:21 +0100 Subject: [PATCH 08/10] removed old stub --- unittests/stubs.cpp | 37 ------------------------------------- 1 file changed, 37 deletions(-) delete mode 100644 unittests/stubs.cpp diff --git a/unittests/stubs.cpp b/unittests/stubs.cpp deleted file mode 100644 index 165d882ef8d4..000000000000 --- a/unittests/stubs.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include -#include -//#include "gmock/gmock.h" - -#include "uORB/uORB.h" -#include - -/****************************************** - * uORB stubs -******************************************/ - -/* -struct orb_metadata { - const char *o_name; - const size_t o_size; -}; -typedef intptr_t orb_advert_t; -extern orb_advert_t orb_advertise(const struct orb_metadata *meta, const void *data); -extern int orb_publish(const struct orb_metadata *meta, orb_advert_t handle, const void *data); -*/ - -orb_advert_t orb_advertise(const struct orb_metadata *meta, const void *data) { - return (orb_advert_t)0; -} - -int orb_publish(const struct orb_metadata *meta, orb_advert_t handle, const void *data) { - return 0; -} - -/****************************************** - * param stubs -******************************************/ - -//extern param_info_s * __param_start, __param_end; -struct param_info_s param_array[5]; -param_info_s *__param_start = ¶m_array[0]; -param_info_s *__param_end = ¶m_array[4]; From 8bb98cb042d4d9900f2d4bec014cfe26f2cc1c2d Mon Sep 17 00:00:00 2001 From: Andreas Antener Date: Tue, 3 Feb 2015 11:49:34 +0100 Subject: [PATCH 09/10] setting parameters at runtime to get rid of the designated union initializer --- unittests/CMakeLists.txt | 2 +- unittests/param_test.cpp | 43 +++++++++++++++++++++++++++------------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt index e1f4120fc14b..1a203fa301a7 100644 --- a/unittests/CMakeLists.txt +++ b/unittests/CMakeLists.txt @@ -61,7 +61,7 @@ add_executable(mixer_test mixer_test.cpp hrt.cpp ${PX_SRC}/modules/systemlib/mixer/mixer_simple.cpp ${PX_SRC}/modules/systemlib/pwm_limit/pwm_limit.c ${PX_SRC}/systemcmds/tests/test_mixer.cpp) -#add_gtest(mixer_test) +add_gtest(mixer_test) # conversion_test add_executable(conversion_test conversion_test.cpp ${PX_SRC}/systemcmds/tests/test_conv.cpp) diff --git a/unittests/param_test.cpp b/unittests/param_test.cpp index b3aff34e8d32..bd2a9a45d6fd 100644 --- a/unittests/param_test.cpp +++ b/unittests/param_test.cpp @@ -3,30 +3,45 @@ #include "gtest/gtest.h" -static const struct param_info_s test_1 = { - "TEST_1", - PARAM_TYPE_INT32, - .val.i = 2 -}; struct param_info_s param_array[256]; struct param_info_s *param_info_base; struct param_info_s *param_info_limit; -TEST(ParamTest, ResetAll) { +/* + * Adds test parameters + */ +void _add_parameters() { + struct param_info_s test_1 = { + "TEST_1", + PARAM_TYPE_INT32 + }; + test_1.val.i = 2; + + struct param_info_s test_2 = { + "TEST_2", + PARAM_TYPE_INT32 + }; + test_2.val.i = 4; + param_array[0] = test_1; + param_array[1] = test_2; param_info_base = (struct param_info_s *) ¶m_array[0]; - param_info_limit = (struct param_info_s *) ¶m_array[1]; + param_info_limit = (struct param_info_s *) ¶m_array[2]; +} + +TEST(ParamTest, SimpleFind) { + _add_parameters(); printf("diff: %i\n", (unsigned)(param_info_limit - param_info_base)); - param_t test_1 = param_find("TEST_1"); - ASSERT_NE(PARAM_INVALID, test_1) << "param_find failed"; + param_t param = param_find("TEST_2"); + ASSERT_NE(PARAM_INVALID, param) << "param_find did not find parameter"; int32_t value; - int result = param_get(test_1, &value); - ASSERT_EQ(0, result) << "param_get failed"; - ASSERT_EQ(2, value) << "wrong param value"; - - //ASSERT_TRUE(false) << "fail"; + int result = param_get(param, &value); + ASSERT_EQ(0, result) << "param_get did not return parameter"; + ASSERT_EQ(4, value) << "value of returned parameter does not match"; } + + From 67c2d3ae3b8c029510eca218766d409477d6c51b Mon Sep 17 00:00:00 2001 From: Andreas Antener Date: Wed, 4 Feb 2015 09:33:14 +0100 Subject: [PATCH 10/10] added actual tests and fixed reset-exclude funtction --- src/modules/systemlib/param/param.c | 15 ++-- unittests/param_test.cpp | 104 ++++++++++++++++++++++++++-- 2 files changed, 111 insertions(+), 8 deletions(-) diff --git a/src/modules/systemlib/param/param.c b/src/modules/systemlib/param/param.c index aa10f19ec79d..0b1415adfb42 100644 --- a/src/modules/systemlib/param/param.c +++ b/src/modules/systemlib/param/param.c @@ -499,15 +499,22 @@ param_reset_excludes(const char* excludes[], int num_excludes) for (param = 0; handle_in_range(param); param++) { const char* name = param_name(param); + bool exclude = false; + + for (int index = 0; index < num_excludes; index ++) { + int len = strlen(excludes[index]); - for (int index = 0, len = strlen(excludes[index]); index < num_excludes; index ++) { if((excludes[index][len - 1] == '*' - && strncmp(name, excludes[index], len - 1)) == 0 + && strncmp(name, excludes[index], len - 1) == 0) || strcmp(name, excludes[index]) == 0) { - - param_reset(param); + exclude = true; + break; } } + + if(!exclude) { + param_reset(param); + } } param_unlock(); diff --git a/unittests/param_test.cpp b/unittests/param_test.cpp index bd2a9a45d6fd..5ea6bcc6024f 100644 --- a/unittests/param_test.cpp +++ b/unittests/param_test.cpp @@ -3,7 +3,9 @@ #include "gtest/gtest.h" - +/* + * These will be used in param.c if compiling for unit tests + */ struct param_info_s param_array[256]; struct param_info_s *param_info_base; struct param_info_s *param_info_limit; @@ -24,16 +26,48 @@ void _add_parameters() { }; test_2.val.i = 4; + struct param_info_s rc_x = { + "RC_X", + PARAM_TYPE_INT32 + }; + rc_x.val.i = 8; + + struct param_info_s rc2_x = { + "RC2_X", + PARAM_TYPE_INT32 + }; + rc2_x.val.i = 16; + param_array[0] = test_1; param_array[1] = test_2; + param_array[2] = rc_x; + param_array[3] = rc2_x; param_info_base = (struct param_info_s *) ¶m_array[0]; - param_info_limit = (struct param_info_s *) ¶m_array[2]; + param_info_limit = (struct param_info_s *) ¶m_array[4]; // needs to point at the end of the data, + // therefore number of params + 1 +} + +void _assert_parameter_int_value(param_t param, int32_t expected) { + int32_t value; + int result = param_get(param, &value); + ASSERT_EQ(0, result) << printf("param_get (%i) did not return parameter\n", param); + ASSERT_EQ(expected, value) << printf("value for param (%i) doesn't match default value\n", param); +} + +void _set_all_int_parameters_to(int32_t value) { + param_set((param_t)0, &value); + param_set((param_t)1, &value); + param_set((param_t)2, &value); + param_set((param_t)3, &value); + + _assert_parameter_int_value((param_t)0, value); + _assert_parameter_int_value((param_t)1, value); + _assert_parameter_int_value((param_t)2, value); + _assert_parameter_int_value((param_t)3, value); } TEST(ParamTest, SimpleFind) { _add_parameters(); - - printf("diff: %i\n", (unsigned)(param_info_limit - param_info_base)); param_t param = param_find("TEST_2"); ASSERT_NE(PARAM_INVALID, param) << "param_find did not find parameter"; @@ -44,4 +78,66 @@ TEST(ParamTest, SimpleFind) { ASSERT_EQ(4, value) << "value of returned parameter does not match"; } +TEST(ParamTest, ResetAll) { + _add_parameters(); + _set_all_int_parameters_to(50); + + param_reset_all(); + + _assert_parameter_int_value((param_t)0, 2); + _assert_parameter_int_value((param_t)1, 4); + _assert_parameter_int_value((param_t)2, 8); + _assert_parameter_int_value((param_t)3, 16); +} + +TEST(ParamTest, ResetAllExcludesOne) { + _add_parameters(); + _set_all_int_parameters_to(50); + + const char* excludes[] = {"RC_X"}; + param_reset_excludes(excludes, 1); + + _assert_parameter_int_value((param_t)0, 2); + _assert_parameter_int_value((param_t)1, 4); + _assert_parameter_int_value((param_t)2, 50); + _assert_parameter_int_value((param_t)3, 16); +} + +TEST(ParamTest, ResetAllExcludesTwo) { + _add_parameters(); + _set_all_int_parameters_to(50); + + const char* excludes[] = {"RC_X", "TEST_1"}; + param_reset_excludes(excludes, 2); + + _assert_parameter_int_value((param_t)0, 50); + _assert_parameter_int_value((param_t)1, 4); + _assert_parameter_int_value((param_t)2, 50); + _assert_parameter_int_value((param_t)3, 16); +} + +TEST(ParamTest, ResetAllExcludesBoundaryCheck) { + _add_parameters(); + _set_all_int_parameters_to(50); + + const char* excludes[] = {"RC_X", "TEST_1"}; + param_reset_excludes(excludes, 1); + + _assert_parameter_int_value((param_t)0, 2); + _assert_parameter_int_value((param_t)1, 4); + _assert_parameter_int_value((param_t)2, 50); + _assert_parameter_int_value((param_t)3, 16); +} + +TEST(ParamTest, ResetAllExcludesWildcard) { + _add_parameters(); + _set_all_int_parameters_to(50); + + const char* excludes[] = {"RC*"}; + param_reset_excludes(excludes, 1); + _assert_parameter_int_value((param_t)0, 2); + _assert_parameter_int_value((param_t)1, 4); + _assert_parameter_int_value((param_t)2, 50); + _assert_parameter_int_value((param_t)3, 50); +} \ No newline at end of file