summaryrefslogtreecommitdiffstats
path: root/tests/test-vector.c
diff options
context:
space:
mode:
authorChris Hall <chris.hall@highwayman.com>2011-07-21 19:53:02 +0100
committerChris Hall <chris.hall@highwayman.com>2011-07-21 19:53:02 +0100
commit56da2a1c9b6361e302b7a39fe2740561a9012d88 (patch)
tree6b6543532133a0c618d0f4ec70a87cf3f96caf30 /tests/test-vector.c
parente535bc959729262480a9702e71334002edee3f8c (diff)
downloadquagga-56da2a1c9b6361e302b7a39fe2740561a9012d88.tar.bz2
quagga-56da2a1c9b6361e302b7a39fe2740561a9012d88.tar.xz
Update pipework and improve memory reporting.
Improve error handling for all new pipework inputs and outputs. Change behaviour of ^C from VTY Terminal, so that will interrupt output and terminate all running pipes -- including running shell commands. In pipe commands, recognise "~/..." and "~user/..." home directory forms. Changed "~/" to mean the usual home for the current user. "~~/" now means the configuration file directory. Introduced "shdir DIR" command to show what is (currently) what. Changed "<|" so that if the command has a path, it is expanded using Quagga's rules (including "~~/" and "~./") and the "here" directory is set to that path. Fixed collection of stderr output from all pipes so that is separate from stdout output, and is always sent to the base output (eg VTY Terminal). Increase amount of information about the heap that "show mem" shows -- particularly if the "memory_tracker" is enabled. Tested and applied resulting fixes.
Diffstat (limited to 'tests/test-vector.c')
-rw-r--r--tests/test-vector.c304
1 files changed, 66 insertions, 238 deletions
diff --git a/tests/test-vector.c b/tests/test-vector.c
index 109f9004..02105e01 100644
--- a/tests/test-vector.c
+++ b/tests/test-vector.c
@@ -25,12 +25,11 @@ void test_vector_insert_item(void);
void test_vector_insert_item_here(void);
void test_vector_delete_item(void);
void do_test_insert(const int rider);
-int sort_cmp(const void* const* a, const void* const* b);
+int sort_cmp(void const* const* a, void const* const* b);
void test_vector_sort(void);
void test_vector_bsearch(void);
void test_vector_move_item_here(void);
-void do_test_move_item_here(const int rider, vector_index ins, vector_index src,
- char strings[][10], const vector_index len) ;
+void do_test_move_item_here(const int rider);
void test_vector_part_reverse(void);
void test_vector_copy_here(void);
void test_vector_move_here(void);
@@ -290,9 +289,9 @@ test_vector_set(void)
"vector_active != 1000");
vector_set(v, s1000);
- assert_true(vector_count(v) == len + 1,
+ assert_true(vector_count(v) == (unsigned)len + 1,
"vector_count != 1001");
- assert_true(vector_active(v) == len + 1,
+ assert_true(vector_active(v) == (unsigned)len + 1,
"vector_active != 1001");
assert_true(vector_slot(v,1000) == s1000,
"vector_slot != 1000");
@@ -551,7 +550,7 @@ test_vector_sort(void)
}
int
-sort_cmp(const void* const* a, const void* const* b)
+sort_cmp(void const* const* a, void const* const* b)
{
return strcmp(*a, *b);
}
@@ -606,275 +605,104 @@ test_vector_bsearch(void)
void
test_vector_move_item_here(void)
{
- const uint n = 20 ;
- const uint l = n - 1 ;
- char strings[n][10] ;
- uint i ;
-
- for (i = 0 ; i < n ; ++i)
- sprintf(strings[i], "item=%2u", i) ;
-
- do_test_move_item_here(-1, 8, 16, strings, n);
- do_test_move_item_here( 0, 8, 16, strings, n);
- do_test_move_item_here(+1, 8, 16, strings, n);
-
- do_test_move_item_here(-1, 16, 8, strings, n);
- do_test_move_item_here( 0, 16, 8, strings, n);
- do_test_move_item_here(+1, 16, 8, strings, n);
-
- do_test_move_item_here(-1, 9, 9, strings, n);
- do_test_move_item_here( 0, 9, 9, strings, n);
- do_test_move_item_here(+1, 9, 9, strings, n);
-
- do_test_move_item_here(-1, 10, 9, strings, n);
- do_test_move_item_here( 0, 10, 9, strings, n);
- do_test_move_item_here(+1, 10, 9, strings, n);
-
- do_test_move_item_here(-1, 9, 10, strings, n);
- do_test_move_item_here( 0, 9, 10, strings, n);
- do_test_move_item_here(+1, 9, 10, strings, n);
-
- do_test_move_item_here(-1, 11, 9, strings, n);
- do_test_move_item_here( 0, 11, 9, strings, n);
- do_test_move_item_here(+1, 11, 9, strings, n);
-
- do_test_move_item_here(-1, 9, 11, strings, n);
- do_test_move_item_here( 0, 9, 11, strings, n);
- do_test_move_item_here(+1, 9, 11, strings, n);
-
- do_test_move_item_here(-1, 0, 10, strings, n);
- do_test_move_item_here( 0, 0, 10, strings, n);
- do_test_move_item_here(+1, 0, 10, strings, n);
-
- do_test_move_item_here(-1, 10, 0, strings, n);
- do_test_move_item_here( 0, 10, 0, strings, n);
- do_test_move_item_here(+1, 10, 0, strings, n);
-
- do_test_move_item_here(-1, 0, l, strings, n);
- do_test_move_item_here( 0, 0, l, strings, n);
- do_test_move_item_here(+1, 0, l, strings, n);
-
- do_test_move_item_here(-1, l, 0, strings, n);
- do_test_move_item_here( 0, l, 0, strings, n);
- do_test_move_item_here(+1, l, 0, strings, n);
-
- do_test_move_item_here(-1, 10, l, strings, n);
- do_test_move_item_here( 0, 10, l, strings, n);
- do_test_move_item_here(+1, 10, l, strings, n);
-
- do_test_move_item_here(-1, l, 10, strings, n);
- do_test_move_item_here( 0, l, 10, strings, n);
- do_test_move_item_here(+1, l, 10, strings, n);
-
- do_test_move_item_here(-1, 0, 0, strings, n);
- do_test_move_item_here( 0, 0, 0, strings, n);
- do_test_move_item_here(+1, 0, 0, strings, n);
-
- do_test_move_item_here(-1, 1, 1, strings, n);
- do_test_move_item_here( 0, 1, 1, strings, n);
- do_test_move_item_here(+1, 1, 1, strings, n);
-
- do_test_move_item_here(-1, 0, 1, strings, n);
- do_test_move_item_here( 0, 0, 1, strings, n);
- do_test_move_item_here(+1, 0, 1, strings, n);
-
- do_test_move_item_here(-1, 1, 0, strings, n);
- do_test_move_item_here( 0, 1, 0, strings, n);
- do_test_move_item_here(+1, 1, 0, strings, n);
-
- do_test_move_item_here(-1, 0, 2, strings, n);
- do_test_move_item_here( 0, 0, 2, strings, n);
- do_test_move_item_here(+1, 0, 2, strings, n);
-
- do_test_move_item_here(-1, 2, 0, strings, n);
- do_test_move_item_here( 0, 2, 0, strings, n);
- do_test_move_item_here(+1, 2, 0, strings, n);
-
- do_test_move_item_here(-1, l, l, strings, n);
- do_test_move_item_here( 0, l, l, strings, n);
- do_test_move_item_here(+1, l, l, strings, n);
-
- do_test_move_item_here(-1,l-1, l, strings, n);
- do_test_move_item_here( 0,l-1, l, strings, n);
- do_test_move_item_here(+1,l-1, l, strings, n);
-
- do_test_move_item_here(-1, l,l-1, strings, n);
- do_test_move_item_here( 0, l,l-1, strings, n);
- do_test_move_item_here(+1, l,l-1, strings, n);
+ do_test_move_item_here(-1);
+ do_test_move_item_here(0);
+ do_test_move_item_here(1);
}
void
-do_test_move_item_here(const int rider, vector_index ins, vector_index src,
- char strings[][10], const vector_index len)
+do_test_move_item_here(const int rider)
{
vector v = NULL;
- vector_index i, e, check_end ;
- vector_index hi, lo ;
- char* expect[len] ;
-
+ const vector_length_t len = 100;
+ const vector_index_t ins = 50;
+ const vector_index_t src = 70;
+ vector_index_t i;
+ char buf[10];
+ vector_index_t check_dest = 0;
+ vector_index_t check_src = 0;
+ vector_index_t check_end = 0;
+ int check_shift = 0;
p_vector_item dest_item = NULL;
+
switch(rider)
{
case -1:
- printf("test_vector_move_here before dst=%2d, src=%2d\n", src, ins);
+ printf("test_vector_move_here before\n");
+ check_dest = ins;
+ check_src = src;
+ check_end = len;
+ check_shift = 1;
break;
-
case 0:
- printf("test_vector_move_here at dst=%2d, src=%2d\n", src, ins);
- --check_end ;
+ printf("test_vector_move_here at\n");
+ check_dest = ins;
+ check_src = src - 1;
+ check_end = len - 1;
+ check_shift = 0;
break;
-
case 1:
- printf("test_vector_move_here after dst=%2d, src=%2d\n", src, ins);
+ printf("test_vector_move_here after\n");
+ check_dest = ins + 1;
+ check_src = src;
+ check_end = len;
+ check_shift = 1;
break;
- } ;
-
- /* Build the test vector and perform action */
+ }
v = vector_init_new(v, 0);
for (i = 0; i < len; ++i)
- vector_set_item(v, i, strdup(strings[i]));
+ {
+ sprintf(buf, "%u", i);
+ vector_set_item(v, i, strdup(buf));
+ }
dest_item = vector_get_item(v, ins); /* item to free if rider == 0 */
vector_move_item_here(v, ins, rider, src);
+ assert_true(vector_end(v) == check_end, "vector_end(v) != check_end");
- /* Build the expected result. */
+ /* check contents are correct */
- if (ins <= src)
+ /* from start to insertion point */
+ for (i = 0; i < check_dest - 1; ++i)
{
- lo = ins ;
- hi = src ;
+ sprintf(buf, "%u", i);
+ assert_true(strcmp(vector_get_item(v, i), buf) == 0,
+ "vector_get_item(v, i) != buf");
}
- else
- {
- lo = src ;
- hi = ins ;
- } ;
- check_end = (rider != 0) ? len : len - 1 ;
- i = 0 ;
- e = 0 ;
+ /* at insertion point */
+ sprintf(buf, "%u", src);
+ assert_true(strcmp(vector_get_item(v, check_dest), buf) == 0,
+ "vector_get_item(v, check_dest) != buf");
- while (i < lo)
- expect[i++] = strings[e++] ;
-
- if (lo == hi)
+ /* from insertion point to src */
+ for (i = check_dest + 1; i <= check_src; ++i)
{
- /* Special case -- do nothing if rider != 0
- * drop entry if rider == 0
- */
- if (rider == 0)
- ++e ;
+ sprintf(buf, "%u", i - check_shift);
+ assert_true(strcmp(vector_get_item(v, i), buf) == 0, "vector_get_item(v, i) != buf");
}
- else if (lo == (hi - 1))
+
+ /* from src to end */
+ for (i = check_src + 1; i < check_end; ++i)
{
- /* Special case -- ins and src next to each other !
- *
- * If rider != 0 -- insert ins and src in the required order
- * If rider == 0 -- insert just src
- */
- if (rider < 0)
- {
- expect[i++] = strings[src] ;
- expect[i++] = strings[ins] ;
- }
- else if (rider == 0)
- {
- expect[i++] = strings[src] ;
- }
- else
- {
- expect[i++] = strings[ins] ;
- expect[i++] = strings[src] ;
- } ;
- e += 2 ;
+ sprintf(buf, "%u", i - (check_shift - 1));
+ assert_true(strcmp(vector_get_item(v, i), buf) == 0, "vector_get_item(v, i) != buf");
}
- else
- {
- /* Now we know that ins and src are separated by at least 1 entry.
- */
- uint be ;
-
- be = hi - 1 ;
-
- if (ins < src)
- {
- /* At insertion point, so insert ins and src in the required order
- * or insert juist the src.
- */
- if (rider < 0)
- {
- expect[i++] = strings[src] ;
- expect[i++] = strings[ins] ;
- ++be ;
- }
- else if (rider == 0)
- {
- expect[i++] = strings[src] ;
- }
- else
- {
- expect[i++] = strings[ins] ;
- expect[i++] = strings[src] ;
- ++be ;
- } ;
-
- ++be ;
- } ;
-
- e += 1 ;
-
- while (i < be)
- expect[i++] = strings[e++] ;
-
- if (ins > src)
- {
- /* At insertion point, so insert ins and src in the required order
- * or insert juist the src.
- */
- if (rider < 0)
- {
- expect[i++] = strings[src] ;
- expect[i++] = strings[ins] ;
- }
- else if (rider == 0)
- {
- expect[i++] = strings[src] ;
- }
- else
- {
- expect[i++] = strings[ins] ;
- expect[i++] = strings[src] ;
- } ;
- } ;
-
- e = hi + 1 ;
- } ;
-
- while (i < check_end)
- expect[i++] = strings[e++] ;
-
- /* check contents are correct */
- assert_true(vector_end(v) == check_end, "vector_end(v) != check_end");
- for (i = 0 ; i < check_end ; ++i)
- {
- if (strcmp(vector_get_item(v, i), expect[i]) != 0)
- {
- assert_true(0, "vector_get_item(v, i) != expected") ;
- break ;
- } ;
- } ;
-
- /* free contents */
+ /* free contents */
for (i = 0; i < vector_end(v); ++i)
- free(vector_slot(v, i));
+ {
+ free(vector_slot(v, i));
+ }
if (rider == 0)
- free(dest_item);
+ {
+ free(dest_item);
+ }
vector_free(v);
}