Skip to content
This repository has been archived by the owner on Feb 16, 2025. It is now read-only.

Commit

Permalink
tests: fix other tests and some bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
kodebach committed Nov 7, 2019
1 parent c81a30a commit a9e6df6
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 111 deletions.
33 changes: 23 additions & 10 deletions src/libs/elektra/keyname.c
Original file line number Diff line number Diff line change
Expand Up @@ -509,8 +509,14 @@ int elektraKeyNameValidate (const char * name, const char * prefix, size_t * siz

const char * nameStart = name;

size_t size = *sizePtr + strlen (name) + 1; // +1 either for terminating zero, or starting separator (if we have prefix)
size_t usize = *usizePtr + strlen (name) + 1; // +1 either for terminating zero, or starting separator (if we have prefix)
size_t size, usize;
size = usize = strlen (name) + 1; // +1 either for terminating zero, or starting separator (if we have prefix)

if (prefix != NULL)
{
size += *sizePtr;
usize += *usizePtr;
}

enum
{
Expand All @@ -534,7 +540,7 @@ int elektraKeyNameValidate (const char * name, const char * prefix, size_t * siz
name += leadingSlashes;
}

if (*usizePtr == 3)
if (prefix != NULL && *usizePtr == 3)
{
// namespace only base key, no need to add separator
--size;
Expand Down Expand Up @@ -707,10 +713,11 @@ int elektraKeyNameValidate (const char * name, const char * prefix, size_t * siz
}
}

if (state == FIRST_PART || state == EMPTY_PART)
if (state == PART)
{
*sizePtr = size;
*usizePtr = usize;
// have trailing slash
*sizePtr = size - 1;
*usizePtr = usize - 1;
return 1;
}

Expand All @@ -721,9 +728,8 @@ int elektraKeyNameValidate (const char * name, const char * prefix, size_t * siz
return 1;
}

// have trailing slash
*sizePtr = size - 1;
*usizePtr = usize - 1;
*sizePtr = size;
*usizePtr = usize;
return 1;
}

Expand Down Expand Up @@ -817,6 +823,11 @@ void elektraKeyNameCanonicalize (const char * name, char ** canonicalName, size_
}
else if (offset > 1)
{
if (*(outPtr - 1) == '\0')
{
--outPtr;
}

if (*(outPtr - 1) != '/')
{
*outPtr++ = '/';
Expand Down Expand Up @@ -1490,6 +1501,8 @@ ssize_t keyAddName (Key * key, const char * newName)

if (strlen (newName) == 0) return key->keySize;

size_t oldKeySize = key->keySize;

if (!elektraKeyNameValidate (newName, key->key, &key->keySize, &key->keyUSize))
{
// error invalid name suffix
Expand All @@ -1516,7 +1529,7 @@ ssize_t keyAddName (Key * key, const char * newName)
elektraRealloc ((void **) &key->key, key->keySize);
elektraRealloc ((void **) &key->ukey, key->keyUSize);

elektraKeyNameCanonicalize (newName, &key->key, key->keySize, key->keyUSize == 3);
elektraKeyNameCanonicalize (newName, &key->key, oldKeySize, key->keyUSize == 3);
elektraKeyNameUnescape (key->key, &key->ukey);

set_bit (key->flags, KEY_FLAG_SYNC);
Expand Down
62 changes: 36 additions & 26 deletions tests/ctest/test_internal.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ static void test_elektraStrLen (void)
{
charSeq[0] = '\33';
charSeq[1] = 'a';
charSeq[2] = i; // 1..254
charSeq[2] = i; // 1..254
charSeq[3] = 256 - i; // 255..2
charSeq[4] = '\0';

Expand All @@ -61,9 +61,19 @@ static void test_elektraStrLen (void)
}
}

#define TEST_VALIDATE_NAME_OK(NAME, MSG) succeed_if (elektraKeyNameValidate (NAME, "/"), MSG " ok");
#define TEST_VALIDATE_NAME_OK(NAME, MSG) \
do \
{ \
size_t s = 2, u = 3; \
succeed_if (elektraKeyNameValidate (NAME, "/", &s, &u), MSG " ok"); \
} while (0)

#define TEST_VALIDATE_NAME_NOK(NAME, MSG) succeed_if (!elektraKeyNameValidate (NAME, "/"), MSG " not ok");
#define TEST_VALIDATE_NAME_NOK(NAME, MSG) \
do \
{ \
size_t s = 2, u = 3; \
succeed_if (!elektraKeyNameValidate (NAME, "/", &s, &u), MSG "not ok"); \
} while (0)

static void test_elektraKeyNameValidate (void)
{
Expand Down Expand Up @@ -114,12 +124,12 @@ static void test_elektraKeyNameEscapePart (void)
TEST_ESCAPE_PART_OK ("\\\\\\..", "\\\\\\\\\\\\..");
TEST_ESCAPE_PART_OK ("/", "\\/");
TEST_ESCAPE_PART_OK ("\\/", "\\\\\\/"); // 1 -> 3
TEST_ESCAPE_PART_OK ("\\\\/", "\\\\\\\\\\/"); // 2 -> 5
TEST_ESCAPE_PART_OK ("\\\\/", "\\\\\\\\\\/"); // 2 -> 5
TEST_ESCAPE_PART_OK ("ab\\\\/", "ab\\\\\\\\\\/"); // 2 -> 5
TEST_ESCAPE_PART_OK ("ab\\\\/de", "ab\\\\\\\\\\/de"); // 2 -> 5
TEST_ESCAPE_PART_OK ("\\", "\\\\"); // 1 -> 2
TEST_ESCAPE_PART_OK ("\\\\", "\\\\\\\\"); // 2 -> 4
TEST_ESCAPE_PART_OK ("\\\\\\", "\\\\\\\\\\\\"); // 3 -> 6
TEST_ESCAPE_PART_OK ("\\\\", "\\\\\\\\"); // 2 -> 4
TEST_ESCAPE_PART_OK ("\\\\\\", "\\\\\\\\\\\\"); // 3 -> 6
elektraFree (dest);
}

Expand All @@ -133,119 +143,119 @@ static void test_elektraKeyNameUnescape (void)
dest[2] = '\0';
char * p = NULL;

succeed_if (elektraKeyNameUnescape ("abc", &dest, 2) == 6, "size of unescaping wrong");
elektraKeyNameUnescape ("abc", &dest);
succeed_if_same_string ("abc", dest + 2);

succeed_if (elektraKeyNameUnescape ("\\\\.", &dest, 2) == 5, "size of unescaping wrong");
elektraKeyNameUnescape ("\\\\.", &dest);
succeed_if_same_string ("\\.", dest + 2);

succeed_if (elektraKeyNameUnescape ("abc/def", &dest, 2) == 10, "size of unescaping wrong");
elektraKeyNameUnescape ("abc/def", &dest);
p = dest + 2;
succeed_if_same_string ("abc", p);
p += 4;
succeed_if_same_string ("def", p);

succeed_if (elektraKeyNameUnescape ("abc\\/def", &dest, 2) == 10, "size of unescaping wrong");
elektraKeyNameUnescape ("abc\\/def", &dest);
p = dest + 2;
succeed_if_same_string ("abc/def", p);

succeed_if (elektraKeyNameUnescape ("abc/%/def", &dest, 2) == 11, "size of unescaping wrong");
elektraKeyNameUnescape ("abc/%/def", &dest);
p = dest + 2;
succeed_if_same_string ("abc", p);
p += 4;
succeed_if_same_string ("", p);
p += 1;
succeed_if_same_string ("def", p);

succeed_if (elektraKeyNameUnescape ("abc/\\%/def", &dest, 2) == 12, "size of unescaping wrong");
elektraKeyNameUnescape ("abc/\\%/def", &dest);
p = dest + 2;
succeed_if_same_string ("abc", p);
p += 4;
succeed_if_same_string ("%", p);
p += 2;
succeed_if_same_string ("def", p);

succeed_if (elektraKeyNameUnescape ("abc/\\./def", &dest, 2) == 12, "size of unescaping wrong");
elektraKeyNameUnescape ("abc/\\./def", &dest);
p = dest + 2;
succeed_if_same_string ("abc", p);
p += 4;
succeed_if_same_string (".", p);
p += 2;
succeed_if_same_string ("def", p);

succeed_if (elektraKeyNameUnescape ("abc/\\../def", &dest, 2) == 13, "size of unescaping wrong");
elektraKeyNameUnescape ("abc/\\../def", &dest);
p = dest + 2;
succeed_if_same_string ("abc", p);
p += 4;
succeed_if_same_string ("..", p);
p += 3;
succeed_if_same_string ("def", p);

succeed_if (elektraKeyNameUnescape ("abc/\\\\../def", &dest, 2) == 14, "size of unescaping wrong");
elektraKeyNameUnescape ("abc/\\\\../def", &dest);
p = dest + 2;
succeed_if_same_string ("abc", p);
p += 4;
succeed_if_same_string ("\\..", p);
p += 4;
succeed_if_same_string ("def", p);

succeed_if (elektraKeyNameUnescape ("a\\\\c/\\../d\\\\f", &dest, 2) == 13, "size of unescaping wrong");
elektraKeyNameUnescape ("a\\\\c/\\../d\\\\f", &dest);
p = dest + 2;
succeed_if_same_string ("a\\c", p);
p += 4;
succeed_if_same_string ("..", p);
p += 3;
succeed_if_same_string ("d\\f", p);

succeed_if (elektraKeyNameUnescape ("\\\\bc/\\%/\\\\ef", &dest, 2) == 12, "size of unescaping wrong");
elektraKeyNameUnescape ("\\\\bc/\\%/\\\\ef", &dest);
p = dest + 2;
succeed_if_same_string ("\\bc", p);
p += 4;
succeed_if_same_string ("%", p);
p += 2;
succeed_if_same_string ("\\ef", p);

succeed_if (elektraKeyNameUnescape ("\\\\b/\\%/\\\\e", &dest, 2) == 10, "size of unescaping wrong");
elektraKeyNameUnescape ("\\\\b/\\%/\\\\e", &dest);
p = dest + 2;
succeed_if_same_string ("\\b", p);
p += 3;
succeed_if_same_string ("%", p);
p += 2;
succeed_if_same_string ("\\e", p);

succeed_if (elektraKeyNameUnescape ("\\\\b/\\\\%/\\\\e", &dest, 2) == 11, "size of unescaping wrong");
elektraKeyNameUnescape ("\\\\b/\\\\%/\\\\e", &dest);
p = dest + 2;
succeed_if_same_string ("\\b", p);
p += 3;
succeed_if_same_string ("\\%", p);
p += 3;
succeed_if_same_string ("\\e", p);

succeed_if (elektraKeyNameUnescape ("a\\/\\/def", &dest, 2) == 9, "size of unescaping wrong");
elektraKeyNameUnescape ("a\\/\\/def", &dest);
p = dest + 2;
succeed_if_same_string ("a//def", p);

succeed_if (elektraKeyNameUnescape ("\\/\\/\\/def", &dest, 2) == 9, "size of unescaping wrong");
elektraKeyNameUnescape ("\\/\\/\\/def", &dest);
p = dest + 2;
succeed_if_same_string ("///def", p);

succeed_if (elektraKeyNameUnescape ("\\/\\/\\/def", &dest, 2) == 9, "size of unescaping wrong");
elektraKeyNameUnescape ("\\/\\/\\/def", &dest);
p = dest + 2;
succeed_if_same_string ("///def", p);

succeed_if (elektraKeyNameUnescape ("\\/\\/\\/\\/\\/\\/", &dest, 2) == 9, "size of unescaping wrong");
elektraKeyNameUnescape ("\\/\\/\\/\\/\\/\\/", &dest);
p = dest + 2;
succeed_if_same_string ("//////", p);

succeed_if (elektraKeyNameUnescape ("\\/\\/%\\/\\/\\/", &dest, 2) == 9, "size of unescaping wrong");
elektraKeyNameUnescape ("\\/\\/%\\/\\/\\/", &dest);
p = dest + 2;
succeed_if_same_string ("//%///", p);

succeed_if (elektraKeyNameUnescape ("\\/\\/..\\/\\/", &dest, 2) == 9, "size of unescaping wrong");
elektraKeyNameUnescape ("\\/\\/..\\/\\/", &dest);
p = dest + 2;
succeed_if_same_string ("//..//", p);

succeed_if (elektraKeyNameUnescape ("bar\\/foo_bar\\/", &dest, 2) == sizeof ("bar/foo_bar/") + 2, "size of unescaping wrong");
elektraKeyNameUnescape ("bar\\/foo_bar\\/", &dest);
p = dest + 2;
succeed_if_same_string ("bar/foo_bar/", p);

Expand Down
Loading

0 comments on commit a9e6df6

Please sign in to comment.