<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>