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