This is an automated email from the ASF dual-hosted git repository. lupyuen pushed a commit to branch releases/12.7 in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git
commit 83fc4e2abac4e944fba987e12a2b51cd3c6af2c7 Author: dongjiuzhu1 <dongjiuz...@xiaomi.com> AuthorDate: Sun Apr 21 15:04:31 2024 +0800 system/uorb: fix memory leak report by coverity nsh> uorb_unit_test uORB note: try single-topic support uORB note: PASS single-topic test uORB note: PASS orb 10-instances uORB note: try multi-topic support uORB note: ---------------- LATENCY TEST ------------------ mean: 0 us std dev: 0 us min: 0 us max: 0 us missed topic updates: 0 uORB note: PASS multi-topic test uORB note: try multi-topic support subscribing before publishing uORB note: PASS multi-topic reversed uORB note: Testing unadvertise uORB note: Testing multi-topic 2 test (queue simulation) uORB note: PASS multi-topic 2 test (queue simulation) uORB note: Testing orb queuing uORB note: Testing to write some elements... uORB note: Testing overflow... uORB note: Testing underflow... uORB note: PASS orb queuing uORB note: Testing orb queuing (poll & notify) PASS Signed-off-by: dongjiuzhu1 <dongjiuz...@xiaomi.com> --- system/uorb/test/unit_test.c | 165 ++++++++++++++++++++++++++++++++----------- 1 file changed, 123 insertions(+), 42 deletions(-) diff --git a/system/uorb/test/unit_test.c b/system/uorb/test/unit_test.c index fc8d340e2..901d0a794 100644 --- a/system/uorb/test/unit_test.c +++ b/system/uorb/test/unit_test.c @@ -194,6 +194,7 @@ static int latency_test(bool print) struct orb_test_medium_s sample; pthread_t pubsub_task; int instance = 0; + int ret = ERROR; int fd; test_note("---------------- LATENCY TEST ------------------"); @@ -213,7 +214,8 @@ static int latency_test(bool print) if (pthread_create(&pubsub_task, NULL, pubsubtest_thread_entry, NULL) < 0) { - return test_fail("failed launching task"); + test_fail("failed launching task"); + goto out; } /* give the test task some data */ @@ -224,7 +226,8 @@ static int latency_test(bool print) sample.timestamp = orb_absolute_time(); if (OK != orb_publish(ORB_ID(orb_test_medium), fd, &sample)) { - return test_fail("mult. pub0 timing fail"); + test_fail("mult. pub0 timing fail"); + goto out; } usleep(1000); /* simulate >800 Hz system operation */ @@ -232,11 +235,15 @@ static int latency_test(bool print) if (pubsub_task < 0) { - return test_fail("failed launching task"); + test_fail("failed launching task"); + goto out; } + ret = OK; + +out: orb_unadvertise(fd); - return g_pubsubtest_res; + return ret < 0 ? ret : g_pubsubtest_res; } static int test_single(void) @@ -247,7 +254,7 @@ static int test_single(void) bool updated; int afd; int sfd; - int ret; + int ret = ERROR; test_note("try single-topic support"); @@ -265,6 +272,7 @@ static int test_single(void) sfd = orb_subscribe(ORB_ID(orb_test)); if (sfd < 0) { + orb_unadvertise(afd); return test_fail("subscribe failed: %d", errno); } @@ -274,23 +282,27 @@ static int test_single(void) if (OK != orb_copy(ORB_ID(orb_test), sfd, &sub_sample)) { - return test_fail("copy(1) failed: %d", errno); + test_fail("copy(1) failed: %d", errno); + goto out; } if (sample.val != sub_sample.val) { - return test_fail("copy(1) mismatch: %d expected %d", - sub_sample.val, sample.val); + test_fail("copy(1) mismatch: %d expected %d", + sub_sample.val, sample.val); + goto out; } if (OK != orb_check(sfd, &updated)) { - return test_fail("check(1) failed"); + test_fail("check(1) failed"); + goto out; } if (updated) { - return test_fail("spurious updated flag"); + test_fail("spurious updated flag"); + goto out; } /* check second publish */ @@ -299,45 +311,56 @@ static int test_single(void) if (OK != orb_publish(ORB_ID(orb_test), afd, &sample)) { - return test_fail("publish failed"); + test_fail("publish failed"); + goto out; } if (OK != orb_check(sfd, &updated)) { - return test_fail("check(2) failed"); + test_fail("check(2) failed"); + goto out; } if (!updated) { - return test_fail("missing updated flag"); + test_fail("missing updated flag"); + goto out; } if (OK != orb_copy(ORB_ID(orb_test), sfd, &sub_sample)) { - return test_fail("copy(2) failed: %d", errno); + test_fail("copy(2) failed: %d", errno); + goto out; } if (sample.val != sub_sample.val) { - return test_fail("copy(2) mismatch: %d expected %d", - sub_sample.val, sample.val); + test_fail("copy(2) mismatch: %d expected %d", + sub_sample.val, sample.val); + goto out; } /* unadvertise and out */ +out: ret = orb_unadvertise(afd); if (ret != OK) { - return test_fail("orb_unadvertise failed: %i", ret); + test_fail("orb_unadvertise failed: %i", ret); } ret = orb_unsubscribe(sfd); if (ret != OK) { - return test_fail("orb_unsubscribe failed: %i", ret); + test_fail("orb_unsubscribe failed: %i", ret); } - return test_note("PASS single-topic test"); + if (ret == OK) + { + test_note("PASS single-topic test"); + } + + return ret; } static int test_multi_inst10(void) @@ -345,6 +368,7 @@ static int test_multi_inst10(void) const int max_inst = 10; int sfd[max_inst]; int afd[max_inst]; + int ret = ERROR; int i; int j; @@ -359,7 +383,8 @@ static int test_multi_inst10(void) { if (OK == orb_exists(ORB_ID(orb_test), i)) { - return test_fail("sub %d is advertised", i); + test_fail("sub %d is advertised", i); + goto out_with_sfd; } } @@ -369,9 +394,16 @@ static int test_multi_inst10(void) { afd[i] = orb_advertise_multi_queue_persist(ORB_ID(orb_test), NULL, &i, 1); + } + + /* verify advertised yet */ + + for (i = 0; i < max_inst; i++) + { if (OK != orb_exists(ORB_ID(orb_test), i)) { - return test_fail("sub %d advertise failed", i); + test_fail("sub %d advertise failed", i); + goto out_with_sfd; } } @@ -401,7 +433,8 @@ static int test_multi_inst10(void) orb_check(sfd[sub_instance], &updated); if (!updated) { - return test_fail("sub %d not updated", sub_instance); + test_fail("sub %d not updated", sub_instance); + goto out; } else { @@ -409,14 +442,16 @@ static int test_multi_inst10(void) if (orb_copy(ORB_ID(orb_test), sfd[sub_instance], &sample)) { - return test_fail("sub %d copy failed", sub_instance); + test_fail("sub %d copy failed", sub_instance); + goto out; } else { if (sample.val != (j * sub_instance + i)) { - return test_fail("sub %d invalid value %d", - sub_instance, sample.val); + test_fail("sub %d invalid value %d", + sub_instance, sample.val); + goto out; } } } @@ -424,14 +459,26 @@ static int test_multi_inst10(void) } } - /* force unsubscribe all, then repeat */ + ret = OK; +out: + for (i = 0; i < max_inst; i++) + { + orb_unadvertise(afd[i]); + } + +out_with_sfd: for (i = 0; i < max_inst; i++) { orb_unsubscribe(sfd[i]); } - return test_note("PASS orb 10-instances"); + if (ret == OK) + { + test_note("PASS orb 10-instances"); + } + + return ret; } static int test_multi(int *afds, int *sfds) @@ -671,6 +718,7 @@ static int test_multi2(void) struct sched_param param; pthread_attr_t attr; pthread_t pubsub_task; + int ret = ERROR; int i; test_note("Testing multi-topic 2 test (queue simulation)"); @@ -693,7 +741,8 @@ static int test_multi2(void) if (pthread_create(&pubsub_task, &attr, pub_test_multi2_entry, NULL) < 0) { pthread_attr_destroy(&attr); - return test_fail("failed launching task"); + test_fail("failed launching task"); + goto out; } pthread_attr_destroy(&attr); @@ -718,13 +767,15 @@ static int test_multi2(void) if (OK != orb_copy(ORB_ID(orb_test_medium_multi), orb_data_cur_fd, &msg)) { - return test_fail("copy failed: %d", errno); + test_fail("copy failed: %d", errno); + goto out; } if (last_time >= msg.timestamp && last_time != 0) { - return test_fail("Timestamp not increasing! (%" PRIu64 - " >= %" PRIu64 ")", last_time, msg.timestamp); + test_fail("Timestamp not increasing! (%" PRIu64 + " >= %" PRIu64 ")", last_time, msg.timestamp); + goto out; } last_time = msg.timestamp; @@ -732,12 +783,20 @@ static int test_multi2(void) } } + ret = OK; + +out: for (i = 0; i < num_instances; ++i) { orb_unsubscribe(orb_data_fd[i]); } - return test_note("PASS multi-topic 2 test (queue simulation)"); + if (ret == OK) + { + test_note("PASS multi-topic 2 test (queue simulation)"); + } + + return ret; } int test_queue(void) @@ -750,6 +809,7 @@ int test_queue(void) int instance = 0; int ptopic; int sfd; + int ret = ERROR; int i; test_note("Testing orb queuing"); @@ -779,52 +839,60 @@ int test_queue(void) ORB_ID(orb_test_medium_queue), &sample, &instance, queue_size); if (ptopic < 0) { + orb_unsubscribe(sfd); return test_fail("advertise failed: %d", errno); } orb_check(sfd, &updated); if (!updated) { - return test_fail("update flag not set"); + test_fail("update flag not set"); + goto out; } if (OK != orb_copy(ORB_ID(orb_test_medium_queue), sfd, &sub_sample)) { - return test_fail("copy(1) failed: %d", errno); + test_fail("copy(1) failed: %d", errno); + goto out; } if (sub_sample.val != sample.val) { - return test_fail("copy(1) mismatch: %d expected %d", - sub_sample.val, sample.val); + test_fail("copy(1) mismatch: %d expected %d", + sub_sample.val, sample.val); + goto out; } orb_check(sfd, &updated); if (updated) { - return test_fail("spurious updated flag"); + test_fail("spurious updated flag"); + goto out; } #define CHECK_UPDATED(element) \ orb_check(sfd, &updated); \ if (!updated) \ { \ - return test_fail("update flag not set, element %i", element); \ + test_fail("update flag not set, element %i", element); \ + goto out; \ } #define CHECK_NOT_UPDATED(element) \ orb_check(sfd, &updated); \ if (updated) \ { \ - return test_fail("update flag set, element %i", element); \ + test_fail("update flag set, element %i", element); \ + goto out; \ } #define CHECK_COPY(i_got, i_correct) \ orb_copy(ORB_ID(orb_test_medium_queue), sfd, &sub_sample); \ if (i_got != i_correct) \ { \ - return test_fail("got wrong element from the queue (got %i," \ - "should be %i)", i_got, i_correct); \ + test_fail("got wrong element from the queue (got %i," \ + "should be %i)", i_got, i_correct); \ + goto out; \ } /* no messages in the queue anymore */ @@ -880,10 +948,18 @@ int test_queue(void) #undef CHECK_UPDATED #undef CHECK_NOT_UPDATED + ret = OK; + +out: orb_unadvertise(ptopic); orb_unsubscribe(sfd); - return test_note("PASS orb queuing"); + if (ret == OK) + { + test_note("PASS orb queuing"); + } + + return ret; } static FAR void *pub_test_queue_entry(FAR void *arg) @@ -973,6 +1049,7 @@ static int test_queue_poll_notify(void) if (pthread_create(&pubsub_task, &attr, pub_test_queue_entry, NULL) < 0) { + orb_unsubscribe(sfd); pthread_attr_destroy(&attr); return test_fail("failed test queue task"); } @@ -994,10 +1071,12 @@ static int test_queue_poll_notify(void) break; } + orb_unsubscribe(sfd); return test_fail("poll timeout"); } else if (poll_ret < 0 && errno != EINTR) { + orb_unsubscribe(sfd); return test_fail("poll error (%d, %d)", poll_ret, errno); } @@ -1006,6 +1085,7 @@ static int test_queue_poll_notify(void) orb_copy(ORB_ID(orb_test_medium_queue_poll), sfd, &t); if (next_expected_val != t.val) { + orb_unsubscribe(sfd); return test_fail("copy mismatch: %d expected %d", t.val, next_expected_val); } @@ -1016,6 +1096,7 @@ static int test_queue_poll_notify(void) if (g_num_messages_sent != next_expected_val) { + orb_unsubscribe(sfd); return test_fail("number of sent and received messages mismatch" " (sent: %i, received: %i)", g_num_messages_sent, next_expected_val);