Changeset 33

Show
Ignore:
Timestamp:
05/29/08 20:43:37 (6 months ago)
Author:
jtang
Message:

Cleaned up test programs.
Added a binary test to shm.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libsipc/Makefile

    r30 r33  
    4141        $(MAKE) -C examples $@ 
    4242 
    43 test
     43tests
    4444        $(MAKE) -C tests $@ 
    4545 
  • trunk/libsipc/tests/Makefile

    r30 r33  
    66install: 
    77 
    8 test: $(TESTS) 
     8tests: $(TESTS) 
    99 
    1010test_ipc: test_ipc.c shm.h shm.c mqueue.h mqueue.c 
  • trunk/libsipc/tests/mqueue.c

    r21 r33  
    3131#include "mqueue.h" 
    3232 
     33#define SIPC_MQ_KEY "mq_ipc_test" 
     34 
    3335#define CREATOR_APP "ipc_creator" 
    3436#define DESTROYER_APP "ipc_destroyer" 
     
    4648int test_mqueue_init(void) 
    4749{ 
    48         pid_t pid;      
     50        pid_t pid; 
    4951        int status = 0; 
    5052        char ipc_type_str[128]; 
    51          
     53 
    5254        bzero(ipc_type_str, 128); 
    5355        snprintf(ipc_type_str, 128, "%d", SIPC_SYSV_MQUEUES); 
    5456        char *helper_argv[] = { 
    5557                CREATOR_APP, 
    56                 SIPC_MQ_KEY,  
     58                SIPC_MQ_KEY, 
    5759                ipc_type_str, 
    5860                NULL, 
    59         };      
     61        }; 
    6062 
    6163        /* Run helper app first */ 
     
    7274        wait(&status); 
    7375 
    74         /* Open IPCs */         
     76        /* Open IPCs */ 
    7577        writer_ipc = 
    7678            sipc_open(SIPC_MQ_KEY, SIPC_SENDER, SIPC_SYSV_MQUEUES, DATA_LEN); 
     
    8789 
    8890        return 0; 
    89 } 
    90  
    91 void test_mqueue(void) 
    92 { 
    93         pid_t pid; 
    94         int status = 0;  
    95  
    96         switch ((pid = fork())) { 
    97         case -1: 
    98                 fprintf(stderr, "fork: %s\n", strerror(errno)); 
    99                 return; 
    100         case 0: 
    101                 do_child(); 
    102                 exit(0); 
    103                 break; 
    104         default: 
    105                 do_parent(); 
    106                 break; 
    107         } 
    108          
    109         wait(&status);  
    110 } 
    111  
    112 /* Read a message from mqueue */ 
    113 static void do_parent() 
    114 { 
    115         char *data = NULL; 
    116         int len = 0; 
    117          
    118         /* Get pointer to IPC's data member */ 
    119         data = sipc_get_data_ptr(reader_ipc); 
    120         CU_ASSERT_PTR_NOT_NULL(data); 
    121  
    122         while (!sipc_recv_data(reader_ipc, &data, &len)) { 
    123                 if (data != NULL && is_end_xmit(data)) 
    124                         break; 
    125         } 
    126  
    127         /* Cleanup handle here */ 
    128         sipc_close(reader_ipc); 
    129 } 
    130  
    131 static void do_child() 
    132 { 
    133         int rbytes = 0; 
    134         char *data = NULL; 
    135         FILE *ifile = fopen(IN_FILE, "r"); 
    136         if (!ifile) { 
    137                 fprintf(stderr, "fopen: %s\n", strerror(errno)); 
    138                 return; 
    139         } 
    140  
    141         /* Get pointer to IPC's data member */ 
    142         data = sipc_get_data_ptr(writer_ipc); 
    143         CU_ASSERT_PTR_NOT_NULL(data); 
    144  
    145         /* Read DATA_LEN bytes from file */ 
    146         rbytes = fread(data, sizeof(char), DATA_LEN, ifile); 
    147         if (rbytes < 0) { 
    148                 fprintf(stderr, "fread: %s\n", strerror(errno)); 
    149                 fclose(ifile); 
    150                 return; 
    151         } 
    152          
    153         /* Send data, then end of xmit */ 
    154         CU_ASSERT(sipc_send_data(writer_ipc, DATA_LEN) == 0); 
    155         CU_ASSERT(send_end_xmit(writer_ipc) == 0); 
    156         fclose(ifile);   
    157  
    158         /* Cleanup handle here */ 
    159         sipc_close(writer_ipc); 
    16091} 
    16192 
     
    174105                ipc_type_str, 
    175106                NULL, 
    176         };      
     107        }; 
    177108 
    178109        /* Run helper app to destroy the shm segment and message queue */ 
     
    181112                fprintf(stderr, "fork(): %s\n", strerror(errno)); 
    182113                return -1; 
    183         case 0:                 
     114        case 0: 
    184115                execve(DESTROYER_APP, helper_argv, NULL); 
    185116                break; 
     
    190121 
    191122        return 0; 
     123} 
     124 
     125static void test_mqueue(void) 
     126{ 
     127        pid_t pid; 
     128        int status = 0; 
     129 
     130        switch ((pid = fork())) { 
     131        case -1: 
     132                fprintf(stderr, "fork: %s\n", strerror(errno)); 
     133                return; 
     134        case 0: 
     135                do_child(); 
     136                exit(0); 
     137                break; 
     138        default: 
     139                do_parent(); 
     140                break; 
     141        } 
     142 
     143        wait(&status); 
     144} 
     145 
     146CU_TestInfo mqueue_tests[] = { 
     147        {"mqueue", test_mqueue} 
     148        , 
     149        CU_TEST_INFO_NULL 
     150}; 
     151 
     152/* Read a message from mqueue */ 
     153static void do_parent() 
     154{ 
     155        char *data = NULL; 
     156        int len = 0; 
     157 
     158        /* Get pointer to IPC's data member */ 
     159        data = sipc_get_data_ptr(reader_ipc); 
     160        CU_ASSERT_PTR_NOT_NULL(data); 
     161 
     162        while (!sipc_recv_data(reader_ipc, &data, &len)) { 
     163                if (data != NULL && is_end_xmit(data)) 
     164                        break; 
     165        } 
     166 
     167        /* Cleanup handle here */ 
     168        sipc_close(reader_ipc); 
     169} 
     170 
     171static void do_child() 
     172{ 
     173        int rbytes = 0; 
     174        char *data = NULL; 
     175        FILE *ifile = fopen(IN_FILE, "r"); 
     176        if (!ifile) { 
     177                fprintf(stderr, "fopen: %s\n", strerror(errno)); 
     178                return; 
     179        } 
     180 
     181        /* Get pointer to IPC's data member */ 
     182        data = sipc_get_data_ptr(writer_ipc); 
     183        CU_ASSERT_PTR_NOT_NULL(data); 
     184 
     185        /* Read DATA_LEN bytes from file */ 
     186        rbytes = fread(data, sizeof(char), DATA_LEN, ifile); 
     187        if (rbytes < 0) { 
     188                fprintf(stderr, "fread: %s\n", strerror(errno)); 
     189                fclose(ifile); 
     190                return; 
     191        } 
     192 
     193        /* Send data, then end of xmit */ 
     194        CU_ASSERT(sipc_send_data(writer_ipc, DATA_LEN) == 0); 
     195        CU_ASSERT(send_end_xmit(writer_ipc) == 0); 
     196        fclose(ifile); 
     197 
     198        /* Cleanup handle here */ 
     199        sipc_close(writer_ipc); 
    192200} 
    193201 
     
    199207                return -1; 
    200208        } 
    201          
     209 
    202210        bzero(data, DATA_LEN); 
    203211        strncpy(data, XMIT_END, DATA_LEN-1); 
  • trunk/libsipc/tests/mqueue.h

    r1 r33  
    2222#define __TEST_MQUEUE_H__ 
    2323 
    24 #define SIPC_MQ_KEY "mq_ipc_test" 
     24#include <CUnit/CUnit.h> 
    2525 
    26 int test_mqueue_init(void); 
    27 void test_mqueue(void); 
    28 int test_mqueue_cleanup(void)
     26extern int test_mqueue_init(void); 
     27extern int test_mqueue_cleanup(void); 
     28extern CU_TestInfo mqueue_tests[]
    2929 
    3030#endif 
  • trunk/libsipc/tests/shm.c

    r21 r33  
    3232#include "shm.h" 
    3333 
     34#define SIPC_SHM_KEY "shm_ipc_test" 
     35 
    3436#define CREATOR_APP "ipc_creator" 
    3537#define DESTROYER_APP "ipc_destroyer" 
     
    4244static void do_child(void); 
    4345static void do_parent(void); 
     46static void do_binary_child(void); 
     47static void do_binary_parent(void); 
    4448static void send_end_xmit(sipc_t *sipc); 
    4549static int verify_data(char *filename, char *recv_data); 
     
    6064                ipc_type_str, 
    6165                NULL, 
    62         };      
     66        }; 
    6367 
    6468        /* Run helper app to create a message queue for our side channel */ 
     
    7478        } 
    7579        wait(&status); 
    76          
     80 
    7781        /* Open IPCs */ 
    7882        writer_ipc = 
     
    8185                fprintf(stderr, "Could not initialize IPC resource\n"); 
    8286                return -1; 
    83       } 
     87      } 
    8488        reader_ipc = 
    8589            sipc_open(SIPC_SHM_KEY, SIPC_RECEIVER, SIPC_SYSV_SHM, DATA_LEN); 
     
    8791                fprintf(stderr, "Could not initialize IPC resource\n"); 
    8892                return -1; 
    89         }                    
     93        } 
    9094 
    9195        return 0; 
    92 } 
    93  
    94 void test_shm(void) 
    95 {        
    96         int status; 
    97         pid_t pid; 
    98  
    99         switch (pid = fork()) { 
    100         case -1: 
    101                 fprintf(stderr, "fork: %s\n", strerror(errno)); 
    102                 return; 
    103         case 0: 
    104                 do_child(); 
    105                 /* Exit here to prevent displaying results 2x */ 
    106                 exit(0);  
    107                 break; 
    108         default: 
    109                 do_parent(); 
    110                 break;           
    111         } 
    112  
    113         wait(&status);   
    11496} 
    11597 
     
    119101        pid_t pid; 
    120102        char ipc_type_str[128]; 
     103 
     104        sipc_close(reader_ipc); 
     105        sipc_close(writer_ipc); 
    121106 
    122107        /* Build the destroyer app's argv */ 
     
    128113                ipc_type_str, 
    129114                NULL, 
    130         };      
     115        }; 
    131116 
    132117        /* Run helper app to destroy the shm segment and message queue */ 
     
    142127        } 
    143128        wait(&status); 
    144          
     129 
    145130        return 0; 
    146131} 
     132 
     133static void test_unforked_shm(void) { 
     134        static char message[] = "HELLO,"; 
     135        size_t message_len = sizeof(message); 
     136        char *shm_data = sipc_get_data_ptr(writer_ipc); 
     137        int recv_len; 
     138        char *recv_data; 
     139 
     140        CU_ASSERT_PTR_NOT_NULL_FATAL(shm_data); 
     141        strcpy(shm_data, message); 
     142        CU_ASSERT(sipc_send_data(writer_ipc, message_len) == 0); 
     143        CU_ASSERT(sipc_recv_data(reader_ipc, &recv_data, &recv_len) == 0); 
     144        CU_ASSERT(recv_len >= message_len); 
     145        CU_ASSERT(memcmp(recv_data, message, message_len) == 0); 
     146        CU_ASSERT(sipc_shm_recv_done(reader_ipc) == 0); 
     147} 
     148 
     149static void test_shm(void) 
     150{ 
     151        int status; 
     152        pid_t pid; 
     153 
     154        switch (pid = fork()) { 
     155        case -1: 
     156                fprintf(stderr, "fork: %s\n", strerror(errno)); 
     157                return; 
     158        case 0: 
     159                sipc_close(reader_ipc); 
     160                do_child(); 
     161                /* Exit here to prevent displaying results 2x */ 
     162                exit(0); 
     163                break; 
     164        default: 
     165                do_parent(); 
     166                break; 
     167        } 
     168 
     169        wait(&status); 
     170} 
     171 
     172static void test_binary_shm(void) 
     173{ 
     174        int status; 
     175        pid_t pid; 
     176 
     177        switch (pid = fork()) { 
     178        case -1: 
     179                fprintf(stderr, "fork: %s\n", strerror(errno)); 
     180                return; 
     181        case 0: 
     182                sipc_close(reader_ipc); 
     183                do_binary_child(); 
     184                /* Exit here to prevent displaying results 2x */ 
     185                exit(0); 
     186                break; 
     187        default: 
     188                do_binary_parent(); 
     189                break; 
     190        } 
     191 
     192        wait(&status); 
     193} 
     194 
     195CU_TestInfo shm_tests[] = { 
     196        {"unforked shm", test_unforked_shm}, 
     197        {"forked shm", test_shm}, 
     198        {"binary shm", test_binary_shm}, 
     199        CU_TEST_INFO_NULL 
     200}; 
    147201 
    148202static void do_child(void) 
     
    162216                sipc_error(writer_ipc, "fopen: %s\n", strerror(errno)); 
    163217                return; 
    164         }       
     218        } 
    165219        /* Read DATA_LEN bytes from file */ 
    166220        bzero(shm_data, DATA_LEN); 
     
    169223                fclose(ifile); 
    170224                return; 
    171         }  
     225        } 
    172226        fclose(ifile); 
    173227 
     
    175229        if (sipc_send_data(writer_ipc, DATA_LEN) < 0) { 
    176230                sipc_error(writer_ipc, "Unable to send data\n"); 
    177                 return;         
     231                return; 
    178232        } 
    179233        send_end_xmit(writer_ipc); 
    180         CU_PASS("Successfully sent data via SYSV shared memory");              
     234        CU_PASS("Successfully sent data via SYSV shared memory"); 
    181235 
    182236        sipc_close(writer_ipc); 
     
    188242        char recv_data[DATA_LEN]; 
    189243        int len = 0; 
    190                  
     244 
    191245        while (!sipc_recv_data(reader_ipc, &data, &len)) { 
    192246                if (END_XMIT(data)) { 
     
    197251                /* Copy received data for verification later */ 
    198252                strncpy(recv_data, data, DATA_LEN); 
    199                 sipc_shm_recv_done(reader_ipc);                 
     253                sipc_shm_recv_done(reader_ipc); 
    200254        } 
    201255        CU_PASS("Successfully read a message via SYSV shared memory"); 
    202256 
    203         if (verify_data(IN_FILE, recv_data)) { 
     257        if (verify_data(IN_FILE, recv_data) != 1) { 
    204258                CU_PASS("Sent data matches received data"); 
    205259        } else { 
     
    207261        } 
    208262 
    209         sipc_close(reader_ipc);  
     263
     264 
     265/* 
     266 * Write a sequence of bytes to the shm SIPC. 
     267 */ 
     268static void do_binary_child(void) 
     269
     270        size_t i = 0; 
     271        char *shm_data = NULL; 
     272 
     273        /* Get pointer to IPC's internal data */ 
     274        shm_data = sipc_get_data_ptr(writer_ipc); 
     275        if (!shm_data) { 
     276                sipc_error(writer_ipc, "Unable to get pointer to data.\n"); 
     277                return; 
     278        } 
     279 
     280        for (i = 0; i < DATA_LEN; i++) { 
     281                shm_data[i] = i % 256; 
     282        } 
     283 
     284        /* Send the data */ 
     285        if (sipc_send_data(writer_ipc, DATA_LEN) < 0) { 
     286                sipc_error(writer_ipc, "Unable to send data\n"); 
     287                return; 
     288        } 
     289        send_end_xmit(writer_ipc); 
     290        CU_PASS("Successfully sent binary data via SYSV shared memory"); 
     291 
     292        sipc_close(writer_ipc); 
     293
     294 
     295static void do_binary_parent(void) 
     296
     297        char *data = NULL; 
     298        unsigned char recv_data[DATA_LEN]; 
     299        int len = 0, i; 
     300 
     301        while (!sipc_recv_data(reader_ipc, &data, &len)) { 
     302                if (END_XMIT(data)) { 
     303                        sipc_shm_recv_done(reader_ipc); 
     304                        break; 
     305                } 
     306                /* Copy received data for verification later */ 
     307                CU_ASSERT_FATAL(len == DATA_LEN); 
     308                memcpy(recv_data, data, len); 
     309                sipc_shm_recv_done(reader_ipc); 
     310        } 
     311        CU_PASS("Successfully read a message via SYSV shared memory"); 
     312 
     313        for (i = 0; i < DATA_LEN; i++) { 
     314                if (recv_data[i] != i % 256) { 
     315                        CU_FAIL("Sent data does not match received data!"); 
     316                        break; 
     317                } 
     318        } 
     319        if (i > DATA_LEN) { 
     320                CU_PASS("Sent data matches received data"); 
     321        } 
    210322} 
    211323 
     
    226338} 
    227339 
    228 /* Read DATA_LEN bytes from a file and determine if  
     340/* Read DATA_LEN bytes from a file and determine if 
    229341 * the read contents match the provided character string */ 
    230 int verify_data(char *filename, char *recv_data) 
     342static int verify_data(char *filename, char *recv_data) 
    231343{ 
    232344        FILE *ifile = NULL; 
     
    239351                return -1; 
    240352        } 
    241         
     353 
    242354        rbytes = fread(data, sizeof(char), DATA_LEN-1, ifile); 
    243355        if (rbytes < 0) { 
    244356                fclose(ifile); 
    245                 return -1;      
     357                return -1; 
    246358        } 
    247359        fclose(ifile); 
    248360 
    249         if (strcmp(data, recv_data)) 
     361        if (memcmp(data, recv_data, rbytes)) 
    250362                return 1; 
    251363 
     
    255367static inline int END_XMIT(char *data) 
    256368{ 
    257         return !strcmp(data, DATA_END); 
    258 } 
     369       return !memcmp(data, DATA_END, strlen(DATA_END) + 1); 
     370} 
  • trunk/libsipc/tests/shm.h

    r1 r33  
    2222#define __TEST_SHM_H__ 
    2323 
    24 #define SIPC_SHM_KEY "shm_ipc_test" 
     24#include <CUnit/CUnit.h> 
    2525 
    26 int test_shm_init(void); 
    27 void test_shm(void); 
    28 int test_shm_cleanup(void)
     26extern int test_shm_init(void); 
     27extern int test_shm_cleanup(void); 
     28extern CU_TestInfo shm_tests[]
    2929 
    3030#endif 
  • trunk/libsipc/tests/test_ipc.c

    r1 r33  
    2626#include "shm.h" 
    2727 
    28 int main(
     28int main(void
    2929{ 
    30         CU_pSuite mq_suite = NULL, shm_suite = NULL; 
    31          
    32         if (CU_initialize_registry() != CUE_SUCCESS)  
     30        if (CU_initialize_registry() != CUE_SUCCESS) 
    3331                return CU_get_error(); 
    3432 
    3533        /* Add suites to registry */ 
    36         mq_suite = CU_add_suite("mq", test_mqueue_init, test_mqueue_cleanup); 
    37         shm_suite = CU_add_suite("shm", test_shm_init, test_shm_cleanup); 
    38         if (!shm_suite)  
    39                 goto err;        
     34        CU_SuiteInfo suites[] = { 
     35                {"mq", test_mqueue_init, test_mqueue_cleanup, mqueue_tests}, 
     36                {"shm", test_shm_init, test_shm_cleanup, shm_tests}, 
     37                CU_SUITE_INFO_NULL 
     38        }; 
     39        CU_register_suites(suites); 
    4040 
    41         /* Add tests to suites */ 
    42         if (!CU_add_test(mq_suite, "test_mq", test_mqueue))  
    43                 goto err;  
    44         if (!CU_add_test(shm_suite, "test_shm", test_shm)) 
    45                 goto err;  
    46          
    4741        /* Run tests */ 
    4842        CU_basic_set_mode(CU_BRM_VERBOSE); 
    49         CU_basic_run_tests();           
     43        CU_basic_run_tests(); 
    5044 
    51         printf("# suites run: %d, # tests run: %d\n",  
     45        printf("# suites run: %d, # tests run: %d\n", 
    5246               CU_get_number_of_suites_run(), 
    5347               CU_get_number_of_tests_run()); 
     
    5650        return CU_get_error(); 
    5751} 
    58