diff options
author | Ingo Huerner <ingo_huerner@mentor.com> | 2017-03-30 14:35:18 +0200 |
---|---|---|
committer | Ingo Huerner <ingo_huerner@mentor.com> | 2017-03-30 14:35:18 +0200 |
commit | bfbb7bdf51ded03c2277992df3fb619488bd26a8 (patch) | |
tree | d578d2935775da273531f13e2c26821a2ff9c5e0 /test | |
parent | 3b28999fa9a1f7f8cd9b55ba6f8165e2447038fc (diff) | |
download | persistence-common-object-bfbb7bdf51ded03c2277992df3fb619488bd26a8.tar.gz |
Added test for corrupt key-names when reusing a deleted block
Diffstat (limited to 'test')
-rw-r--r-- | test/test_pco_key_value_store.c | 156 |
1 files changed, 154 insertions, 2 deletions
diff --git a/test/test_pco_key_value_store.c b/test/test_pco_key_value_store.c index f6bfd63..cae906b 100644 --- a/test/test_pco_key_value_store.c +++ b/test/test_pco_key_value_store.c @@ -3014,6 +3014,150 @@ START_TEST(test_WriteThrough) END_TEST +START_TEST(test_AddKey_DeleteKey_AddShorterKeyName) +{ + char* write2 = + "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstu" + "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstu" + "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstu" + "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstu" + "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstu" + "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstu" + "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstu" + "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstu" + "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstu" + "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstu" + "1234565794587954687654"; + + const char* longKeyTemplate = "AlongKey_%d_whi.ch_is_very_long"; + const char* mixedKeyFragment = "is_very_long"; + char keyBuffer[256] = {0}; + int handle = -1; + int ret = 0; + int i = 0, listSize = 0; + + //Cleaning up testdata folder + remove("/tmp/AddKey_DeleteKey_AddShorterKeyName.db"); + + + handle = persComDbOpen("/tmp/AddKey_DeleteKey_AddShorterKeyName.db", 0x1); //create test.db if not present + fail_unless(handle >= 0, "Failed to create non existent lDB: retval: [%d]", handle); + + // + // add keys with long key-names + // + for(i=1; i<=300; i++) + { + memset(keyBuffer, 0, 256); + snprintf(keyBuffer, 128, longKeyTemplate, i, i); + + ret = persComDbWriteKey(handle, keyBuffer, (char*)write2, strlen(write2)); + fail_unless(ret == strlen(write2) , "Wrong write size while inserting in cache"); + } + ret = persComDbClose(handle); + handle = -1; + + // + // delete all keys with long key-names. + // + handle = persComDbOpen("/tmp/AddKey_DeleteKey_AddShorterKeyName.db", 0x2); // write through + fail_unless(handle >= 0, "Failed to create non existent lDB: retval: [%d]", handle); + + for(i=1; i<=300; i++) + { + memset(keyBuffer, 0, 256); + snprintf(keyBuffer, 128, longKeyTemplate, i, i); + + ret = persComDbDeleteKey(handle, keyBuffer); + fail_unless(ret >= 0, "Failed to delete key: %d - error: %d", i, ret); + } + ret = persComDbClose(handle); + handle = -1; + + + // + // now add new keys with shorter key-names; memory space from deleted keys in the db should be reused by newly added keys. + // + handle = persComDbOpen("/tmp/AddKey_DeleteKey_AddShorterKeyName.db", 0x2); // write through + fail_unless(handle >= 0, "Failed to create non existent lDB: retval: [%d]", handle); + + + ret = persComDbWriteKey(handle, "ASHORTKEY_01", (char*)write2, strlen(write2)); + fail_unless(ret == strlen(write2) , "Wrong write size while inserting in cache"); + + ret = persComDbWriteKey(handle, "ASHORTKEY_02", (char*)write2, strlen(write2)); + fail_unless(ret == strlen(write2) , "Wrong write size while inserting in cache"); + + ret = persComDbWriteKey(handle, "ALONGKEY_10_SHORT", (char*)write2, strlen(write2)); + fail_unless(ret == strlen(write2) , "Wrong write size while inserting in cache"); + + ret = persComDbWriteKey(handle, "ALONGKEY_20_SHORT", (char*)write2, strlen(write2)); + fail_unless(ret == strlen(write2) , "Wrong write size while inserting in cache"); + + ret = persComDbClose(handle); + handle = -1; + + // + // now check if key-names were correctly written + // + handle = persComDbOpen("/tmp/AddKey_DeleteKey_AddShorterKeyName.db", 0x2); // write through + + listSize = persComDbGetSizeKeysList(handle); + + if(listSize > 0) + { + // now extract from the given list the single keys and search for mixed up key-names + char* resourceList = (char*)malloc((size_t)listSize+4); + memset(resourceList, 0, (size_t)listSize+4-1); + + if(resourceList != NULL) + { + int i = 0, idx = 0, numResources = 0; + int resourceStartIdx[256] = {0}; + char buffer[2048] = {0}; + + memset(resourceStartIdx, 0, 256-1); + ret = persComDbGetKeysList(handle, resourceList, listSize); + + if(ret != 0) + { + resourceStartIdx[idx] = 0; // initial start + + for(i=1; i<listSize; i++ ) + { + if(resourceList[i] == '\0') + { + numResources++; + resourceStartIdx[idx++] = i+1; + } + } + for(i=0; i<=numResources; i++) + { + // now search for mixed keys; if we have found the mixedKeryFragment, key-name is corrupt and test must fail + char* mixedFound = strstr(&resourceList[resourceStartIdx[i]], mixedKeyFragment); + if(NULL != mixedFound) + { + printf("Key[%d]: %s\n", i, &resourceList[resourceStartIdx[i]]); + printf(" Problem: %s\n", &resourceList[resourceStartIdx[i]]); + } + + fail_unless(NULL == mixedFound, "Invalid key name detected [%s]", &resourceList[resourceStartIdx[i]]); + } + } + + free(resourceList); + } + } + + ret = persComDbClose(handle); + handle = -1; + +} +END_TEST + + + + static Suite* persistenceCommonLib_suite() { @@ -3092,6 +3236,9 @@ static Suite* persistenceCommonLib_suite() tcase_add_test(tc_WriteThrough, test_WriteThrough); tcase_set_timeout(tc_WriteThrough, 20); + TCase* tc_AddKey_DeleteKey_AddShorterKeyName = tcase_create("AddKey_DeleteKey_AddShorterKeyName"); + tcase_add_test(tc_AddKey_DeleteKey_AddShorterKeyName, test_AddKey_DeleteKey_AddShorterKeyName); + tcase_set_timeout(tc_AddKey_DeleteKey_AddShorterKeyName, 60); suite_add_tcase(s, tc_persOpenLocalDB); @@ -3161,16 +3308,22 @@ static Suite* persistenceCommonLib_suite() suite_add_tcase(s, tc_WriteThrough); tcase_add_checked_fixture(tc_WriteThrough, data_setup, data_teardown); + suite_add_tcase(s, tc_AddKey_DeleteKey_AddShorterKeyName); + return s; } + + + + + int main(int argc, char* argv[]) { int nr_failed = 0, nr_run = 0, i = 0; TestResult** tResult; -#if 1 Suite* s = persistenceCommonLib_suite(); SRunner* sr = srunner_create(s); srunner_set_xml(sr, "/tmp/persistenceCommonObjectTest.xml"); @@ -3187,7 +3340,6 @@ int main(int argc, char* argv[]) } srunner_free(sr); -#endif dlt_free(); return (0 == nr_failed) ? EXIT_SUCCESS : EXIT_FAILURE; |