xref: /aosp_15_r20/external/swiftshader/tests/SystemUnitTests/LRUCacheTests.cpp (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker // Copyright 2020 The SwiftShader Authors. All Rights Reserved.
2*03ce13f7SAndroid Build Coastguard Worker //
3*03ce13f7SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*03ce13f7SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*03ce13f7SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*03ce13f7SAndroid Build Coastguard Worker //
7*03ce13f7SAndroid Build Coastguard Worker //    http://www.apache.org/licenses/LICENSE-2.0
8*03ce13f7SAndroid Build Coastguard Worker //
9*03ce13f7SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*03ce13f7SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*03ce13f7SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*03ce13f7SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*03ce13f7SAndroid Build Coastguard Worker // limitations under the License.
14*03ce13f7SAndroid Build Coastguard Worker 
15*03ce13f7SAndroid Build Coastguard Worker #include "System/LRUCache.hpp"
16*03ce13f7SAndroid Build Coastguard Worker 
17*03ce13f7SAndroid Build Coastguard Worker #include <gmock/gmock.h>
18*03ce13f7SAndroid Build Coastguard Worker #include <gtest/gtest.h>
19*03ce13f7SAndroid Build Coastguard Worker 
20*03ce13f7SAndroid Build Coastguard Worker #include <vector>
21*03ce13f7SAndroid Build Coastguard Worker 
22*03ce13f7SAndroid Build Coastguard Worker using namespace sw;
23*03ce13f7SAndroid Build Coastguard Worker 
24*03ce13f7SAndroid Build Coastguard Worker namespace {
25*03ce13f7SAndroid Build Coastguard Worker 
26*03ce13f7SAndroid Build Coastguard Worker template<typename Cache>
checkRange(const Cache & cache,std::vector<std::pair<typename Cache::Key,typename Cache::Data>> list)27*03ce13f7SAndroid Build Coastguard Worker void checkRange(const Cache &cache, std::vector<std::pair<typename Cache::Key, typename Cache::Data>> list)
28*03ce13f7SAndroid Build Coastguard Worker {
29*03ce13f7SAndroid Build Coastguard Worker 	size_t i = 0;
30*03ce13f7SAndroid Build Coastguard Worker 	for(auto it : cache)
31*03ce13f7SAndroid Build Coastguard Worker 	{
32*03ce13f7SAndroid Build Coastguard Worker 		ASSERT_EQ(list[i].first, it.key());
33*03ce13f7SAndroid Build Coastguard Worker 		ASSERT_EQ(list[i].second, it.data());
34*03ce13f7SAndroid Build Coastguard Worker 		i++;
35*03ce13f7SAndroid Build Coastguard Worker 	}
36*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(i, list.size());
37*03ce13f7SAndroid Build Coastguard Worker }
38*03ce13f7SAndroid Build Coastguard Worker 
39*03ce13f7SAndroid Build Coastguard Worker }  // namespace
40*03ce13f7SAndroid Build Coastguard Worker 
41*03ce13f7SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
42*03ce13f7SAndroid Build Coastguard Worker // LRUCache
43*03ce13f7SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
TEST(LRUCache,Empty)44*03ce13f7SAndroid Build Coastguard Worker TEST(LRUCache, Empty)
45*03ce13f7SAndroid Build Coastguard Worker {
46*03ce13f7SAndroid Build Coastguard Worker 	LRUCache<std::string, std::string> cache(8);
47*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup(""), "");
48*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("123"), "");
49*03ce13f7SAndroid Build Coastguard Worker 	bool looped = false;
50*03ce13f7SAndroid Build Coastguard Worker 	for(auto ignored : cache)
51*03ce13f7SAndroid Build Coastguard Worker 	{
52*03ce13f7SAndroid Build Coastguard Worker 		(void)ignored;
53*03ce13f7SAndroid Build Coastguard Worker 		looped = true;
54*03ce13f7SAndroid Build Coastguard Worker 	}
55*03ce13f7SAndroid Build Coastguard Worker 	if(looped)
56*03ce13f7SAndroid Build Coastguard Worker 	{
57*03ce13f7SAndroid Build Coastguard Worker 		FAIL() << "Should not loop on empty cache";
58*03ce13f7SAndroid Build Coastguard Worker 	}
59*03ce13f7SAndroid Build Coastguard Worker }
60*03ce13f7SAndroid Build Coastguard Worker 
TEST(LRUCache,AddNoEviction)61*03ce13f7SAndroid Build Coastguard Worker TEST(LRUCache, AddNoEviction)
62*03ce13f7SAndroid Build Coastguard Worker {
63*03ce13f7SAndroid Build Coastguard Worker 	LRUCache<std::string, std::string> cache(4);
64*03ce13f7SAndroid Build Coastguard Worker 
65*03ce13f7SAndroid Build Coastguard Worker 	cache.add("1", "one");
66*03ce13f7SAndroid Build Coastguard Worker 	cache.add("2", "two");
67*03ce13f7SAndroid Build Coastguard Worker 	cache.add("3", "three");
68*03ce13f7SAndroid Build Coastguard Worker 	cache.add("4", "four");
69*03ce13f7SAndroid Build Coastguard Worker 
70*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("1"), "one");
71*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("2"), "two");
72*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("3"), "three");
73*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("4"), "four");
74*03ce13f7SAndroid Build Coastguard Worker 
75*03ce13f7SAndroid Build Coastguard Worker 	checkRange(cache, {
76*03ce13f7SAndroid Build Coastguard Worker 	                      { "4", "four" },
77*03ce13f7SAndroid Build Coastguard Worker 	                      { "3", "three" },
78*03ce13f7SAndroid Build Coastguard Worker 	                      { "2", "two" },
79*03ce13f7SAndroid Build Coastguard Worker 	                      { "1", "one" },
80*03ce13f7SAndroid Build Coastguard Worker 	                  });
81*03ce13f7SAndroid Build Coastguard Worker }
82*03ce13f7SAndroid Build Coastguard Worker 
TEST(LRUCache,AddWithEviction)83*03ce13f7SAndroid Build Coastguard Worker TEST(LRUCache, AddWithEviction)
84*03ce13f7SAndroid Build Coastguard Worker {
85*03ce13f7SAndroid Build Coastguard Worker 	LRUCache<std::string, std::string> cache(4);
86*03ce13f7SAndroid Build Coastguard Worker 
87*03ce13f7SAndroid Build Coastguard Worker 	cache.add("1", "one");
88*03ce13f7SAndroid Build Coastguard Worker 	cache.add("2", "two");
89*03ce13f7SAndroid Build Coastguard Worker 	cache.add("3", "three");
90*03ce13f7SAndroid Build Coastguard Worker 	cache.add("4", "four");
91*03ce13f7SAndroid Build Coastguard Worker 	cache.add("5", "five");
92*03ce13f7SAndroid Build Coastguard Worker 	cache.add("6", "six");
93*03ce13f7SAndroid Build Coastguard Worker 
94*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("1"), "");
95*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("2"), "");
96*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("3"), "three");
97*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("4"), "four");
98*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("5"), "five");
99*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("6"), "six");
100*03ce13f7SAndroid Build Coastguard Worker 
101*03ce13f7SAndroid Build Coastguard Worker 	checkRange(cache, {
102*03ce13f7SAndroid Build Coastguard Worker 	                      { "6", "six" },
103*03ce13f7SAndroid Build Coastguard Worker 	                      { "5", "five" },
104*03ce13f7SAndroid Build Coastguard Worker 	                      { "4", "four" },
105*03ce13f7SAndroid Build Coastguard Worker 	                      { "3", "three" },
106*03ce13f7SAndroid Build Coastguard Worker 	                  });
107*03ce13f7SAndroid Build Coastguard Worker }
108*03ce13f7SAndroid Build Coastguard Worker 
TEST(LRUCache,AddClearAdd)109*03ce13f7SAndroid Build Coastguard Worker TEST(LRUCache, AddClearAdd)
110*03ce13f7SAndroid Build Coastguard Worker {
111*03ce13f7SAndroid Build Coastguard Worker 	LRUCache<std::string, std::string> cache(4);
112*03ce13f7SAndroid Build Coastguard Worker 
113*03ce13f7SAndroid Build Coastguard Worker 	// Add some data.
114*03ce13f7SAndroid Build Coastguard Worker 	cache.add("1", "one");
115*03ce13f7SAndroid Build Coastguard Worker 	cache.add("2", "two");
116*03ce13f7SAndroid Build Coastguard Worker 	cache.add("3", "three");
117*03ce13f7SAndroid Build Coastguard Worker 	cache.add("4", "four");
118*03ce13f7SAndroid Build Coastguard Worker 	cache.add("5", "five");
119*03ce13f7SAndroid Build Coastguard Worker 	cache.add("6", "six");
120*03ce13f7SAndroid Build Coastguard Worker 
121*03ce13f7SAndroid Build Coastguard Worker 	// Clear it.
122*03ce13f7SAndroid Build Coastguard Worker 	cache.clear();
123*03ce13f7SAndroid Build Coastguard Worker 
124*03ce13f7SAndroid Build Coastguard Worker 	// Check has no data.
125*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("1"), "");
126*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("2"), "");
127*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("3"), "");
128*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("4"), "");
129*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("5"), "");
130*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("6"), "");
131*03ce13f7SAndroid Build Coastguard Worker 
132*03ce13f7SAndroid Build Coastguard Worker 	checkRange(cache, {});
133*03ce13f7SAndroid Build Coastguard Worker 
134*03ce13f7SAndroid Build Coastguard Worker 	// Add it again.
135*03ce13f7SAndroid Build Coastguard Worker 	cache.add("1", "one");
136*03ce13f7SAndroid Build Coastguard Worker 	cache.add("2", "two");
137*03ce13f7SAndroid Build Coastguard Worker 	cache.add("3", "three");
138*03ce13f7SAndroid Build Coastguard Worker 	cache.add("4", "four");
139*03ce13f7SAndroid Build Coastguard Worker 	cache.add("5", "five");
140*03ce13f7SAndroid Build Coastguard Worker 	cache.add("6", "six");
141*03ce13f7SAndroid Build Coastguard Worker 
142*03ce13f7SAndroid Build Coastguard Worker 	// Check has data.
143*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("1"), "");
144*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("2"), "");
145*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("3"), "three");
146*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("4"), "four");
147*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("5"), "five");
148*03ce13f7SAndroid Build Coastguard Worker 	ASSERT_EQ(cache.lookup("6"), "six");
149*03ce13f7SAndroid Build Coastguard Worker 
150*03ce13f7SAndroid Build Coastguard Worker 	checkRange(cache, {
151*03ce13f7SAndroid Build Coastguard Worker 	                      { "6", "six" },
152*03ce13f7SAndroid Build Coastguard Worker 	                      { "5", "five" },
153*03ce13f7SAndroid Build Coastguard Worker 	                      { "4", "four" },
154*03ce13f7SAndroid Build Coastguard Worker 	                      { "3", "three" },
155*03ce13f7SAndroid Build Coastguard Worker 	                  });
156*03ce13f7SAndroid Build Coastguard Worker }
157*03ce13f7SAndroid Build Coastguard Worker 
TEST(LRUCache,Reordering)158*03ce13f7SAndroid Build Coastguard Worker TEST(LRUCache, Reordering)
159*03ce13f7SAndroid Build Coastguard Worker {
160*03ce13f7SAndroid Build Coastguard Worker 	LRUCache<std::string, std::string> cache(4);
161*03ce13f7SAndroid Build Coastguard Worker 
162*03ce13f7SAndroid Build Coastguard Worker 	// Fill
163*03ce13f7SAndroid Build Coastguard Worker 	cache.add("1", "one");
164*03ce13f7SAndroid Build Coastguard Worker 	cache.add("2", "two");
165*03ce13f7SAndroid Build Coastguard Worker 	cache.add("3", "three");
166*03ce13f7SAndroid Build Coastguard Worker 	cache.add("4", "four");
167*03ce13f7SAndroid Build Coastguard Worker 
168*03ce13f7SAndroid Build Coastguard Worker 	// Push 2 then 4 to most recent
169*03ce13f7SAndroid Build Coastguard Worker 	cache.add("2", "two");
170*03ce13f7SAndroid Build Coastguard Worker 	cache.add("4", "four");
171*03ce13f7SAndroid Build Coastguard Worker 
172*03ce13f7SAndroid Build Coastguard Worker 	checkRange(cache, {
173*03ce13f7SAndroid Build Coastguard Worker 	                      { "4", "four" },
174*03ce13f7SAndroid Build Coastguard Worker 	                      { "2", "two" },
175*03ce13f7SAndroid Build Coastguard Worker 	                      { "3", "three" },
176*03ce13f7SAndroid Build Coastguard Worker 	                      { "1", "one" },
177*03ce13f7SAndroid Build Coastguard Worker 	                  });
178*03ce13f7SAndroid Build Coastguard Worker }