diff --git a/datapoollocal/LocalPoolVector.h b/datapoollocal/LocalPoolVector.h index ce3b1a14..a28fe327 100644 --- a/datapoollocal/LocalPoolVector.h +++ b/datapoollocal/LocalPoolVector.h @@ -100,8 +100,8 @@ public: return vectorSize; } - T& operator [](int i); - const T &operator [](int i) const; + T& operator [](size_t i); + const T &operator [](size_t i) const; virtual ReturnValue_t serialize(uint8_t** buffer, size_t* size, const size_t maxSize, @@ -126,6 +126,7 @@ public: ReturnValue_t read(MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING, uint32_t timeoutMs = 20) override; + /** * @brief The commit call copies the array values back to the data pool. * @details diff --git a/datapoollocal/LocalPoolVector.tpp b/datapoollocal/LocalPoolVector.tpp index ce68982b..6612a491 100644 --- a/datapoollocal/LocalPoolVector.tpp +++ b/datapoollocal/LocalPoolVector.tpp @@ -91,8 +91,8 @@ inline ReturnValue_t LocalPoolVector::commitWithoutLock() { } template -inline T& LocalPoolVector::operator [](int i) { - if(i <= vectorSize) { +inline T& LocalPoolVector::operator [](size_t i) { + if(i < vectorSize) { return value[i]; } // If this happens, I have to set some value. I consider this @@ -100,13 +100,16 @@ inline T& LocalPoolVector::operator [](int i) { #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::error << "LocalPoolVector: Invalid index. Setting or returning" " last value!" << std::endl; +#else + fsfw::printError("LocalPoolVector: Invalid index. Setting or returning" + " last value!\n\r"); #endif - return value[i]; + return value[vectorSize]; } template -inline const T& LocalPoolVector::operator [](int i) const { - if(i <= vectorSize) { +inline const T& LocalPoolVector::operator [](size_t i) const { + if(i < vectorSize) { return value[i]; } // If this happens, I have to set some value. I consider this @@ -114,8 +117,11 @@ inline const T& LocalPoolVector::operator [](int i) const { #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::error << "LocalPoolVector: Invalid index. Setting or returning" " last value!" << std::endl; +#else + fsfw::printError("LocalPoolVector: Invalid index. Setting or returning" + " last value!\n\r"); #endif - return value[i]; + return value[vectorSize]; } template diff --git a/unittest/tests/datapoollocal/LocalPoolVectorTest.cpp b/unittest/tests/datapoollocal/LocalPoolVectorTest.cpp index 188011df..7e40e898 100644 --- a/unittest/tests/datapoollocal/LocalPoolVectorTest.cpp +++ b/unittest/tests/datapoollocal/LocalPoolVectorTest.cpp @@ -16,7 +16,7 @@ TEST_CASE("LocalPoolVector" , "[LocPoolVecTest]") { // very basic test. lp_vec_t testVector = lp_vec_t( objects::TEST_LOCAL_POOL_OWNER_BASE, lpool::uint16Vec3Id); - CHECK(testVector.read() == retval::CATCH_OK); + REQUIRE(testVector.read() == retval::CATCH_OK); testVector.value[0] = 5; testVector.value[1] = 232; testVector.value[2] = 32023; @@ -32,6 +32,38 @@ TEST_CASE("LocalPoolVector" , "[LocPoolVecTest]") { CHECK(testVector.value[0] == 5); CHECK(testVector.value[1] == 232); CHECK(testVector.value[2] == 32023); + + CHECK(testVector[0] == 5); + + // This is invalid access, so the last value will be set instead. + // (we can't throw exceptions) + testVector[4] = 12; + CHECK(testVector[3] == 12); + CHECK(testVector.commit() == retval::CATCH_OK); + + // Use read-only reference. + const lp_vec_t& roTestVec = testVector; + uint16_t valueOne = roTestVec[0]; + CHECK(valueOne == 5); + + uint16_t lastVal = roTestVec[25]; + CHECK(lastVal == 12); + } + + SECTION("ErrorHandling") { + // not try to use a local pool variable which does not exist + lp_vec_t invalidVector = lp_vec_t( + objects::TEST_LOCAL_POOL_OWNER_BASE, 0xffffffff); + REQUIRE(invalidVector.read() == + static_cast(HasLocalDataPoolIF::POOL_ENTRY_NOT_FOUND)); + REQUIRE(invalidVector.commit() == + static_cast(HasLocalDataPoolIF::POOL_ENTRY_NOT_FOUND)); + + // now try to access with wrong type + lp_vec_t invalidVector2 = lp_vec_t( + objects::TEST_LOCAL_POOL_OWNER_BASE, lpool::uint16Vec3Id); + REQUIRE(invalidVector2.read() == + static_cast(HasLocalDataPoolIF::POOL_ENTRY_TYPE_CONFLICT)); } }