00001 00002 #include <sys/types.h> 00003 00004 #include <dnet.h> 00005 00006 #include <stdio.h> 00007 #include <stdlib.h> 00008 #include <string.h> 00009 00010 #include <check.h> 00011 00012 START_TEST(test_blob_newfree) 00013 { 00014 blob_t *b; 00015 00016 fail_unless((b = blob_new()) != NULL, "new failed"); 00017 fail_unless((b = blob_free(b)) == NULL, "free failed"); 00018 } 00019 END_TEST 00020 00021 START_TEST(test_blob_readwrite) 00022 { 00023 blob_t *b; 00024 char tmp[32]; 00025 00026 b = blob_new(); 00027 blob_write(b, "foobar", 7); 00028 blob_write(b, "spazzo", 7); 00029 blob_write(b, "doofus", 7); 00030 blob_rewind(b); 00031 00032 blob_read(b, tmp, 7); 00033 fail_unless(strcmp(tmp, "foobar") == 0, "read1 failed"); 00034 blob_read(b, tmp, 7); 00035 fail_unless(strcmp(tmp, "spazzo") == 0, "read2 failed"); 00036 blob_read(b, tmp, 7); 00037 fail_unless(strcmp(tmp, "doofus") == 0, "read3 failed"); 00038 blob_free(b); 00039 } 00040 END_TEST 00041 00042 START_TEST(test_blob_insertdelete) 00043 { 00044 blob_t *b, bf; 00045 char tmp[32]; 00046 00047 b = blob_new(); 00048 fail_unless(blob_insert(b, "foo", 3) == 3, "insert1 failed"); 00049 blob_rewind(b); 00050 fail_unless(blob_insert(b, "bar", 3) == 3, "insert2 failed"); 00051 blob_rewind(b); 00052 blob_read(b, tmp, 6); 00053 tmp[6] = 0; 00054 fail_unless(strcmp(tmp,"barfoo") == 0, "read failed"); 00055 blob_rewind(b); 00056 fail_unless(blob_delete(b, NULL, 3) == 3, "delete failed"); 00057 blob_rewind(b); 00058 blob_read(b, tmp, 3); 00059 tmp[3] = 0; 00060 fail_unless(strcmp(tmp,"foo") == 0, "read failed"); 00061 00062 fail_unless(blob_delete(b, NULL, 4) < 0, "deleted more than size"); 00063 b = blob_free(b); 00064 00065 bf.base = "foobar"; 00066 bf.end = 6; 00067 bf.off = bf.size = 0; 00068 00069 fail_unless(blob_insert(&bf, "foobar", 6) < 0, "inserted into fixed"); 00070 fail_unless(blob_delete(&bf, NULL, 3) < 0, "deleted from fixed"); 00071 } 00072 END_TEST 00073 00074 START_TEST(test_blob_packunpack) 00075 { 00076 blob_t *b; 00077 uint32_t D, d; 00078 uint16_t H, h; 00079 u_char c; 00080 char s[128]; 00081 u_char buf[6]; 00082 00083 b = blob_new(); 00084 00085 D = 0xdeadbeef; 00086 H = 0xbabe; 00087 memcpy(buf, "f\x00\x00bar", 6); 00088 c = 'c'; 00089 d = 555; 00090 h = 666; 00091 strcpy(s, "donkey"); 00092 #if 0 00093 printf("D: 0x%x H: 0x%x c: %c d: %d h: %d s: %s\n", 00094 D, H, c, d, h, s); 00095 #endif 00096 fail_unless(blob_pack(b, "whee:%D%H%*b%c%d%h%s\r\n", 00097 D, H, sizeof(buf), buf, c, d, h, s) == 0, 00098 "pack failed"); 00099 00100 blob_rewind(b); 00101 #if 0 00102 blob_print(b, "hexl", blob_left(b)); 00103 #endif 00104 fail_unless(blob_unpack(b, "whee:%D%H%*b%c%d%h%*s\r\n", 00105 &D, &H, sizeof(buf), buf, &c, &d, &h, sizeof(s), s) == 0, 00106 "unpack failed"); 00107 #if 0 00108 printf("D: 0x%x H: 0x%x c: %c d: %d h: %d s: %s\n", 00109 D, H, c, d, h, s); 00110 #endif 00111 if (D != 0xdeadbeef || H != 0xbabe || 00112 memcmp(buf, "f\x00\x00bar", 6) != 0 || c != 'c' || d != 555 || 00113 h != 666 || strcmp(s, "donkey") != 0) 00114 fail("unpacked weird crap"); 00115 00116 blob_free(b); 00117 } 00118 END_TEST 00119 00120 START_TEST(test_blob_seek) 00121 { 00122 blob_t *b; 00123 00124 b = blob_new(); 00125 blob_insert(b, "foobar", 6); 00126 blob_rewind(b); 00127 fail_unless(blob_skip(b, 3) == 3, "skip failed"); 00128 fail_unless(blob_skip(b, 3) == 6, "skip to end failed"); 00129 fail_unless(blob_skip(b, 1) < 0, "skipped past end"); 00130 fail_unless(blob_seek(b, -1, SEEK_END) == 5, "end seek failed"); 00131 fail_unless(blob_seek(b, 1, SEEK_SET) == 1, "set seek failed"); 00132 blob_rewind(b); 00133 fail_unless(blob_seek(b, -1, SEEK_CUR) < 0, "seeked past 0"); 00134 fail_unless(blob_seek(b, 3, SEEK_CUR) == 3, "cur seek failed"); 00135 blob_free(b); 00136 } 00137 END_TEST 00138 00139 START_TEST(test_blob_index) 00140 { 00141 blob_t *b; 00142 00143 b = blob_new(); 00144 blob_write(b, "this is only a test!", 20); 00145 blob_rewind(b); 00146 fail_unless(blob_index(b, "this", 4) == 0, "index start failed"); 00147 fail_unless(blob_index(b, "!", 1) == 19, "index end failed"); 00148 fail_unless(blob_index(b, "only ", 5) == 8, "index middle failed"); 00149 fail_unless(blob_rindex(b, "!", 1) == 19, "rindex end failed"); 00150 fail_unless(blob_rindex(b, "this", 4) == 0, "rindex start failed"); 00151 fail_unless(blob_rindex(b, "only ", 5) == 8, "rindex middle failed"); 00152 blob_free(b); 00153 } 00154 END_TEST 00155 00156 Suite * 00157 blob_suite(void) 00158 { 00159 Suite *s = suite_create("blob"); 00160 TCase *tc_core = tcase_create("core"); 00161 00162 suite_add_tcase(s, tc_core); 00163 tcase_add_test(tc_core, test_blob_newfree); 00164 tcase_add_test(tc_core, test_blob_readwrite); 00165 tcase_add_test(tc_core, test_blob_insertdelete); 00166 tcase_add_test(tc_core, test_blob_packunpack); 00167 tcase_add_test(tc_core, test_blob_seek); 00168 tcase_add_test(tc_core, test_blob_index); 00169 00170 return (s); 00171 } 00172 00173 int 00174 main(void) 00175 { 00176 Suite *s = blob_suite(); 00177 SRunner *sr = srunner_create(s); 00178 int nf; 00179 #if 0 00180 srunner_set_fork_status(sr, CK_NOFORK); 00181 #endif 00182 srunner_run_all (sr, CK_NORMAL); 00183 nf = srunner_ntests_failed(sr); 00184 srunner_free(sr); 00185 00186 return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE; 00187 }