1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2015 Intel Corporation
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker *
11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker * Software.
14*61046927SAndroid Build Coastguard Worker *
15*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker */
23*61046927SAndroid Build Coastguard Worker
24*61046927SAndroid Build Coastguard Worker /* A collection of unit tests for cache.c */
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Worker #include <gtest/gtest.h>
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Worker #include <stdio.h>
29*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
30*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
31*61046927SAndroid Build Coastguard Worker #include <string.h>
32*61046927SAndroid Build Coastguard Worker #include <ftw.h>
33*61046927SAndroid Build Coastguard Worker #include <errno.h>
34*61046927SAndroid Build Coastguard Worker #include <stdarg.h>
35*61046927SAndroid Build Coastguard Worker #include <inttypes.h>
36*61046927SAndroid Build Coastguard Worker #include <limits.h>
37*61046927SAndroid Build Coastguard Worker #include <time.h>
38*61046927SAndroid Build Coastguard Worker #include <unistd.h>
39*61046927SAndroid Build Coastguard Worker #include <utime.h>
40*61046927SAndroid Build Coastguard Worker
41*61046927SAndroid Build Coastguard Worker #include "util/detect_os.h"
42*61046927SAndroid Build Coastguard Worker #include "util/mesa-sha1.h"
43*61046927SAndroid Build Coastguard Worker #include "util/disk_cache.h"
44*61046927SAndroid Build Coastguard Worker #include "util/disk_cache_os.h"
45*61046927SAndroid Build Coastguard Worker #include "util/ralloc.h"
46*61046927SAndroid Build Coastguard Worker
47*61046927SAndroid Build Coastguard Worker #ifdef ENABLE_SHADER_CACHE
48*61046927SAndroid Build Coastguard Worker
49*61046927SAndroid Build Coastguard Worker /* Callback for nftw used in rmrf_local below.
50*61046927SAndroid Build Coastguard Worker */
51*61046927SAndroid Build Coastguard Worker static int
remove_entry(const char * path,const struct stat * sb,int typeflag,struct FTW * ftwbuf)52*61046927SAndroid Build Coastguard Worker remove_entry(const char *path,
53*61046927SAndroid Build Coastguard Worker const struct stat *sb,
54*61046927SAndroid Build Coastguard Worker int typeflag,
55*61046927SAndroid Build Coastguard Worker struct FTW *ftwbuf)
56*61046927SAndroid Build Coastguard Worker {
57*61046927SAndroid Build Coastguard Worker int err = remove(path);
58*61046927SAndroid Build Coastguard Worker
59*61046927SAndroid Build Coastguard Worker if (err)
60*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Error removing %s: %s\n", path, strerror(errno));
61*61046927SAndroid Build Coastguard Worker
62*61046927SAndroid Build Coastguard Worker return err;
63*61046927SAndroid Build Coastguard Worker }
64*61046927SAndroid Build Coastguard Worker
65*61046927SAndroid Build Coastguard Worker /* Recursively remove a directory.
66*61046927SAndroid Build Coastguard Worker *
67*61046927SAndroid Build Coastguard Worker * This is equivalent to "rm -rf <dir>" with one bit of protection
68*61046927SAndroid Build Coastguard Worker * that the directory name must begin with "." to ensure we don't
69*61046927SAndroid Build Coastguard Worker * wander around deleting more than intended.
70*61046927SAndroid Build Coastguard Worker *
71*61046927SAndroid Build Coastguard Worker * Returns 0 on success, -1 on any error.
72*61046927SAndroid Build Coastguard Worker */
73*61046927SAndroid Build Coastguard Worker static int
rmrf_local(const char * path)74*61046927SAndroid Build Coastguard Worker rmrf_local(const char *path)
75*61046927SAndroid Build Coastguard Worker {
76*61046927SAndroid Build Coastguard Worker if (path == NULL || *path == '\0' || *path != '.')
77*61046927SAndroid Build Coastguard Worker return -1;
78*61046927SAndroid Build Coastguard Worker
79*61046927SAndroid Build Coastguard Worker return nftw(path, remove_entry, 64, FTW_DEPTH | FTW_PHYS);
80*61046927SAndroid Build Coastguard Worker }
81*61046927SAndroid Build Coastguard Worker
82*61046927SAndroid Build Coastguard Worker static void
check_directories_created(void * mem_ctx,const char * cache_dir)83*61046927SAndroid Build Coastguard Worker check_directories_created(void *mem_ctx, const char *cache_dir)
84*61046927SAndroid Build Coastguard Worker {
85*61046927SAndroid Build Coastguard Worker bool sub_dirs_created = false;
86*61046927SAndroid Build Coastguard Worker
87*61046927SAndroid Build Coastguard Worker char buf[PATH_MAX];
88*61046927SAndroid Build Coastguard Worker if (getcwd(buf, PATH_MAX)) {
89*61046927SAndroid Build Coastguard Worker char *full_path = ralloc_asprintf(mem_ctx, "%s%s", buf, ++cache_dir);
90*61046927SAndroid Build Coastguard Worker struct stat sb;
91*61046927SAndroid Build Coastguard Worker if (stat(full_path, &sb) != -1 && S_ISDIR(sb.st_mode))
92*61046927SAndroid Build Coastguard Worker sub_dirs_created = true;
93*61046927SAndroid Build Coastguard Worker }
94*61046927SAndroid Build Coastguard Worker
95*61046927SAndroid Build Coastguard Worker EXPECT_TRUE(sub_dirs_created) << "create sub dirs";
96*61046927SAndroid Build Coastguard Worker }
97*61046927SAndroid Build Coastguard Worker
98*61046927SAndroid Build Coastguard Worker static bool
does_cache_contain(struct disk_cache * cache,const cache_key key)99*61046927SAndroid Build Coastguard Worker does_cache_contain(struct disk_cache *cache, const cache_key key)
100*61046927SAndroid Build Coastguard Worker {
101*61046927SAndroid Build Coastguard Worker void *result;
102*61046927SAndroid Build Coastguard Worker
103*61046927SAndroid Build Coastguard Worker result = disk_cache_get(cache, key, NULL);
104*61046927SAndroid Build Coastguard Worker
105*61046927SAndroid Build Coastguard Worker if (result) {
106*61046927SAndroid Build Coastguard Worker free(result);
107*61046927SAndroid Build Coastguard Worker return true;
108*61046927SAndroid Build Coastguard Worker }
109*61046927SAndroid Build Coastguard Worker
110*61046927SAndroid Build Coastguard Worker return false;
111*61046927SAndroid Build Coastguard Worker }
112*61046927SAndroid Build Coastguard Worker
113*61046927SAndroid Build Coastguard Worker static bool
cache_exists(struct disk_cache * cache)114*61046927SAndroid Build Coastguard Worker cache_exists(struct disk_cache *cache)
115*61046927SAndroid Build Coastguard Worker {
116*61046927SAndroid Build Coastguard Worker uint8_t key[20];
117*61046927SAndroid Build Coastguard Worker char data[] = "some test data";
118*61046927SAndroid Build Coastguard Worker
119*61046927SAndroid Build Coastguard Worker if (!cache)
120*61046927SAndroid Build Coastguard Worker return false;
121*61046927SAndroid Build Coastguard Worker
122*61046927SAndroid Build Coastguard Worker disk_cache_compute_key(cache, data, sizeof(data), key);
123*61046927SAndroid Build Coastguard Worker disk_cache_put(cache, key, data, sizeof(data), NULL);
124*61046927SAndroid Build Coastguard Worker disk_cache_wait_for_idle(cache);
125*61046927SAndroid Build Coastguard Worker void *result = disk_cache_get(cache, key, NULL);
126*61046927SAndroid Build Coastguard Worker disk_cache_remove(cache, key);
127*61046927SAndroid Build Coastguard Worker
128*61046927SAndroid Build Coastguard Worker free(result);
129*61046927SAndroid Build Coastguard Worker return result != NULL;
130*61046927SAndroid Build Coastguard Worker }
131*61046927SAndroid Build Coastguard Worker
132*61046927SAndroid Build Coastguard Worker static void *
poll_disk_cache_get(struct disk_cache * cache,const cache_key key,size_t * size)133*61046927SAndroid Build Coastguard Worker poll_disk_cache_get(struct disk_cache *cache,
134*61046927SAndroid Build Coastguard Worker const cache_key key,
135*61046927SAndroid Build Coastguard Worker size_t *size)
136*61046927SAndroid Build Coastguard Worker {
137*61046927SAndroid Build Coastguard Worker void *result;
138*61046927SAndroid Build Coastguard Worker
139*61046927SAndroid Build Coastguard Worker for (int iter = 0; iter < 1000; ++iter) {
140*61046927SAndroid Build Coastguard Worker result = disk_cache_get(cache, key, size);
141*61046927SAndroid Build Coastguard Worker if (result)
142*61046927SAndroid Build Coastguard Worker return result;
143*61046927SAndroid Build Coastguard Worker
144*61046927SAndroid Build Coastguard Worker usleep(1000);
145*61046927SAndroid Build Coastguard Worker }
146*61046927SAndroid Build Coastguard Worker
147*61046927SAndroid Build Coastguard Worker return NULL;
148*61046927SAndroid Build Coastguard Worker }
149*61046927SAndroid Build Coastguard Worker
150*61046927SAndroid Build Coastguard Worker #define CACHE_TEST_TMP "./cache-test-tmp"
151*61046927SAndroid Build Coastguard Worker
152*61046927SAndroid Build Coastguard Worker static void
test_disk_cache_create(void * mem_ctx,const char * cache_dir_name,const char * driver_id)153*61046927SAndroid Build Coastguard Worker test_disk_cache_create(void *mem_ctx, const char *cache_dir_name,
154*61046927SAndroid Build Coastguard Worker const char *driver_id)
155*61046927SAndroid Build Coastguard Worker {
156*61046927SAndroid Build Coastguard Worker struct disk_cache *cache;
157*61046927SAndroid Build Coastguard Worker int err;
158*61046927SAndroid Build Coastguard Worker
159*61046927SAndroid Build Coastguard Worker /* Before doing anything else, ensure that with
160*61046927SAndroid Build Coastguard Worker * MESA_SHADER_CACHE_DISABLE set to true, that disk_cache_create returns NO-OP cache.
161*61046927SAndroid Build Coastguard Worker */
162*61046927SAndroid Build Coastguard Worker setenv("MESA_SHADER_CACHE_DISABLE", "true", 1);
163*61046927SAndroid Build Coastguard Worker cache = disk_cache_create("test", driver_id, 0);
164*61046927SAndroid Build Coastguard Worker EXPECT_EQ(cache->type, DISK_CACHE_NONE) << "disk_cache_create with MESA_SHADER_CACHE_DISABLE set";
165*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache);
166*61046927SAndroid Build Coastguard Worker
167*61046927SAndroid Build Coastguard Worker unsetenv("MESA_SHADER_CACHE_DISABLE");
168*61046927SAndroid Build Coastguard Worker
169*61046927SAndroid Build Coastguard Worker #ifdef SHADER_CACHE_DISABLE_BY_DEFAULT
170*61046927SAndroid Build Coastguard Worker /* With SHADER_CACHE_DISABLE_BY_DEFAULT, ensure that with
171*61046927SAndroid Build Coastguard Worker * MESA_SHADER_CACHE_DISABLE set to nothing, disk_cache_create returns NO-OP cache.
172*61046927SAndroid Build Coastguard Worker */
173*61046927SAndroid Build Coastguard Worker unsetenv("MESA_SHADER_CACHE_DISABLE");
174*61046927SAndroid Build Coastguard Worker cache = disk_cache_create("test", driver_id, 0);
175*61046927SAndroid Build Coastguard Worker EXPECT_EQ(cache->type, DISK_CACHE_NONE)
176*61046927SAndroid Build Coastguard Worker << "disk_cache_create with MESA_SHADER_CACHE_DISABLE unset "
177*61046927SAndroid Build Coastguard Worker "and SHADER_CACHE_DISABLE_BY_DEFAULT build option";
178*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache);
179*61046927SAndroid Build Coastguard Worker
180*61046927SAndroid Build Coastguard Worker /* For remaining tests, ensure that the cache is enabled. */
181*61046927SAndroid Build Coastguard Worker setenv("MESA_SHADER_CACHE_DISABLE", "false", 1);
182*61046927SAndroid Build Coastguard Worker #endif /* SHADER_CACHE_DISABLE_BY_DEFAULT */
183*61046927SAndroid Build Coastguard Worker
184*61046927SAndroid Build Coastguard Worker /* For the first real disk_cache_create() clear these environment
185*61046927SAndroid Build Coastguard Worker * variables to test creation of cache in home directory.
186*61046927SAndroid Build Coastguard Worker */
187*61046927SAndroid Build Coastguard Worker unsetenv("MESA_SHADER_CACHE_DIR");
188*61046927SAndroid Build Coastguard Worker unsetenv("XDG_CACHE_HOME");
189*61046927SAndroid Build Coastguard Worker
190*61046927SAndroid Build Coastguard Worker cache = disk_cache_create("test", driver_id, 0);
191*61046927SAndroid Build Coastguard Worker EXPECT_NE(cache, nullptr) << "disk_cache_create with no environment variables";
192*61046927SAndroid Build Coastguard Worker
193*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache);
194*61046927SAndroid Build Coastguard Worker
195*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID
196*61046927SAndroid Build Coastguard Worker /* Android doesn't try writing to disk (just calls the cache callbacks), so
197*61046927SAndroid Build Coastguard Worker * the directory tests below don't apply.
198*61046927SAndroid Build Coastguard Worker */
199*61046927SAndroid Build Coastguard Worker return;
200*61046927SAndroid Build Coastguard Worker #endif
201*61046927SAndroid Build Coastguard Worker
202*61046927SAndroid Build Coastguard Worker /* Test with XDG_CACHE_HOME set */
203*61046927SAndroid Build Coastguard Worker setenv("XDG_CACHE_HOME", CACHE_TEST_TMP "/xdg-cache-home", 1);
204*61046927SAndroid Build Coastguard Worker cache = disk_cache_create("test", driver_id, 0);
205*61046927SAndroid Build Coastguard Worker EXPECT_TRUE(cache_exists(cache))
206*61046927SAndroid Build Coastguard Worker << "disk_cache_create with XDG_CACHE_HOME set with a non-existing parent directory";
207*61046927SAndroid Build Coastguard Worker
208*61046927SAndroid Build Coastguard Worker char *path = ralloc_asprintf(
209*61046927SAndroid Build Coastguard Worker mem_ctx, "%s%s", CACHE_TEST_TMP "/xdg-cache-home/", cache_dir_name);
210*61046927SAndroid Build Coastguard Worker check_directories_created(mem_ctx, path);
211*61046927SAndroid Build Coastguard Worker
212*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache);
213*61046927SAndroid Build Coastguard Worker
214*61046927SAndroid Build Coastguard Worker /* Test with MESA_SHADER_CACHE_DIR set */
215*61046927SAndroid Build Coastguard Worker err = rmrf_local(CACHE_TEST_TMP);
216*61046927SAndroid Build Coastguard Worker EXPECT_EQ(err, 0) << "Removing " CACHE_TEST_TMP;
217*61046927SAndroid Build Coastguard Worker
218*61046927SAndroid Build Coastguard Worker setenv("MESA_SHADER_CACHE_DIR", CACHE_TEST_TMP "/mesa-shader-cache-dir", 1);
219*61046927SAndroid Build Coastguard Worker cache = disk_cache_create("test", driver_id, 0);
220*61046927SAndroid Build Coastguard Worker EXPECT_TRUE(cache_exists(cache))
221*61046927SAndroid Build Coastguard Worker << "disk_cache_create with MESA_SHADER_CACHE_DIR set with a non-existing parent directory";
222*61046927SAndroid Build Coastguard Worker
223*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache);
224*61046927SAndroid Build Coastguard Worker rmrf_local(CACHE_TEST_TMP);
225*61046927SAndroid Build Coastguard Worker EXPECT_EQ(err, 0) << "Removing " CACHE_TEST_TMP;
226*61046927SAndroid Build Coastguard Worker
227*61046927SAndroid Build Coastguard Worker err = mkdir(CACHE_TEST_TMP, 0755);
228*61046927SAndroid Build Coastguard Worker if (err != 0) {
229*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Error creating %s: %s\n", CACHE_TEST_TMP, strerror(errno));
230*61046927SAndroid Build Coastguard Worker GTEST_FAIL();
231*61046927SAndroid Build Coastguard Worker }
232*61046927SAndroid Build Coastguard Worker
233*61046927SAndroid Build Coastguard Worker cache = disk_cache_create("test", driver_id, 0);
234*61046927SAndroid Build Coastguard Worker EXPECT_TRUE(cache_exists(cache)) << "disk_cache_create with MESA_SHADER_CACHE_DIR set with existing parent directory";
235*61046927SAndroid Build Coastguard Worker
236*61046927SAndroid Build Coastguard Worker path = ralloc_asprintf(
237*61046927SAndroid Build Coastguard Worker mem_ctx, "%s%s", CACHE_TEST_TMP "/mesa-shader-cache-dir/", cache_dir_name);
238*61046927SAndroid Build Coastguard Worker check_directories_created(mem_ctx, path);
239*61046927SAndroid Build Coastguard Worker
240*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache);
241*61046927SAndroid Build Coastguard Worker }
242*61046927SAndroid Build Coastguard Worker
243*61046927SAndroid Build Coastguard Worker static void
test_put_and_get(bool test_cache_size_limit,const char * driver_id)244*61046927SAndroid Build Coastguard Worker test_put_and_get(bool test_cache_size_limit, const char *driver_id)
245*61046927SAndroid Build Coastguard Worker {
246*61046927SAndroid Build Coastguard Worker struct disk_cache *cache;
247*61046927SAndroid Build Coastguard Worker char blob[] = "This is a blob of thirty-seven bytes";
248*61046927SAndroid Build Coastguard Worker uint8_t blob_key[20];
249*61046927SAndroid Build Coastguard Worker char string[] = "While this string has thirty-four";
250*61046927SAndroid Build Coastguard Worker uint8_t string_key[20];
251*61046927SAndroid Build Coastguard Worker char *result;
252*61046927SAndroid Build Coastguard Worker size_t size;
253*61046927SAndroid Build Coastguard Worker uint8_t *one_KB, *one_MB;
254*61046927SAndroid Build Coastguard Worker uint8_t one_KB_key[20], one_MB_key[20];
255*61046927SAndroid Build Coastguard Worker int count;
256*61046927SAndroid Build Coastguard Worker
257*61046927SAndroid Build Coastguard Worker #ifdef SHADER_CACHE_DISABLE_BY_DEFAULT
258*61046927SAndroid Build Coastguard Worker setenv("MESA_SHADER_CACHE_DISABLE", "false", 1);
259*61046927SAndroid Build Coastguard Worker #endif /* SHADER_CACHE_DISABLE_BY_DEFAULT */
260*61046927SAndroid Build Coastguard Worker
261*61046927SAndroid Build Coastguard Worker cache = disk_cache_create("test", driver_id, 0);
262*61046927SAndroid Build Coastguard Worker
263*61046927SAndroid Build Coastguard Worker disk_cache_compute_key(cache, blob, sizeof(blob), blob_key);
264*61046927SAndroid Build Coastguard Worker
265*61046927SAndroid Build Coastguard Worker /* Ensure that disk_cache_get returns nothing before anything is added. */
266*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache, blob_key, &size);
267*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, nullptr) << "disk_cache_get with non-existent item (pointer)";
268*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, 0) << "disk_cache_get with non-existent item (size)";
269*61046927SAndroid Build Coastguard Worker
270*61046927SAndroid Build Coastguard Worker /* Simple test of put and get. */
271*61046927SAndroid Build Coastguard Worker disk_cache_put(cache, blob_key, blob, sizeof(blob), NULL);
272*61046927SAndroid Build Coastguard Worker
273*61046927SAndroid Build Coastguard Worker /* disk_cache_put() hands things off to a thread so wait for it. */
274*61046927SAndroid Build Coastguard Worker disk_cache_wait_for_idle(cache);
275*61046927SAndroid Build Coastguard Worker
276*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache, blob_key, &size);
277*61046927SAndroid Build Coastguard Worker EXPECT_STREQ(blob, result) << "disk_cache_get of existing item (pointer)";
278*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, sizeof(blob)) << "disk_cache_get of existing item (size)";
279*61046927SAndroid Build Coastguard Worker
280*61046927SAndroid Build Coastguard Worker free(result);
281*61046927SAndroid Build Coastguard Worker
282*61046927SAndroid Build Coastguard Worker /* Test put and get of a second item. */
283*61046927SAndroid Build Coastguard Worker disk_cache_compute_key(cache, string, sizeof(string), string_key);
284*61046927SAndroid Build Coastguard Worker disk_cache_put(cache, string_key, string, sizeof(string), NULL);
285*61046927SAndroid Build Coastguard Worker
286*61046927SAndroid Build Coastguard Worker /* disk_cache_put() hands things off to a thread so wait for it. */
287*61046927SAndroid Build Coastguard Worker disk_cache_wait_for_idle(cache);
288*61046927SAndroid Build Coastguard Worker
289*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache, string_key, &size);
290*61046927SAndroid Build Coastguard Worker EXPECT_STREQ(result, string) << "2nd disk_cache_get of existing item (pointer)";
291*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, sizeof(string)) << "2nd disk_cache_get of existing item (size)";
292*61046927SAndroid Build Coastguard Worker
293*61046927SAndroid Build Coastguard Worker free(result);
294*61046927SAndroid Build Coastguard Worker
295*61046927SAndroid Build Coastguard Worker /* Set the cache size to 1KB and add a 1KB item to force an eviction. */
296*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache);
297*61046927SAndroid Build Coastguard Worker
298*61046927SAndroid Build Coastguard Worker if (!test_cache_size_limit)
299*61046927SAndroid Build Coastguard Worker return;
300*61046927SAndroid Build Coastguard Worker
301*61046927SAndroid Build Coastguard Worker setenv("MESA_SHADER_CACHE_MAX_SIZE", "1K", 1);
302*61046927SAndroid Build Coastguard Worker cache = disk_cache_create("test", driver_id, 0);
303*61046927SAndroid Build Coastguard Worker
304*61046927SAndroid Build Coastguard Worker one_KB = (uint8_t *) calloc(1, 1024);
305*61046927SAndroid Build Coastguard Worker
306*61046927SAndroid Build Coastguard Worker /* Obviously the SHA-1 hash of 1024 zero bytes isn't particularly
307*61046927SAndroid Build Coastguard Worker * interesting. But we do have want to take some special care with
308*61046927SAndroid Build Coastguard Worker * the hash we use here. The issue is that in this artificial case,
309*61046927SAndroid Build Coastguard Worker * (with only three files in the cache), the probability is good
310*61046927SAndroid Build Coastguard Worker * that each of the three files will end up in their own
311*61046927SAndroid Build Coastguard Worker * directory. Then, if the directory containing the .tmp file for
312*61046927SAndroid Build Coastguard Worker * the new item being added for disk_cache_put() is the chosen victim
313*61046927SAndroid Build Coastguard Worker * directory for eviction, then no suitable file will be found and
314*61046927SAndroid Build Coastguard Worker * nothing will be evicted.
315*61046927SAndroid Build Coastguard Worker *
316*61046927SAndroid Build Coastguard Worker * That's actually expected given how the eviction code is
317*61046927SAndroid Build Coastguard Worker * implemented, (which expects to only evict once things are more
318*61046927SAndroid Build Coastguard Worker * interestingly full than that).
319*61046927SAndroid Build Coastguard Worker *
320*61046927SAndroid Build Coastguard Worker * For this test, we force this signature to land in the same
321*61046927SAndroid Build Coastguard Worker * directory as the original blob first written to the cache.
322*61046927SAndroid Build Coastguard Worker */
323*61046927SAndroid Build Coastguard Worker disk_cache_compute_key(cache, one_KB, 1024, one_KB_key);
324*61046927SAndroid Build Coastguard Worker one_KB_key[0] = blob_key[0];
325*61046927SAndroid Build Coastguard Worker
326*61046927SAndroid Build Coastguard Worker disk_cache_put(cache, one_KB_key, one_KB, 1024, NULL);
327*61046927SAndroid Build Coastguard Worker
328*61046927SAndroid Build Coastguard Worker free(one_KB);
329*61046927SAndroid Build Coastguard Worker
330*61046927SAndroid Build Coastguard Worker /* disk_cache_put() hands things off to a thread so wait for it. */
331*61046927SAndroid Build Coastguard Worker disk_cache_wait_for_idle(cache);
332*61046927SAndroid Build Coastguard Worker
333*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache, one_KB_key, &size);
334*61046927SAndroid Build Coastguard Worker EXPECT_NE(result, nullptr) << "3rd disk_cache_get of existing item (pointer)";
335*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, 1024) << "3rd disk_cache_get of existing item (size)";
336*61046927SAndroid Build Coastguard Worker
337*61046927SAndroid Build Coastguard Worker free(result);
338*61046927SAndroid Build Coastguard Worker
339*61046927SAndroid Build Coastguard Worker /* Ensure eviction happened by checking that both of the previous
340*61046927SAndroid Build Coastguard Worker * cache itesm were evicted.
341*61046927SAndroid Build Coastguard Worker */
342*61046927SAndroid Build Coastguard Worker bool contains_1KB_file = false;
343*61046927SAndroid Build Coastguard Worker count = 0;
344*61046927SAndroid Build Coastguard Worker if (does_cache_contain(cache, blob_key))
345*61046927SAndroid Build Coastguard Worker count++;
346*61046927SAndroid Build Coastguard Worker
347*61046927SAndroid Build Coastguard Worker if (does_cache_contain(cache, string_key))
348*61046927SAndroid Build Coastguard Worker count++;
349*61046927SAndroid Build Coastguard Worker
350*61046927SAndroid Build Coastguard Worker if (does_cache_contain(cache, one_KB_key)) {
351*61046927SAndroid Build Coastguard Worker count++;
352*61046927SAndroid Build Coastguard Worker contains_1KB_file = true;
353*61046927SAndroid Build Coastguard Worker }
354*61046927SAndroid Build Coastguard Worker
355*61046927SAndroid Build Coastguard Worker EXPECT_TRUE(contains_1KB_file)
356*61046927SAndroid Build Coastguard Worker << "disk_cache_put eviction last file == MAX_SIZE (1KB)";
357*61046927SAndroid Build Coastguard Worker EXPECT_EQ(count, 1) << "disk_cache_put eviction with MAX_SIZE=1K";
358*61046927SAndroid Build Coastguard Worker
359*61046927SAndroid Build Coastguard Worker /* Now increase the size to 1M, add back both items, and ensure all
360*61046927SAndroid Build Coastguard Worker * three that have been added are available via disk_cache_get.
361*61046927SAndroid Build Coastguard Worker */
362*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache);
363*61046927SAndroid Build Coastguard Worker
364*61046927SAndroid Build Coastguard Worker setenv("MESA_SHADER_CACHE_MAX_SIZE", "1M", 1);
365*61046927SAndroid Build Coastguard Worker cache = disk_cache_create("test", driver_id, 0);
366*61046927SAndroid Build Coastguard Worker
367*61046927SAndroid Build Coastguard Worker disk_cache_put(cache, blob_key, blob, sizeof(blob), NULL);
368*61046927SAndroid Build Coastguard Worker disk_cache_put(cache, string_key, string, sizeof(string), NULL);
369*61046927SAndroid Build Coastguard Worker
370*61046927SAndroid Build Coastguard Worker /* disk_cache_put() hands things off to a thread so wait for it. */
371*61046927SAndroid Build Coastguard Worker disk_cache_wait_for_idle(cache);
372*61046927SAndroid Build Coastguard Worker
373*61046927SAndroid Build Coastguard Worker count = 0;
374*61046927SAndroid Build Coastguard Worker if (does_cache_contain(cache, blob_key))
375*61046927SAndroid Build Coastguard Worker count++;
376*61046927SAndroid Build Coastguard Worker
377*61046927SAndroid Build Coastguard Worker if (does_cache_contain(cache, string_key))
378*61046927SAndroid Build Coastguard Worker count++;
379*61046927SAndroid Build Coastguard Worker
380*61046927SAndroid Build Coastguard Worker if (does_cache_contain(cache, one_KB_key))
381*61046927SAndroid Build Coastguard Worker count++;
382*61046927SAndroid Build Coastguard Worker
383*61046927SAndroid Build Coastguard Worker EXPECT_EQ(count, 3) << "no eviction before overflow with MAX_SIZE=1M";
384*61046927SAndroid Build Coastguard Worker
385*61046927SAndroid Build Coastguard Worker /* Finally, check eviction again after adding an object of size 1M. */
386*61046927SAndroid Build Coastguard Worker one_MB = (uint8_t *) calloc(1024, 1024);
387*61046927SAndroid Build Coastguard Worker
388*61046927SAndroid Build Coastguard Worker disk_cache_compute_key(cache, one_MB, 1024 * 1024, one_MB_key);
389*61046927SAndroid Build Coastguard Worker one_MB_key[0] = blob_key[0];
390*61046927SAndroid Build Coastguard Worker
391*61046927SAndroid Build Coastguard Worker disk_cache_put(cache, one_MB_key, one_MB, 1024 * 1024, NULL);
392*61046927SAndroid Build Coastguard Worker
393*61046927SAndroid Build Coastguard Worker free(one_MB);
394*61046927SAndroid Build Coastguard Worker
395*61046927SAndroid Build Coastguard Worker /* disk_cache_put() hands things off to a thread so wait for it. */
396*61046927SAndroid Build Coastguard Worker disk_cache_wait_for_idle(cache);
397*61046927SAndroid Build Coastguard Worker
398*61046927SAndroid Build Coastguard Worker bool contains_1MB_file = false;
399*61046927SAndroid Build Coastguard Worker count = 0;
400*61046927SAndroid Build Coastguard Worker if (does_cache_contain(cache, blob_key))
401*61046927SAndroid Build Coastguard Worker count++;
402*61046927SAndroid Build Coastguard Worker
403*61046927SAndroid Build Coastguard Worker if (does_cache_contain(cache, string_key))
404*61046927SAndroid Build Coastguard Worker count++;
405*61046927SAndroid Build Coastguard Worker
406*61046927SAndroid Build Coastguard Worker if (does_cache_contain(cache, one_KB_key))
407*61046927SAndroid Build Coastguard Worker count++;
408*61046927SAndroid Build Coastguard Worker
409*61046927SAndroid Build Coastguard Worker if (does_cache_contain(cache, one_MB_key)) {
410*61046927SAndroid Build Coastguard Worker count++;
411*61046927SAndroid Build Coastguard Worker contains_1MB_file = true;
412*61046927SAndroid Build Coastguard Worker }
413*61046927SAndroid Build Coastguard Worker
414*61046927SAndroid Build Coastguard Worker EXPECT_TRUE(contains_1MB_file)
415*61046927SAndroid Build Coastguard Worker << "disk_cache_put eviction last file == MAX_SIZE (1MB)";
416*61046927SAndroid Build Coastguard Worker EXPECT_EQ(count, 1) << "eviction after overflow with MAX_SIZE=1M";
417*61046927SAndroid Build Coastguard Worker
418*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache);
419*61046927SAndroid Build Coastguard Worker }
420*61046927SAndroid Build Coastguard Worker
421*61046927SAndroid Build Coastguard Worker static void
test_put_key_and_get_key(const char * driver_id)422*61046927SAndroid Build Coastguard Worker test_put_key_and_get_key(const char *driver_id)
423*61046927SAndroid Build Coastguard Worker {
424*61046927SAndroid Build Coastguard Worker struct disk_cache *cache;
425*61046927SAndroid Build Coastguard Worker bool result;
426*61046927SAndroid Build Coastguard Worker
427*61046927SAndroid Build Coastguard Worker uint8_t key_a[20] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
428*61046927SAndroid Build Coastguard Worker 10, 11, 12, 13, 14, 15, 16, 17, 18, 19};
429*61046927SAndroid Build Coastguard Worker uint8_t key_b[20] = { 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
430*61046927SAndroid Build Coastguard Worker 30, 33, 32, 33, 34, 35, 36, 37, 38, 39};
431*61046927SAndroid Build Coastguard Worker uint8_t key_a_collide[20] =
432*61046927SAndroid Build Coastguard Worker { 0, 1, 42, 43, 44, 45, 46, 47, 48, 49,
433*61046927SAndroid Build Coastguard Worker 50, 55, 52, 53, 54, 55, 56, 57, 58, 59};
434*61046927SAndroid Build Coastguard Worker
435*61046927SAndroid Build Coastguard Worker #ifdef SHADER_CACHE_DISABLE_BY_DEFAULT
436*61046927SAndroid Build Coastguard Worker setenv("MESA_SHADER_CACHE_DISABLE", "false", 1);
437*61046927SAndroid Build Coastguard Worker #endif /* SHADER_CACHE_DISABLE_BY_DEFAULT */
438*61046927SAndroid Build Coastguard Worker
439*61046927SAndroid Build Coastguard Worker cache = disk_cache_create("test", driver_id, 0);
440*61046927SAndroid Build Coastguard Worker
441*61046927SAndroid Build Coastguard Worker /* First test that disk_cache_has_key returns false before disk_cache_put_key */
442*61046927SAndroid Build Coastguard Worker result = disk_cache_has_key(cache, key_a);
443*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, 0) << "disk_cache_has_key before key added";
444*61046927SAndroid Build Coastguard Worker
445*61046927SAndroid Build Coastguard Worker /* Then a couple of tests of disk_cache_put_key followed by disk_cache_has_key */
446*61046927SAndroid Build Coastguard Worker disk_cache_put_key(cache, key_a);
447*61046927SAndroid Build Coastguard Worker result = disk_cache_has_key(cache, key_a);
448*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, 1) << "disk_cache_has_key after key added";
449*61046927SAndroid Build Coastguard Worker
450*61046927SAndroid Build Coastguard Worker disk_cache_put_key(cache, key_b);
451*61046927SAndroid Build Coastguard Worker result = disk_cache_has_key(cache, key_b);
452*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, 1) << "2nd disk_cache_has_key after key added";
453*61046927SAndroid Build Coastguard Worker
454*61046927SAndroid Build Coastguard Worker /* Test that a key with the same two bytes as an existing key
455*61046927SAndroid Build Coastguard Worker * forces an eviction.
456*61046927SAndroid Build Coastguard Worker */
457*61046927SAndroid Build Coastguard Worker disk_cache_put_key(cache, key_a_collide);
458*61046927SAndroid Build Coastguard Worker result = disk_cache_has_key(cache, key_a_collide);
459*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, 1) << "put_key of a colliding key lands in the cache";
460*61046927SAndroid Build Coastguard Worker
461*61046927SAndroid Build Coastguard Worker result = disk_cache_has_key(cache, key_a);
462*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, 0) << "put_key of a colliding key evicts from the cache";
463*61046927SAndroid Build Coastguard Worker
464*61046927SAndroid Build Coastguard Worker /* And finally test that we can re-add the original key to re-evict
465*61046927SAndroid Build Coastguard Worker * the colliding key.
466*61046927SAndroid Build Coastguard Worker */
467*61046927SAndroid Build Coastguard Worker disk_cache_put_key(cache, key_a);
468*61046927SAndroid Build Coastguard Worker result = disk_cache_has_key(cache, key_a);
469*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, 1) << "put_key of original key lands again";
470*61046927SAndroid Build Coastguard Worker
471*61046927SAndroid Build Coastguard Worker result = disk_cache_has_key(cache, key_a_collide);
472*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, 0) << "put_key of orginal key evicts the colliding key";
473*61046927SAndroid Build Coastguard Worker
474*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache);
475*61046927SAndroid Build Coastguard Worker }
476*61046927SAndroid Build Coastguard Worker
477*61046927SAndroid Build Coastguard Worker /* To make sure we are not just using the inmemory cache index for the single
478*61046927SAndroid Build Coastguard Worker * file cache we test adding and retriving cache items between two different
479*61046927SAndroid Build Coastguard Worker * cache instances.
480*61046927SAndroid Build Coastguard Worker */
481*61046927SAndroid Build Coastguard Worker static void
test_put_and_get_between_instances(const char * driver_id)482*61046927SAndroid Build Coastguard Worker test_put_and_get_between_instances(const char *driver_id)
483*61046927SAndroid Build Coastguard Worker {
484*61046927SAndroid Build Coastguard Worker char blob[] = "This is a blob of thirty-seven bytes";
485*61046927SAndroid Build Coastguard Worker uint8_t blob_key[20];
486*61046927SAndroid Build Coastguard Worker char string[] = "While this string has thirty-four";
487*61046927SAndroid Build Coastguard Worker uint8_t string_key[20];
488*61046927SAndroid Build Coastguard Worker char *result;
489*61046927SAndroid Build Coastguard Worker size_t size;
490*61046927SAndroid Build Coastguard Worker
491*61046927SAndroid Build Coastguard Worker #ifdef SHADER_CACHE_DISABLE_BY_DEFAULT
492*61046927SAndroid Build Coastguard Worker setenv("MESA_SHADER_CACHE_DISABLE", "false", 1);
493*61046927SAndroid Build Coastguard Worker #endif /* SHADER_CACHE_DISABLE_BY_DEFAULT */
494*61046927SAndroid Build Coastguard Worker
495*61046927SAndroid Build Coastguard Worker struct disk_cache *cache1 = disk_cache_create("test_between_instances",
496*61046927SAndroid Build Coastguard Worker driver_id, 0);
497*61046927SAndroid Build Coastguard Worker struct disk_cache *cache2 = disk_cache_create("test_between_instances",
498*61046927SAndroid Build Coastguard Worker driver_id, 0);
499*61046927SAndroid Build Coastguard Worker
500*61046927SAndroid Build Coastguard Worker disk_cache_compute_key(cache1, blob, sizeof(blob), blob_key);
501*61046927SAndroid Build Coastguard Worker
502*61046927SAndroid Build Coastguard Worker /* Ensure that disk_cache_get returns nothing before anything is added. */
503*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache1, blob_key, &size);
504*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, nullptr) << "disk_cache_get(cache1) with non-existent item (pointer)";
505*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, 0) << "disk_cache_get(cach1) with non-existent item (size)";
506*61046927SAndroid Build Coastguard Worker
507*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache2, blob_key, &size);
508*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, nullptr) << "disk_cache_get(cache2) with non-existent item (pointer)";
509*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, 0) << "disk_cache_get(cache2) with non-existent item (size)";
510*61046927SAndroid Build Coastguard Worker
511*61046927SAndroid Build Coastguard Worker /* Simple test of put and get. */
512*61046927SAndroid Build Coastguard Worker disk_cache_put(cache1, blob_key, blob, sizeof(blob), NULL);
513*61046927SAndroid Build Coastguard Worker
514*61046927SAndroid Build Coastguard Worker /* disk_cache_put() hands things off to a thread so wait for it. */
515*61046927SAndroid Build Coastguard Worker disk_cache_wait_for_idle(cache1);
516*61046927SAndroid Build Coastguard Worker
517*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache2, blob_key, &size);
518*61046927SAndroid Build Coastguard Worker EXPECT_STREQ(blob, result) << "disk_cache_get(cache2) of existing item (pointer)";
519*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, sizeof(blob)) << "disk_cache_get of(cache2) existing item (size)";
520*61046927SAndroid Build Coastguard Worker
521*61046927SAndroid Build Coastguard Worker free(result);
522*61046927SAndroid Build Coastguard Worker
523*61046927SAndroid Build Coastguard Worker /* Test put and get of a second item, via the opposite instances */
524*61046927SAndroid Build Coastguard Worker disk_cache_compute_key(cache2, string, sizeof(string), string_key);
525*61046927SAndroid Build Coastguard Worker disk_cache_put(cache2, string_key, string, sizeof(string), NULL);
526*61046927SAndroid Build Coastguard Worker
527*61046927SAndroid Build Coastguard Worker /* disk_cache_put() hands things off to a thread so wait for it. */
528*61046927SAndroid Build Coastguard Worker disk_cache_wait_for_idle(cache2);
529*61046927SAndroid Build Coastguard Worker
530*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache1, string_key, &size);
531*61046927SAndroid Build Coastguard Worker EXPECT_STREQ(result, string) << "2nd disk_cache_get(cache1) of existing item (pointer)";
532*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, sizeof(string)) << "2nd disk_cache_get(cache1) of existing item (size)";
533*61046927SAndroid Build Coastguard Worker
534*61046927SAndroid Build Coastguard Worker free(result);
535*61046927SAndroid Build Coastguard Worker
536*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache1);
537*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache2);
538*61046927SAndroid Build Coastguard Worker }
539*61046927SAndroid Build Coastguard Worker
540*61046927SAndroid Build Coastguard Worker static void
test_put_and_get_between_instances_with_eviction(const char * driver_id)541*61046927SAndroid Build Coastguard Worker test_put_and_get_between_instances_with_eviction(const char *driver_id)
542*61046927SAndroid Build Coastguard Worker {
543*61046927SAndroid Build Coastguard Worker cache_key small_key[8], small_key2, big_key[2];
544*61046927SAndroid Build Coastguard Worker struct disk_cache *cache[2];
545*61046927SAndroid Build Coastguard Worker unsigned int i, n, k;
546*61046927SAndroid Build Coastguard Worker uint8_t *small;
547*61046927SAndroid Build Coastguard Worker uint8_t *big;
548*61046927SAndroid Build Coastguard Worker char *result;
549*61046927SAndroid Build Coastguard Worker size_t size;
550*61046927SAndroid Build Coastguard Worker
551*61046927SAndroid Build Coastguard Worker #ifdef SHADER_CACHE_DISABLE_BY_DEFAULT
552*61046927SAndroid Build Coastguard Worker setenv("MESA_SHADER_CACHE_DISABLE", "false", 1);
553*61046927SAndroid Build Coastguard Worker #endif /* SHADER_CACHE_DISABLE_BY_DEFAULT */
554*61046927SAndroid Build Coastguard Worker
555*61046927SAndroid Build Coastguard Worker setenv("MESA_SHADER_CACHE_MAX_SIZE", "2K", 1);
556*61046927SAndroid Build Coastguard Worker
557*61046927SAndroid Build Coastguard Worker cache[0] = disk_cache_create("test_between_instances_with_eviction", driver_id, 0);
558*61046927SAndroid Build Coastguard Worker cache[1] = disk_cache_create("test_between_instances_with_eviction", driver_id, 0);
559*61046927SAndroid Build Coastguard Worker
560*61046927SAndroid Build Coastguard Worker uint8_t two_KB[2048] = { 0 };
561*61046927SAndroid Build Coastguard Worker cache_key two_KB_key = { 'T', 'W', 'O', 'K', 'B' };
562*61046927SAndroid Build Coastguard Worker
563*61046927SAndroid Build Coastguard Worker /* Flush the database by adding the dummy 2KB entry */
564*61046927SAndroid Build Coastguard Worker disk_cache_put(cache[0], two_KB_key, two_KB, sizeof(two_KB), NULL);
565*61046927SAndroid Build Coastguard Worker disk_cache_wait_for_idle(cache[0]);
566*61046927SAndroid Build Coastguard Worker
567*61046927SAndroid Build Coastguard Worker int size_big = 1000;
568*61046927SAndroid Build Coastguard Worker size_big -= sizeof(struct cache_entry_file_data);
569*61046927SAndroid Build Coastguard Worker size_big -= mesa_cache_db_file_entry_size();
570*61046927SAndroid Build Coastguard Worker size_big -= cache[0]->driver_keys_blob_size;
571*61046927SAndroid Build Coastguard Worker size_big -= 4 + 8; /* cache_item_metadata size + room for alignment */
572*61046927SAndroid Build Coastguard Worker
573*61046927SAndroid Build Coastguard Worker for (i = 0; i < ARRAY_SIZE(big_key); i++) {
574*61046927SAndroid Build Coastguard Worker big = (uint8_t *) malloc(size_big);
575*61046927SAndroid Build Coastguard Worker memset(big, i, size_big);
576*61046927SAndroid Build Coastguard Worker
577*61046927SAndroid Build Coastguard Worker disk_cache_compute_key(cache[0], big, size_big, big_key[i]);
578*61046927SAndroid Build Coastguard Worker disk_cache_put(cache[0], big_key[i], big, size_big, NULL);
579*61046927SAndroid Build Coastguard Worker disk_cache_wait_for_idle(cache[0]);
580*61046927SAndroid Build Coastguard Worker
581*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache[0], big_key[i], &size);
582*61046927SAndroid Build Coastguard Worker EXPECT_NE(result, nullptr) << "disk_cache_get with existent item (pointer)";
583*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, size_big) << "disk_cache_get with existent item (size)";
584*61046927SAndroid Build Coastguard Worker free(result);
585*61046927SAndroid Build Coastguard Worker
586*61046927SAndroid Build Coastguard Worker free(big);
587*61046927SAndroid Build Coastguard Worker }
588*61046927SAndroid Build Coastguard Worker
589*61046927SAndroid Build Coastguard Worker int size_small = 256;
590*61046927SAndroid Build Coastguard Worker size_small -= sizeof(struct cache_entry_file_data);
591*61046927SAndroid Build Coastguard Worker size_small -= mesa_cache_db_file_entry_size();
592*61046927SAndroid Build Coastguard Worker size_small -= cache[1]->driver_keys_blob_size;
593*61046927SAndroid Build Coastguard Worker size_small -= 4 + 8; /* cache_item_metadata size + room for alignment */
594*61046927SAndroid Build Coastguard Worker
595*61046927SAndroid Build Coastguard Worker for (i = 0; i < ARRAY_SIZE(small_key); i++) {
596*61046927SAndroid Build Coastguard Worker small = (uint8_t *) malloc(size_small);
597*61046927SAndroid Build Coastguard Worker memset(small, i, size_small);
598*61046927SAndroid Build Coastguard Worker
599*61046927SAndroid Build Coastguard Worker disk_cache_compute_key(cache[1], small, size_small, small_key[i]);
600*61046927SAndroid Build Coastguard Worker disk_cache_put(cache[1], small_key[i], small, size_small, NULL);
601*61046927SAndroid Build Coastguard Worker disk_cache_wait_for_idle(cache[1]);
602*61046927SAndroid Build Coastguard Worker
603*61046927SAndroid Build Coastguard Worker /*
604*61046927SAndroid Build Coastguard Worker * At first we added two 1000KB entries to cache[0]. Now, when first
605*61046927SAndroid Build Coastguard Worker * 256KB entry is added, the two 1000KB entries are evicted because
606*61046927SAndroid Build Coastguard Worker * at minimum cache_max_size/2 is evicted on overflow.
607*61046927SAndroid Build Coastguard Worker *
608*61046927SAndroid Build Coastguard Worker * All four 256KB entries stay in the cache.
609*61046927SAndroid Build Coastguard Worker */
610*61046927SAndroid Build Coastguard Worker for (k = 0; k < ARRAY_SIZE(cache); k++) {
611*61046927SAndroid Build Coastguard Worker for (n = 0; n <= i; n++) {
612*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache[k], big_key[0], &size);
613*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, nullptr) << "disk_cache_get with non-existent item (pointer)";
614*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, 0) << "disk_cache_get with non-existent item (size)";
615*61046927SAndroid Build Coastguard Worker free(result);
616*61046927SAndroid Build Coastguard Worker
617*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache[k], big_key[1], &size);
618*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, nullptr) << "disk_cache_get with non-existent item (pointer)";
619*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, 0) << "disk_cache_get with non-existent item (size)";
620*61046927SAndroid Build Coastguard Worker free(result);
621*61046927SAndroid Build Coastguard Worker
622*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache[k], small_key[n], &size);
623*61046927SAndroid Build Coastguard Worker EXPECT_NE(result, nullptr) << "disk_cache_get of existing item (pointer)";
624*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, size_small) << "disk_cache_get of existing item (size)";
625*61046927SAndroid Build Coastguard Worker free(result);
626*61046927SAndroid Build Coastguard Worker
627*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache[k], small_key[n], &size);
628*61046927SAndroid Build Coastguard Worker EXPECT_NE(result, nullptr) << "disk_cache_get of existing item (pointer)";
629*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, size_small) << "disk_cache_get of existing item (size)";
630*61046927SAndroid Build Coastguard Worker free(result);
631*61046927SAndroid Build Coastguard Worker }
632*61046927SAndroid Build Coastguard Worker }
633*61046927SAndroid Build Coastguard Worker
634*61046927SAndroid Build Coastguard Worker free(small);
635*61046927SAndroid Build Coastguard Worker }
636*61046927SAndroid Build Coastguard Worker
637*61046927SAndroid Build Coastguard Worker small = (uint8_t *) malloc(size_small);
638*61046927SAndroid Build Coastguard Worker memset(small, i, size_small);
639*61046927SAndroid Build Coastguard Worker
640*61046927SAndroid Build Coastguard Worker /* Add another 256KB entry. This will evict first five 256KB entries
641*61046927SAndroid Build Coastguard Worker * of eight that we added previously. */
642*61046927SAndroid Build Coastguard Worker disk_cache_compute_key(cache[0], small, size_small, small_key2);
643*61046927SAndroid Build Coastguard Worker disk_cache_put(cache[0], small_key2, small, size_small, NULL);
644*61046927SAndroid Build Coastguard Worker disk_cache_wait_for_idle(cache[0]);
645*61046927SAndroid Build Coastguard Worker
646*61046927SAndroid Build Coastguard Worker free(small);
647*61046927SAndroid Build Coastguard Worker
648*61046927SAndroid Build Coastguard Worker for (k = 0; k < ARRAY_SIZE(cache); k++) {
649*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache[k], small_key2, &size);
650*61046927SAndroid Build Coastguard Worker EXPECT_NE(result, nullptr) << "disk_cache_get of existing item (pointer)";
651*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, size_small) << "disk_cache_get of existing item (size)";
652*61046927SAndroid Build Coastguard Worker free(result);
653*61046927SAndroid Build Coastguard Worker }
654*61046927SAndroid Build Coastguard Worker
655*61046927SAndroid Build Coastguard Worker for (i = 0, k = 0; k < ARRAY_SIZE(cache); k++) {
656*61046927SAndroid Build Coastguard Worker for (n = 0; n < ARRAY_SIZE(small_key); n++) {
657*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache[k], small_key[n], &size);
658*61046927SAndroid Build Coastguard Worker if (!result)
659*61046927SAndroid Build Coastguard Worker i++;
660*61046927SAndroid Build Coastguard Worker free(result);
661*61046927SAndroid Build Coastguard Worker }
662*61046927SAndroid Build Coastguard Worker }
663*61046927SAndroid Build Coastguard Worker
664*61046927SAndroid Build Coastguard Worker EXPECT_EQ(i, 10) << "2x disk_cache_get with 5 non-existent 256KB items";
665*61046927SAndroid Build Coastguard Worker
666*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache[0]);
667*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache[1]);
668*61046927SAndroid Build Coastguard Worker }
669*61046927SAndroid Build Coastguard Worker #endif /* ENABLE_SHADER_CACHE */
670*61046927SAndroid Build Coastguard Worker
671*61046927SAndroid Build Coastguard Worker class Cache : public ::testing::Test {
672*61046927SAndroid Build Coastguard Worker protected:
673*61046927SAndroid Build Coastguard Worker void *mem_ctx;
674*61046927SAndroid Build Coastguard Worker
Cache()675*61046927SAndroid Build Coastguard Worker Cache() {
676*61046927SAndroid Build Coastguard Worker mem_ctx = ralloc_context(NULL);
677*61046927SAndroid Build Coastguard Worker }
~Cache()678*61046927SAndroid Build Coastguard Worker ~Cache() {
679*61046927SAndroid Build Coastguard Worker ralloc_free(mem_ctx);
680*61046927SAndroid Build Coastguard Worker }
681*61046927SAndroid Build Coastguard Worker };
682*61046927SAndroid Build Coastguard Worker
TEST_F(Cache,MultiFile)683*61046927SAndroid Build Coastguard Worker TEST_F(Cache, MultiFile)
684*61046927SAndroid Build Coastguard Worker {
685*61046927SAndroid Build Coastguard Worker const char *driver_id;
686*61046927SAndroid Build Coastguard Worker
687*61046927SAndroid Build Coastguard Worker #ifndef ENABLE_SHADER_CACHE
688*61046927SAndroid Build Coastguard Worker GTEST_SKIP() << "ENABLE_SHADER_CACHE not defined.";
689*61046927SAndroid Build Coastguard Worker #else
690*61046927SAndroid Build Coastguard Worker bool compress = true;
691*61046927SAndroid Build Coastguard Worker
692*61046927SAndroid Build Coastguard Worker run_tests:
693*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_MULTI_FILE", "true", 1);
694*61046927SAndroid Build Coastguard Worker
695*61046927SAndroid Build Coastguard Worker if (!compress)
696*61046927SAndroid Build Coastguard Worker driver_id = "make_check_uncompressed";
697*61046927SAndroid Build Coastguard Worker else
698*61046927SAndroid Build Coastguard Worker driver_id = "make_check";
699*61046927SAndroid Build Coastguard Worker
700*61046927SAndroid Build Coastguard Worker test_disk_cache_create(mem_ctx, CACHE_DIR_NAME, driver_id);
701*61046927SAndroid Build Coastguard Worker
702*61046927SAndroid Build Coastguard Worker test_put_and_get(true, driver_id);
703*61046927SAndroid Build Coastguard Worker
704*61046927SAndroid Build Coastguard Worker test_put_key_and_get_key(driver_id);
705*61046927SAndroid Build Coastguard Worker
706*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_MULTI_FILE", "false", 1);
707*61046927SAndroid Build Coastguard Worker
708*61046927SAndroid Build Coastguard Worker int err = rmrf_local(CACHE_TEST_TMP);
709*61046927SAndroid Build Coastguard Worker EXPECT_EQ(err, 0) << "Removing " CACHE_TEST_TMP " again";
710*61046927SAndroid Build Coastguard Worker
711*61046927SAndroid Build Coastguard Worker if (compress) {
712*61046927SAndroid Build Coastguard Worker compress = false;
713*61046927SAndroid Build Coastguard Worker goto run_tests;
714*61046927SAndroid Build Coastguard Worker }
715*61046927SAndroid Build Coastguard Worker #endif
716*61046927SAndroid Build Coastguard Worker }
717*61046927SAndroid Build Coastguard Worker
TEST_F(Cache,SingleFile)718*61046927SAndroid Build Coastguard Worker TEST_F(Cache, SingleFile)
719*61046927SAndroid Build Coastguard Worker {
720*61046927SAndroid Build Coastguard Worker const char *driver_id;
721*61046927SAndroid Build Coastguard Worker
722*61046927SAndroid Build Coastguard Worker #ifndef ENABLE_SHADER_CACHE
723*61046927SAndroid Build Coastguard Worker GTEST_SKIP() << "ENABLE_SHADER_CACHE not defined.";
724*61046927SAndroid Build Coastguard Worker #else
725*61046927SAndroid Build Coastguard Worker bool compress = true;
726*61046927SAndroid Build Coastguard Worker
727*61046927SAndroid Build Coastguard Worker run_tests:
728*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_SINGLE_FILE", "true", 1);
729*61046927SAndroid Build Coastguard Worker
730*61046927SAndroid Build Coastguard Worker if (!compress)
731*61046927SAndroid Build Coastguard Worker driver_id = "make_check_uncompressed";
732*61046927SAndroid Build Coastguard Worker else
733*61046927SAndroid Build Coastguard Worker driver_id = "make_check";
734*61046927SAndroid Build Coastguard Worker
735*61046927SAndroid Build Coastguard Worker test_disk_cache_create(mem_ctx, CACHE_DIR_NAME_SF, driver_id);
736*61046927SAndroid Build Coastguard Worker
737*61046927SAndroid Build Coastguard Worker /* We skip testing cache size limit as the single file cache currently
738*61046927SAndroid Build Coastguard Worker * doesn't have any functionality to enforce cache size limits.
739*61046927SAndroid Build Coastguard Worker */
740*61046927SAndroid Build Coastguard Worker test_put_and_get(false, driver_id);
741*61046927SAndroid Build Coastguard Worker
742*61046927SAndroid Build Coastguard Worker test_put_key_and_get_key(driver_id);
743*61046927SAndroid Build Coastguard Worker
744*61046927SAndroid Build Coastguard Worker test_put_and_get_between_instances(driver_id);
745*61046927SAndroid Build Coastguard Worker
746*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_SINGLE_FILE", "false", 1);
747*61046927SAndroid Build Coastguard Worker
748*61046927SAndroid Build Coastguard Worker int err = rmrf_local(CACHE_TEST_TMP);
749*61046927SAndroid Build Coastguard Worker EXPECT_EQ(err, 0) << "Removing " CACHE_TEST_TMP " again";
750*61046927SAndroid Build Coastguard Worker
751*61046927SAndroid Build Coastguard Worker if (compress) {
752*61046927SAndroid Build Coastguard Worker compress = false;
753*61046927SAndroid Build Coastguard Worker goto run_tests;
754*61046927SAndroid Build Coastguard Worker }
755*61046927SAndroid Build Coastguard Worker #endif
756*61046927SAndroid Build Coastguard Worker }
757*61046927SAndroid Build Coastguard Worker
TEST_F(Cache,Database)758*61046927SAndroid Build Coastguard Worker TEST_F(Cache, Database)
759*61046927SAndroid Build Coastguard Worker {
760*61046927SAndroid Build Coastguard Worker const char *driver_id = "make_check_uncompressed";
761*61046927SAndroid Build Coastguard Worker
762*61046927SAndroid Build Coastguard Worker #ifndef ENABLE_SHADER_CACHE
763*61046927SAndroid Build Coastguard Worker GTEST_SKIP() << "ENABLE_SHADER_CACHE not defined.";
764*61046927SAndroid Build Coastguard Worker #else
765*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_DATABASE_NUM_PARTS", "1", 1);
766*61046927SAndroid Build Coastguard Worker
767*61046927SAndroid Build Coastguard Worker test_disk_cache_create(mem_ctx, CACHE_DIR_NAME_DB, driver_id);
768*61046927SAndroid Build Coastguard Worker
769*61046927SAndroid Build Coastguard Worker /* We skip testing cache size limit as the single file cache compresses
770*61046927SAndroid Build Coastguard Worker * data much better than the multi-file cache, which results in the
771*61046927SAndroid Build Coastguard Worker * failing tests of the cache eviction function. We we will test the
772*61046927SAndroid Build Coastguard Worker * eviction separately with the disabled compression.
773*61046927SAndroid Build Coastguard Worker */
774*61046927SAndroid Build Coastguard Worker test_put_and_get(false, driver_id);
775*61046927SAndroid Build Coastguard Worker
776*61046927SAndroid Build Coastguard Worker int err = rmrf_local(CACHE_TEST_TMP);
777*61046927SAndroid Build Coastguard Worker EXPECT_EQ(err, 0) << "Removing " CACHE_TEST_TMP " again";
778*61046927SAndroid Build Coastguard Worker
779*61046927SAndroid Build Coastguard Worker test_disk_cache_create(mem_ctx, CACHE_DIR_NAME_DB, driver_id);
780*61046927SAndroid Build Coastguard Worker
781*61046927SAndroid Build Coastguard Worker test_put_and_get(true, driver_id);
782*61046927SAndroid Build Coastguard Worker
783*61046927SAndroid Build Coastguard Worker test_put_key_and_get_key(driver_id);
784*61046927SAndroid Build Coastguard Worker
785*61046927SAndroid Build Coastguard Worker test_put_and_get_between_instances(driver_id);
786*61046927SAndroid Build Coastguard Worker
787*61046927SAndroid Build Coastguard Worker test_put_and_get_between_instances_with_eviction(driver_id);
788*61046927SAndroid Build Coastguard Worker
789*61046927SAndroid Build Coastguard Worker unsetenv("MESA_DISK_CACHE_DATABASE_NUM_PARTS");
790*61046927SAndroid Build Coastguard Worker
791*61046927SAndroid Build Coastguard Worker err = rmrf_local(CACHE_TEST_TMP);
792*61046927SAndroid Build Coastguard Worker EXPECT_EQ(err, 0) << "Removing " CACHE_TEST_TMP " again";
793*61046927SAndroid Build Coastguard Worker #endif
794*61046927SAndroid Build Coastguard Worker }
795*61046927SAndroid Build Coastguard Worker
TEST_F(Cache,Combined)796*61046927SAndroid Build Coastguard Worker TEST_F(Cache, Combined)
797*61046927SAndroid Build Coastguard Worker {
798*61046927SAndroid Build Coastguard Worker const char *driver_id = "make_check";
799*61046927SAndroid Build Coastguard Worker char blob[] = "This is a RO blob";
800*61046927SAndroid Build Coastguard Worker char blob2[] = "This is a RW blob";
801*61046927SAndroid Build Coastguard Worker uint8_t dummy_key[20] = { 0 };
802*61046927SAndroid Build Coastguard Worker uint8_t blob_key[20];
803*61046927SAndroid Build Coastguard Worker uint8_t blob_key2[20];
804*61046927SAndroid Build Coastguard Worker char foz_rw_idx_file[1024];
805*61046927SAndroid Build Coastguard Worker char foz_ro_idx_file[1024];
806*61046927SAndroid Build Coastguard Worker char foz_rw_file[1024];
807*61046927SAndroid Build Coastguard Worker char foz_ro_file[1024];
808*61046927SAndroid Build Coastguard Worker char *result;
809*61046927SAndroid Build Coastguard Worker size_t size;
810*61046927SAndroid Build Coastguard Worker
811*61046927SAndroid Build Coastguard Worker #ifndef ENABLE_SHADER_CACHE
812*61046927SAndroid Build Coastguard Worker GTEST_SKIP() << "ENABLE_SHADER_CACHE not defined.";
813*61046927SAndroid Build Coastguard Worker #else
814*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_SINGLE_FILE", "true", 1);
815*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_MULTI_FILE", "true", 1);
816*61046927SAndroid Build Coastguard Worker
817*61046927SAndroid Build Coastguard Worker #ifdef SHADER_CACHE_DISABLE_BY_DEFAULT
818*61046927SAndroid Build Coastguard Worker setenv("MESA_SHADER_CACHE_DISABLE", "false", 1);
819*61046927SAndroid Build Coastguard Worker #endif /* SHADER_CACHE_DISABLE_BY_DEFAULT */
820*61046927SAndroid Build Coastguard Worker
821*61046927SAndroid Build Coastguard Worker /* Enable Fossilize read-write cache. */
822*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_COMBINE_RW_WITH_RO_FOZ", "true", 1);
823*61046927SAndroid Build Coastguard Worker
824*61046927SAndroid Build Coastguard Worker test_disk_cache_create(mem_ctx, CACHE_DIR_NAME_SF, driver_id);
825*61046927SAndroid Build Coastguard Worker
826*61046927SAndroid Build Coastguard Worker /* Create Fossilize writable cache. */
827*61046927SAndroid Build Coastguard Worker struct disk_cache *cache_sf_wr = disk_cache_create("combined_test",
828*61046927SAndroid Build Coastguard Worker driver_id, 0);
829*61046927SAndroid Build Coastguard Worker
830*61046927SAndroid Build Coastguard Worker disk_cache_compute_key(cache_sf_wr, blob, sizeof(blob), blob_key);
831*61046927SAndroid Build Coastguard Worker disk_cache_compute_key(cache_sf_wr, blob2, sizeof(blob2), blob_key2);
832*61046927SAndroid Build Coastguard Worker
833*61046927SAndroid Build Coastguard Worker /* Ensure that disk_cache_get returns nothing before anything is added. */
834*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache_sf_wr, blob_key, &size);
835*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, nullptr) << "disk_cache_get with non-existent item (pointer)";
836*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, 0) << "disk_cache_get with non-existent item (size)";
837*61046927SAndroid Build Coastguard Worker
838*61046927SAndroid Build Coastguard Worker /* Put blob entry to the cache. */
839*61046927SAndroid Build Coastguard Worker disk_cache_put(cache_sf_wr, blob_key, blob, sizeof(blob), NULL);
840*61046927SAndroid Build Coastguard Worker disk_cache_wait_for_idle(cache_sf_wr);
841*61046927SAndroid Build Coastguard Worker
842*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache_sf_wr, blob_key, &size);
843*61046927SAndroid Build Coastguard Worker EXPECT_STREQ(blob, result) << "disk_cache_get of existing item (pointer)";
844*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, sizeof(blob)) << "disk_cache_get of existing item (size)";
845*61046927SAndroid Build Coastguard Worker free(result);
846*61046927SAndroid Build Coastguard Worker
847*61046927SAndroid Build Coastguard Worker /* Rename file foz_cache.foz -> ro_cache.foz */
848*61046927SAndroid Build Coastguard Worker sprintf(foz_rw_file, "%s/foz_cache.foz", cache_sf_wr->path);
849*61046927SAndroid Build Coastguard Worker sprintf(foz_ro_file, "%s/ro_cache.foz", cache_sf_wr->path);
850*61046927SAndroid Build Coastguard Worker EXPECT_EQ(rename(foz_rw_file, foz_ro_file), 0) << "foz_cache.foz renaming failed";
851*61046927SAndroid Build Coastguard Worker
852*61046927SAndroid Build Coastguard Worker /* Rename file foz_cache_idx.foz -> ro_cache_idx.foz */
853*61046927SAndroid Build Coastguard Worker sprintf(foz_rw_idx_file, "%s/foz_cache_idx.foz", cache_sf_wr->path);
854*61046927SAndroid Build Coastguard Worker sprintf(foz_ro_idx_file, "%s/ro_cache_idx.foz", cache_sf_wr->path);
855*61046927SAndroid Build Coastguard Worker EXPECT_EQ(rename(foz_rw_idx_file, foz_ro_idx_file), 0) << "foz_cache_idx.foz renaming failed";
856*61046927SAndroid Build Coastguard Worker
857*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache_sf_wr);
858*61046927SAndroid Build Coastguard Worker
859*61046927SAndroid Build Coastguard Worker /* Disable Fossilize read-write cache. */
860*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_COMBINE_RW_WITH_RO_FOZ", "false", 1);
861*61046927SAndroid Build Coastguard Worker
862*61046927SAndroid Build Coastguard Worker /* Set up Fossilize read-only cache. */
863*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_COMBINE_RW_WITH_RO_FOZ", "true", 1);
864*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_READ_ONLY_FOZ_DBS", "ro_cache", 1);
865*61046927SAndroid Build Coastguard Worker
866*61046927SAndroid Build Coastguard Worker /* Create FOZ cache that fetches the RO cache. Note that this produces
867*61046927SAndroid Build Coastguard Worker * empty RW cache files. */
868*61046927SAndroid Build Coastguard Worker struct disk_cache *cache_sf_ro = disk_cache_create("combined_test",
869*61046927SAndroid Build Coastguard Worker driver_id, 0);
870*61046927SAndroid Build Coastguard Worker
871*61046927SAndroid Build Coastguard Worker /* Blob entry must present because it shall be retrieved from the
872*61046927SAndroid Build Coastguard Worker * ro_cache.foz */
873*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache_sf_ro, blob_key, &size);
874*61046927SAndroid Build Coastguard Worker EXPECT_STREQ(blob, result) << "disk_cache_get of existing item (pointer)";
875*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, sizeof(blob)) << "disk_cache_get of existing item (size)";
876*61046927SAndroid Build Coastguard Worker free(result);
877*61046927SAndroid Build Coastguard Worker
878*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache_sf_ro);
879*61046927SAndroid Build Coastguard Worker
880*61046927SAndroid Build Coastguard Worker /* Remove empty FOZ RW cache files created above. We only need RO cache. */
881*61046927SAndroid Build Coastguard Worker EXPECT_EQ(unlink(foz_rw_file), 0);
882*61046927SAndroid Build Coastguard Worker EXPECT_EQ(unlink(foz_rw_idx_file), 0);
883*61046927SAndroid Build Coastguard Worker
884*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_SINGLE_FILE", "false", 1);
885*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_MULTI_FILE", "false", 1);
886*61046927SAndroid Build Coastguard Worker
887*61046927SAndroid Build Coastguard Worker /* Create MESA-DB cache with enabled retrieval from the read-only
888*61046927SAndroid Build Coastguard Worker * cache. */
889*61046927SAndroid Build Coastguard Worker struct disk_cache *cache_mesa_db = disk_cache_create("combined_test",
890*61046927SAndroid Build Coastguard Worker driver_id, 0);
891*61046927SAndroid Build Coastguard Worker
892*61046927SAndroid Build Coastguard Worker /* Dummy entry must not present in any of the caches. Foz cache
893*61046927SAndroid Build Coastguard Worker * reloads index if cache entry is missing. This is a sanity-check
894*61046927SAndroid Build Coastguard Worker * for foz_read_entry(), it should work properly with a disabled
895*61046927SAndroid Build Coastguard Worker * FOZ RW cache. */
896*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache_mesa_db, dummy_key, &size);
897*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, nullptr) << "disk_cache_get with non-existent item (pointer)";
898*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, 0) << "disk_cache_get with non-existent item (size)";
899*61046927SAndroid Build Coastguard Worker
900*61046927SAndroid Build Coastguard Worker /* Blob entry must present because it shall be retrieved from the
901*61046927SAndroid Build Coastguard Worker * read-only cache. */
902*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache_mesa_db, blob_key, &size);
903*61046927SAndroid Build Coastguard Worker EXPECT_STREQ(blob, result) << "disk_cache_get of existing item (pointer)";
904*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, sizeof(blob)) << "disk_cache_get of existing item (size)";
905*61046927SAndroid Build Coastguard Worker free(result);
906*61046927SAndroid Build Coastguard Worker
907*61046927SAndroid Build Coastguard Worker /* Blob2 entry must not present in any of the caches. */
908*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache_mesa_db, blob_key2, &size);
909*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, nullptr) << "disk_cache_get with non-existent item (pointer)";
910*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, 0) << "disk_cache_get with non-existent item (size)";
911*61046927SAndroid Build Coastguard Worker
912*61046927SAndroid Build Coastguard Worker /* Put blob2 entry to the cache. */
913*61046927SAndroid Build Coastguard Worker disk_cache_put(cache_mesa_db, blob_key2, blob2, sizeof(blob2), NULL);
914*61046927SAndroid Build Coastguard Worker disk_cache_wait_for_idle(cache_mesa_db);
915*61046927SAndroid Build Coastguard Worker
916*61046927SAndroid Build Coastguard Worker /* Blob2 entry must present because it shall be retrieved from the
917*61046927SAndroid Build Coastguard Worker * read-write cache. */
918*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache_mesa_db, blob_key2, &size);
919*61046927SAndroid Build Coastguard Worker EXPECT_STREQ(blob2, result) << "disk_cache_get of existing item (pointer)";
920*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, sizeof(blob2)) << "disk_cache_get of existing item (size)";
921*61046927SAndroid Build Coastguard Worker free(result);
922*61046927SAndroid Build Coastguard Worker
923*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache_mesa_db);
924*61046927SAndroid Build Coastguard Worker
925*61046927SAndroid Build Coastguard Worker /* Disable read-only cache. */
926*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_COMBINE_RW_WITH_RO_FOZ", "false", 1);
927*61046927SAndroid Build Coastguard Worker
928*61046927SAndroid Build Coastguard Worker /* Create MESA-DB cache with disabled retrieval from the
929*61046927SAndroid Build Coastguard Worker * read-only cache. */
930*61046927SAndroid Build Coastguard Worker cache_mesa_db = disk_cache_create("combined_test", driver_id, 0);
931*61046927SAndroid Build Coastguard Worker
932*61046927SAndroid Build Coastguard Worker /* Blob2 entry must present because it shall be retrieved from the
933*61046927SAndroid Build Coastguard Worker * MESA-DB cache. */
934*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache_mesa_db, blob_key2, &size);
935*61046927SAndroid Build Coastguard Worker EXPECT_STREQ(blob2, result) << "disk_cache_get of existing item (pointer)";
936*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, sizeof(blob2)) << "disk_cache_get of existing item (size)";
937*61046927SAndroid Build Coastguard Worker free(result);
938*61046927SAndroid Build Coastguard Worker
939*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache_mesa_db);
940*61046927SAndroid Build Coastguard Worker
941*61046927SAndroid Build Coastguard Worker /* Create MESA-DB cache with disabled retrieval from the read-only
942*61046927SAndroid Build Coastguard Worker * cache. */
943*61046927SAndroid Build Coastguard Worker cache_mesa_db = disk_cache_create("combined_test", driver_id, 0);
944*61046927SAndroid Build Coastguard Worker
945*61046927SAndroid Build Coastguard Worker /* Blob entry must not present in the cache because we disable the
946*61046927SAndroid Build Coastguard Worker * read-only cache. */
947*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache_mesa_db, blob_key, &size);
948*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, nullptr) << "disk_cache_get with non-existent item (pointer)";
949*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, 0) << "disk_cache_get with non-existent item (size)";
950*61046927SAndroid Build Coastguard Worker
951*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache_mesa_db);
952*61046927SAndroid Build Coastguard Worker
953*61046927SAndroid Build Coastguard Worker /* Create default multi-file cache. */
954*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_MULTI_FILE", "true", 1);
955*61046927SAndroid Build Coastguard Worker
956*61046927SAndroid Build Coastguard Worker /* Enable read-only cache. */
957*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_COMBINE_RW_WITH_RO_FOZ", "true", 1);
958*61046927SAndroid Build Coastguard Worker
959*61046927SAndroid Build Coastguard Worker /* Create multi-file cache with enabled retrieval from the
960*61046927SAndroid Build Coastguard Worker * read-only cache. */
961*61046927SAndroid Build Coastguard Worker struct disk_cache *cache_multifile = disk_cache_create("combined_test",
962*61046927SAndroid Build Coastguard Worker driver_id, 0);
963*61046927SAndroid Build Coastguard Worker
964*61046927SAndroid Build Coastguard Worker /* Blob entry must present because it shall be retrieved from the
965*61046927SAndroid Build Coastguard Worker * read-only cache. */
966*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache_multifile, blob_key, &size);
967*61046927SAndroid Build Coastguard Worker EXPECT_STREQ(blob, result) << "disk_cache_get of existing item (pointer)";
968*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, sizeof(blob)) << "disk_cache_get of existing item (size)";
969*61046927SAndroid Build Coastguard Worker free(result);
970*61046927SAndroid Build Coastguard Worker
971*61046927SAndroid Build Coastguard Worker /* Blob2 entry must not present in any of the caches. */
972*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache_multifile, blob_key2, &size);
973*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, nullptr) << "disk_cache_get with non-existent item (pointer)";
974*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, 0) << "disk_cache_get with non-existent item (size)";
975*61046927SAndroid Build Coastguard Worker
976*61046927SAndroid Build Coastguard Worker /* Put blob2 entry to the cache. */
977*61046927SAndroid Build Coastguard Worker disk_cache_put(cache_multifile, blob_key2, blob2, sizeof(blob2), NULL);
978*61046927SAndroid Build Coastguard Worker disk_cache_wait_for_idle(cache_multifile);
979*61046927SAndroid Build Coastguard Worker
980*61046927SAndroid Build Coastguard Worker /* Blob2 entry must present because it shall be retrieved from the
981*61046927SAndroid Build Coastguard Worker * read-write cache. */
982*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache_multifile, blob_key2, &size);
983*61046927SAndroid Build Coastguard Worker EXPECT_STREQ(blob2, result) << "disk_cache_get of existing item (pointer)";
984*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, sizeof(blob2)) << "disk_cache_get of existing item (size)";
985*61046927SAndroid Build Coastguard Worker free(result);
986*61046927SAndroid Build Coastguard Worker
987*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache_multifile);
988*61046927SAndroid Build Coastguard Worker
989*61046927SAndroid Build Coastguard Worker /* Disable read-only cache. */
990*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_COMBINE_RW_WITH_RO_FOZ", "false", 1);
991*61046927SAndroid Build Coastguard Worker unsetenv("MESA_DISK_CACHE_READ_ONLY_FOZ_DBS");
992*61046927SAndroid Build Coastguard Worker
993*61046927SAndroid Build Coastguard Worker /* Create multi-file cache with disabled retrieval from the
994*61046927SAndroid Build Coastguard Worker * read-only cache. */
995*61046927SAndroid Build Coastguard Worker cache_multifile = disk_cache_create("combined_test", driver_id, 0);
996*61046927SAndroid Build Coastguard Worker
997*61046927SAndroid Build Coastguard Worker /* Blob entry must not present in the cache because we disabled the
998*61046927SAndroid Build Coastguard Worker * read-only cache. */
999*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache_multifile, blob_key, &size);
1000*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, nullptr) << "disk_cache_get with non-existent item (pointer)";
1001*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, 0) << "disk_cache_get with non-existent item (size)";
1002*61046927SAndroid Build Coastguard Worker
1003*61046927SAndroid Build Coastguard Worker /* Blob2 entry must present because it shall be retrieved from the
1004*61046927SAndroid Build Coastguard Worker * read-write cache. */
1005*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache_multifile, blob_key2, &size);
1006*61046927SAndroid Build Coastguard Worker EXPECT_STREQ(blob2, result) << "disk_cache_get of existing item (pointer)";
1007*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, sizeof(blob2)) << "disk_cache_get of existing item (size)";
1008*61046927SAndroid Build Coastguard Worker free(result);
1009*61046927SAndroid Build Coastguard Worker
1010*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache_multifile);
1011*61046927SAndroid Build Coastguard Worker
1012*61046927SAndroid Build Coastguard Worker unsetenv("MESA_DISK_CACHE_MULTI_FILE");
1013*61046927SAndroid Build Coastguard Worker
1014*61046927SAndroid Build Coastguard Worker int err = rmrf_local(CACHE_TEST_TMP);
1015*61046927SAndroid Build Coastguard Worker EXPECT_EQ(err, 0) << "Removing " CACHE_TEST_TMP " again";
1016*61046927SAndroid Build Coastguard Worker #endif
1017*61046927SAndroid Build Coastguard Worker }
1018*61046927SAndroid Build Coastguard Worker
TEST_F(Cache,DISABLED_List)1019*61046927SAndroid Build Coastguard Worker TEST_F(Cache, DISABLED_List)
1020*61046927SAndroid Build Coastguard Worker {
1021*61046927SAndroid Build Coastguard Worker const char *driver_id = "make_check";
1022*61046927SAndroid Build Coastguard Worker char blob[] = "This is a RO blob";
1023*61046927SAndroid Build Coastguard Worker uint8_t blob_key[20];
1024*61046927SAndroid Build Coastguard Worker char foz_rw_idx_file[1024];
1025*61046927SAndroid Build Coastguard Worker char foz_ro_idx_file[1024];
1026*61046927SAndroid Build Coastguard Worker char foz_rw_file[1024];
1027*61046927SAndroid Build Coastguard Worker char foz_ro_file[1024];
1028*61046927SAndroid Build Coastguard Worker char *result;
1029*61046927SAndroid Build Coastguard Worker size_t size;
1030*61046927SAndroid Build Coastguard Worker
1031*61046927SAndroid Build Coastguard Worker #ifndef ENABLE_SHADER_CACHE
1032*61046927SAndroid Build Coastguard Worker GTEST_SKIP() << "ENABLE_SHADER_CACHE not defined.";
1033*61046927SAndroid Build Coastguard Worker #else
1034*61046927SAndroid Build Coastguard Worker #ifndef FOZ_DB_UTIL_DYNAMIC_LIST
1035*61046927SAndroid Build Coastguard Worker GTEST_SKIP() << "FOZ_DB_UTIL_DYNAMIC_LIST not supported";
1036*61046927SAndroid Build Coastguard Worker #else
1037*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_SINGLE_FILE", "true", 1);
1038*61046927SAndroid Build Coastguard Worker
1039*61046927SAndroid Build Coastguard Worker #ifdef SHADER_CACHE_DISABLE_BY_DEFAULT
1040*61046927SAndroid Build Coastguard Worker setenv("MESA_SHADER_CACHE_DISABLE", "false", 1);
1041*61046927SAndroid Build Coastguard Worker #endif /* SHADER_CACHE_DISABLE_BY_DEFAULT */
1042*61046927SAndroid Build Coastguard Worker
1043*61046927SAndroid Build Coastguard Worker test_disk_cache_create(mem_ctx, CACHE_DIR_NAME_SF, driver_id);
1044*61046927SAndroid Build Coastguard Worker
1045*61046927SAndroid Build Coastguard Worker /* Create ro files for testing */
1046*61046927SAndroid Build Coastguard Worker /* Create Fossilize writable cache. */
1047*61046927SAndroid Build Coastguard Worker struct disk_cache *cache_sf_wr =
1048*61046927SAndroid Build Coastguard Worker disk_cache_create("list_test", driver_id, 0);
1049*61046927SAndroid Build Coastguard Worker
1050*61046927SAndroid Build Coastguard Worker disk_cache_compute_key(cache_sf_wr, blob, sizeof(blob), blob_key);
1051*61046927SAndroid Build Coastguard Worker
1052*61046927SAndroid Build Coastguard Worker /* Ensure that disk_cache_get returns nothing before anything is added. */
1053*61046927SAndroid Build Coastguard Worker result = (char *)disk_cache_get(cache_sf_wr, blob_key, &size);
1054*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, nullptr)
1055*61046927SAndroid Build Coastguard Worker << "disk_cache_get with non-existent item (pointer)";
1056*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, 0) << "disk_cache_get with non-existent item (size)";
1057*61046927SAndroid Build Coastguard Worker
1058*61046927SAndroid Build Coastguard Worker /* Put blob entry to the cache. */
1059*61046927SAndroid Build Coastguard Worker disk_cache_put(cache_sf_wr, blob_key, blob, sizeof(blob), NULL);
1060*61046927SAndroid Build Coastguard Worker disk_cache_wait_for_idle(cache_sf_wr);
1061*61046927SAndroid Build Coastguard Worker
1062*61046927SAndroid Build Coastguard Worker result = (char *)disk_cache_get(cache_sf_wr, blob_key, &size);
1063*61046927SAndroid Build Coastguard Worker EXPECT_STREQ(blob, result) << "disk_cache_get of existing item (pointer)";
1064*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, sizeof(blob)) << "disk_cache_get of existing item (size)";
1065*61046927SAndroid Build Coastguard Worker free(result);
1066*61046927SAndroid Build Coastguard Worker
1067*61046927SAndroid Build Coastguard Worker /* Rename file foz_cache.foz -> ro_cache.foz */
1068*61046927SAndroid Build Coastguard Worker sprintf(foz_rw_file, "%s/foz_cache.foz", cache_sf_wr->path);
1069*61046927SAndroid Build Coastguard Worker sprintf(foz_ro_file, "%s/ro_cache.foz", cache_sf_wr->path);
1070*61046927SAndroid Build Coastguard Worker EXPECT_EQ(rename(foz_rw_file, foz_ro_file), 0)
1071*61046927SAndroid Build Coastguard Worker << "foz_cache.foz renaming failed";
1072*61046927SAndroid Build Coastguard Worker
1073*61046927SAndroid Build Coastguard Worker /* Rename file foz_cache_idx.foz -> ro_cache_idx.foz */
1074*61046927SAndroid Build Coastguard Worker sprintf(foz_rw_idx_file, "%s/foz_cache_idx.foz", cache_sf_wr->path);
1075*61046927SAndroid Build Coastguard Worker sprintf(foz_ro_idx_file, "%s/ro_cache_idx.foz", cache_sf_wr->path);
1076*61046927SAndroid Build Coastguard Worker EXPECT_EQ(rename(foz_rw_idx_file, foz_ro_idx_file), 0)
1077*61046927SAndroid Build Coastguard Worker << "foz_cache_idx.foz renaming failed";
1078*61046927SAndroid Build Coastguard Worker
1079*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache_sf_wr);
1080*61046927SAndroid Build Coastguard Worker
1081*61046927SAndroid Build Coastguard Worker const char *list_filename = CACHE_TEST_TMP "/foz_dbs_list.txt";
1082*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_READ_ONLY_FOZ_DBS_DYNAMIC_LIST", list_filename, 1);
1083*61046927SAndroid Build Coastguard Worker
1084*61046927SAndroid Build Coastguard Worker /* Create new empty file */
1085*61046927SAndroid Build Coastguard Worker FILE *list_file = fopen(list_filename, "w");
1086*61046927SAndroid Build Coastguard Worker fputs("ro_cache\n", list_file);
1087*61046927SAndroid Build Coastguard Worker fclose(list_file);
1088*61046927SAndroid Build Coastguard Worker
1089*61046927SAndroid Build Coastguard Worker /* Create Fossilize writable cache. */
1090*61046927SAndroid Build Coastguard Worker struct disk_cache *cache_sf = disk_cache_create("list_test", driver_id, 0);
1091*61046927SAndroid Build Coastguard Worker
1092*61046927SAndroid Build Coastguard Worker /* Blob entry must present because it shall be retrieved from the
1093*61046927SAndroid Build Coastguard Worker * ro_cache.foz loaded from list at creation time */
1094*61046927SAndroid Build Coastguard Worker result = (char *)disk_cache_get(cache_sf, blob_key, &size);
1095*61046927SAndroid Build Coastguard Worker EXPECT_STREQ(blob, result) << "disk_cache_get of existing item (pointer)";
1096*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, sizeof(blob)) << "disk_cache_get of existing item (size)";
1097*61046927SAndroid Build Coastguard Worker free(result);
1098*61046927SAndroid Build Coastguard Worker
1099*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache_sf);
1100*61046927SAndroid Build Coastguard Worker remove(list_filename);
1101*61046927SAndroid Build Coastguard Worker
1102*61046927SAndroid Build Coastguard Worker /* Test loading from a list populated at runtime */
1103*61046927SAndroid Build Coastguard Worker /* Create new empty file */
1104*61046927SAndroid Build Coastguard Worker list_file = fopen(list_filename, "w");
1105*61046927SAndroid Build Coastguard Worker fclose(list_file);
1106*61046927SAndroid Build Coastguard Worker
1107*61046927SAndroid Build Coastguard Worker /* Create Fossilize writable cache. */
1108*61046927SAndroid Build Coastguard Worker cache_sf = disk_cache_create("list_test", driver_id, 0);
1109*61046927SAndroid Build Coastguard Worker
1110*61046927SAndroid Build Coastguard Worker /* Ensure that disk_cache returns nothing before list file is populated */
1111*61046927SAndroid Build Coastguard Worker result = (char *)disk_cache_get(cache_sf, blob_key, &size);
1112*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, nullptr)
1113*61046927SAndroid Build Coastguard Worker << "disk_cache_get with non-existent item (pointer)";
1114*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, 0) << "disk_cache_get with non-existent item (size)";
1115*61046927SAndroid Build Coastguard Worker
1116*61046927SAndroid Build Coastguard Worker /* Add ro_cache to list file for loading */
1117*61046927SAndroid Build Coastguard Worker list_file = fopen(list_filename, "a");
1118*61046927SAndroid Build Coastguard Worker fputs("ro_cache\n", list_file);
1119*61046927SAndroid Build Coastguard Worker fclose(list_file);
1120*61046927SAndroid Build Coastguard Worker
1121*61046927SAndroid Build Coastguard Worker /* Poll result to give time for updater to load ro cache */
1122*61046927SAndroid Build Coastguard Worker result = (char *)poll_disk_cache_get(cache_sf, blob_key, &size);
1123*61046927SAndroid Build Coastguard Worker
1124*61046927SAndroid Build Coastguard Worker /* Blob entry must present because it shall be retrieved from the
1125*61046927SAndroid Build Coastguard Worker * ro_cache.foz loaded from list at runtime */
1126*61046927SAndroid Build Coastguard Worker EXPECT_STREQ(blob, result) << "disk_cache_get of existing item (pointer)";
1127*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, sizeof(blob)) << "disk_cache_get of existing item (size)";
1128*61046927SAndroid Build Coastguard Worker free(result);
1129*61046927SAndroid Build Coastguard Worker
1130*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache_sf);
1131*61046927SAndroid Build Coastguard Worker remove(list_filename);
1132*61046927SAndroid Build Coastguard Worker
1133*61046927SAndroid Build Coastguard Worker /* Test loading from a list with some invalid files */
1134*61046927SAndroid Build Coastguard Worker /* Create new empty file */
1135*61046927SAndroid Build Coastguard Worker list_file = fopen(list_filename, "w");
1136*61046927SAndroid Build Coastguard Worker fclose(list_file);
1137*61046927SAndroid Build Coastguard Worker
1138*61046927SAndroid Build Coastguard Worker /* Create Fossilize writable cache. */
1139*61046927SAndroid Build Coastguard Worker cache_sf = disk_cache_create("list_test", driver_id, 0);
1140*61046927SAndroid Build Coastguard Worker
1141*61046927SAndroid Build Coastguard Worker /* Ensure that disk_cache returns nothing before list file is populated */
1142*61046927SAndroid Build Coastguard Worker result = (char *)disk_cache_get(cache_sf, blob_key, &size);
1143*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, nullptr)
1144*61046927SAndroid Build Coastguard Worker << "disk_cache_get with non-existent item (pointer)";
1145*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, 0) << "disk_cache_get with non-existent item (size)";
1146*61046927SAndroid Build Coastguard Worker
1147*61046927SAndroid Build Coastguard Worker /* Add non-existant list files for loading */
1148*61046927SAndroid Build Coastguard Worker list_file = fopen(list_filename, "a");
1149*61046927SAndroid Build Coastguard Worker fputs("no_cache\n", list_file);
1150*61046927SAndroid Build Coastguard Worker fputs("no_cache2\n", list_file);
1151*61046927SAndroid Build Coastguard Worker fputs("no_cache/no_cache3\n", list_file);
1152*61046927SAndroid Build Coastguard Worker /* Add ro_cache to list file for loading */
1153*61046927SAndroid Build Coastguard Worker fputs("ro_cache\n", list_file);
1154*61046927SAndroid Build Coastguard Worker fclose(list_file);
1155*61046927SAndroid Build Coastguard Worker
1156*61046927SAndroid Build Coastguard Worker /* Poll result to give time for updater to load ro cache */
1157*61046927SAndroid Build Coastguard Worker result = (char *)poll_disk_cache_get(cache_sf, blob_key, &size);
1158*61046927SAndroid Build Coastguard Worker
1159*61046927SAndroid Build Coastguard Worker /* Blob entry must present because it shall be retrieved from the
1160*61046927SAndroid Build Coastguard Worker * ro_cache.foz loaded from list at runtime despite invalid files
1161*61046927SAndroid Build Coastguard Worker * in the list */
1162*61046927SAndroid Build Coastguard Worker EXPECT_STREQ(blob, result) << "disk_cache_get of existing item (pointer)";
1163*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, sizeof(blob)) << "disk_cache_get of existing item (size)";
1164*61046927SAndroid Build Coastguard Worker free(result);
1165*61046927SAndroid Build Coastguard Worker
1166*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache_sf);
1167*61046927SAndroid Build Coastguard Worker remove(list_filename);
1168*61046927SAndroid Build Coastguard Worker
1169*61046927SAndroid Build Coastguard Worker int err = rmrf_local(CACHE_TEST_TMP);
1170*61046927SAndroid Build Coastguard Worker EXPECT_EQ(err, 0) << "Removing " CACHE_TEST_TMP " again";
1171*61046927SAndroid Build Coastguard Worker
1172*61046927SAndroid Build Coastguard Worker unsetenv("MESA_DISK_CACHE_SINGLE_FILE");
1173*61046927SAndroid Build Coastguard Worker unsetenv("MESA_DISK_CACHE_READ_ONLY_FOZ_DBS_DYNAMIC_LIST");
1174*61046927SAndroid Build Coastguard Worker #endif /* FOZ_DB_UTIL_DYNAMIC_LIST */
1175*61046927SAndroid Build Coastguard Worker #endif /* ENABLE_SHADER_CACHE */
1176*61046927SAndroid Build Coastguard Worker }
1177*61046927SAndroid Build Coastguard Worker
1178*61046927SAndroid Build Coastguard Worker static void
test_multipart_eviction(const char * driver_id)1179*61046927SAndroid Build Coastguard Worker test_multipart_eviction(const char *driver_id)
1180*61046927SAndroid Build Coastguard Worker {
1181*61046927SAndroid Build Coastguard Worker const unsigned int entry_size = 512;
1182*61046927SAndroid Build Coastguard Worker uint8_t blobs[7][entry_size];
1183*61046927SAndroid Build Coastguard Worker cache_key keys[7];
1184*61046927SAndroid Build Coastguard Worker unsigned int i;
1185*61046927SAndroid Build Coastguard Worker char *result;
1186*61046927SAndroid Build Coastguard Worker size_t size;
1187*61046927SAndroid Build Coastguard Worker
1188*61046927SAndroid Build Coastguard Worker setenv("MESA_SHADER_CACHE_MAX_SIZE", "3K", 1);
1189*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_DATABASE_EVICTION_SCORE_2X_PERIOD", "1", 1);
1190*61046927SAndroid Build Coastguard Worker
1191*61046927SAndroid Build Coastguard Worker struct disk_cache *cache = disk_cache_create("test", driver_id, 0);
1192*61046927SAndroid Build Coastguard Worker
1193*61046927SAndroid Build Coastguard Worker unsigned int entry_file_size = entry_size;
1194*61046927SAndroid Build Coastguard Worker entry_file_size -= sizeof(struct cache_entry_file_data);
1195*61046927SAndroid Build Coastguard Worker entry_file_size -= mesa_cache_db_file_entry_size();
1196*61046927SAndroid Build Coastguard Worker entry_file_size -= cache->driver_keys_blob_size;
1197*61046927SAndroid Build Coastguard Worker entry_file_size -= 4 + 8; /* cache_item_metadata size + room for alignment */
1198*61046927SAndroid Build Coastguard Worker
1199*61046927SAndroid Build Coastguard Worker /*
1200*61046927SAndroid Build Coastguard Worker * 1. Allocate 3KB cache in 3 parts, each part is 1KB
1201*61046927SAndroid Build Coastguard Worker * 2. Fill up cache with six 512K entries
1202*61046927SAndroid Build Coastguard Worker * 3. Touch entries of the first part, which will bump last_access_time
1203*61046927SAndroid Build Coastguard Worker * of the first two cache entries
1204*61046927SAndroid Build Coastguard Worker * 4. Insert seventh 512K entry that will cause eviction of the second part
1205*61046927SAndroid Build Coastguard Worker * 5. Check that second entry of the second part gone due to eviction and
1206*61046927SAndroid Build Coastguard Worker * others present
1207*61046927SAndroid Build Coastguard Worker */
1208*61046927SAndroid Build Coastguard Worker
1209*61046927SAndroid Build Coastguard Worker /* Fill up cache with six 512K entries. */
1210*61046927SAndroid Build Coastguard Worker for (i = 0; i < 6; i++) {
1211*61046927SAndroid Build Coastguard Worker memset(blobs[i], i, entry_file_size);
1212*61046927SAndroid Build Coastguard Worker
1213*61046927SAndroid Build Coastguard Worker disk_cache_compute_key(cache, blobs[i], entry_file_size, keys[i]);
1214*61046927SAndroid Build Coastguard Worker disk_cache_put(cache, keys[i], blobs[i], entry_file_size, NULL);
1215*61046927SAndroid Build Coastguard Worker disk_cache_wait_for_idle(cache);
1216*61046927SAndroid Build Coastguard Worker
1217*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache, keys[i], &size);
1218*61046927SAndroid Build Coastguard Worker EXPECT_NE(result, nullptr) << "disk_cache_get with existent item (pointer)";
1219*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, entry_file_size) << "disk_cache_get with existent item (size)";
1220*61046927SAndroid Build Coastguard Worker free(result);
1221*61046927SAndroid Build Coastguard Worker
1222*61046927SAndroid Build Coastguard Worker /* Ensure that cache entries will have distinct last_access_time
1223*61046927SAndroid Build Coastguard Worker * during testing.
1224*61046927SAndroid Build Coastguard Worker */
1225*61046927SAndroid Build Coastguard Worker if (i % 2 == 0)
1226*61046927SAndroid Build Coastguard Worker usleep(100000);
1227*61046927SAndroid Build Coastguard Worker }
1228*61046927SAndroid Build Coastguard Worker
1229*61046927SAndroid Build Coastguard Worker /* Touch entries of the first part. Second part becomes outdated */
1230*61046927SAndroid Build Coastguard Worker for (i = 0; i < 2; i++) {
1231*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache, keys[i], &size);
1232*61046927SAndroid Build Coastguard Worker EXPECT_NE(result, nullptr) << "disk_cache_get with existent item (pointer)";
1233*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, entry_file_size) << "disk_cache_get with existent item (size)";
1234*61046927SAndroid Build Coastguard Worker free(result);
1235*61046927SAndroid Build Coastguard Worker }
1236*61046927SAndroid Build Coastguard Worker
1237*61046927SAndroid Build Coastguard Worker /* Insert seventh entry. */
1238*61046927SAndroid Build Coastguard Worker memset(blobs[6], 6, entry_file_size);
1239*61046927SAndroid Build Coastguard Worker disk_cache_compute_key(cache, blobs[6], entry_file_size, keys[6]);
1240*61046927SAndroid Build Coastguard Worker disk_cache_put(cache, keys[6], blobs[6], entry_file_size, NULL);
1241*61046927SAndroid Build Coastguard Worker disk_cache_wait_for_idle(cache);
1242*61046927SAndroid Build Coastguard Worker
1243*61046927SAndroid Build Coastguard Worker /* Check whether third entry of the second part gone and others present. */
1244*61046927SAndroid Build Coastguard Worker for (i = 0; i < ARRAY_SIZE(blobs); i++) {
1245*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache, keys[i], &size);
1246*61046927SAndroid Build Coastguard Worker if (i == 2) {
1247*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, nullptr) << "disk_cache_get with non-existent item (pointer)";
1248*61046927SAndroid Build Coastguard Worker } else {
1249*61046927SAndroid Build Coastguard Worker EXPECT_NE(result, nullptr) << "disk_cache_get with existent item (pointer)";
1250*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, entry_file_size) << "disk_cache_get with existent item (size)";
1251*61046927SAndroid Build Coastguard Worker }
1252*61046927SAndroid Build Coastguard Worker free(result);
1253*61046927SAndroid Build Coastguard Worker }
1254*61046927SAndroid Build Coastguard Worker
1255*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache);
1256*61046927SAndroid Build Coastguard Worker }
1257*61046927SAndroid Build Coastguard Worker
TEST_F(Cache,DatabaseMultipartEviction)1258*61046927SAndroid Build Coastguard Worker TEST_F(Cache, DatabaseMultipartEviction)
1259*61046927SAndroid Build Coastguard Worker {
1260*61046927SAndroid Build Coastguard Worker const char *driver_id = "make_check_uncompressed";
1261*61046927SAndroid Build Coastguard Worker
1262*61046927SAndroid Build Coastguard Worker #ifndef ENABLE_SHADER_CACHE
1263*61046927SAndroid Build Coastguard Worker GTEST_SKIP() << "ENABLE_SHADER_CACHE not defined.";
1264*61046927SAndroid Build Coastguard Worker #else
1265*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_DATABASE_NUM_PARTS", "3", 1);
1266*61046927SAndroid Build Coastguard Worker
1267*61046927SAndroid Build Coastguard Worker test_disk_cache_create(mem_ctx, CACHE_DIR_NAME_DB, driver_id);
1268*61046927SAndroid Build Coastguard Worker
1269*61046927SAndroid Build Coastguard Worker test_multipart_eviction(driver_id);
1270*61046927SAndroid Build Coastguard Worker
1271*61046927SAndroid Build Coastguard Worker unsetenv("MESA_DISK_CACHE_DATABASE_NUM_PARTS");
1272*61046927SAndroid Build Coastguard Worker
1273*61046927SAndroid Build Coastguard Worker int err = rmrf_local(CACHE_TEST_TMP);
1274*61046927SAndroid Build Coastguard Worker EXPECT_EQ(err, 0) << "Removing " CACHE_TEST_TMP " again";
1275*61046927SAndroid Build Coastguard Worker #endif
1276*61046927SAndroid Build Coastguard Worker }
1277*61046927SAndroid Build Coastguard Worker
1278*61046927SAndroid Build Coastguard Worker static void
test_put_and_get_disabled(const char * driver_id)1279*61046927SAndroid Build Coastguard Worker test_put_and_get_disabled(const char *driver_id)
1280*61046927SAndroid Build Coastguard Worker {
1281*61046927SAndroid Build Coastguard Worker struct disk_cache *cache;
1282*61046927SAndroid Build Coastguard Worker char blob[] = "This is a blob of thirty-seven bytes";
1283*61046927SAndroid Build Coastguard Worker uint8_t blob_key[20];
1284*61046927SAndroid Build Coastguard Worker char *result;
1285*61046927SAndroid Build Coastguard Worker size_t size;
1286*61046927SAndroid Build Coastguard Worker
1287*61046927SAndroid Build Coastguard Worker cache = disk_cache_create("test", driver_id, 0);
1288*61046927SAndroid Build Coastguard Worker
1289*61046927SAndroid Build Coastguard Worker disk_cache_compute_key(cache, blob, sizeof(blob), blob_key);
1290*61046927SAndroid Build Coastguard Worker
1291*61046927SAndroid Build Coastguard Worker /* Ensure that disk_cache_get returns nothing before anything is added. */
1292*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache, blob_key, &size);
1293*61046927SAndroid Build Coastguard Worker EXPECT_EQ(result, nullptr) << "disk_cache_get with non-existent item (pointer)";
1294*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, 0) << "disk_cache_get with non-existent item (size)";
1295*61046927SAndroid Build Coastguard Worker
1296*61046927SAndroid Build Coastguard Worker /* Simple test of put and get. */
1297*61046927SAndroid Build Coastguard Worker disk_cache_put(cache, blob_key, blob, sizeof(blob), NULL);
1298*61046927SAndroid Build Coastguard Worker
1299*61046927SAndroid Build Coastguard Worker /* disk_cache_put() hands things off to a thread so wait for it. */
1300*61046927SAndroid Build Coastguard Worker disk_cache_wait_for_idle(cache);
1301*61046927SAndroid Build Coastguard Worker
1302*61046927SAndroid Build Coastguard Worker result = (char *) disk_cache_get(cache, blob_key, &size);
1303*61046927SAndroid Build Coastguard Worker EXPECT_STREQ(result, nullptr) << "disk_cache_get of existing item (pointer)";
1304*61046927SAndroid Build Coastguard Worker EXPECT_EQ(size, 0) << "disk_cache_get of existing item (size)";
1305*61046927SAndroid Build Coastguard Worker
1306*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache);
1307*61046927SAndroid Build Coastguard Worker }
1308*61046927SAndroid Build Coastguard Worker
TEST_F(Cache,Disabled)1309*61046927SAndroid Build Coastguard Worker TEST_F(Cache, Disabled)
1310*61046927SAndroid Build Coastguard Worker {
1311*61046927SAndroid Build Coastguard Worker const char *driver_id = "make_check";
1312*61046927SAndroid Build Coastguard Worker
1313*61046927SAndroid Build Coastguard Worker #ifndef ENABLE_SHADER_CACHE
1314*61046927SAndroid Build Coastguard Worker GTEST_SKIP() << "ENABLE_SHADER_CACHE not defined.";
1315*61046927SAndroid Build Coastguard Worker #else
1316*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_SINGLE_FILE", "true", 1);
1317*61046927SAndroid Build Coastguard Worker
1318*61046927SAndroid Build Coastguard Worker #ifdef SHADER_CACHE_DISABLE_BY_DEFAULT
1319*61046927SAndroid Build Coastguard Worker setenv("MESA_SHADER_CACHE_DISABLE", "false", 1);
1320*61046927SAndroid Build Coastguard Worker #endif /* SHADER_CACHE_DISABLE_BY_DEFAULT */
1321*61046927SAndroid Build Coastguard Worker
1322*61046927SAndroid Build Coastguard Worker test_disk_cache_create(mem_ctx, CACHE_DIR_NAME_SF, driver_id);
1323*61046927SAndroid Build Coastguard Worker
1324*61046927SAndroid Build Coastguard Worker test_put_and_get(false, driver_id);
1325*61046927SAndroid Build Coastguard Worker
1326*61046927SAndroid Build Coastguard Worker setenv("MESA_SHADER_CACHE_DISABLE", "true", 1);
1327*61046927SAndroid Build Coastguard Worker
1328*61046927SAndroid Build Coastguard Worker test_put_and_get_disabled(driver_id);
1329*61046927SAndroid Build Coastguard Worker
1330*61046927SAndroid Build Coastguard Worker setenv("MESA_SHADER_CACHE_DISABLE", "false", 1);
1331*61046927SAndroid Build Coastguard Worker setenv("MESA_DISK_CACHE_SINGLE_FILE", "false", 1);
1332*61046927SAndroid Build Coastguard Worker
1333*61046927SAndroid Build Coastguard Worker int err = rmrf_local(CACHE_TEST_TMP);
1334*61046927SAndroid Build Coastguard Worker EXPECT_EQ(err, 0) << "Removing " CACHE_TEST_TMP " again";
1335*61046927SAndroid Build Coastguard Worker #endif
1336*61046927SAndroid Build Coastguard Worker }
1337*61046927SAndroid Build Coastguard Worker
TEST_F(Cache,DoNotDeleteNewCache)1338*61046927SAndroid Build Coastguard Worker TEST_F(Cache, DoNotDeleteNewCache)
1339*61046927SAndroid Build Coastguard Worker {
1340*61046927SAndroid Build Coastguard Worker #ifndef ENABLE_SHADER_CACHE
1341*61046927SAndroid Build Coastguard Worker GTEST_SKIP() << "ENABLE_SHADER_CACHE not defined.";
1342*61046927SAndroid Build Coastguard Worker #else
1343*61046927SAndroid Build Coastguard Worker
1344*61046927SAndroid Build Coastguard Worker #ifdef SHADER_CACHE_DISABLE_BY_DEFAULT
1345*61046927SAndroid Build Coastguard Worker setenv("MESA_SHADER_CACHE_DISABLE", "false", 1);
1346*61046927SAndroid Build Coastguard Worker #endif /* SHADER_CACHE_DISABLE_BY_DEFAULT */
1347*61046927SAndroid Build Coastguard Worker
1348*61046927SAndroid Build Coastguard Worker char dir_template[] = "/tmp/tmpdir.XXXXXX";
1349*61046927SAndroid Build Coastguard Worker char *dir_name = mkdtemp(dir_template);
1350*61046927SAndroid Build Coastguard Worker ASSERT_NE(dir_name, nullptr);
1351*61046927SAndroid Build Coastguard Worker
1352*61046927SAndroid Build Coastguard Worker char cache_dir_name[256];
1353*61046927SAndroid Build Coastguard Worker sprintf(cache_dir_name, "%s/mesa_shader_cache", dir_name);
1354*61046927SAndroid Build Coastguard Worker mkdir(cache_dir_name, 0755);
1355*61046927SAndroid Build Coastguard Worker
1356*61046927SAndroid Build Coastguard Worker setenv("MESA_SHADER_CACHE_DIR", dir_name, 1);
1357*61046927SAndroid Build Coastguard Worker
1358*61046927SAndroid Build Coastguard Worker disk_cache_delete_old_cache();
1359*61046927SAndroid Build Coastguard Worker
1360*61046927SAndroid Build Coastguard Worker struct stat st;
1361*61046927SAndroid Build Coastguard Worker EXPECT_EQ(stat(cache_dir_name, &st), 0);
1362*61046927SAndroid Build Coastguard Worker
1363*61046927SAndroid Build Coastguard Worker unsetenv("MESA_SHADER_CACHE_DIR");
1364*61046927SAndroid Build Coastguard Worker rmdir(cache_dir_name);
1365*61046927SAndroid Build Coastguard Worker rmdir(dir_name);
1366*61046927SAndroid Build Coastguard Worker #endif
1367*61046927SAndroid Build Coastguard Worker }
1368*61046927SAndroid Build Coastguard Worker
TEST_F(Cache,DoNotDeleteCacheWithNewMarker)1369*61046927SAndroid Build Coastguard Worker TEST_F(Cache, DoNotDeleteCacheWithNewMarker)
1370*61046927SAndroid Build Coastguard Worker {
1371*61046927SAndroid Build Coastguard Worker #ifndef ENABLE_SHADER_CACHE
1372*61046927SAndroid Build Coastguard Worker GTEST_SKIP() << "ENABLE_SHADER_CACHE not defined.";
1373*61046927SAndroid Build Coastguard Worker #else
1374*61046927SAndroid Build Coastguard Worker
1375*61046927SAndroid Build Coastguard Worker #ifdef SHADER_CACHE_DISABLE_BY_DEFAULT
1376*61046927SAndroid Build Coastguard Worker setenv("MESA_SHADER_CACHE_DISABLE", "false", 1);
1377*61046927SAndroid Build Coastguard Worker #endif /* SHADER_CACHE_DISABLE_BY_DEFAULT */
1378*61046927SAndroid Build Coastguard Worker
1379*61046927SAndroid Build Coastguard Worker char dir_template[] = "/tmp/tmpdir.XXXXXX";
1380*61046927SAndroid Build Coastguard Worker char *dir_name = mkdtemp(dir_template);
1381*61046927SAndroid Build Coastguard Worker ASSERT_NE(dir_name, nullptr);
1382*61046927SAndroid Build Coastguard Worker
1383*61046927SAndroid Build Coastguard Worker char cache_dir_name[240];
1384*61046927SAndroid Build Coastguard Worker sprintf(cache_dir_name, "%s/mesa_shader_cache", dir_name);
1385*61046927SAndroid Build Coastguard Worker mkdir(cache_dir_name, 0755);
1386*61046927SAndroid Build Coastguard Worker
1387*61046927SAndroid Build Coastguard Worker char file_name[256];
1388*61046927SAndroid Build Coastguard Worker sprintf(file_name, "%s/marker", cache_dir_name);
1389*61046927SAndroid Build Coastguard Worker
1390*61046927SAndroid Build Coastguard Worker FILE *file = fopen(file_name, "w");
1391*61046927SAndroid Build Coastguard Worker fclose(file);
1392*61046927SAndroid Build Coastguard Worker
1393*61046927SAndroid Build Coastguard Worker setenv("MESA_SHADER_CACHE_DIR", dir_name, 1);
1394*61046927SAndroid Build Coastguard Worker
1395*61046927SAndroid Build Coastguard Worker disk_cache_delete_old_cache();
1396*61046927SAndroid Build Coastguard Worker
1397*61046927SAndroid Build Coastguard Worker struct stat st;
1398*61046927SAndroid Build Coastguard Worker EXPECT_EQ(stat(cache_dir_name, &st), 0);
1399*61046927SAndroid Build Coastguard Worker
1400*61046927SAndroid Build Coastguard Worker unsetenv("MESA_SHADER_CACHE_DIR");
1401*61046927SAndroid Build Coastguard Worker unlink(file_name);
1402*61046927SAndroid Build Coastguard Worker rmdir(cache_dir_name);
1403*61046927SAndroid Build Coastguard Worker rmdir(dir_name);
1404*61046927SAndroid Build Coastguard Worker #endif
1405*61046927SAndroid Build Coastguard Worker }
1406*61046927SAndroid Build Coastguard Worker
TEST_F(Cache,DeleteOldCache)1407*61046927SAndroid Build Coastguard Worker TEST_F(Cache, DeleteOldCache)
1408*61046927SAndroid Build Coastguard Worker {
1409*61046927SAndroid Build Coastguard Worker #ifndef ENABLE_SHADER_CACHE
1410*61046927SAndroid Build Coastguard Worker GTEST_SKIP() << "ENABLE_SHADER_CACHE not defined.";
1411*61046927SAndroid Build Coastguard Worker #else
1412*61046927SAndroid Build Coastguard Worker
1413*61046927SAndroid Build Coastguard Worker #ifdef SHADER_CACHE_DISABLE_BY_DEFAULT
1414*61046927SAndroid Build Coastguard Worker setenv("MESA_SHADER_CACHE_DISABLE", "false", 1);
1415*61046927SAndroid Build Coastguard Worker #endif /* SHADER_CACHE_DISABLE_BY_DEFAULT */
1416*61046927SAndroid Build Coastguard Worker
1417*61046927SAndroid Build Coastguard Worker char dir_template[] = "/tmp/tmpdir.XXXXXX";
1418*61046927SAndroid Build Coastguard Worker char *dir_name = mkdtemp(dir_template);
1419*61046927SAndroid Build Coastguard Worker ASSERT_NE(dir_name, nullptr) << "Creating temporary directory failed";
1420*61046927SAndroid Build Coastguard Worker
1421*61046927SAndroid Build Coastguard Worker char cache_dir_name[240];
1422*61046927SAndroid Build Coastguard Worker sprintf(cache_dir_name, "%s/mesa_shader_cache", dir_name);
1423*61046927SAndroid Build Coastguard Worker mkdir(cache_dir_name, 0755);
1424*61046927SAndroid Build Coastguard Worker
1425*61046927SAndroid Build Coastguard Worker char file_name[256];
1426*61046927SAndroid Build Coastguard Worker sprintf(file_name, "%s/marker", cache_dir_name);
1427*61046927SAndroid Build Coastguard Worker
1428*61046927SAndroid Build Coastguard Worker FILE *file = fopen(file_name, "w");
1429*61046927SAndroid Build Coastguard Worker fclose(file);
1430*61046927SAndroid Build Coastguard Worker
1431*61046927SAndroid Build Coastguard Worker struct utimbuf utime_buf = { };
1432*61046927SAndroid Build Coastguard Worker EXPECT_EQ(utime(file_name, &utime_buf), 0);
1433*61046927SAndroid Build Coastguard Worker
1434*61046927SAndroid Build Coastguard Worker
1435*61046927SAndroid Build Coastguard Worker setenv("MESA_SHADER_CACHE_DIR", dir_name, 1);
1436*61046927SAndroid Build Coastguard Worker
1437*61046927SAndroid Build Coastguard Worker disk_cache_delete_old_cache();
1438*61046927SAndroid Build Coastguard Worker
1439*61046927SAndroid Build Coastguard Worker struct stat st;
1440*61046927SAndroid Build Coastguard Worker EXPECT_NE(stat(cache_dir_name, &st), 0);
1441*61046927SAndroid Build Coastguard Worker EXPECT_EQ(errno, ENOENT);
1442*61046927SAndroid Build Coastguard Worker
1443*61046927SAndroid Build Coastguard Worker unsetenv("MESA_SHADER_CACHE_DIR");
1444*61046927SAndroid Build Coastguard Worker unlink(file_name);
1445*61046927SAndroid Build Coastguard Worker rmdir(cache_dir_name);
1446*61046927SAndroid Build Coastguard Worker rmdir(dir_name);
1447*61046927SAndroid Build Coastguard Worker #endif
1448*61046927SAndroid Build Coastguard Worker }
1449