Path: blob/main_old/src/libANGLE/BlobCache_unittest.cpp
1693 views
//1// Copyright 2018 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//5// BlobCache_unittest.h: Unit tests for the blob cache.67#include <gtest/gtest.h>89#include "libANGLE/BlobCache.h"1011namespace egl12{1314// Note: this is fairly similar to SizedMRUCache_unittest, and makes sure the15// BlobCache usage of SizedMRUCache is not broken.1617using BlobPut = angle::MemoryBuffer;18using Blob = BlobCache::Value;19using Key = BlobCache::Key;2021template <typename T>22void MakeSequence(T &seq, uint8_t start)23{24for (uint8_t i = 0; i < seq.size(); ++i)25{26seq[i] = i + start;27}28}2930BlobPut MakeBlob(size_t size, uint8_t start = 0)31{32BlobPut blob;33EXPECT_TRUE(blob.resize(size));34MakeSequence(blob, start);35return blob;36}3738Key MakeKey(uint8_t start = 0)39{40Key key;41MakeSequence(key, start);42return key;43}4445// Test a cache with a value that takes up maximum size.46TEST(BlobCacheTest, MaxSizedValue)47{48constexpr size_t kSize = 32;49BlobCache blobCache(kSize);5051blobCache.populate(MakeKey(0), MakeBlob(kSize));52EXPECT_EQ(32u, blobCache.size());53EXPECT_FALSE(blobCache.empty());5455blobCache.populate(MakeKey(1), MakeBlob(kSize));56EXPECT_EQ(32u, blobCache.size());57EXPECT_FALSE(blobCache.empty());5859Blob blob;60size_t blobSize;61EXPECT_FALSE(blobCache.get(nullptr, MakeKey(0), &blob, &blobSize));6263blobCache.clear();64EXPECT_TRUE(blobCache.empty());65}6667// Test a cache with many small values, that it can handle unlimited inserts.68TEST(BlobCacheTest, ManySmallValues)69{70constexpr size_t kSize = 32;71BlobCache blobCache(kSize);7273for (size_t value = 0; value < kSize; ++value)74{75blobCache.populate(MakeKey(value), MakeBlob(1, value));7677Blob qvalue;78size_t blobSize;79EXPECT_TRUE(blobCache.get(nullptr, MakeKey(value), &qvalue, &blobSize));80if (qvalue.size() > 0)81{82EXPECT_EQ(value, qvalue[0]);83}84}8586EXPECT_EQ(32u, blobCache.size());87EXPECT_FALSE(blobCache.empty());8889// Putting one element evicts the first element.90blobCache.populate(MakeKey(kSize), MakeBlob(1, kSize));9192Blob qvalue;93size_t blobSize;94EXPECT_FALSE(blobCache.get(nullptr, MakeKey(0), &qvalue, &blobSize));9596// Putting one large element cleans out the whole stack.97blobCache.populate(MakeKey(kSize + 1), MakeBlob(kSize, kSize + 1));98EXPECT_EQ(32u, blobCache.size());99EXPECT_FALSE(blobCache.empty());100101for (size_t value = 0; value <= kSize; ++value)102{103EXPECT_FALSE(blobCache.get(nullptr, MakeKey(value), &qvalue, &blobSize));104}105EXPECT_TRUE(blobCache.get(nullptr, MakeKey(kSize + 1), &qvalue, &blobSize));106if (qvalue.size() > 0)107{108EXPECT_EQ(kSize + 1, qvalue[0]);109}110111// Put a bunch of items in the cache sequentially.112for (size_t value = 0; value < kSize * 10; ++value)113{114blobCache.populate(MakeKey(value), MakeBlob(1, value));115}116117EXPECT_EQ(32u, blobCache.size());118}119120// Tests putting an oversize element.121TEST(BlobCacheTest, OversizeValue)122{123constexpr size_t kSize = 32;124BlobCache blobCache(kSize);125126blobCache.populate(MakeKey(5), MakeBlob(100));127128Blob qvalue;129size_t blobSize;130EXPECT_FALSE(blobCache.get(nullptr, MakeKey(5), &qvalue, &blobSize));131}132133} // namespace egl134135136