mdstest for overload
- 2 senders overload one receivers
- one sender overloads 2 receivers

mdstest for SNA (Serial Number Arithmetic)
- without overload, mds sender gradually sends more than 65535 messages
  and receivers should receive them all
- with overload, mds sender sends a burst of greater than 65535 messages
  and receivers should receive them all

mdstest for #1960 backward compatibility, in order to test the txprob timer
- sender enables, receiver disables
- sender disables, receiver enables
---
 src/mds/apitest/mdstipc.h     |   6 +
 src/mds/apitest/mdstipc_api.c | 743 +++++++++++++++++++++++++---------
 2 files changed, 553 insertions(+), 196 deletions(-)

diff --git a/src/mds/apitest/mdstipc.h b/src/mds/apitest/mdstipc.h
index 2bd44b4fa..5fd7b9c6e 100644
--- a/src/mds/apitest/mdstipc.h
+++ b/src/mds/apitest/mdstipc.h
@@ -145,6 +145,12 @@ typedef struct tet_mds_recvd_msg_info {
   uint16_t len;
 } TET_MDS_RECVD_MSG_INFO;
 
+typedef struct COUNTER {
+  MDS_DEST fr_dest;
+  uint32_t msg_count;
+  struct COUNTER *next;
+} COUNTER;
+
 /********************* GLOBAL variables ********************/
 TET_ADEST gl_tet_adest;
 TET_VDEST
diff --git a/src/mds/apitest/mdstipc_api.c b/src/mds/apitest/mdstipc_api.c
index f667d7385..4f6a4e14c 100644
--- a/src/mds/apitest/mdstipc_api.c
+++ b/src/mds/apitest/mdstipc_api.c
@@ -31,6 +31,7 @@
 
 #define MSG_SIZE MDS_DIRECT_BUF_MAXSIZE
 static MDS_CLIENT_MSG_FORMAT_VER gl_set_msg_fmt_ver;
+COUNTER *gl_head_counters = NULL;
 
 MDS_SVC_ID svc_ids[3] = {2006, 2007, 2008};
 
@@ -13105,219 +13106,543 @@ void tet_create_default_PWE_VDEST_tp()
        test_validate(FAIL, 0);
 }
 
-void tet_sender(uint32_t msg_count, uint32_t msg_size)
+static void reset_counters()
 {
-       int live = 100; // sender live max 100s
-       TET_MDS_MSG *mesg;
-       if (msg_size > TET_MSG_SIZE_MIN) {
-               printf("\nSender: msg_size > TET_MSG_SIZE_MIN\n");
-               exit(1);
-       }
-       mesg = (TET_MDS_MSG *)malloc(sizeof(TET_MDS_MSG));
-       memset(mesg, 0, sizeof(TET_MDS_MSG));
+    COUNTER *tmp = gl_head_counters;
+    while(tmp != NULL) {
+        gl_head_counters = tmp->next;
+        free(tmp);
+        tmp = gl_head_counters;
+    }
+}
 
-       printf("\nStarted Sender (pid:%d) svc_id=%d\n",
-                       (int)getpid(), NCSMDS_SVC_ID_INTERNAL_MIN);
-       if (adest_get_handle() != NCSCC_RC_SUCCESS) {
-               printf("\n: Sender FAIL to get adest handle\n");
-               exit(1);
-       }
+static uint32_t increase_counters(MDS_DEST dest)
+{
+    COUNTER *tmp = gl_head_counters;
+    while(tmp != NULL) {
+        if (tmp->fr_dest == dest) {
+            tmp->msg_count++;
+            printf("\nGot %d message from %x\n",
+                tmp->msg_count, dest);
+            return tmp->msg_count;
+        }
+        tmp = tmp->next;
+    }
+    if (tmp == NULL) {
+        COUNTER *new = (COUNTER *)malloc(sizeof(COUNTER));
+        new->fr_dest = dest;
+        new->msg_count = 1;
+        new->next = gl_head_counters;
+        gl_head_counters = new;
+        printf("\nGot %d message from %x\n",
+            new->msg_count, dest);
+        return new->msg_count;
+    }
+    return 0;
+}
 
-       if (mds_service_install(gl_tet_adest.mds_pwe1_hdl,
-                               NCSMDS_SVC_ID_INTERNAL_MIN, 1,
-                               NCSMDS_SCOPE_NONE, false, false) != 
NCSCC_RC_SUCCESS) {
-               printf("\nSender FAIL to install the service\n");
-               exit(1);
-       }
+static bool verify_counters(uint32_t expect_num)
+{
+    COUNTER *tmp = gl_head_counters;
+    if (tmp == NULL) {
+        printf("\nNo message\n");
+        return false;
+    }
+    while(tmp != NULL) {
+        if (tmp->msg_count != expect_num) {
+            printf("\nGot %d message from %x\n",
+                tmp->msg_count, tmp->fr_dest);
+            return false;
+        }
+        tmp = tmp->next;
+    }
+    return true;
+}
 
-       MDS_SVC_ID svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN};
-       if (mds_service_subscribe(
-               gl_tet_adest.mds_pwe1_hdl, NCSMDS_SVC_ID_INTERNAL_MIN,
-               NCSMDS_SCOPE_INTRANODE, 1, svcids) != NCSCC_RC_SUCCESS) {
-               printf("\nSender FAIL to subscribe receiver\n");
-               exit(1);
-       }
+void tet_sender(MDS_SVC_ID svc_id, uint32_t msg_count, uint32_t msg_size,
+                int svc_num, MDS_SVC_ID to_svcids[],
+                uint32_t live_time)
+{
+    TET_MDS_MSG *mesg;
+    if (msg_size > TET_MSG_SIZE_MIN) {
+        printf("\nSender: msg_size > TET_MSG_SIZE_MIN\n");
+        exit(1);
+    }
+    mesg = (TET_MDS_MSG *)malloc(sizeof(TET_MDS_MSG));
+    memset(mesg, 0, sizeof(TET_MDS_MSG));
+
+    printf("\nStarted Sender (pid:%d) svc_id=%d\n",
+            (int)getpid(), svc_id);
+    if (adest_get_handle() != NCSCC_RC_SUCCESS) {
+        printf("\n: Sender FAIL to get adest handle\n");
+        exit(1);
+    }
 
-       while (!gl_tet_adest.svc[0].svcevt[0].dest && live-- > 0) {
-               printf("\nSender is waiting for receiver UP\n");
-               sleep(1);
-       }
-       printf("\nSender got last event=%d of svc_id=%d dest=<%llx>\n",
-                       gl_tet_adest.svc[0].svcevt[0].event,
-                       gl_tet_adest.svc[0].svcevt[0].svc_id,
-                       gl_tet_adest.svc[0].svcevt[0].dest);
+    if (mds_service_install(gl_tet_adest.mds_pwe1_hdl,
+                svc_id, 1,
+                NCSMDS_SCOPE_NONE, false, false) != NCSCC_RC_SUCCESS) {
+        printf("\nSender FAIL to install the service\n");
+        exit(1);
+    }
 
-       // wait for receiver subscribe sender
-       // otherwise, receiver won't detect loss message
-       sleep(1);
+    if (mds_service_subscribe(
+        gl_tet_adest.mds_pwe1_hdl, svc_id,
+        NCSMDS_SCOPE_INTRANODE,
+        svc_num, to_svcids) != NCSCC_RC_SUCCESS) {
+        printf("\nSender FAIL to subscribe receiver\n");
+        exit(1);
+    }
 
-       for (uint32_t i = 1; i <= msg_count; i++) {
-               /* to verify received correct order */
-               memset(mesg->send_data, 'X', msg_size);
-               sprintf(mesg->send_data, "%u", i);
-               mesg->send_len = msg_size;
-               if (mds_just_send(gl_tet_adest.mds_pwe1_hdl,
-                                 NCSMDS_SVC_ID_INTERNAL_MIN,
-                                 NCSMDS_SVC_ID_EXTERNAL_MIN,
-                                 gl_tet_adest.svc[0].svcevt[0].dest,
-                                 MDS_SEND_PRIORITY_HIGH,
-                                 mesg) != NCSCC_RC_SUCCESS) {
-                       printf("\nSender FAIL send message\n");
-                       exit(1);
-               } else {
-                       printf("\nSender SENT message %d successfully\n", i);
-               }
-       }
-       free(mesg);
-       while (live-- > 0) {
-               // Keep sender alive for retransmission
-               sleep(1);
-       }
+    while (live_time-- > 0) {
+        int count = 0;
+        printf("\nSender is waiting for receiver UP\n");
+        for (int i = 0; i < gl_tet_adest.svc[0].subscr_count; i++) {
+            if (gl_tet_adest.svc[0].svcevt[i].dest) {
+                count++;
+            }
+        }
+        if (count == svc_num) {
+            printf("\nAll %d receivers are UP\n", count);
+            break;
+        }
+        sleep(1);
+    }
+
+    // wait for receiver subscribe sender
+    // otherwise, receiver won't detect loss message
+    sleep(5);
+
+    for (uint32_t i = 1; i <= msg_count; i++) {
+        /* to verify received correct order */
+        memset(mesg->send_data, 'X', msg_size);
+        sprintf(mesg->send_data, "%u", i);
+        mesg->send_len = msg_size;
+        for (int j = 0; j < gl_tet_adest.svc[0].subscr_count; j++) {
+            if (mds_just_send(gl_tet_adest.mds_pwe1_hdl,
+                      svc_id,
+                      to_svcids[j],
+                      gl_tet_adest.svc[0].svcevt[j].dest,
+                      MDS_SEND_PRIORITY_HIGH,
+                      mesg) != NCSCC_RC_SUCCESS) {
+                printf("\nSender FAIL send message\n");
+                exit(1);
+            } else {
+                printf("\nSender SENT message %d successfully\n", i);
+            }
+        }
+    }
+    free(mesg);
+    while (live_time-- > 0) {
+        // Keep sender alive for retransmission
+        sleep(1);
+    }
 }
 
-bool tet_receiver(uint32_t msg_count, uint32_t msg_size)
+int tet_receiver(MDS_SVC_ID svc_id, uint32_t msg_count,
+                uint32_t msg_size, int svc_num, MDS_SVC_ID fr_svcids[])
 {
-       if (msg_size > TET_MSG_SIZE_MIN) {
-               printf("\nReceiver: msg_size > TET_MSG_SIZE_MIN\n");
-               return 1;
-       }
-       printf("\nStarted Receiver (pid:%d) svc_id=%d\n",
-                       (int)getpid(), NCSMDS_SVC_ID_EXTERNAL_MIN);
-       if (adest_get_handle() != NCSCC_RC_SUCCESS) {
-               printf("\nReceiver FAIL to get adest handle\n");
-               return 1;
-       }
+    if (msg_size > TET_MSG_SIZE_MIN) {
+        printf("\nReceiver: msg_size > TET_MSG_SIZE_MIN\n");
+        return 1;
+    }
+    printf("\nStarted Receiver (pid:%d) svc_id=%d\n",
+            (int)getpid(), svc_id);
+    if (adest_get_handle() != NCSCC_RC_SUCCESS) {
+        printf("\nReceiver FAIL to get adest handle\n");
+        return 1;
+    }
 
-       sleep(1); //Let sender subscribe before receiver install
-       if (mds_service_install(gl_tet_adest.mds_pwe1_hdl,
-                               NCSMDS_SVC_ID_EXTERNAL_MIN, 1,
-                               NCSMDS_SCOPE_NONE, true, false) != 
NCSCC_RC_SUCCESS) {
-               printf("\nReceiver FAIL to install the service\n");
-       }
-
-       MDS_SVC_ID svcids[] = {NCSMDS_SVC_ID_INTERNAL_MIN};
-       if (mds_service_subscribe(
-               gl_tet_adest.mds_pwe1_hdl, NCSMDS_SVC_ID_EXTERNAL_MIN,
-               NCSMDS_SCOPE_INTRANODE, 1, svcids) != NCSCC_RC_SUCCESS) {
-               printf("\nReceiver FAIL to subscribe sender\n");
-               exit(1);
-       }
-
-       struct pollfd sel;
-       uint32_t counter = 0;
-       char *expected_buff = malloc(msg_size);
-       memset(expected_buff, 'X', msg_size);
-       sel.fd = m_GET_FD_FROM_SEL_OBJ(gl_tet_adest.svc[0].sel_obj);
-       sel.events = POLLIN;
-       while (counter < msg_count) {
-               int ret = osaf_poll(&sel, 1, 10000);
-               if (ret > 0) {
-                       gl_rcvdmsginfo.msg = NULL;
-                       if (mds_service_retrieve(gl_tet_adest.mds_pwe1_hdl,
-                                                NCSMDS_SVC_ID_EXTERNAL_MIN,
-                                                SA_DISPATCH_ONE) != 
NCSCC_RC_SUCCESS) {
-                               printf("\nReceiver FAIL to retrieve message\n");
-                               break;
-                       }
-                       TET_MDS_MSG *msg = (TET_MDS_MSG *)gl_rcvdmsginfo.msg;
-                       if (msg != NULL) {
-                               counter++;
-                               sprintf(expected_buff, "%u", counter);
-                               if (memcmp(msg->recvd_data,
-                                           expected_buff, msg_size) != 0) {
-                                       printf("\nReceived incorrect 
message\n");
-                                       free(expected_buff);
-                                       free(msg);
-                                       return 1;
-                               }
-                               free(msg);
-                       }
-               } else {
-                       printf("\nReceiver got %d messages\n", counter);
-                       printf("\nReceiver poll FAIL\n");
-                       break;
-               }
-       }
+    sleep(1); //Let sender subscribe before receiver install
+    if (mds_service_install(gl_tet_adest.mds_pwe1_hdl,
+                svc_id, 1,
+                NCSMDS_SCOPE_NONE, true, false) != NCSCC_RC_SUCCESS) {
+        printf("\nReceiver FAIL to install the service\n");
+    }
 
-       printf("\nReceiver verify number of received messages\n");
-       if (counter != msg_count) {
-               printf("\nReceiver: Total received msg=%d"
-                               " differ expected %d\n", counter, msg_count);
-               free(expected_buff);
-               return 1;
-       }
+    if (mds_service_subscribe(
+        gl_tet_adest.mds_pwe1_hdl, svc_id,
+        NCSMDS_SCOPE_INTRANODE,
+        svc_num, fr_svcids) != NCSCC_RC_SUCCESS) {
+        printf("\nReceiver FAIL to subscribe sender\n");
+        exit(1);
+    }
+
+    struct pollfd sel;
+    uint32_t counter = 0;
+    reset_counters();
+    char *expected_buff = malloc(msg_size);
+    sel.fd = m_GET_FD_FROM_SEL_OBJ(gl_tet_adest.svc[0].sel_obj);
+    sel.events = POLLIN;
+    while (true) {
+        int ret = osaf_poll(&sel, 1, 10000);
+        if (ret > 0) {
+            gl_rcvdmsginfo.msg = NULL;
+            if (mds_service_retrieve(gl_tet_adest.mds_pwe1_hdl,
+                         svc_id,
+                         SA_DISPATCH_ONE) != NCSCC_RC_SUCCESS) {
+                printf("\nReceiver FAIL to retrieve message\n");
+                break;
+            }
+            TET_MDS_MSG *msg = (TET_MDS_MSG *)gl_rcvdmsginfo.msg;
+            if (msg != NULL) {
+                counter = increase_counters(gl_rcvdmsginfo.fr_dest);
+                memset(expected_buff, 'X', msg_size);
+                sprintf(expected_buff, "%u", counter);
+                if (memcmp(msg->recvd_data,
+                        expected_buff, msg_size) != 0) {
+                    printf("\nExpect %s but received %s from %x\n",
+                        expected_buff,
+                        msg->recvd_data,
+                        gl_rcvdmsginfo.fr_dest);
+                    free(expected_buff);
+                    free(msg);
+                    reset_counters();
+                    return 1;
+                }
+                free(msg);
+            }
+        } else {
+            break;
+        }
+    }
+
+    printf("\nReceiver verify number of received messages\n");
+    if (!verify_counters(msg_count)) {
+        printf("\nReceiver: Not get enough %d messages\n", msg_count);
+        free(expected_buff);
+        reset_counters();
+        return 1;
+    }
 
-       printf("\nEnd Receiver (pid:%d) svc_id=%d\n",
-                       (int)getpid(), NCSMDS_SVC_ID_EXTERNAL_MIN);
-       free(expected_buff);
-       return 0;
+    printf("\nEnd Receiver (pid:%d) svc_id=%d\n",
+            (int)getpid(), svc_id);
+    free(expected_buff);
+    reset_counters();
+    return 0;
 }
 
 void tet_overload_tp_1(void)
 {
-       int pid = 0;
-       int FAIL = 0;
-       uint32_t msg_count = 2000;
-       uint32_t msg_size = 50000;
-
-       printf("\nTest Case 1: Receiver wait for drop normal message"
-               " retransmit and receive all messages in order\n");
-       /*--------------------------------------------------------------------*/
-       pid = fork();
-       if (pid == 0) {
-               /* child as sender */
-               setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
-               mds_startup();
-               tet_sender(msg_count, msg_size);
-               mds_shutdown();
-       } else if (pid > 0) {
-               /* parent as receiver */
-               setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
-               mds_startup();
-               FAIL = tet_receiver(msg_count, msg_size);
-               printf("\nReceiver finish, kill Sender\n");
-               kill(pid, SIGKILL);
-               mds_shutdown();
-       } else {
-               /* fork() error */
-               printf("\nFAIL to fork()\n");
-               FAIL = 1;
-       }
+    int FAIL = 1;
+    uint32_t msg_count = 2000;
+    uint32_t msg_size = 50000; //bytes
+
+    printf("\nTest Case 1: Receiver wait for drop normal message"
+        " retransmit and receive all messages in order\n");
+    /*--------------------------------------------------------------------*/
+    pid_t pid = fork();
+    if (pid == 0) {
+        /* child as sender */
+        setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
+        mds_startup();
+        MDS_SVC_ID to_svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN};
+        MDS_SVC_ID svc_id = NCSMDS_SVC_ID_INTERNAL_MIN;
+        uint32_t live_time = 100; //seconds
+        tet_sender(svc_id, msg_count, msg_size, 1, to_svcids, live_time);
+        mds_shutdown();
+    } else if (pid > 0) {
+        /* parent as receiver */
+        setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
+        mds_startup();
+        MDS_SVC_ID fr_svcids[] = {NCSMDS_SVC_ID_INTERNAL_MIN};
+        MDS_SVC_ID svc_id = NCSMDS_SVC_ID_EXTERNAL_MIN;
+        FAIL = tet_receiver(svc_id, msg_count, msg_size, 1, fr_svcids);
+        printf("\nReceiver finish, kill Sender\n");
+        kill(pid, SIGKILL);
+        mds_shutdown();
+    } else {
+        printf("\nFAIL to fork()\n");
+    }
 
-       test_validate(FAIL, 0);
+    test_validate(FAIL, 0);
 }
 
 void tet_overload_tp_2(void)
 {
-       int pid = 0;
-       int FAIL = 0;
-       uint32_t msg_count = 1000;
-       uint32_t msg_size = 100000;
+    int FAIL = 1;
+    uint32_t msg_count = 1000;
+    uint32_t msg_size = 100000;
+
+    printf("\nTest Case 2: Receiver wait for drop fragment message"
+        " retransmit and receive all messages in order\n");
+    /*--------------------------------------------------------------------*/
+    pid_t pid = fork();
+    if (pid == 0) {
+        /* child as sender */
+        setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
+        mds_startup();
+        MDS_SVC_ID to_svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN};
+        MDS_SVC_ID svc_id = NCSMDS_SVC_ID_INTERNAL_MIN;
+        uint32_t live_time = 100; //seconds
+        tet_sender(svc_id, msg_count, msg_size, 1, to_svcids, live_time);
+        mds_shutdown();
+    } else if (pid > 0) {
+        /* parent as receiver */
+        setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
+        mds_startup();
+        MDS_SVC_ID fr_svcids[] = {NCSMDS_SVC_ID_INTERNAL_MIN};
+        MDS_SVC_ID svc_id = NCSMDS_SVC_ID_EXTERNAL_MIN;
+        FAIL = tet_receiver(svc_id, msg_count, msg_size, 1, fr_svcids);
+        kill(pid, SIGKILL);
+        mds_shutdown();
+    } else {
+        printf("\nFAIL to fork()\n");
+    }
 
-       printf("\nTest Case 2: Receiver wait for drop fragment message"
-               " retransmit and receive all messages in order\n");
-       /*--------------------------------------------------------------------*/
-       pid = fork();
-       if (pid == 0) {
-               /* child as sender */
-               setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
-               mds_startup();
-               tet_sender(msg_count, msg_size);
-               mds_shutdown();
-       } else if (pid > 0) {
-               /* parent as receiver */
-               setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
-               mds_startup();
-               FAIL = tet_receiver(msg_count, msg_size);
-               kill(pid, SIGKILL);
-               mds_shutdown();
-       } else {
-               /* fork() error */
-               printf("\nFAIL to fork()\n");
-               FAIL = 1;
-       }
+    test_validate(FAIL, 0);
+}
+
+void tet_overload_tp_3(void)
+{
+    int FAIL = 1;
+    uint32_t msg_count = 2000;
+    uint32_t msg_size = 50000;
+
+    printf("\nTest Case 3: One Receiver wait for drop normal message"
+        " retransmit and receive all messages in order from two senders\n");
+    /*--------------------------------------------------------------------*/
+    pid_t pid = fork();
+    if (pid == 0) {
+        /* child as sender */
+        pid = fork();
+        if (pid == 0) {
+            FILE *fp = fopen("/tmp/mdstest.pid", "a");
+            fprintf(fp, " %d", getpid());
+            fclose(fp);
+            setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
+            mds_startup();
+            MDS_SVC_ID to_svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN};
+            MDS_SVC_ID svc_id = NCSMDS_SVC_ID_INTERNAL_MIN;
+            uint32_t live_time = 100; //seconds
+            tet_sender(svc_id, msg_count, msg_size, 1, to_svcids, live_time);
+            mds_shutdown();
+        } else if (pid > 0) {
+            FILE *fp = fopen("/tmp/mdstest.pid", "a");
+            fprintf(fp, " %d", getpid());
+            fclose(fp);
+            setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
+            mds_startup();
+            MDS_SVC_ID to_svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN};
+            MDS_SVC_ID svc_id = NCSMDS_SVC_ID_INTERNAL_MIN+1;
+            uint32_t live_time = 100; //seconds
+            tet_sender(svc_id, msg_count, msg_size, 1, to_svcids, live_time);
+            mds_shutdown();
+        }
+    } else if (pid > 0) {
+        /* parent as receiver */
+        setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
+        mds_startup();
+        MDS_SVC_ID fr_svcids[] = {
+            NCSMDS_SVC_ID_INTERNAL_MIN,
+            NCSMDS_SVC_ID_INTERNAL_MIN+1};
+        MDS_SVC_ID svc_id = NCSMDS_SVC_ID_EXTERNAL_MIN;
+        FAIL = tet_receiver(svc_id, msg_count, msg_size, 2, fr_svcids);
+        mds_shutdown();
+    } else {
+        printf("\nFAIL to fork()\n");
+    }
+    printf("\nkill mdstest processes rc: %d\n",
+        system("kill -9 $(cat /tmp/mdstest.pid); rm -f /tmp/mdstest.pid"));
+    test_validate(FAIL, 0);
+}
+
+void tet_overload_tp_4(void)
+{
+    int FAIL = 1;
+    uint32_t msg_count = 2000;
+    uint32_t msg_size = 50000;
+
+    printf("\nTest Case 4: Two Receivers wait for drop normal message"
+        " retransmit and receive all messages in order from one sender\n");
+    /*--------------------------------------------------------------------*/
+    pid_t pid = fork();
+    if (pid == 0) {
+        /* child as sender */
+        setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
+        mds_startup();
+        MDS_SVC_ID to_svcids[] = {
+            NCSMDS_SVC_ID_EXTERNAL_MIN,
+            NCSMDS_SVC_ID_EXTERNAL_MIN+1};
+        MDS_SVC_ID svc_id = NCSMDS_SVC_ID_INTERNAL_MIN;
+        uint32_t live_time = 100; //seconds
+        tet_sender(svc_id, msg_count, msg_size, 2, to_svcids, live_time);
+        mds_shutdown();
+    } else if (pid > 0) {
+        /* parent as receiver */
+        pid_t pid2 = fork();
+        if (pid2 == 0) {
+            setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
+            mds_startup();
+            MDS_SVC_ID fr_svcids[] = {NCSMDS_SVC_ID_INTERNAL_MIN};
+            MDS_SVC_ID svc_id = NCSMDS_SVC_ID_EXTERNAL_MIN;
+            FAIL = tet_receiver(svc_id, msg_count, msg_size, 1, fr_svcids);
+            mds_shutdown();
+            exit(FAIL);
+        } else if (pid2 > 0) {
+            setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
+            mds_startup();
+            MDS_SVC_ID fr_svcids[] = {NCSMDS_SVC_ID_INTERNAL_MIN};
+            MDS_SVC_ID svc_id = NCSMDS_SVC_ID_EXTERNAL_MIN+1;
+            FAIL = tet_receiver(svc_id, msg_count, msg_size, 1, fr_svcids);
+            mds_shutdown();
+            if (FAIL == 0) {
+                int status;
+                wait(&status);
+                if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0)) {
+                    printf("\nThe other receiver FAIL\n");
+                    FAIL = 1;
+                }
+            }
+        } else {
+            printf("\nFAIL to fork()\n");
+        }
+    } else {
+        printf("\nFAIL to fork()\n");
+    }
+    kill(pid, SIGKILL);
+    test_validate(FAIL, 0);
+}
+
+void tet_mds_fctrl_compatibility_tp1(void)
+{
+    int FAIL = 1;
+    uint32_t msg_count = 100;
+    uint32_t msg_size = 50000;
+
+    printf("\nTest Case 5: Sender enable MDS FCTRL but Receiver disable\n");
+    /*--------------------------------------------------------------------*/
+    pid_t pid = fork();
+    if (pid == 0) {
+        /* child as sender */
+        setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
+        mds_startup();
+        MDS_SVC_ID to_svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN};
+        MDS_SVC_ID svc_id = NCSMDS_SVC_ID_INTERNAL_MIN;
+        uint32_t live_time = 100; //seconds
+        tet_sender(svc_id, msg_count, msg_size, 1, to_svcids, live_time);
+        mds_shutdown();
+    } else if (pid > 0) {
+        /* parent as receiver */
+        mds_startup();
+        MDS_SVC_ID fr_svcids[] = {NCSMDS_SVC_ID_INTERNAL_MIN};
+        MDS_SVC_ID svc_id = NCSMDS_SVC_ID_EXTERNAL_MIN;
+        FAIL = tet_receiver(svc_id, msg_count, msg_size, 1, fr_svcids);
+        printf("\nReceiver finish, kill Sender\n");
+        kill(pid, SIGKILL);
+        mds_shutdown();
+    } else {
+        printf("\nFAIL to fork()\n");
+    }
 
-       test_validate(FAIL, 0);
+    test_validate(FAIL, 0);
+}
+
+void tet_mds_fctrl_compatibility_tp2(void)
+{
+    int FAIL = 1;
+    uint32_t msg_count = 100;
+    uint32_t msg_size = 50000;
+
+    printf("\nTest Case 5: Sender diable MDS FCTRL but Receiver enable\n");
+    /*--------------------------------------------------------------------*/
+    pid_t pid = fork();
+    if (pid == 0) {
+        /* child as sender */
+        mds_startup();
+        MDS_SVC_ID to_svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN};
+        MDS_SVC_ID svc_id = NCSMDS_SVC_ID_INTERNAL_MIN;
+        uint32_t live_time = 100; //seconds
+        tet_sender(svc_id, msg_count, msg_size, 1, to_svcids, live_time);
+        mds_shutdown();
+    } else if (pid > 0) {
+        /* parent as receiver */
+        setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
+        mds_startup();
+        MDS_SVC_ID fr_svcids[] = {NCSMDS_SVC_ID_INTERNAL_MIN};
+        MDS_SVC_ID svc_id = NCSMDS_SVC_ID_EXTERNAL_MIN;
+        FAIL = tet_receiver(svc_id, msg_count, msg_size, 1, fr_svcids);
+        printf("\nReceiver finish, kill Sender\n");
+        kill(pid, SIGKILL);
+        mds_shutdown();
+    } else {
+        printf("\nFAIL to fork()\n");
+    }
+
+    test_validate(FAIL, 0);
+}
+
+void tet_mds_fctrl_with_sna_tp1(void)
+{
+    int FAIL = 1;
+    uint32_t msg_count = 65535 + 1000;
+    uint32_t msg_size = 1000;
+
+    printf("\nTest Case 7: sender gradually sends more than 65535"
+        " small messages (not OVERLOAD)"
+        " and receiver should receive them all\n");
+    /*--------------------------------------------------------------------*/
+    pid_t pid = fork();
+    if (pid == 0) {
+        /* child as sender */
+        setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
+        mds_startup();
+        MDS_SVC_ID to_svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN};
+        MDS_SVC_ID svc_id = NCSMDS_SVC_ID_INTERNAL_MIN;
+        uint32_t live_time = 0; //seconds
+        tet_sender(svc_id, msg_count, msg_size, 1, to_svcids, live_time);
+        mds_shutdown();
+    } else if (pid > 0) {
+        /* parent as receiver */
+        setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
+        mds_startup();
+        MDS_SVC_ID fr_svcids[] = {NCSMDS_SVC_ID_INTERNAL_MIN};
+        MDS_SVC_ID svc_id = NCSMDS_SVC_ID_EXTERNAL_MIN;
+        FAIL = tet_receiver(svc_id, msg_count, msg_size, 1, fr_svcids);
+        printf("\nReceiver finish, kill Sender\n");
+        kill(pid, SIGKILL);
+        mds_shutdown();
+    } else {
+        printf("\nFAIL to fork()\n");
+    }
+
+    test_validate(FAIL, 0);
+}
+
+void tet_mds_fctrl_with_sna_tp2(void)
+{
+    int FAIL = 1;
+    uint32_t msg_count = 65535 + 1000;
+    uint32_t msg_size = 50000;
+
+    printf("\nTest Case 8: sender gradually sends more than 65535"
+        " big messages (OVERLOAD happens)"
+        " and receiver should receive them all\n");
+    /*--------------------------------------------------------------------*/
+    pid_t pid = fork();
+    if (pid == 0) {
+        /* child as sender */
+        setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
+        mds_startup();
+        MDS_SVC_ID to_svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN};
+        MDS_SVC_ID svc_id = NCSMDS_SVC_ID_INTERNAL_MIN;
+        uint32_t live_time = 1000; //seconds
+        tet_sender(svc_id, msg_count, msg_size, 1, to_svcids, live_time);
+        mds_shutdown();
+    } else if (pid > 0) {
+        /* parent as receiver */
+        setenv("MDS_TIPC_FCTRL_ENABLED", "1", 1);
+        mds_startup();
+        MDS_SVC_ID fr_svcids[] = {NCSMDS_SVC_ID_INTERNAL_MIN};
+        MDS_SVC_ID svc_id = NCSMDS_SVC_ID_EXTERNAL_MIN;
+        FAIL = tet_receiver(svc_id, msg_count, msg_size, 1, fr_svcids);
+        printf("\nReceiver finish, kill Sender\n");
+        kill(pid, SIGKILL);
+        mds_shutdown();
+    } else {
+        printf("\nFAIL to fork()\n");
+    }
+
+    test_validate(FAIL, 0);
 }
 
 void Print_return_status(uint32_t rs)
@@ -14038,11 +14363,37 @@ __attribute__((constructor)) static void 
mdsTipcAPI_constructor(void)
        test_case_add(26, tet_create_default_PWE_VDEST_tp,
                      "create_default_PWE_VDEST");
 
-       test_suite_add(27, "MDS TIPC OVERLOAD Test");
-       test_case_add(
-               27, tet_overload_tp_1,
-               "Receiver wait for drop normal message retransmit and receive 
all messages in order");
-       test_case_add(
-               27, tet_overload_tp_2,
-               "Receiver wait for drop fragment message retransmit and receive 
all messages in order");
+    test_suite_add(27, "MDS TIPC OVERLOAD Test");
+    test_case_add(
+        27, tet_overload_tp_1,
+        "Receiver wait for drop normal message retransmit"
+        " (OVERLOAD happens) and receive all messages in order");
+    test_case_add(
+        27, tet_overload_tp_2,
+        "Receiver wait for drop fragment message retransmit"
+        " (OVERLOAD happens) and receive all messages in order");
+    test_case_add(
+        27, tet_overload_tp_3,
+        "One Receiver can receive all messages"
+        " (OVERLOAD happens) from two senders");
+    test_case_add(
+        27, tet_overload_tp_4,
+        "Two Receivers can receive all messages"
+        " (OVERLOAD happens) from one sender");
+    test_case_add(
+        27, tet_mds_fctrl_compatibility_tp1,
+        "Sender enable MDS FCTRL but Receiver disable");
+    test_case_add(
+        27, tet_mds_fctrl_compatibility_tp2,
+        "Sender diable MDS FCTRL but Receiver enable");
+    test_case_add(
+        27, tet_mds_fctrl_with_sna_tp1,
+        "sender gradually sends more than 65535"
+        " small messages (not OVERLOAD)"
+        " and receiver should receive them all");
+    test_case_add(
+        27, tet_mds_fctrl_with_sna_tp2,
+        "sender gradually sends more than 65535"
+        " big messages (OVERLOAD happens)"
+        " and receiver should receive them all");
 }
-- 
2.17.1



_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to