1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (C) 2017 Intel Corporation. 3 * All rights reserved. 4 */ 5 6 #include "spdk_cunit.h" 7 8 #include "blobfs/tree.c" 9 10 void 11 cache_buffer_free(struct cache_buffer *cache_buffer) 12 { 13 free(cache_buffer); 14 } 15 16 static void 17 blobfs_tree_op_test(void) 18 { 19 struct cache_tree *tree; 20 struct cache_buffer *buffer[5]; 21 struct cache_buffer *tmp_buffer; 22 int i; 23 24 for (i = 0; i < 5; i ++) { 25 buffer[i] = calloc(1, sizeof(struct cache_buffer)); 26 SPDK_CU_ASSERT_FATAL(buffer[i]); 27 } 28 29 tree = calloc(1, sizeof(*tree)); 30 SPDK_CU_ASSERT_FATAL(tree != NULL); 31 32 /* insert buffer[0] */ 33 buffer[0]->offset = 0; 34 tree = tree_insert_buffer(tree, buffer[0]); 35 SPDK_CU_ASSERT_FATAL(tree != NULL); 36 CU_ASSERT(tree->level == 0); 37 tmp_buffer = tree_find_buffer(tree, buffer[0]->offset); 38 CU_ASSERT(tmp_buffer == buffer[0]); 39 40 /* insert buffer[1] */ 41 buffer[1]->offset = CACHE_BUFFER_SIZE; 42 /* set the bytes_filled equal = bytes_filled with same non zero value, e.g., 32 */ 43 buffer[1]->bytes_filled = buffer[1]->bytes_flushed = 32; 44 tree = tree_insert_buffer(tree, buffer[1]); 45 SPDK_CU_ASSERT_FATAL(tree != NULL); 46 CU_ASSERT(tree->level == 0); 47 tmp_buffer = tree_find_filled_buffer(tree, buffer[1]->offset); 48 CU_ASSERT(tmp_buffer == buffer[1]); 49 50 /* insert buffer[2] */ 51 buffer[2]->offset = (CACHE_TREE_WIDTH - 1) * CACHE_BUFFER_SIZE; 52 tree = tree_insert_buffer(tree, buffer[2]); 53 SPDK_CU_ASSERT_FATAL(tree != NULL); 54 CU_ASSERT(tree->level == 0); 55 tmp_buffer = tree_find_buffer(tree, buffer[2]->offset); 56 CU_ASSERT(tmp_buffer == buffer[2]); 57 tmp_buffer = tree_find_filled_buffer(tree, buffer[2]->offset); 58 CU_ASSERT(tmp_buffer == NULL); 59 60 /* insert buffer[3], set an offset which can not be fit level 0 */ 61 buffer[3]->offset = CACHE_TREE_LEVEL_SIZE(1); 62 tree = tree_insert_buffer(tree, buffer[3]); 63 SPDK_CU_ASSERT_FATAL(tree != NULL); 64 CU_ASSERT(tree->level == 1); 65 tmp_buffer = tree_find_buffer(tree, buffer[3]->offset); 66 CU_ASSERT(tmp_buffer == buffer[3]); 67 68 /* insert buffer[4], set an offset which can not be fit level 1 */ 69 buffer[4]->offset = CACHE_TREE_LEVEL_SIZE(2); 70 tree = tree_insert_buffer(tree, buffer[4]); 71 SPDK_CU_ASSERT_FATAL(tree != NULL); 72 CU_ASSERT(tree->level == 2); 73 tmp_buffer = tree_find_buffer(tree, buffer[4]->offset); 74 CU_ASSERT(tmp_buffer == buffer[4]); 75 76 /* delete buffer[0] */ 77 tree_remove_buffer(tree, buffer[0]); 78 /* check whether buffer[0] is still existed or not */ 79 tmp_buffer = tree_find_buffer(tree, 0); 80 CU_ASSERT(tmp_buffer == NULL); 81 82 /* delete buffer[3] */ 83 tree_remove_buffer(tree, buffer[3]); 84 /* check whether buffer[3] is still existed or not */ 85 tmp_buffer = tree_find_buffer(tree, CACHE_TREE_LEVEL_SIZE(1)); 86 CU_ASSERT(tmp_buffer == NULL); 87 88 /* free all buffers in the tree */ 89 tree_free_buffers(tree); 90 91 /* check whether buffer[1] is still existed or not */ 92 tmp_buffer = tree_find_buffer(tree, CACHE_BUFFER_SIZE); 93 CU_ASSERT(tmp_buffer == NULL); 94 /* check whether buffer[2] is still existed or not */ 95 tmp_buffer = tree_find_buffer(tree, (CACHE_TREE_WIDTH - 1) * CACHE_BUFFER_SIZE); 96 CU_ASSERT(tmp_buffer == NULL); 97 /* check whether buffer[4] is still existed or not */ 98 tmp_buffer = tree_find_buffer(tree, CACHE_TREE_LEVEL_SIZE(2)); 99 CU_ASSERT(tmp_buffer == NULL); 100 101 /* According to tree_free_buffers, root will not be freed */ 102 free(tree); 103 } 104 105 int 106 main(int argc, char **argv) 107 { 108 CU_pSuite suite = NULL; 109 unsigned int num_failures; 110 111 CU_set_error_action(CUEA_ABORT); 112 CU_initialize_registry(); 113 114 suite = CU_add_suite("tree", NULL, NULL); 115 CU_ADD_TEST(suite, blobfs_tree_op_test); 116 117 CU_basic_set_mode(CU_BRM_VERBOSE); 118 CU_basic_run_tests(); 119 num_failures = CU_get_number_of_failures(); 120 CU_cleanup_registry(); 121 122 return num_failures; 123 } 124