<div dir="ltr"><div dir="ltr"><font color="#9900ff">>><br>>> The CAN framework has minimal Rx implementation, so to test loopback<br>>> driver the test application is modified to write and read atomically<br>>> ---<br>>> testsuites/libtests/can01/init.c | 71 ++++++++++++++------------------<br>>> 1 file changed, 31 insertions(+), 40 deletions(-)<br>>><br>>> diff --git a/testsuites/libtests/can01/init.c b/testsuites/libtests/can01/init.c<br>>> index 0675fe606f..f70e68fb51 100644<br>>> --- a/testsuites/libtests/can01/init.c<br>>> +++ b/testsuites/libtests/can01/init.c<br>>> @@ -48,7 +48,7 @@<br>>> if (c3 == '9') { \<br>>> if (c2 == 'z') { \<br>>> if (c1 == 'z') { \<br>>> - printf("not enough task letters for names !!!\n"); \<br>>> + CAN_ERR("not enough task letters for names !!!\n"); \<br>><br>>I don't think the print statements need to be macro'd in your test, so<br>>long as they only get printed when the test fails. When it's passing,<br>>then we would prefer it be quiet.</font><br><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div>The CAN_ERR expands to printing the file name, line number, thread id and error message.</div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px">Can we have this information printed by expanded macro or change to printf?<br><br></blockquote></div><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, 15 Dec 2022 at 02:57, Gedare Bloom <<a href="mailto:gedare@rtems.org" target="_blank">gedare@rtems.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Sat, Dec 3, 2022 at 2:02 AM Prashanth S <<a href="mailto:fishesprashanth@gmail.com" target="_blank">fishesprashanth@gmail.com</a>> wrote:<br>
><br>
> The CAN framework has minimal Rx implementation, so to test loopback<br>
> driver the test application is modified to write and read atomically<br>
> ---<br>
> testsuites/libtests/can01/init.c | 71 ++++++++++++++------------------<br>
> 1 file changed, 31 insertions(+), 40 deletions(-)<br>
><br>
> diff --git a/testsuites/libtests/can01/init.c b/testsuites/libtests/can01/init.c<br>
> index 0675fe606f..f70e68fb51 100644<br>
> --- a/testsuites/libtests/can01/init.c<br>
> +++ b/testsuites/libtests/can01/init.c<br>
> @@ -48,7 +48,7 @@<br>
> if (c3 == '9') { \<br>
> if (c2 == 'z') { \<br>
> if (c1 == 'z') { \<br>
> - printf("not enough task letters for names !!!\n"); \<br>
> + CAN_ERR("not enough task letters for names !!!\n"); \<br>
<br>
I don't think the print statements need to be macro'd in your test, so<br>
long as they only get printed when the test fails. When it's passing,<br>
then we would prefer it be quiet.<br>
<br>
> exit( 1 ); \<br>
> } else \<br>
> c1++; \<br>
> @@ -63,6 +63,10 @@<br>
> else \<br>
> c4++ \<br>
><br>
> +struct test_thread {<br>
> + rtems_mutex mutex;<br>
> +};<br>
> +<br>
> static void test_task(rtems_task_argument);<br>
> int can_loopback_init(const char *);<br>
> int create_task(int);<br>
> @@ -70,60 +74,54 @@ int create_task(int);<br>
> static rtems_id task_id[TASKS];<br>
> static rtems_id task_test_status[TASKS] = {[0 ... (TASKS - 1)] = false};<br>
><br>
> +static struct test_thread thread;<br>
> +<br>
> const char rtems_test_name[] = "CAN test TX, RX with CAN loopback driver";<br>
><br>
> -/*FIXME: Should Implement one more test application for the<br>
> - * RTR support<br>
> - *<br>
> - * For testing, the number of successful read and write<br>
> - * count is verified.<br>
> - */<br>
> static void test_task(rtems_task_argument data)<br>
> {<br>
> - //sleep so that other tasks will be created.<br>
> sleep(1);<br>
><br>
> int fd, task_num = (uint32_t)data;<br>
> uint32_t count = 0, msg_size;<br>
><br>
> - struct can_msg msg;<br>
> + struct can_msg send_msg, recv_msg;<br>
><br>
> printf("CAN tx and rx for %s\n", CAN_DEV_FILE);<br>
><br>
> fd = open(CAN_DEV_FILE, O_RDWR);<br>
> if (fd < 0) {<br>
> - printf("open error: task = %u %s: %s\n", task_num, CAN_DEV_FILE, strerror(errno));<br>
> + CAN_ERR("open error: task = %u %s: %s\n", task_num, CAN_DEV_FILE, strerror(errno));<br>
> }<br>
><br>
> rtems_test_assert(fd >= 0);<br>
><br>
> for (int i = 0; i < NUM_TEST_MSGS; i++) {<br>
> - printf("test_task %u\n", task_num);<br>
> -<br>
> - <a href="http://msg.id" rel="noreferrer" target="_blank">msg.id</a> = task_num;<br>
> - //FIXME: Implement Test cases for other flags also.<br>
> - msg.flags = 0;<br>
> - msg.len = (i + 1) % 9;<br>
> + <a href="http://send_msg.id" rel="noreferrer" target="_blank">send_msg.id</a> = task_num;<br>
> + send_msg.flags = 0;<br>
> + send_msg.len = (i + 1) % 9;<br>
><br>
> - for (int j = 0; j < msg.len; j++) {<br>
> - msg.data[j] = 'a' + j;<br>
> + for (int j = 0; j < send_msg.len; j++) {<br>
> + send_msg.data[j] = 'a' + j;<br>
> }<br>
><br>
> - msg_size = ((char *)&msg.data[msg.len] - (char *)&msg);<br>
> + msg_size = ((char *)&send_msg.data[send_msg.len] - (char *)&send_msg);<br>
><br>
> - printf("calling write task = %u\n", task_num);<br>
> + rtems_mutex_lock(&thread.mutex);<br>
><br>
> - count = write(fd, &msg, sizeof(msg));<br>
> + count = write(fd, &send_msg, sizeof(send_msg));<br>
> rtems_test_assert(count == msg_size);<br>
> - printf("task = %u write count = %u\n", task_num, count);<br>
><br>
> - printf("calling read task = %u\n", task_num);<br>
> - count = read(fd, &msg, sizeof(msg));<br>
> - rtems_test_assert(count > 0);<br>
> - printf("task = %u read count = %u\n", task_num, count);<br>
> + count = read(fd, &recv_msg, sizeof(recv_msg));<br>
> + rtems_test_assert(send_msg.len == recv_msg.len);<br>
> +<br>
> + for (int i = 0; i < recv_msg.len; i++) {<br>
> + rtems_test_assert(send_msg.data[i] == recv_msg.data[i]);<br>
> + }<br>
><br>
> - printf("received message\n");<br>
> - can_print_msg(&msg);<br>
> + rtems_mutex_unlock(&thread.mutex);<br>
> +<br>
> + can_print_msg(&recv_msg);<br>
><br>
> sleep(1);<br>
> }<br>
> @@ -131,14 +129,11 @@ static void test_task(rtems_task_argument data)<br>
><br>
> task_test_status[task_num] = true;<br>
><br>
> - printf("task exited = %u\n", task_num);<br>
> rtems_task_exit();<br>
> }<br>
><br>
> int create_task(int i)<br>
> {<br>
> - printf("Creating task %d\n", i);<br>
> -<br>
> rtems_status_code result;<br>
> rtems_name name;<br>
><br>
> @@ -156,21 +151,18 @@ int create_task(int i)<br>
> RTEMS_FIFO | RTEMS_FLOATING_POINT,<br>
> &task_id[i]);<br>
> if (result != RTEMS_SUCCESSFUL) {<br>
> - printf("rtems_task_create error: %s\n", rtems_status_text(result));<br>
> + CAN_ERR("rtems_task_create error: %s\n", rtems_status_text(result));<br>
> rtems_test_assert(result == RTEMS_SUCCESSFUL);<br>
> }<br>
><br>
> - printf("number = %3" PRIi32 ", id = %08" PRIxrtems_id ", starting, ", i, task_id[i]);<br>
> -<br>
> fflush(stdout);<br>
><br>
> - printf("starting task\n");<br>
> result = rtems_task_start(task_id[i],<br>
> test_task,<br>
> (rtems_task_argument)i);<br>
><br>
> if (result != RTEMS_SUCCESSFUL) {<br>
> - printf("rtems_task_start failed %s\n", rtems_status_text(result));<br>
> + CAN_ERR("rtems_task_start failed %s\n", rtems_status_text(result));<br>
> rtems_test_assert(result == RTEMS_SUCCESSFUL);<br>
> }<br>
><br>
> @@ -183,8 +175,6 @@ static rtems_task Init(<br>
> rtems_task_argument ignored<br>
> )<br>
> {<br>
> - printf("Init\n");<br>
> -<br>
> int ret;<br>
><br>
> rtems_print_printer_fprintf_putc(&rtems_test_printer);<br>
> @@ -199,10 +189,12 @@ static rtems_task Init(<br>
><br>
> ret = can_loopback_init(CAN_DEV_FILE);<br>
> if (ret != RTEMS_SUCCESSFUL) {<br>
> - printf("%s failed\n", rtems_test_name);<br>
> + CAN_ERR("%s failed\n", rtems_test_name);<br>
> rtems_test_assert(ret == RTEMS_SUCCESSFUL);<br>
> }<br>
><br>
> + rtems_mutex_init(&thread.mutex, "CAN test");<br>
> +<br>
> for (int i = 0; i < TASKS; i++) {<br>
> create_task(i);<br>
> }<br>
> @@ -212,7 +204,6 @@ static rtems_task Init(<br>
> int flag = 0;<br>
> for (int i = 0; i < TASKS; i++) {<br>
> if (task_test_status[i] == false) {<br>
> - printf("task not exited = %d\n", i);<br>
> sleep(1);<br>
> flag = 1;<br>
> break;<br>
> --<br>
> 2.25.1<br>
><br>
> _______________________________________________<br>
> devel mailing list<br>
> <a href="mailto:devel@rtems.org" target="_blank">devel@rtems.org</a><br>
> <a href="http://lists.rtems.org/mailman/listinfo/devel" rel="noreferrer" target="_blank">http://lists.rtems.org/mailman/listinfo/devel</a><br>
</blockquote></div></div>