static svn_error_t * basic_cache_test(svn_cache__t *cache, svn_boolean_t size_is_one, apr_pool_t *pool) { svn_boolean_t found; svn_revnum_t twenty = 20, thirty = 30, *answer; apr_pool_t *subpool; /* We use a subpool for all calls in this test and aggressively * clear it, to try to find any bugs where the cached values aren't * actually saved away in the cache's pools. */ subpool = svn_pool_create(pool); SVN_ERR(svn_cache__get((void **) &answer, &found, cache, "twenty", subpool)); if (found) return svn_error_create(SVN_ERR_TEST_FAILED, NULL, "cache found an entry that wasn't there"); svn_pool_clear(subpool); SVN_ERR(svn_cache__set(cache, "twenty", &twenty, subpool)); svn_pool_clear(subpool); SVN_ERR(svn_cache__get((void **) &answer, &found, cache, "twenty", subpool)); if (! found) return svn_error_create(SVN_ERR_TEST_FAILED, NULL, "cache failed to find entry for 'twenty'"); if (*answer != 20) return svn_error_createf(SVN_ERR_TEST_FAILED, NULL, "expected 20 but found '%ld'", *answer); svn_pool_clear(subpool); SVN_ERR(svn_cache__set(cache, "thirty", &thirty, subpool)); svn_pool_clear(subpool); SVN_ERR(svn_cache__get((void **) &answer, &found, cache, "thirty", subpool)); if (! found) return svn_error_create(SVN_ERR_TEST_FAILED, NULL, "cache failed to find entry for 'thirty'"); if (*answer != 30) return svn_error_createf(SVN_ERR_TEST_FAILED, NULL, "expected 30 but found '%ld'", *answer); if (size_is_one) { SVN_ERR(svn_cache__get((void **) &answer, &found, cache, "twenty", subpool)); if (found) return svn_error_create(SVN_ERR_TEST_FAILED, NULL, "cache found entry for 'twenty' that should have " "expired"); } svn_pool_destroy(subpool); return SVN_NO_ERROR; }
static svn_error_t * test_memcache_long_key(const svn_test_opts_t *opts, apr_pool_t *pool) { svn_cache__t *cache; svn_config_t *config; svn_memcache_t *memcache = NULL; svn_revnum_t fifty = 50, *answer; svn_boolean_t found = FALSE; const char *prefix = apr_psprintf(pool, "test_memcache_long_key-%" APR_TIME_T_FMT, apr_time_now()); static const char *long_key = "0123456789" "0123456789" "0123456789" "0123456789" "0123456789" /* 50 */ "0123456789" "0123456789" "0123456789" "0123456789" "0123456789" /* 100 */ "0123456789" "0123456789" "0123456789" "0123456789" "0123456789" /* 150 */ "0123456789" "0123456789" "0123456789" "0123456789" "0123456789" /* 200 */ "0123456789" "0123456789" "0123456789" "0123456789" "0123456789" /* 250 */ "0123456789" "0123456789" "0123456789" "0123456789" "0123456789" /* 300 */ ; if (opts->config_file) { SVN_ERR(svn_config_read3(&config, opts->config_file, TRUE, FALSE, FALSE, pool)); SVN_ERR(svn_cache__make_memcache_from_config(&memcache, config, pool, pool)); } if (! memcache) return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL, "not configured to use memcached"); /* Create a memcache-based cache. */ SVN_ERR(svn_cache__create_memcache(&cache, memcache, serialize_revnum, deserialize_revnum, APR_HASH_KEY_STRING, prefix, pool)); SVN_ERR(svn_cache__set(cache, long_key, &fifty, pool)); SVN_ERR(svn_cache__get((void **) &answer, &found, cache, long_key, pool)); if (! found) return svn_error_create(SVN_ERR_TEST_FAILED, NULL, "cache failed to find entry for 'fifty'"); if (*answer != 50) return svn_error_createf(SVN_ERR_TEST_FAILED, NULL, "expected 50 but found '%ld'", *answer); return SVN_NO_ERROR; }
static svn_error_t * test_membuffer_cache_clearing(apr_pool_t *pool) { svn_cache__t *cache; svn_membuffer_t *membuffer; svn_boolean_t found; svn_revnum_t *value; svn_revnum_t valueA = 12345; svn_revnum_t valueB = 67890; /* Create a simple cache for strings, keyed by strings. */ SVN_ERR(svn_cache__membuffer_cache_create(&membuffer, 10*1024, 1, 0, TRUE, TRUE, pool)); SVN_ERR(svn_cache__create_membuffer_cache(&cache, membuffer, serialize_revnum, deserialize_revnum, APR_HASH_KEY_STRING, "cache:", SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY, FALSE, pool, pool)); /* Initially, the cache is empty. */ SVN_ERR(svn_cache__get((void **) &value, &found, cache, "key A", pool)); SVN_TEST_ASSERT(!found); SVN_ERR(svn_cache__get((void **) &value, &found, cache, "key B", pool)); SVN_TEST_ASSERT(!found); SVN_ERR(svn_cache__get((void **) &value, &found, cache, "key C", pool)); SVN_TEST_ASSERT(!found); /* Add entries. */ SVN_ERR(svn_cache__set(cache, "key A", &valueA, pool)); SVN_ERR(svn_cache__set(cache, "key B", &valueB, pool)); /* Added entries should be cached (too small to get evicted already). */ SVN_ERR(svn_cache__get((void **) &value, &found, cache, "key A", pool)); SVN_TEST_ASSERT(found); SVN_TEST_ASSERT(*value == valueA); SVN_ERR(svn_cache__get((void **) &value, &found, cache, "key B", pool)); SVN_TEST_ASSERT(found); SVN_TEST_ASSERT(*value == valueB); SVN_ERR(svn_cache__get((void **) &value, &found, cache, "key C", pool)); SVN_TEST_ASSERT(!found); /* Clear the cache. */ SVN_ERR(svn_cache__membuffer_clear(membuffer)); /* The cache is empty again. */ SVN_ERR(svn_cache__get((void **) &value, &found, cache, "key A", pool)); SVN_TEST_ASSERT(!found); SVN_ERR(svn_cache__get((void **) &value, &found, cache, "key B", pool)); SVN_TEST_ASSERT(!found); SVN_ERR(svn_cache__get((void **) &value, &found, cache, "key C", pool)); SVN_TEST_ASSERT(!found); /* But still functional: */ SVN_ERR(svn_cache__set(cache, "key B", &valueB, pool)); SVN_ERR(svn_cache__has_key(&found, cache, "key A", pool)); SVN_TEST_ASSERT(!found); SVN_ERR(svn_cache__has_key(&found, cache, "key B", pool)); SVN_TEST_ASSERT(found); SVN_ERR(svn_cache__has_key(&found, cache, "key C", pool)); SVN_TEST_ASSERT(!found); return SVN_NO_ERROR; }
static svn_error_t * test_membuffer_serializer_error_handling(apr_pool_t *pool) { svn_cache__t *cache; svn_membuffer_t *membuffer; svn_revnum_t twenty = 20; svn_boolean_t found; void *val; SVN_ERR(svn_cache__membuffer_cache_create(&membuffer, 10*1024, 1, 0, TRUE, TRUE, pool)); /* Create a cache with just one entry. */ SVN_ERR(svn_cache__create_membuffer_cache(&cache, membuffer, serialize_revnum, raise_error_deserialize_func, APR_HASH_KEY_STRING, "cache:", SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY, FALSE, pool, pool)); SVN_ERR(svn_cache__set(cache, "twenty", &twenty, pool)); /* Test retrieving data from cache using full getter that always raises an error. */ SVN_TEST_ASSERT_ERROR( svn_cache__get(&val, &found, cache, "twenty", pool), APR_EGENERAL); /* Test retrieving data from cache using partial getter that always raises an error. */ SVN_TEST_ASSERT_ERROR( svn_cache__get_partial(&val, &found, cache, "twenty", raise_error_partial_getter_func, NULL, pool), APR_EGENERAL); /* Create a new cache. */ SVN_ERR(svn_cache__membuffer_cache_create(&membuffer, 10*1024, 1, 0, TRUE, TRUE, pool)); SVN_ERR(svn_cache__create_membuffer_cache(&cache, membuffer, serialize_revnum, deserialize_revnum, APR_HASH_KEY_STRING, "cache:", SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY, FALSE, pool, pool)); /* Store one entry in cache. */ SVN_ERR(svn_cache__set(cache, "twenty", &twenty, pool)); /* Test setting data in cache using partial setter that always raises an error. */ SVN_TEST_ASSERT_ERROR( svn_cache__set_partial(cache, "twenty", raise_error_partial_setter_func, NULL, pool), APR_EGENERAL); return SVN_NO_ERROR; }