diff --git a/platforms/common/uORB/CMakeLists.txt b/platforms/common/uORB/CMakeLists.txt index 2e3add770e1b..879034739b9d 100644 --- a/platforms/common/uORB/CMakeLists.txt +++ b/platforms/common/uORB/CMakeLists.txt @@ -112,4 +112,9 @@ if(PX4_TESTING) add_subdirectory(uORB_tests) endif() +if(PX4_TESTING) + add_subdirectory(test) +endif() + + px4_add_functional_gtest(SRC uORBMessageFieldsTest.cpp LINKLIBS uORB) diff --git a/platforms/common/uORB/Subscription.hpp b/platforms/common/uORB/Subscription.hpp index 71c8809ad229..723427d840d4 100644 --- a/platforms/common/uORB/Subscription.hpp +++ b/platforms/common/uORB/Subscription.hpp @@ -118,16 +118,8 @@ class Subscription bool valid() const { return _node != nullptr; } bool advertised() { - if (valid()) { - return Manager::is_advertised(_node); - } - - // try to initialize if (subscribe()) { - // check again if valid - if (valid()) { - return Manager::is_advertised(_node); - } + return Manager::is_advertised(_node); } return false; @@ -138,11 +130,11 @@ class Subscription */ bool updated() { - if (!valid()) { - subscribe(); + if (subscribe()) { + return Manager::updates_available(_node, _last_generation); } - return valid() ? Manager::updates_available(_node, _last_generation) : false; + return false; } /** @@ -151,11 +143,11 @@ class Subscription */ bool update(void *dst) { - if (!valid()) { - subscribe(); + if (subscribe()) { + return Manager::orb_data_copy(_node, dst, _last_generation, true); } - return valid() ? Manager::orb_data_copy(_node, dst, _last_generation, true) : false; + return false; } /** @@ -164,11 +156,11 @@ class Subscription */ bool copy(void *dst) { - if (!valid()) { - subscribe(); + if (subscribe()) { + return Manager::orb_data_copy(_node, dst, _last_generation, false); } - return valid() ? Manager::orb_data_copy(_node, dst, _last_generation, false) : false; + return false; } /** diff --git a/platforms/common/uORB/test/CMakeLists.txt b/platforms/common/uORB/test/CMakeLists.txt new file mode 100644 index 000000000000..2148d870b3fd --- /dev/null +++ b/platforms/common/uORB/test/CMakeLists.txt @@ -0,0 +1,36 @@ +############################################################################ +# +# Copyright (c) 2019-2024 PX4 Development Team. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. Neither the name PX4 nor the names of its contributors may be +# used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +############################################################################ + +px4_add_functional_gtest(SRC SubscriptionTest.cpp LINKLIBS uORB) + diff --git a/platforms/common/uORB/test/SubscriptionTest.cpp b/platforms/common/uORB/test/SubscriptionTest.cpp new file mode 100644 index 000000000000..226a4869f438 --- /dev/null +++ b/platforms/common/uORB/test/SubscriptionTest.cpp @@ -0,0 +1,114 @@ +/**************************************************************************** + * + * Copyright (c) 2019-2024 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * Test for Subscription + */ + +#include +#include +#include +#include + +namespace uORB +{ +namespace test +{ + + +class SubscriptionTestable : public uORB::Subscription +{ +public: + SubscriptionTestable() : Subscription(ORB_ID(orb_test), 0) + { + } + + void setNodeValue(void *node) + { + _node = node; + + } + void *getNodeValue() + { + return _node; + } + +}; + + +class SubscriptionTest : public ::testing::Test +{ +protected: + SubscriptionTestable testable; + + static void SetUpTestSuite() + { + uORB::Manager::initialize(); + + orb_test_s message{}; + orb_advertise(ORB_ID(orb_test), &message); + + } + static void TearDownTestSuite() + { + uORB::Manager::terminate(); + } + + void TearDown() override + { + testable.setNodeValue(nullptr); + } + + +}; + +TEST_F(SubscriptionTest, updateWhenSubscribedThenNotSubscribedTwice) +{ + int anyValue = 1; + testable.setNodeValue(&anyValue); + + testable.updated(); + + ASSERT_EQ(testable.getNodeValue(), &anyValue) << "Original node value don't have to be overrwiten"; +} + +TEST_F(SubscriptionTest, updateWhenNotSubscribedThenSubscribed) +{ + testable.setNodeValue(nullptr); + + testable.updated(); + + ASSERT_NE(testable.getNodeValue(), nullptr) << "Node value after 'updated' have to be initialized"; +} +} +}