diff options
author | Coren[m] <Break@Ocean> | 2013-09-17 01:08:57 +0200 |
---|---|---|
committer | Coren[m] <Break@Ocean> | 2013-09-17 01:08:57 +0200 |
commit | 1c57a3a3de376c8e9f127c409032fd94298e5e7b (patch) | |
tree | 7e4f841b70d15b5ea999100eb1445dd3c47361f9 /auto_tests/messenger_test.c | |
parent | 1d2f4465bf634f45704eb69791c45bd623154909 (diff) |
Tests of state loading/saving lead to two fixes for DHT.c and util.c
util.c:
- fix in empty section at the end of the state, showed as bug when having an empty name
DHT.c:
- fix in saving less data than originally announced, showed as bug when not having reached any clients ever (no clients or only with timestamp of zero)
Diffstat (limited to 'auto_tests/messenger_test.c')
-rw-r--r-- | auto_tests/messenger_test.c | 89 |
1 files changed, 87 insertions, 2 deletions
diff --git a/auto_tests/messenger_test.c b/auto_tests/messenger_test.c index 1b72a92f..dc1625a3 100644 --- a/auto_tests/messenger_test.c +++ b/auto_tests/messenger_test.c | |||
@@ -43,10 +43,9 @@ Messenger *m; | |||
43 | 43 | ||
44 | unsigned char *hex_string_to_bin(char hex_string[]) | 44 | unsigned char *hex_string_to_bin(char hex_string[]) |
45 | { | 45 | { |
46 | size_t len = strlen(hex_string); | 46 | size_t i, len = strlen(hex_string); |
47 | unsigned char *val = calloc(1, len); | 47 | unsigned char *val = calloc(1, len); |
48 | char *pos = hex_string; | 48 | char *pos = hex_string; |
49 | int i = 0; | ||
50 | 49 | ||
51 | for (i = 0; i < len; ++i, pos += 2) | 50 | for (i = 0; i < len; ++i, pos += 2) |
52 | sscanf(pos, "%2hhx", &val[i]); | 51 | sscanf(pos, "%2hhx", &val[i]); |
@@ -227,6 +226,86 @@ START_TEST(test_getname) | |||
227 | } | 226 | } |
228 | END_TEST | 227 | END_TEST |
229 | 228 | ||
229 | START_TEST(test_dht_state_saveloadsave) | ||
230 | { | ||
231 | /* validate that: | ||
232 | * a) saving stays within the confined space | ||
233 | * b) a save()d state can be load()ed back successfully | ||
234 | * c) a second save() is of equal size | ||
235 | * d) the second save() is of equal content */ | ||
236 | size_t i, extra = 64; | ||
237 | size_t size = DHT_size(m->dht); | ||
238 | uint8_t buffer[size + 2 * extra]; | ||
239 | memset(buffer, 0xCD, extra); | ||
240 | memset(buffer + extra + size, 0xCD, extra); | ||
241 | DHT_save(m->dht, buffer + extra); | ||
242 | for(i = 0; i < extra; i++) { | ||
243 | ck_assert_msg(buffer[i] == 0xCD, "Buffer underwritten from DHT_save() @%u", i); | ||
244 | ck_assert_msg(buffer[extra + size + i] == 0xCD, "Buffer overwritten from DHT_save() @%u", i); | ||
245 | } | ||
246 | |||
247 | int res = DHT_load_new(m->dht, buffer + extra, size); | ||
248 | if (res == -1) | ||
249 | ck_assert_msg(res == 0, "Failed to load back stored buffer: res == -1"); | ||
250 | else { | ||
251 | char msg[128]; | ||
252 | size_t offset = res >> 4; | ||
253 | uint8_t *ptr = buffer + extra + offset; | ||
254 | sprintf(msg, "Failed to load back stored buffer: 0x%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx @%u/%u, code %d", | ||
255 | ptr[-2], ptr[-1], ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], offset, size, res & 0x0F); | ||
256 | ck_assert_msg(res == 0, msg); | ||
257 | } | ||
258 | |||
259 | size_t size2 = DHT_size(m->dht); | ||
260 | ck_assert_msg(size == size2, "Messenger \"grew\" in size from a store/load cycle: %u -> %u", size, size2); | ||
261 | |||
262 | uint8_t buffer2[size2]; | ||
263 | DHT_save(m->dht, buffer2); | ||
264 | |||
265 | ck_assert_msg(!memcmp(buffer + extra, buffer2, size), "DHT state changed by store/load/store cycle"); | ||
266 | } | ||
267 | END_TEST | ||
268 | |||
269 | START_TEST(test_messenger_state_saveloadsave) | ||
270 | { | ||
271 | /* validate that: | ||
272 | * a) saving stays within the confined space | ||
273 | * b) a save()d state can be load()ed back successfully | ||
274 | * c) a second save() is of equal size | ||
275 | * d) the second save() is of equal content */ | ||
276 | size_t i, extra = 64; | ||
277 | size_t size = Messenger_size(m); | ||
278 | uint8_t buffer[size + 2 * extra]; | ||
279 | memset(buffer, 0xCD, extra); | ||
280 | memset(buffer + extra + size, 0xCD, extra); | ||
281 | Messenger_save(m, buffer + extra); | ||
282 | for(i = 0; i < extra; i++) { | ||
283 | ck_assert_msg(buffer[i] == 0xCD, "Buffer underwritten from Messenger_save() @%u", i); | ||
284 | ck_assert_msg(buffer[extra + size + i] == 0xCD, "Buffer overwritten from Messenger_save() @%u", i); | ||
285 | } | ||
286 | |||
287 | int res = Messenger_load(m, buffer + extra, size); | ||
288 | if (res == -1) | ||
289 | ck_assert_msg(res == 0, "Failed to load back stored buffer: res == -1"); | ||
290 | else { | ||
291 | char msg[128]; | ||
292 | size_t offset = res >> 4; | ||
293 | uint8_t *ptr = buffer + extra + offset; | ||
294 | sprintf(msg, "Failed to load back stored buffer: 0x%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx @%u/%u, code %d", | ||
295 | ptr[-2], ptr[-1], ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], offset, size, res & 0x0F); | ||
296 | ck_assert_msg(res == 0, msg); | ||
297 | } | ||
298 | |||
299 | size_t size2 = Messenger_size(m); | ||
300 | ck_assert_msg(size == size2, "Messenger \"grew\" in size from a store/load cycle: %u -> %u", size, size2); | ||
301 | |||
302 | uint8_t buffer2[size2]; | ||
303 | Messenger_save(m, buffer2); | ||
304 | |||
305 | ck_assert_msg(!memcmp(buffer + extra, buffer2, size), "Messenger state changed by store/load/store cycle"); | ||
306 | } | ||
307 | END_TEST | ||
308 | |||
230 | Suite *messenger_suite(void) | 309 | Suite *messenger_suite(void) |
231 | { | 310 | { |
232 | Suite *s = suite_create("Messenger"); | 311 | Suite *s = suite_create("Messenger"); |
@@ -241,6 +320,8 @@ Suite *messenger_suite(void) | |||
241 | //TCase *addfriend = tcase_create("addfriend"); | 320 | //TCase *addfriend = tcase_create("addfriend"); |
242 | TCase *setname = tcase_create("setname"); | 321 | TCase *setname = tcase_create("setname"); |
243 | TCase *getname = tcase_create("getname"); | 322 | TCase *getname = tcase_create("getname"); |
323 | TCase *dht_state_saveloadsave = tcase_create("dht_state_saveloadsave"); | ||
324 | TCase *messenger_state_saveloadsave = tcase_create("messenger_state_saveloadsave"); | ||
244 | 325 | ||
245 | tcase_add_test(userstatus_size, test_m_get_userstatus_size); | 326 | tcase_add_test(userstatus_size, test_m_get_userstatus_size); |
246 | tcase_add_test(set_userstatus, test_m_set_userstatus); | 327 | tcase_add_test(set_userstatus, test_m_set_userstatus); |
@@ -252,6 +333,8 @@ Suite *messenger_suite(void) | |||
252 | //tcase_add_test(addfriend, test_m_addfriend); | 333 | //tcase_add_test(addfriend, test_m_addfriend); |
253 | tcase_add_test(setname, test_getname); | 334 | tcase_add_test(setname, test_getname); |
254 | tcase_add_test(setname, test_setname); | 335 | tcase_add_test(setname, test_setname); |
336 | tcase_add_test(dht_state_saveloadsave, test_dht_state_saveloadsave); | ||
337 | tcase_add_test(messenger_state_saveloadsave, test_messenger_state_saveloadsave); | ||
255 | 338 | ||
256 | suite_add_tcase(s, userstatus_size); | 339 | suite_add_tcase(s, userstatus_size); |
257 | suite_add_tcase(s, set_userstatus); | 340 | suite_add_tcase(s, set_userstatus); |
@@ -263,6 +346,8 @@ Suite *messenger_suite(void) | |||
263 | //suite_add_tcase(s, addfriend); | 346 | //suite_add_tcase(s, addfriend); |
264 | suite_add_tcase(s, getname); | 347 | suite_add_tcase(s, getname); |
265 | suite_add_tcase(s, setname); | 348 | suite_add_tcase(s, setname); |
349 | suite_add_tcase(s, messenger_state_saveloadsave); | ||
350 | suite_add_tcase(s, dht_state_saveloadsave); | ||
266 | 351 | ||
267 | return s; | 352 | return s; |
268 | } | 353 | } |