/* * Copyright(c) 2012-2018 Intel Corporation * SPDX-License-Identifier: BSD-3-Clause-Clear */ /* * This headers must be in test source file. It's important that cmocka.h is * last. */ #undef static #undef inline //src/cleaning/cleaning.c //ocf_cleaner_run #include #include #include #include #include "print_desc.h" /* * Headers from tested target. */ #include "cleaning.h" #include "alru.h" #include "acp.h" #include "../ocf_cache_priv.h" #include "../ocf_ctx_priv.h" #include "../mngt/ocf_mngt_common.h" #include "../metadata/metadata.h" /* * Mocked functions. Here we must deliver functions definitions which are not * in tested source file. */ void __wrap_cleaning_policy_alru_setup(struct ocf_cache *cache) {} int __wrap_cleaning_policy_alru_set_cleaning_param(struct ocf_cache *cache, uint32_t param_id, uint32_t param_value) { } int __wrap_cleaning_policy_alru_get_cleaning_param(struct ocf_cache *cache, uint32_t param_id, uint32_t *param_value) { } int __wrap_cleaning_policy_acp_initialize(struct ocf_cache *cache, int init_metadata, int init_params){} void __wrap_cleaning_policy_acp_deinitialize(struct ocf_cache *cache){} int __wrap_cleaning_policy_acp_perform_cleaning(struct ocf_cache *cache, uint32_t io_queue){} void __wrap_cleaning_policy_acp_init_cache_block(struct ocf_cache *cache, uint32_t cache_line){} void __wrap_cleaning_policy_acp_set_hot_cache_line(struct ocf_cache *cache, uint32_t cache_line){} void __wrap_cleaning_policy_acp_purge_block(struct ocf_cache *cache, uint32_t cache_line){} int __wrap_cleaning_policy_acp_purge_range(struct ocf_cache *cache, int core_id, uint64_t start_byte, uint64_t end_byte){} int __wrap_cleaning_policy_acp_add_core(ocf_cache_t cache, ocf_core_id_t core_id){} int __wrap_cleaning_policy_acp_remove_core(ocf_cache_t cache, ocf_core_id_t core_id){} void __wrap_cleaning_policy_acp_request_pending(struct ocf_request *req){ } void cleaning_policy_acp_setup(struct ocf_cache *cache) { } int cleaning_policy_acp_set_cleaning_param(struct ocf_cache *cache, uint32_t param_id, uint32_t param_value) { } int cleaning_policy_acp_get_cleaning_param(struct ocf_cache *cache, uint32_t param_id, uint32_t *param_value) { } int __wrap_cleaning_policy_acp_set_cleaning_parameters( struct ocf_cache *cache, struct ocf_cleaning_params *params) { } void __wrap_cleaning_policy_acp_get_cleaning_parameters( struct ocf_cache *cache, struct ocf_cleaning_params *params) { } void __wrap_cleaning_policy_alru_init_cache_block(struct ocf_cache *cache, uint32_t cache_line) { } void __wrap_cleaning_policy_alru_purge_cache_block(struct ocf_cache *cache, uint32_t cache_line) { } int __wrap_cleaning_policy_alru_purge_range(struct ocf_cache *cache, int partition_id, int core_id, uint64_t start_byte, uint64_t end_byte) { } void __wrap_cleaning_policy_alru_set_hot_cache_line(struct ocf_cache *cache, uint32_t cache_line) { } int __wrap_cleaning_policy_alru_initialize(struct ocf_cache *cache, int partition_id, int init_metadata) { } int __wrap_cleaning_policy_alru_flush_block(struct ocf_cache *cache, uint32_t io_queue, uint32_t count, uint32_t *cache_lines, int partition_id, int core_id, uint8_t do_lock) { } int __wrap_cleaning_policy_alru_set_cleaning_parameters(ocf_cache_t cache, ocf_part_id_t part_id, struct ocf_cleaning_params *params) { } void __wrap_cleaning_policy_alru_get_cleaning_parameters(ocf_cache_t cache, ocf_part_id_t part_id, struct ocf_cleaning_params *params) { } int __wrap_cleaning_alru_perform_cleaning(struct ocf_cache *cache, uint32_t io_queue) { function_called(); return mock(); } ocf_cache_t __wrap_ocf_cleaner_get_cache(ocf_cleaner_t c) { function_called(); return mock_ptr_type(struct ocf_cache*); } bool __wrap_ocf_mngt_is_cache_locked(ocf_cache_t cache) { function_called(); return mock(); } int __wrap__ocf_cleaner_run_check_dirty_inactive(struct ocf_cache *cache) { function_called(); return mock(); } int __wrap_env_bit_test(int nr, const void *addr) { function_called(); return mock(); } int __wrap_env_rwsem_down_write_trylock(env_rwsem *s) { function_called(); return mock(); } void __wrap_env_rwsem_up_write(env_rwsem *s) { function_called(); } /* * Tests of functions. Every test name must be written to tests array in main(). * Declarations always look the same: static void test_name(void **state); */ static void ocf_cleaner_run_test01(void **state) { struct ocf_cache cache; ocf_part_id_t part_id; uint32_t io_queue; int result; //Initialize needed structures. cache.conf_meta = test_malloc(sizeof(struct ocf_superblock_config)); cache.conf_meta->cleaning_policy_type = ocf_cleaning_alru; print_test_description("Parts are ready for cleaning - should perform cleaning" " for each part"); expect_function_call(__wrap_ocf_cleaner_get_cache); will_return(__wrap_ocf_cleaner_get_cache, &cache); expect_function_call(__wrap_env_bit_test); will_return(__wrap_env_bit_test, 1); expect_function_call(__wrap_ocf_mngt_is_cache_locked); will_return(__wrap_ocf_mngt_is_cache_locked, 0); expect_function_call(__wrap_env_rwsem_down_write_trylock); will_return(__wrap_env_rwsem_down_write_trylock, 1); expect_function_call(__wrap__ocf_cleaner_run_check_dirty_inactive); will_return(__wrap__ocf_cleaner_run_check_dirty_inactive, 0); expect_function_call(__wrap_cleaning_alru_perform_cleaning); will_return(__wrap_cleaning_alru_perform_cleaning, 0); expect_function_call(__wrap_env_rwsem_up_write); result = ocf_cleaner_run(&cache.cleaner, io_queue); assert_int_equal(result, 0); /* Release allocated memory if allocated with test_* functions */ test_free(cache.conf_meta); } /* * Main function. It runs tests. */ int main(void) { const struct CMUnitTest tests[] = { cmocka_unit_test(ocf_cleaner_run_test01) }; print_message("Unit test of cleaning.c\n"); return cmocka_run_group_tests(tests, NULL, NULL); }