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