Annotation of embedaddon/curl/tests/unit/unit1300.c, revision 1.1.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>