diff options
Diffstat (limited to 'tests/t_vector.c')
| -rw-r--r-- | tests/t_vector.c | 62 |
1 files changed, 54 insertions, 8 deletions
diff --git a/tests/t_vector.c b/tests/t_vector.c index a8186b2..6e048e1 100644 --- a/tests/t_vector.c +++ b/tests/t_vector.c | |||
| @@ -13,7 +13,7 @@ | |||
| 13 | #include "trackerlogic.h" | 13 | #include "trackerlogic.h" |
| 14 | #include "test.h" | 14 | #include "test.h" |
| 15 | 15 | ||
| 16 | /* binary_search returns the matching member when there is one, and otherwise | 16 | /* vector_binary_search returns the matching member when there is one, and otherwise |
| 17 | the position at which the key would have to be inserted to keep the vector | 17 | the position at which the key would have to be inserted to keep the vector |
| 18 | sorted. exactmatch distinguishes the two. */ | 18 | sorted. exactmatch distinguishes the two. */ |
| 19 | 19 | ||
| @@ -25,7 +25,7 @@ static void case_search_finds_member(void) { | |||
| 25 | void *found; | 25 | void *found; |
| 26 | 26 | ||
| 27 | test_case("an existing key is found"); | 27 | test_case("an existing key is found"); |
| 28 | found = binary_search(key, sorted, 5, 4, 4, &exactmatch); | 28 | found = vector_binary_search(key, sorted, 5, 4, 4, &exactmatch); |
| 29 | CHECK(exactmatch != 0); | 29 | CHECK(exactmatch != 0); |
| 30 | CHECK_PTR(found, sorted[2]); | 30 | CHECK_PTR(found, sorted[2]); |
| 31 | } | 31 | } |
| @@ -36,9 +36,9 @@ static void case_search_finds_first_and_last(void) { | |||
| 36 | int exactmatch; | 36 | int exactmatch; |
| 37 | 37 | ||
| 38 | test_case("the first and last members are found"); | 38 | test_case("the first and last members are found"); |
| 39 | CHECK_PTR(binary_search(first, sorted, 5, 4, 4, &exactmatch), sorted[0]); | 39 | CHECK_PTR(vector_binary_search(first, sorted, 5, 4, 4, &exactmatch), sorted[0]); |
| 40 | CHECK(exactmatch != 0); | 40 | CHECK(exactmatch != 0); |
| 41 | CHECK_PTR(binary_search(last, sorted, 5, 4, 4, &exactmatch), sorted[4]); | 41 | CHECK_PTR(vector_binary_search(last, sorted, 5, 4, 4, &exactmatch), sorted[4]); |
| 42 | CHECK(exactmatch != 0); | 42 | CHECK(exactmatch != 0); |
| 43 | } | 43 | } |
| 44 | 44 | ||
| @@ -49,11 +49,11 @@ static void case_search_insert_position(void) { | |||
| 49 | void *slot; | 49 | void *slot; |
| 50 | 50 | ||
| 51 | test_case("a missing key yields its insert position"); | 51 | test_case("a missing key yields its insert position"); |
| 52 | slot = binary_search(middle, sorted, 5, 4, 4, &exactmatch); | 52 | slot = vector_binary_search(middle, sorted, 5, 4, 4, &exactmatch); |
| 53 | CHECK_INT(exactmatch, 0); | 53 | CHECK_INT(exactmatch, 0); |
| 54 | CHECK_PTR(slot, sorted[2]); | 54 | CHECK_PTR(slot, sorted[2]); |
| 55 | 55 | ||
| 56 | slot = binary_search(before, sorted, 5, 4, 4, &exactmatch); | 56 | slot = vector_binary_search(before, sorted, 5, 4, 4, &exactmatch); |
| 57 | CHECK_INT(exactmatch, 0); | 57 | CHECK_INT(exactmatch, 0); |
| 58 | CHECK_PTR(slot, sorted[0]); | 58 | CHECK_PTR(slot, sorted[0]); |
| 59 | } | 59 | } |
| @@ -64,7 +64,7 @@ static void case_search_past_the_end(void) { | |||
| 64 | void *slot; | 64 | void *slot; |
| 65 | 65 | ||
| 66 | test_case("a key above every member yields the position past the end"); | 66 | test_case("a key above every member yields the position past the end"); |
| 67 | slot = binary_search(beyond, sorted, 5, 4, 4, &exactmatch); | 67 | slot = vector_binary_search(beyond, sorted, 5, 4, 4, &exactmatch); |
| 68 | CHECK_INT(exactmatch, 0); | 68 | CHECK_INT(exactmatch, 0); |
| 69 | CHECK_PTR(slot, sorted[5]); | 69 | CHECK_PTR(slot, sorted[5]); |
| 70 | } | 70 | } |
| @@ -74,7 +74,7 @@ static void case_search_empty(void) { | |||
| 74 | void *base = (void *)sorted; | 74 | void *base = (void *)sorted; |
| 75 | 75 | ||
| 76 | test_case("searching an empty vector reports no match at the base"); | 76 | test_case("searching an empty vector reports no match at the base"); |
| 77 | CHECK_PTR(binary_search(sorted[0], base, 0, 4, 4, &exactmatch), base); | 77 | CHECK_PTR(vector_binary_search(sorted[0], base, 0, 4, 4, &exactmatch), base); |
| 78 | CHECK_INT(exactmatch, 0); | 78 | CHECK_INT(exactmatch, 0); |
| 79 | } | 79 | } |
| 80 | 80 | ||
| @@ -112,6 +112,51 @@ static void case_insert_keeps_order(void) { | |||
| 112 | free(vector.data); | 112 | free(vector.data); |
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | /* The peer variant is reached with an empty vector on every first announce | ||
| 116 | for a torrent, and again whenever a swarm empties and refills, because | ||
| 117 | vector_fixup_peers drops the allocation and nulls the data pointer. */ | ||
| 118 | |||
| 119 | static void case_insert_peer_into_empty_vector(void) { | ||
| 120 | ot_vector vector = {NULL, 0, 0}; | ||
| 121 | ot_peer6 low, high; | ||
| 122 | int exactmatch; | ||
| 123 | ot_peer *slot; | ||
| 124 | |||
| 125 | memset(low, 0x11, sizeof(low)); | ||
| 126 | memset(high, 0x99, sizeof(high)); | ||
| 127 | |||
| 128 | test_case("the first peer goes into a vector that has no allocation yet"); | ||
| 129 | slot = vector_find_or_insert_peer(&vector, low, OT_PEER_SIZE6, &exactmatch); | ||
| 130 | CHECK(slot != NULL); | ||
| 131 | CHECK_INT(exactmatch, 0); | ||
| 132 | memcpy(slot, low, OT_PEER_SIZE6); | ||
| 133 | CHECK_INT(vector.size, 1); | ||
| 134 | CHECK_INT(vector.space, OT_VECTOR_MIN_MEMBERS); | ||
| 135 | CHECK_PTR(slot, vector.data); | ||
| 136 | |||
| 137 | test_case("a second peer keeps the order"); | ||
| 138 | slot = vector_find_or_insert_peer(&vector, high, OT_PEER_SIZE6, &exactmatch); | ||
| 139 | CHECK(slot != NULL); | ||
| 140 | CHECK_INT(exactmatch, 0); | ||
| 141 | memcpy(slot, high, OT_PEER_SIZE6); | ||
| 142 | CHECK_INT(vector.size, 2); | ||
| 143 | CHECK_MEM((char *)vector.data, low, OT_PEER_COMPARE_SIZE6); | ||
| 144 | CHECK_MEM((char *)vector.data + OT_PEER_SIZE6, high, OT_PEER_COMPARE_SIZE6); | ||
| 145 | |||
| 146 | test_case("and emptying the vector hands the allocation back"); | ||
| 147 | CHECK(vector_remove_peer(&vector, low, OT_PEER_SIZE6) != 0); | ||
| 148 | CHECK(vector_remove_peer(&vector, high, OT_PEER_SIZE6) != 0); | ||
| 149 | CHECK_INT(vector.size, 0); | ||
| 150 | CHECK_PTR(vector.data, NULL); | ||
| 151 | |||
| 152 | test_case("so the next peer starts from no allocation again"); | ||
| 153 | slot = vector_find_or_insert_peer(&vector, low, OT_PEER_SIZE6, &exactmatch); | ||
| 154 | CHECK(slot != NULL); | ||
| 155 | CHECK_INT(vector.size, 1); | ||
| 156 | |||
| 157 | free(vector.data); | ||
| 158 | } | ||
| 159 | |||
| 115 | static void case_insert_finds_existing(void) { | 160 | static void case_insert_finds_existing(void) { |
| 116 | ot_vector vector = {NULL, 0, 0}; | 161 | ot_vector vector = {NULL, 0, 0}; |
| 117 | const unsigned char five[4] = {0, 0, 0, 5}; | 162 | const unsigned char five[4] = {0, 0, 0, 5}; |
| @@ -257,6 +302,7 @@ void test_vector(void) { | |||
| 257 | case_search_past_the_end(); | 302 | case_search_past_the_end(); |
| 258 | case_search_empty(); | 303 | case_search_empty(); |
| 259 | case_insert_keeps_order(); | 304 | case_insert_keeps_order(); |
| 305 | case_insert_peer_into_empty_vector(); | ||
| 260 | case_insert_finds_existing(); | 306 | case_insert_finds_existing(); |
| 261 | case_insert_compare_prefix(); | 307 | case_insert_compare_prefix(); |
| 262 | case_redistribute_holds_every_peer(); | 308 | case_redistribute_holds_every_peer(); |
