xref: /aosp_15_r20/external/angle/src/libANGLE/BlobCache_unittest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2018 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // BlobCache_unittest.h: Unit tests for the blob cache.
7*8975f5c5SAndroid Build Coastguard Worker 
8*8975f5c5SAndroid Build Coastguard Worker #include <gtest/gtest.h>
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/BlobCache.h"
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker namespace egl
13*8975f5c5SAndroid Build Coastguard Worker {
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker // Note: this is fairly similar to SizedMRUCache_unittest, and makes sure the
16*8975f5c5SAndroid Build Coastguard Worker // BlobCache usage of SizedMRUCache is not broken.
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker using BlobPut = angle::MemoryBuffer;
19*8975f5c5SAndroid Build Coastguard Worker using Blob    = BlobCache::Value;
20*8975f5c5SAndroid Build Coastguard Worker using Key     = BlobCache::Key;
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker template <typename T>
MakeSequence(T & seq,uint8_t start)23*8975f5c5SAndroid Build Coastguard Worker void MakeSequence(T &seq, uint8_t start)
24*8975f5c5SAndroid Build Coastguard Worker {
25*8975f5c5SAndroid Build Coastguard Worker     for (uint8_t i = 0; i < seq.size(); ++i)
26*8975f5c5SAndroid Build Coastguard Worker     {
27*8975f5c5SAndroid Build Coastguard Worker         seq[i] = i + start;
28*8975f5c5SAndroid Build Coastguard Worker     }
29*8975f5c5SAndroid Build Coastguard Worker }
30*8975f5c5SAndroid Build Coastguard Worker 
MakeBlob(size_t size,uint8_t start=0)31*8975f5c5SAndroid Build Coastguard Worker BlobPut MakeBlob(size_t size, uint8_t start = 0)
32*8975f5c5SAndroid Build Coastguard Worker {
33*8975f5c5SAndroid Build Coastguard Worker     BlobPut blob;
34*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(blob.resize(size));
35*8975f5c5SAndroid Build Coastguard Worker     MakeSequence(blob, start);
36*8975f5c5SAndroid Build Coastguard Worker     return blob;
37*8975f5c5SAndroid Build Coastguard Worker }
38*8975f5c5SAndroid Build Coastguard Worker 
MakeKey(uint8_t start=0)39*8975f5c5SAndroid Build Coastguard Worker Key MakeKey(uint8_t start = 0)
40*8975f5c5SAndroid Build Coastguard Worker {
41*8975f5c5SAndroid Build Coastguard Worker     Key key;
42*8975f5c5SAndroid Build Coastguard Worker     MakeSequence(key, start);
43*8975f5c5SAndroid Build Coastguard Worker     return key;
44*8975f5c5SAndroid Build Coastguard Worker }
45*8975f5c5SAndroid Build Coastguard Worker 
46*8975f5c5SAndroid Build Coastguard Worker // Test a cache with a value that takes up maximum size.
TEST(BlobCacheTest,MaxSizedValue)47*8975f5c5SAndroid Build Coastguard Worker TEST(BlobCacheTest, MaxSizedValue)
48*8975f5c5SAndroid Build Coastguard Worker {
49*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kSize = 32;
50*8975f5c5SAndroid Build Coastguard Worker     BlobCache blobCache(kSize);
51*8975f5c5SAndroid Build Coastguard Worker 
52*8975f5c5SAndroid Build Coastguard Worker     blobCache.populate(MakeKey(0), MakeBlob(kSize));
53*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(32u, blobCache.size());
54*8975f5c5SAndroid Build Coastguard Worker     EXPECT_FALSE(blobCache.empty());
55*8975f5c5SAndroid Build Coastguard Worker 
56*8975f5c5SAndroid Build Coastguard Worker     blobCache.populate(MakeKey(1), MakeBlob(kSize));
57*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(32u, blobCache.size());
58*8975f5c5SAndroid Build Coastguard Worker     EXPECT_FALSE(blobCache.empty());
59*8975f5c5SAndroid Build Coastguard Worker 
60*8975f5c5SAndroid Build Coastguard Worker     Blob blob;
61*8975f5c5SAndroid Build Coastguard Worker     EXPECT_FALSE(blobCache.get(nullptr, nullptr, MakeKey(0), &blob));
62*8975f5c5SAndroid Build Coastguard Worker 
63*8975f5c5SAndroid Build Coastguard Worker     blobCache.clear();
64*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(blobCache.empty());
65*8975f5c5SAndroid Build Coastguard Worker }
66*8975f5c5SAndroid Build Coastguard Worker 
67*8975f5c5SAndroid Build Coastguard Worker // Test a cache with many small values, that it can handle unlimited inserts.
TEST(BlobCacheTest,ManySmallValues)68*8975f5c5SAndroid Build Coastguard Worker TEST(BlobCacheTest, ManySmallValues)
69*8975f5c5SAndroid Build Coastguard Worker {
70*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kSize = 32;
71*8975f5c5SAndroid Build Coastguard Worker     BlobCache blobCache(kSize);
72*8975f5c5SAndroid Build Coastguard Worker 
73*8975f5c5SAndroid Build Coastguard Worker     for (size_t value = 0; value < kSize; ++value)
74*8975f5c5SAndroid Build Coastguard Worker     {
75*8975f5c5SAndroid Build Coastguard Worker         blobCache.populate(MakeKey(value), MakeBlob(1, value));
76*8975f5c5SAndroid Build Coastguard Worker 
77*8975f5c5SAndroid Build Coastguard Worker         Blob qvalue;
78*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(blobCache.get(nullptr, nullptr, MakeKey(value), &qvalue));
79*8975f5c5SAndroid Build Coastguard Worker         if (qvalue.size() > 0)
80*8975f5c5SAndroid Build Coastguard Worker         {
81*8975f5c5SAndroid Build Coastguard Worker             EXPECT_EQ(value, qvalue[0]);
82*8975f5c5SAndroid Build Coastguard Worker         }
83*8975f5c5SAndroid Build Coastguard Worker     }
84*8975f5c5SAndroid Build Coastguard Worker 
85*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(32u, blobCache.size());
86*8975f5c5SAndroid Build Coastguard Worker     EXPECT_FALSE(blobCache.empty());
87*8975f5c5SAndroid Build Coastguard Worker 
88*8975f5c5SAndroid Build Coastguard Worker     // Putting one element evicts the first element.
89*8975f5c5SAndroid Build Coastguard Worker     blobCache.populate(MakeKey(kSize), MakeBlob(1, kSize));
90*8975f5c5SAndroid Build Coastguard Worker 
91*8975f5c5SAndroid Build Coastguard Worker     Blob qvalue;
92*8975f5c5SAndroid Build Coastguard Worker     EXPECT_FALSE(blobCache.get(nullptr, nullptr, MakeKey(0), &qvalue));
93*8975f5c5SAndroid Build Coastguard Worker 
94*8975f5c5SAndroid Build Coastguard Worker     // Putting one large element cleans out the whole stack.
95*8975f5c5SAndroid Build Coastguard Worker     blobCache.populate(MakeKey(kSize + 1), MakeBlob(kSize, kSize + 1));
96*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(32u, blobCache.size());
97*8975f5c5SAndroid Build Coastguard Worker     EXPECT_FALSE(blobCache.empty());
98*8975f5c5SAndroid Build Coastguard Worker 
99*8975f5c5SAndroid Build Coastguard Worker     for (size_t value = 0; value <= kSize; ++value)
100*8975f5c5SAndroid Build Coastguard Worker     {
101*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(blobCache.get(nullptr, nullptr, MakeKey(value), &qvalue));
102*8975f5c5SAndroid Build Coastguard Worker     }
103*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(blobCache.get(nullptr, nullptr, MakeKey(kSize + 1), &qvalue));
104*8975f5c5SAndroid Build Coastguard Worker     if (qvalue.size() > 0)
105*8975f5c5SAndroid Build Coastguard Worker     {
106*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(kSize + 1, qvalue[0]);
107*8975f5c5SAndroid Build Coastguard Worker     }
108*8975f5c5SAndroid Build Coastguard Worker 
109*8975f5c5SAndroid Build Coastguard Worker     // Put a bunch of items in the cache sequentially.
110*8975f5c5SAndroid Build Coastguard Worker     for (size_t value = 0; value < kSize * 10; ++value)
111*8975f5c5SAndroid Build Coastguard Worker     {
112*8975f5c5SAndroid Build Coastguard Worker         blobCache.populate(MakeKey(value), MakeBlob(1, value));
113*8975f5c5SAndroid Build Coastguard Worker     }
114*8975f5c5SAndroid Build Coastguard Worker 
115*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(32u, blobCache.size());
116*8975f5c5SAndroid Build Coastguard Worker }
117*8975f5c5SAndroid Build Coastguard Worker 
118*8975f5c5SAndroid Build Coastguard Worker // Tests putting an oversize element.
TEST(BlobCacheTest,OversizeValue)119*8975f5c5SAndroid Build Coastguard Worker TEST(BlobCacheTest, OversizeValue)
120*8975f5c5SAndroid Build Coastguard Worker {
121*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kSize = 32;
122*8975f5c5SAndroid Build Coastguard Worker     BlobCache blobCache(kSize);
123*8975f5c5SAndroid Build Coastguard Worker 
124*8975f5c5SAndroid Build Coastguard Worker     blobCache.populate(MakeKey(5), MakeBlob(100));
125*8975f5c5SAndroid Build Coastguard Worker 
126*8975f5c5SAndroid Build Coastguard Worker     Blob qvalue;
127*8975f5c5SAndroid Build Coastguard Worker     EXPECT_FALSE(blobCache.get(nullptr, nullptr, MakeKey(5), &qvalue));
128*8975f5c5SAndroid Build Coastguard Worker }
129*8975f5c5SAndroid Build Coastguard Worker 
130*8975f5c5SAndroid Build Coastguard Worker }  // namespace egl
131