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