From bfbb7bdf51ded03c2277992df3fb619488bd26a8 Mon Sep 17 00:00:00 2001 From: Ingo Huerner Date: Thu, 30 Mar 2017 14:35:18 +0200 Subject: Added test for corrupt key-names when reusing a deleted block --- test/test_pco_key_value_store.c | 156 +++++++++++++++++++++++++++++++++++++++- 1 file 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