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_tracker.h" 20 #include "qdf_tracker_test.h" 21 #include "qdf_trace.h" 22 #include "qdf_types.h" 23 24 #define qdf_ut_tracker_bits 4 /* 16 buckets */ 25 #define qdf_ut_tracker_item_count 3 26 #define qdf_ut_tracker_declare(name) \ 27 qdf_tracker_declare(name, qdf_ut_tracker_bits, "unit-test leak", \ 28 "unit-test alloc", "unit-test free") 29 30 static uint32_t qdf_tracker_test_empty(void) 31 { 32 qdf_ut_tracker_declare(tracker); 33 char func[QDF_TRACKER_FUNC_SIZE]; 34 uint32_t line; 35 36 /* a new tracker should ... */ 37 qdf_tracker_init(&tracker); 38 39 /* ... be empty */ 40 qdf_tracker_check_for_leaks(&tracker); 41 42 /* ... not contain an arbitrary pointer */ 43 QDF_BUG(!qdf_tracker_lookup(&tracker, &tracker, &func, &line)); 44 45 qdf_tracker_deinit(&tracker); 46 47 return 0; 48 } 49 50 static uint32_t qdf_tracker_test_add_remove(void) 51 { 52 qdf_ut_tracker_declare(tracker); 53 bool items[qdf_ut_tracker_item_count]; 54 QDF_STATUS status; 55 int i; 56 57 qdf_tracker_init(&tracker); 58 59 /* an empty tracker should track items */ 60 for (i = 0; i < qdf_ut_tracker_item_count; i++) { 61 status = qdf_tracker_track(&tracker, items + i, 62 __func__, __LINE__); 63 items[i] = QDF_IS_STATUS_SUCCESS(status); 64 } 65 66 /* a non-empty tracker should find previously added items */ 67 for (i = 0; i < qdf_ut_tracker_item_count; i++) { 68 char func[QDF_TRACKER_FUNC_SIZE]; 69 uint32_t line; 70 71 if (!items[i]) 72 continue; 73 74 QDF_BUG(qdf_tracker_lookup(&tracker, items + i, &func, &line)); 75 qdf_tracker_untrack(&tracker, items + i, __func__, __LINE__); 76 } 77 78 /* a tracker should be empty after all items are untracked*/ 79 qdf_tracker_check_for_leaks(&tracker); 80 81 qdf_tracker_deinit(&tracker); 82 83 return 0; 84 } 85 86 uint32_t qdf_tracker_unit_test(void) 87 { 88 uint32_t errors = 0; 89 90 errors += qdf_tracker_test_empty(); 91 errors += qdf_tracker_test_add_remove(); 92 93 return errors; 94 } 95 96