1bf215546Sopenharmony_ci/**************************************************************************
2bf215546Sopenharmony_ci *
3bf215546Sopenharmony_ci * Copyright 2010 VMware, Inc.
4bf215546Sopenharmony_ci * All Rights Reserved.
5bf215546Sopenharmony_ci *
6bf215546Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
7bf215546Sopenharmony_ci * copy of this software and associated documentation files (the
8bf215546Sopenharmony_ci * "Software"), to deal in the Software without restriction, including
9bf215546Sopenharmony_ci * without limitation the rights to use, copy, modify, merge, publish,
10bf215546Sopenharmony_ci * distribute, sub license, and/or sell copies of the Software, and to
11bf215546Sopenharmony_ci * permit persons to whom the Software is furnished to do so, subject to
12bf215546Sopenharmony_ci * the following conditions:
13bf215546Sopenharmony_ci *
14bf215546Sopenharmony_ci * The above copyright notice and this permission notice (including the
15bf215546Sopenharmony_ci * next paragraph) shall be included in all copies or substantial portions
16bf215546Sopenharmony_ci * of the Software.
17bf215546Sopenharmony_ci *
18bf215546Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19bf215546Sopenharmony_ci * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20bf215546Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21bf215546Sopenharmony_ci * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22bf215546Sopenharmony_ci * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23bf215546Sopenharmony_ci * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24bf215546Sopenharmony_ci * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25bf215546Sopenharmony_ci *
26bf215546Sopenharmony_ci **************************************************************************/
27bf215546Sopenharmony_ci
28bf215546Sopenharmony_ci
29bf215546Sopenharmony_ci/*
30bf215546Sopenharmony_ci * Test case for u_cache.
31bf215546Sopenharmony_ci */
32bf215546Sopenharmony_ci
33bf215546Sopenharmony_ci
34bf215546Sopenharmony_ci#include <assert.h>
35bf215546Sopenharmony_ci#include <stdio.h>
36bf215546Sopenharmony_ci
37bf215546Sopenharmony_ci#include "util/u_cache.h"
38bf215546Sopenharmony_ci#include "util/crc32.h"
39bf215546Sopenharmony_ci
40bf215546Sopenharmony_ci
41bf215546Sopenharmony_citypedef uint32_t cache_test_key;
42bf215546Sopenharmony_citypedef uint32_t cache_test_value;
43bf215546Sopenharmony_ci
44bf215546Sopenharmony_ci
45bf215546Sopenharmony_cistatic uint32_t
46bf215546Sopenharmony_cicache_test_hash(const void *key)
47bf215546Sopenharmony_ci{
48bf215546Sopenharmony_ci   return util_hash_crc32(key, sizeof(cache_test_key));
49bf215546Sopenharmony_ci}
50bf215546Sopenharmony_ci
51bf215546Sopenharmony_ci
52bf215546Sopenharmony_cistatic void
53bf215546Sopenharmony_cicache_test_destroy(void *key, void *value)
54bf215546Sopenharmony_ci{
55bf215546Sopenharmony_ci   free(key);
56bf215546Sopenharmony_ci   free(value);
57bf215546Sopenharmony_ci}
58bf215546Sopenharmony_ci
59bf215546Sopenharmony_ci
60bf215546Sopenharmony_cistatic int
61bf215546Sopenharmony_cicache_test_compare(const void *key1, const void *key2) {
62bf215546Sopenharmony_ci   return !(key1 == key2);
63bf215546Sopenharmony_ci}
64bf215546Sopenharmony_ci
65bf215546Sopenharmony_ci
66bf215546Sopenharmony_ciint main() {
67bf215546Sopenharmony_ci   unsigned cache_size;
68bf215546Sopenharmony_ci   unsigned cache_count;
69bf215546Sopenharmony_ci
70bf215546Sopenharmony_ci   for (cache_size = 2; cache_size < (1 << 15); cache_size *= 2) {
71bf215546Sopenharmony_ci      for (cache_count = (cache_size << 5); cache_count < (cache_size << 10); cache_count *= 2) {
72bf215546Sopenharmony_ci         struct util_cache * cache;
73bf215546Sopenharmony_ci         cache_test_key *key;
74bf215546Sopenharmony_ci         cache_test_value *value_in;
75bf215546Sopenharmony_ci         cache_test_value *value_out;
76bf215546Sopenharmony_ci         int i;
77bf215546Sopenharmony_ci
78bf215546Sopenharmony_ci         printf("Testing cache size of %d with %d values.\n", cache_size, cache_count);
79bf215546Sopenharmony_ci
80bf215546Sopenharmony_ci         cache = util_cache_create(cache_test_hash,
81bf215546Sopenharmony_ci                                   cache_test_compare,
82bf215546Sopenharmony_ci                                   cache_test_destroy,
83bf215546Sopenharmony_ci                                   cache_size);
84bf215546Sopenharmony_ci
85bf215546Sopenharmony_ci         /*
86bf215546Sopenharmony_ci          * Retrieve a value from an empty cache.
87bf215546Sopenharmony_ci          */
88bf215546Sopenharmony_ci         key = malloc(sizeof(cache_test_key));
89bf215546Sopenharmony_ci         *key = 0xdeadbeef;
90bf215546Sopenharmony_ci         value_out = (cache_test_value *) util_cache_get(cache, key);
91bf215546Sopenharmony_ci         assert(value_out == NULL);
92bf215546Sopenharmony_ci         (void)value_out;
93bf215546Sopenharmony_ci         free(key);
94bf215546Sopenharmony_ci
95bf215546Sopenharmony_ci
96bf215546Sopenharmony_ci         /*
97bf215546Sopenharmony_ci          * Repeatedly insert into and retrieve values from the cache.
98bf215546Sopenharmony_ci          */
99bf215546Sopenharmony_ci         for (i = 0; i < cache_count; i++) {
100bf215546Sopenharmony_ci            key = malloc(sizeof(cache_test_key));
101bf215546Sopenharmony_ci            value_in = malloc(sizeof(cache_test_value));
102bf215546Sopenharmony_ci
103bf215546Sopenharmony_ci            *key = rand();
104bf215546Sopenharmony_ci            *value_in = rand();
105bf215546Sopenharmony_ci            util_cache_set(cache, key, value_in);
106bf215546Sopenharmony_ci
107bf215546Sopenharmony_ci            value_out = util_cache_get(cache, key);
108bf215546Sopenharmony_ci            assert(value_out != NULL);
109bf215546Sopenharmony_ci            assert(value_in == value_out);
110bf215546Sopenharmony_ci            assert(*value_in == *value_out);
111bf215546Sopenharmony_ci         }
112bf215546Sopenharmony_ci
113bf215546Sopenharmony_ci         /*
114bf215546Sopenharmony_ci          * In debug builds, this will trigger a self-check by the cache of
115bf215546Sopenharmony_ci          * the distribution of hits in its internal cache entries.
116bf215546Sopenharmony_ci          */
117bf215546Sopenharmony_ci         util_cache_destroy(cache);
118bf215546Sopenharmony_ci      }
119bf215546Sopenharmony_ci   }
120bf215546Sopenharmony_ci
121bf215546Sopenharmony_ci   return 0;
122bf215546Sopenharmony_ci}
123