Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
ImageCacheTest.cpp
Go to the documentation of this file.
1 /*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
13#include "tests/Test.h"
14
15#include <cstddef>
16#include <cstdint>
17
18namespace {
19static void* gGlobalAddress;
20struct TestingKey : public SkResourceCache::Key {
21 intptr_t fValue;
22
23 TestingKey(intptr_t value, uint64_t sharedID = 0) : fValue(value) {
24 this->init(&gGlobalAddress, sharedID, sizeof(fValue));
25 }
26};
27struct TestingRec : public SkResourceCache::Rec {
28 TestingRec(const TestingKey& key, uint32_t value) : fKey(key), fValue(value) {}
29
30 TestingKey fKey;
31 intptr_t fValue;
32
33 const Key& getKey() const override { return fKey; }
34 size_t bytesUsed() const override { return sizeof(fKey) + sizeof(fValue); }
35 const char* getCategory() const override { return "test_cache"; }
36 SkDiscardableMemory* diagnostic_only_getDiscardable() const override { return nullptr; }
37
38 static bool Visitor(const SkResourceCache::Rec& baseRec, void* context) {
39 const TestingRec& rec = static_cast<const TestingRec&>(baseRec);
40 intptr_t* result = (intptr_t*)context;
41
42 *result = rec.fValue;
43 return true;
44 }
45};
46} // namespace
47
48static const int COUNT = 10;
49static const int DIM = 256;
50
51static void test_cache(skiatest::Reporter* reporter, SkResourceCache& cache, bool testPurge) {
52 for (int i = 0; i < COUNT; ++i) {
53 TestingKey key(i);
54 intptr_t value = -1;
55
56 REPORTER_ASSERT(reporter, !cache.find(key, TestingRec::Visitor, &value));
58
59 cache.add(new TestingRec(key, i));
60
61 REPORTER_ASSERT(reporter, cache.find(key, TestingRec::Visitor, &value));
63 }
64
65 if (testPurge) {
66 // stress test, should trigger purges
67 for (int i = 0; i < COUNT * 100; ++i) {
68 TestingKey key(i);
69 cache.add(new TestingRec(key, i));
70 }
71 }
72
73 // test the originals after all that purging
74 for (int i = 0; i < COUNT; ++i) {
75 intptr_t value;
76 (void)cache.find(TestingKey(i), TestingRec::Visitor, &value);
77 }
78
79 cache.setTotalByteLimit(0);
80}
81
83 for (int i = 0; i < COUNT; ++i) {
84 TestingKey key(i, i & 1); // every other key will have a 1 for its sharedID
85 cache.add(new TestingRec(key, i));
86 }
87
88 // Ensure that everyone is present
89 for (int i = 0; i < COUNT; ++i) {
90 TestingKey key(i, i & 1); // every other key will have a 1 for its sharedID
91 intptr_t value = -1;
92
93 REPORTER_ASSERT(reporter, cache.find(key, TestingRec::Visitor, &value));
95 }
96
97 // Now purge the ones that had a non-zero sharedID (the odd-indexed ones)
98 cache.purgeSharedID(1);
99
100 // Ensure that only the even ones are still present
101 for (int i = 0; i < COUNT; ++i) {
102 TestingKey key(i, i & 1); // every other key will have a 1 for its sharedID
103 intptr_t value = -1;
104
105 if (i & 1) {
106 REPORTER_ASSERT(reporter, !cache.find(key, TestingRec::Visitor, &value));
107 } else {
108 REPORTER_ASSERT(reporter, cache.find(key, TestingRec::Visitor, &value));
110 }
111 }
112}
113
115static SkDiscardableMemory* pool_factory(size_t bytes) {
117 return gPool->create(bytes);
118}
119
120DEF_TEST(ImageCache, reporter) {
121 static const size_t defLimit = DIM * DIM * 4 * COUNT + 1024; // 1K slop
122
123 {
124 SkResourceCache cache(defLimit);
125 test_cache(reporter, cache, true);
126 }
127 {
129 gPool = pool.get();
131 test_cache(reporter, cache, true);
132 }
133 {
135 test_cache(reporter, cache, false);
136 }
137 {
138 SkResourceCache cache(defLimit);
140 }
141}
142
143DEF_TEST(ImageCache_doubleAdd, r) {
144 // Adding the same key twice should be safe.
145 SkResourceCache cache(4096);
146
147 TestingKey key(1);
148
149 cache.add(new TestingRec(key, 2));
150 cache.add(new TestingRec(key, 3));
151
152 // Lookup can return either value.
153 intptr_t value = -1;
154 REPORTER_ASSERT(r, cache.find(key, TestingRec::Visitor, &value));
155 REPORTER_ASSERT(r, 2 == value || 3 == value);
156}
AutoreleasePool pool
reporter
static void test_cache_purge_shared_id(skiatest::Reporter *reporter, SkResourceCache &cache)
static const int COUNT
static const int DIM
static SkDiscardableMemory * pool_factory(size_t bytes)
static SkDiscardableMemoryPool * gPool
static void test_cache(skiatest::Reporter *reporter, SkResourceCache &cache, bool testPurge)
#define SkASSERT(cond)
Definition SkAssert.h:116
#define DEF_TEST(name, reporter)
Definition Test.h:312
#define REPORTER_ASSERT(r, cond,...)
Definition Test.h:286
static sk_sp< SkDiscardableMemoryPool > Make(size_t size)
virtual SkDiscardableMemory * create(size_t bytes)=0
static SkDiscardableMemory * Create(size_t bytes)
void(* Visitor)(const Rec &, void *context)
uint8_t value
GAsyncResult * result
init(device_serial, adb_binary)
Definition _adb_path.py:12
virtual const char * getCategory() const =0
virtual SkDiscardableMemory * diagnostic_only_getDiscardable() const
virtual size_t bytesUsed() const =0
virtual const Key & getKey() const =0