1 /* 2 * Copyright (c) 2019 The Linux Foundation. All rights reserved. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for 5 * any purpose with or without fee is hereby granted, provided that the 6 * above copyright notice and this permission notice appear in all 7 * copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16 * PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 #include "qdf_slist.h" 20 #include "qdf_slist_test.h" 21 #include "qdf_trace.h" 22 23 struct qdf_slist_test_item { 24 uint32_t id; 25 struct qdf_slist_node node; 26 }; 27 28 #define qdf_slist_node_count 10 29 30 static uint32_t qdf_slist_test_empty(void) 31 { 32 struct qdf_slist list; 33 struct qdf_slist_test_item *item; 34 35 /* a new list should ... */ 36 qdf_slist_init(&list); 37 38 /* ... be empty */ 39 QDF_BUG(qdf_slist_empty(&list)); 40 41 /* ... return NULL when pop()'d */ 42 QDF_BUG(!qdf_slist_pop(&list, item, node)); 43 44 qdf_slist_deinit(&list); 45 46 return 0; 47 } 48 49 static uint32_t qdf_slist_test_push_pop(void) 50 { 51 struct qdf_slist list; 52 struct qdf_slist_test_item items[qdf_slist_node_count]; 53 struct qdf_slist_test_item *item; 54 int i; 55 56 qdf_slist_init(&list); 57 58 /* a list with items should ... */ 59 for (i = 0; i < qdf_slist_node_count; i++) 60 qdf_slist_push(&list, &items[i], node); 61 62 /* ... not be empty */ 63 QDF_BUG(!qdf_slist_empty(&list)); 64 65 /* ... be able to pop() all items previously push()'d */ 66 for (i = 0; i < qdf_slist_node_count; i++) 67 QDF_BUG(qdf_slist_pop(&list, item, node)); 68 69 /* ... be empty after pop()'ing all items */ 70 QDF_BUG(qdf_slist_empty(&list)); 71 72 qdf_slist_deinit(&list); 73 74 return 0; 75 } 76 77 static uint32_t qdf_slist_test_for_each(void) 78 { 79 struct qdf_slist list; 80 struct qdf_slist_test_item items[qdf_slist_node_count]; 81 struct qdf_slist_test_item *prev; 82 struct qdf_slist_test_item *item; 83 int i; 84 85 qdf_slist_init(&list); 86 87 /* a list with items should ... */ 88 for (i = 0; i < qdf_slist_node_count; i++) 89 qdf_slist_push(&list, &items[i], node); 90 91 /* ... be able to iterate over each item */ 92 i = 0; 93 qdf_slist_for_each(&list, item, node) { 94 item->id = i++; 95 } 96 QDF_BUG(i == qdf_slist_node_count); 97 98 /* ... be able to remove each item in the same order */ 99 i = 0; 100 qdf_slist_for_each_del(&list, prev, item, node) { 101 QDF_BUG(item); 102 QDF_BUG(item->id == i++); 103 QDF_BUG(qdf_slist_remove(&list, prev, node)->id == item->id); 104 } 105 QDF_BUG(i == qdf_slist_node_count); 106 107 /* ... be empty after all items are removed */ 108 QDF_BUG(!qdf_slist_pop(&list, item, node)); 109 QDF_BUG(qdf_slist_empty(&list)); 110 111 qdf_slist_deinit(&list); 112 113 return 0; 114 } 115 116 uint32_t qdf_slist_unit_test(void) 117 { 118 uint32_t errors = 0; 119 120 errors += qdf_slist_test_empty(); 121 errors += qdf_slist_test_push_pop(); 122 errors += qdf_slist_test_for_each(); 123 124 return errors; 125 } 126 127