Changeset 33
- Timestamp:
- 05/29/08 20:43:37 (6 months ago)
- Files:
-
- trunk/libsipc/Makefile (modified) (1 diff)
- trunk/libsipc/tests/Makefile (modified) (1 diff)
- trunk/libsipc/tests/mqueue.c (modified) (8 diffs)
- trunk/libsipc/tests/mqueue.h (modified) (1 diff)
- trunk/libsipc/tests/shm.c (modified) (18 diffs)
- trunk/libsipc/tests/shm.h (modified) (1 diff)
- trunk/libsipc/tests/test_ipc.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/libsipc/Makefile
r30 r33 41 41 $(MAKE) -C examples $@ 42 42 43 test :43 tests: 44 44 $(MAKE) -C tests $@ 45 45 trunk/libsipc/tests/Makefile
r30 r33 6 6 install: 7 7 8 test : $(TESTS)8 tests: $(TESTS) 9 9 10 10 test_ipc: test_ipc.c shm.h shm.c mqueue.h mqueue.c trunk/libsipc/tests/mqueue.c
r21 r33 31 31 #include "mqueue.h" 32 32 33 #define SIPC_MQ_KEY "mq_ipc_test" 34 33 35 #define CREATOR_APP "ipc_creator" 34 36 #define DESTROYER_APP "ipc_destroyer" … … 46 48 int test_mqueue_init(void) 47 49 { 48 pid_t pid; 50 pid_t pid; 49 51 int status = 0; 50 52 char ipc_type_str[128]; 51 53 52 54 bzero(ipc_type_str, 128); 53 55 snprintf(ipc_type_str, 128, "%d", SIPC_SYSV_MQUEUES); 54 56 char *helper_argv[] = { 55 57 CREATOR_APP, 56 SIPC_MQ_KEY, 58 SIPC_MQ_KEY, 57 59 ipc_type_str, 58 60 NULL, 59 }; 61 }; 60 62 61 63 /* Run helper app first */ … … 72 74 wait(&status); 73 75 74 /* Open IPCs */ 76 /* Open IPCs */ 75 77 writer_ipc = 76 78 sipc_open(SIPC_MQ_KEY, SIPC_SENDER, SIPC_SYSV_MQUEUES, DATA_LEN); … … 87 89 88 90 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);160 91 } 161 92 … … 174 105 ipc_type_str, 175 106 NULL, 176 }; 107 }; 177 108 178 109 /* Run helper app to destroy the shm segment and message queue */ … … 181 112 fprintf(stderr, "fork(): %s\n", strerror(errno)); 182 113 return -1; 183 case 0: 114 case 0: 184 115 execve(DESTROYER_APP, helper_argv, NULL); 185 116 break; … … 190 121 191 122 return 0; 123 } 124 125 static 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 146 CU_TestInfo mqueue_tests[] = { 147 {"mqueue", test_mqueue} 148 , 149 CU_TEST_INFO_NULL 150 }; 151 152 /* Read a message from mqueue */ 153 static 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 171 static 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); 192 200 } 193 201 … … 199 207 return -1; 200 208 } 201 209 202 210 bzero(data, DATA_LEN); 203 211 strncpy(data, XMIT_END, DATA_LEN-1); trunk/libsipc/tests/mqueue.h
r1 r33 22 22 #define __TEST_MQUEUE_H__ 23 23 24 # define SIPC_MQ_KEY "mq_ipc_test"24 #include <CUnit/CUnit.h> 25 25 26 int test_mqueue_init(void);27 void test_mqueue(void);28 int test_mqueue_cleanup(void);26 extern int test_mqueue_init(void); 27 extern int test_mqueue_cleanup(void); 28 extern CU_TestInfo mqueue_tests[]; 29 29 30 30 #endif trunk/libsipc/tests/shm.c
r21 r33 32 32 #include "shm.h" 33 33 34 #define SIPC_SHM_KEY "shm_ipc_test" 35 34 36 #define CREATOR_APP "ipc_creator" 35 37 #define DESTROYER_APP "ipc_destroyer" … … 42 44 static void do_child(void); 43 45 static void do_parent(void); 46 static void do_binary_child(void); 47 static void do_binary_parent(void); 44 48 static void send_end_xmit(sipc_t *sipc); 45 49 static int verify_data(char *filename, char *recv_data); … … 60 64 ipc_type_str, 61 65 NULL, 62 }; 66 }; 63 67 64 68 /* Run helper app to create a message queue for our side channel */ … … 74 78 } 75 79 wait(&status); 76 80 77 81 /* Open IPCs */ 78 82 writer_ipc = … … 81 85 fprintf(stderr, "Could not initialize IPC resource\n"); 82 86 return -1; 83 }87 } 84 88 reader_ipc = 85 89 sipc_open(SIPC_SHM_KEY, SIPC_RECEIVER, SIPC_SYSV_SHM, DATA_LEN); … … 87 91 fprintf(stderr, "Could not initialize IPC resource\n"); 88 92 return -1; 89 } 93 } 90 94 91 95 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);114 96 } 115 97 … … 119 101 pid_t pid; 120 102 char ipc_type_str[128]; 103 104 sipc_close(reader_ipc); 105 sipc_close(writer_ipc); 121 106 122 107 /* Build the destroyer app's argv */ … … 128 113 ipc_type_str, 129 114 NULL, 130 }; 115 }; 131 116 132 117 /* Run helper app to destroy the shm segment and message queue */ … … 142 127 } 143 128 wait(&status); 144 129 145 130 return 0; 146 131 } 132 133 static 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 149 static 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 172 static 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 195 CU_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 }; 147 201 148 202 static void do_child(void) … … 162 216 sipc_error(writer_ipc, "fopen: %s\n", strerror(errno)); 163 217 return; 164 } 218 } 165 219 /* Read DATA_LEN bytes from file */ 166 220 bzero(shm_data, DATA_LEN); … … 169 223 fclose(ifile); 170 224 return; 171 } 225 } 172 226 fclose(ifile); 173 227 … … 175 229 if (sipc_send_data(writer_ipc, DATA_LEN) < 0) { 176 230 sipc_error(writer_ipc, "Unable to send data\n"); 177 return; 231 return; 178 232 } 179 233 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"); 181 235 182 236 sipc_close(writer_ipc); … … 188 242 char recv_data[DATA_LEN]; 189 243 int len = 0; 190 244 191 245 while (!sipc_recv_data(reader_ipc, &data, &len)) { 192 246 if (END_XMIT(data)) { … … 197 251 /* Copy received data for verification later */ 198 252 strncpy(recv_data, data, DATA_LEN); 199 sipc_shm_recv_done(reader_ipc); 253 sipc_shm_recv_done(reader_ipc); 200 254 } 201 255 CU_PASS("Successfully read a message via SYSV shared memory"); 202 256 203 if (verify_data(IN_FILE, recv_data) ) {257 if (verify_data(IN_FILE, recv_data) != 1) { 204 258 CU_PASS("Sent data matches received data"); 205 259 } else { … … 207 261 } 208 262 209 sipc_close(reader_ipc); 263 } 264 265 /* 266 * Write a sequence of bytes to the shm SIPC. 267 */ 268 static 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 295 static 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 } 210 322 } 211 323 … … 226 338 } 227 339 228 /* Read DATA_LEN bytes from a file and determine if 340 /* Read DATA_LEN bytes from a file and determine if 229 341 * the read contents match the provided character string */ 230 int verify_data(char *filename, char *recv_data)342 static int verify_data(char *filename, char *recv_data) 231 343 { 232 344 FILE *ifile = NULL; … … 239 351 return -1; 240 352 } 241 353 242 354 rbytes = fread(data, sizeof(char), DATA_LEN-1, ifile); 243 355 if (rbytes < 0) { 244 356 fclose(ifile); 245 return -1; 357 return -1; 246 358 } 247 359 fclose(ifile); 248 360 249 if ( strcmp(data, recv_data))361 if (memcmp(data, recv_data, rbytes)) 250 362 return 1; 251 363 … … 255 367 static inline int END_XMIT(char *data) 256 368 { 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 22 22 #define __TEST_SHM_H__ 23 23 24 # define SIPC_SHM_KEY "shm_ipc_test"24 #include <CUnit/CUnit.h> 25 25 26 int test_shm_init(void);27 void test_shm(void);28 int test_shm_cleanup(void);26 extern int test_shm_init(void); 27 extern int test_shm_cleanup(void); 28 extern CU_TestInfo shm_tests[]; 29 29 30 30 #endif trunk/libsipc/tests/test_ipc.c
r1 r33 26 26 #include "shm.h" 27 27 28 int main( )28 int main(void) 29 29 { 30 CU_pSuite mq_suite = NULL, shm_suite = NULL; 31 32 if (CU_initialize_registry() != CUE_SUCCESS) 30 if (CU_initialize_registry() != CUE_SUCCESS) 33 31 return CU_get_error(); 34 32 35 33 /* 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); 40 40 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 47 41 /* Run tests */ 48 42 CU_basic_set_mode(CU_BRM_VERBOSE); 49 CU_basic_run_tests(); 43 CU_basic_run_tests(); 50 44 51 printf("# suites run: %d, # tests run: %d\n", 45 printf("# suites run: %d, # tests run: %d\n", 52 46 CU_get_number_of_suites_run(), 53 47 CU_get_number_of_tests_run()); … … 56 50 return CU_get_error(); 57 51 } 58
