Annotation of embedaddon/curl/tests/unit/unit1300.c, revision 1.1
1.1 ! misho 1: /***************************************************************************
! 2: * _ _ ____ _
! 3: * Project ___| | | | _ \| |
! 4: * / __| | | | |_) | |
! 5: * | (__| |_| | _ <| |___
! 6: * \___|\___/|_| \_\_____|
! 7: *
! 8: * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
! 9: *
! 10: * This software is licensed as described in the file COPYING, which
! 11: * you should have received as part of this distribution. The terms
! 12: * are also available at https://curl.haxx.se/docs/copyright.html.
! 13: *
! 14: * You may opt to use, copy, modify, merge, publish, distribute and/or sell
! 15: * copies of the Software, and permit persons to whom the Software is
! 16: * furnished to do so, under the terms of the COPYING file.
! 17: *
! 18: * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
! 19: * KIND, either express or implied.
! 20: *
! 21: ***************************************************************************/
! 22: #include "curlcheck.h"
! 23:
! 24: #include "llist.h"
! 25:
! 26: static struct curl_llist llist;
! 27:
! 28: static struct curl_llist llist_destination;
! 29:
! 30: static void test_curl_llist_dtor(void *key, void *value)
! 31: {
! 32: /* used by the llist API, does nothing here */
! 33: (void)key;
! 34: (void)value;
! 35: }
! 36:
! 37: static CURLcode unit_setup(void)
! 38: {
! 39: Curl_llist_init(&llist, test_curl_llist_dtor);
! 40: Curl_llist_init(&llist_destination, test_curl_llist_dtor);
! 41: return CURLE_OK;
! 42: }
! 43:
! 44: static void unit_stop(void)
! 45: {
! 46: }
! 47:
! 48: UNITTEST_START
! 49: {
! 50: int unusedData_case1 = 1;
! 51: int unusedData_case2 = 2;
! 52: int unusedData_case3 = 3;
! 53: struct curl_llist_element case1_list;
! 54: struct curl_llist_element case2_list;
! 55: struct curl_llist_element case3_list;
! 56: struct curl_llist_element case4_list;
! 57: struct curl_llist_element *head;
! 58: struct curl_llist_element *element_next;
! 59: struct curl_llist_element *element_prev;
! 60: struct curl_llist_element *to_remove;
! 61: size_t llist_size = Curl_llist_count(&llist);
! 62:
! 63: /**
! 64: * testing llist_init
! 65: * case 1:
! 66: * list initiation
! 67: * @assumptions:
! 68: * 1: list size will be 0
! 69: * 2: list head will be NULL
! 70: * 3: list tail will be NULL
! 71: * 4: list dtor will be NULL
! 72: */
! 73:
! 74: fail_unless(llist.size == 0, "list initial size should be zero");
! 75: fail_unless(llist.head == NULL, "list head should initiate to NULL");
! 76: fail_unless(llist.tail == NULL, "list tail should intiate to NULL");
! 77: fail_unless(llist.dtor == test_curl_llist_dtor,
! 78: "list dtor should initiate to test_curl_llist_dtor");
! 79:
! 80: /**
! 81: * testing Curl_llist_insert_next
! 82: * case 1:
! 83: * list is empty
! 84: * @assumptions:
! 85: * 1: list size will be 1
! 86: * 2: list head will hold the data "unusedData_case1"
! 87: * 3: list tail will be the same as list head
! 88: */
! 89:
! 90: Curl_llist_insert_next(&llist, llist.head, &unusedData_case1, &case1_list);
! 91:
! 92: fail_unless(Curl_llist_count(&llist) == 1,
! 93: "List size should be 1 after adding a new element");
! 94: /*test that the list head data holds my unusedData */
! 95: fail_unless(llist.head->ptr == &unusedData_case1,
! 96: "head ptr should be first entry");
! 97: /*same goes for the list tail */
! 98: fail_unless(llist.tail == llist.head,
! 99: "tail and head should be the same");
! 100:
! 101: /**
! 102: * testing Curl_llist_insert_next
! 103: * case 2:
! 104: * list has 1 element, adding one element after the head
! 105: * @assumptions:
! 106: * 1: the element next to head should be our newly created element
! 107: * 2: the list tail should be our newly created element
! 108: */
! 109:
! 110: Curl_llist_insert_next(&llist, llist.head,
! 111: &unusedData_case3, &case3_list);
! 112: fail_unless(llist.head->next->ptr == &unusedData_case3,
! 113: "the node next to head is not getting set correctly");
! 114: fail_unless(llist.tail->ptr == &unusedData_case3,
! 115: "the list tail is not getting set correctly");
! 116:
! 117: /**
! 118: * testing Curl_llist_insert_next
! 119: * case 3:
! 120: * list has >1 element, adding one element after "NULL"
! 121: * @assumptions:
! 122: * 1: the element next to head should be our newly created element
! 123: * 2: the list tail should different from newly created element
! 124: */
! 125:
! 126: Curl_llist_insert_next(&llist, llist.head,
! 127: &unusedData_case2, &case2_list);
! 128: fail_unless(llist.head->next->ptr == &unusedData_case2,
! 129: "the node next to head is not getting set correctly");
! 130: /* better safe than sorry, check that the tail isn't corrupted */
! 131: fail_unless(llist.tail->ptr != &unusedData_case2,
! 132: "the list tail is not getting set correctly");
! 133:
! 134: /* unit tests for Curl_llist_remove */
! 135:
! 136: /**
! 137: * case 1:
! 138: * list has >1 element, removing head
! 139: * @assumptions:
! 140: * 1: list size will be decremented by one
! 141: * 2: head will be the head->next
! 142: * 3: "new" head's previous will be NULL
! 143: */
! 144:
! 145: head = llist.head;
! 146: abort_unless(head, "llist.head is NULL");
! 147: element_next = head->next;
! 148: llist_size = Curl_llist_count(&llist);
! 149:
! 150: Curl_llist_remove(&llist, llist.head, NULL);
! 151:
! 152: fail_unless(Curl_llist_count(&llist) == (llist_size-1),
! 153: "llist size not decremented as expected");
! 154: fail_unless(llist.head == element_next,
! 155: "llist new head not modified properly");
! 156: abort_unless(llist.head, "llist.head is NULL");
! 157: fail_unless(llist.head->prev == NULL,
! 158: "new head previous not set to null");
! 159:
! 160: /**
! 161: * case 2:
! 162: * removing non head element, with list having >=2 elements
! 163: * @setup:
! 164: * 1: insert another element to the list to make element >=2
! 165: * @assumptions:
! 166: * 1: list size will be decremented by one ; tested
! 167: * 2: element->previous->next will be element->next
! 168: * 3: element->next->previous will be element->previous
! 169: */
! 170: Curl_llist_insert_next(&llist, llist.head, &unusedData_case3,
! 171: &case4_list);
! 172: llist_size = Curl_llist_count(&llist);
! 173: fail_unless(llist_size == 3, "should be 3 list members");
! 174:
! 175: to_remove = llist.head->next;
! 176: abort_unless(to_remove, "to_remove is NULL");
! 177: element_next = to_remove->next;
! 178: element_prev = to_remove->prev;
! 179: Curl_llist_remove(&llist, to_remove, NULL);
! 180: fail_unless(element_prev->next == element_next,
! 181: "element previous->next is not being adjusted");
! 182: abort_unless(element_next, "element_next is NULL");
! 183: fail_unless(element_next->prev == element_prev,
! 184: "element next->previous is not being adjusted");
! 185:
! 186: /**
! 187: * case 3:
! 188: * removing the tail with list having >=1 element
! 189: * @assumptions
! 190: * 1: list size will be decremented by one ;tested
! 191: * 2: element->previous->next will be element->next ;tested
! 192: * 3: element->next->previous will be element->previous ;tested
! 193: * 4: list->tail will be tail->previous
! 194: */
! 195:
! 196: to_remove = llist.tail;
! 197: element_prev = to_remove->prev;
! 198: Curl_llist_remove(&llist, to_remove, NULL);
! 199: fail_unless(llist.tail == element_prev,
! 200: "llist tail is not being adjusted when removing tail");
! 201:
! 202: /**
! 203: * case 4:
! 204: * removing head with list having 1 element
! 205: * @assumptions:
! 206: * 1: list size will be decremented by one ;tested
! 207: * 2: list head will be null
! 208: * 3: list tail will be null
! 209: */
! 210:
! 211: to_remove = llist.head;
! 212: Curl_llist_remove(&llist, to_remove, NULL);
! 213: fail_unless(llist.head == NULL,
! 214: "llist head is not NULL while the llist is empty");
! 215: fail_unless(llist.tail == NULL,
! 216: "llist tail is not NULL while the llist is empty");
! 217:
! 218: Curl_llist_destroy(&llist, NULL);
! 219: Curl_llist_destroy(&llist_destination, NULL);
! 220: }
! 221: UNITTEST_STOP
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>