151c0b2f7Stbbdev /* 2*b15aabb3Stbbdev Copyright (c) 2005-2021 Intel Corporation 351c0b2f7Stbbdev 451c0b2f7Stbbdev Licensed under the Apache License, Version 2.0 (the "License"); 551c0b2f7Stbbdev you may not use this file except in compliance with the License. 651c0b2f7Stbbdev You may obtain a copy of the License at 751c0b2f7Stbbdev 851c0b2f7Stbbdev http://www.apache.org/licenses/LICENSE-2.0 951c0b2f7Stbbdev 1051c0b2f7Stbbdev Unless required by applicable law or agreed to in writing, software 1151c0b2f7Stbbdev distributed under the License is distributed on an "AS IS" BASIS, 1251c0b2f7Stbbdev WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1351c0b2f7Stbbdev See the License for the specific language governing permissions and 1451c0b2f7Stbbdev limitations under the License. 1551c0b2f7Stbbdev */ 1651c0b2f7Stbbdev 17*b15aabb3Stbbdev #if __INTEL_COMPILER && _MSC_VER 18*b15aabb3Stbbdev #pragma warning(disable : 2586) // decorated name length exceeded, name was truncated 19*b15aabb3Stbbdev #endif 20*b15aabb3Stbbdev 2151c0b2f7Stbbdev #define TBB_PREVIEW_CONCURRENT_LRU_CACHE 1 2251c0b2f7Stbbdev 2351c0b2f7Stbbdev #include "common/test.h" 2449e08aacStbbdev #include "oneapi/tbb/concurrent_lru_cache.h" 2551c0b2f7Stbbdev #include <common/concurrent_lru_cache_common.h> 2651c0b2f7Stbbdev 2751c0b2f7Stbbdev //! \file conformance_concurrent_lru_cache.cpp 2851c0b2f7Stbbdev //! \brief Test for [preview] functionality 2951c0b2f7Stbbdev 3051c0b2f7Stbbdev //----------------------------------------------------------------------------- 3151c0b2f7Stbbdev // Concurrent LRU Cache Tests: Cache Test Cases 3251c0b2f7Stbbdev //----------------------------------------------------------------------------- 3351c0b2f7Stbbdev 3451c0b2f7Stbbdev //! \brief \ref interface \ref requirement 3551c0b2f7Stbbdev TEST_CASE("basic test for creation and use") { 3651c0b2f7Stbbdev using preset = concurrent_lru_cache_presets::preset_default<int, int>; 3751c0b2f7Stbbdev __anon425d1b900102(int key) 3851c0b2f7Stbbdev auto callback = [](int key) -> int { return key; }; 3951c0b2f7Stbbdev std::size_t number_of_lru_history_items = 8; 4051c0b2f7Stbbdev 4151c0b2f7Stbbdev preset preset_object{callback, number_of_lru_history_items}; 4251c0b2f7Stbbdev preset::cache_type& cache = preset_object.cache; 4351c0b2f7Stbbdev 4451c0b2f7Stbbdev int dummy_key = 0; 4551c0b2f7Stbbdev preset::handle_type h = cache[dummy_key]; 4651c0b2f7Stbbdev int value = h.value(); 4751c0b2f7Stbbdev (void)value; 4851c0b2f7Stbbdev } 4951c0b2f7Stbbdev 5051c0b2f7Stbbdev //! \brief \ref interface \ref requirement 5151c0b2f7Stbbdev TEST_CASE("basic test for std::move") { 5251c0b2f7Stbbdev using preset = concurrent_lru_cache_presets::preset1; 5351c0b2f7Stbbdev preset preset_object{}; 5451c0b2f7Stbbdev preset::cache_type& cache = preset_object.cache; 5551c0b2f7Stbbdev 5651c0b2f7Stbbdev // retain handle object to keep an item in the cache 5751c0b2f7Stbbdev // if it is still active without aging 5851c0b2f7Stbbdev preset::handle_type sheep = cache["sheep"]; 5951c0b2f7Stbbdev preset::handle_type horse = cache["horse"]; 6051c0b2f7Stbbdev preset::handle_type bull = cache["bull"]; 6151c0b2f7Stbbdev 6251c0b2f7Stbbdev // store handler objects in vector 6351c0b2f7Stbbdev std::vector<preset::handle_type> animals; 6451c0b2f7Stbbdev animals.reserve(5); 6551c0b2f7Stbbdev animals.emplace_back(std::move(sheep)); 6651c0b2f7Stbbdev animals.emplace_back(std::move(horse)); 6751c0b2f7Stbbdev animals[0] = std::move(bull); 6851c0b2f7Stbbdev 6951c0b2f7Stbbdev // after resize() vec will be full of default constructed handlers 7051c0b2f7Stbbdev // with null pointers on item in cache and on cache which item belongs to 7151c0b2f7Stbbdev animals.resize(10); 7251c0b2f7Stbbdev } 7351c0b2f7Stbbdev 7451c0b2f7Stbbdev //! \brief \ref interface \ref requirement 7551c0b2f7Stbbdev TEST_CASE("basic test for to bool conversion") { 7651c0b2f7Stbbdev using concurrent_lru_cache_presets::preset1; 7751c0b2f7Stbbdev 7851c0b2f7Stbbdev preset1 preset_instance{}; 7951c0b2f7Stbbdev preset1::cache_type& cache = preset_instance.cache; 8051c0b2f7Stbbdev 8151c0b2f7Stbbdev 8251c0b2f7Stbbdev preset1::handle_type handle; 8351c0b2f7Stbbdev preset1::handle_type foobar = preset1::handle_type(); 8451c0b2f7Stbbdev 8551c0b2f7Stbbdev handle = cache["handle"]; 8651c0b2f7Stbbdev 8751c0b2f7Stbbdev preset1::handle_type foo = cache["bar"]; 8851c0b2f7Stbbdev 8951c0b2f7Stbbdev preset1::handle_type handle1(std::move(handle)); 9051c0b2f7Stbbdev 9151c0b2f7Stbbdev handle = std::move(handle1); 9251c0b2f7Stbbdev 9351c0b2f7Stbbdev REQUIRE_MESSAGE( 9451c0b2f7Stbbdev !preset1::handle_type(), 9551c0b2f7Stbbdev "user-defined to-bool conversion does not work"); 9651c0b2f7Stbbdev REQUIRE_MESSAGE( 9751c0b2f7Stbbdev handle, 9851c0b2f7Stbbdev "user-defined to-bool conversion does not work"); 9951c0b2f7Stbbdev 10051c0b2f7Stbbdev handle = preset1::handle_type(); 10151c0b2f7Stbbdev } 10251c0b2f7Stbbdev 10351c0b2f7Stbbdev //! \brief \ref requirement 10451c0b2f7Stbbdev TEST_CASE("basic test for cache hit") { 10551c0b2f7Stbbdev using preset = concurrent_lru_cache_presets::preset_call_count<__LINE__>; 10651c0b2f7Stbbdev preset preset_object{}; 10751c0b2f7Stbbdev preset::cache_type& cache = preset_object.cache; 10851c0b2f7Stbbdev 10951c0b2f7Stbbdev int dummy_key = 0; 11051c0b2f7Stbbdev cache[dummy_key]; 11151c0b2f7Stbbdev cache[dummy_key]; 11251c0b2f7Stbbdev 11351c0b2f7Stbbdev REQUIRE_MESSAGE( 11451c0b2f7Stbbdev preset::counter_type::calls == 1, 11551c0b2f7Stbbdev "value function should be called only on a cache miss"); 11651c0b2f7Stbbdev } 11751c0b2f7Stbbdev 11851c0b2f7Stbbdev //! \brief \ref requirement 11951c0b2f7Stbbdev TEST_CASE("basic test for unused objects") { 12051c0b2f7Stbbdev using preset = concurrent_lru_cache_presets::preset_instance_count; 12151c0b2f7Stbbdev preset preset_object{}; 12251c0b2f7Stbbdev 12351c0b2f7Stbbdev for (std::size_t i = 0; i < preset_object.number_of_lru_history_items; ++i) 12451c0b2f7Stbbdev preset_object.cache[i]; 12551c0b2f7Stbbdev 12651c0b2f7Stbbdev REQUIRE_MESSAGE( 12751c0b2f7Stbbdev preset_object.source.instances_count() == preset_object.number_of_lru_history_items+1, 12851c0b2f7Stbbdev "cache should respect number of stored unused objects to number passed in constructor"); 12951c0b2f7Stbbdev } 13051c0b2f7Stbbdev 131