svn commit: r1936642 - subversion/trunk/subversion/tests/libsvn_subr
[email protected] Mon, 27 Jul 2026 15:55:31 -0000
| Newsgroups | gmane.comp.version-control.subversion.svn |
|---|---|
| Message-ID | <178516773139.3159234.15773083941007133111@svn03-he-fi> |
Author: ivan
Date: Mon Jul 27 15:55:31 2026
New Revision: 1936642
Log:
Add tests for svn_cache__set_partial().
* subversion/tests/libsvn_subr/cache-test.c
(add_revnum_inplace_partial_setter_func,
add_revnum_dup_partial_setter_func): New.
(partial_cache_test): New test helper.
(test_inprocess_cache_partial, test_membuffer_cache_partial): New tests.
(test_funcs): Add test_inprocess_cache_partial and
test_membuffer_cache_partial tests to test list. Tweak existing tests
description.
Modified:
subversion/trunk/subversion/tests/libsvn_subr/cache-test.c
Modified: subversion/trunk/subversion/tests/libsvn_subr/cache-test.c
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_subr/cache-test.c Mon Jul 27 15:32:20 2026 (r1936641)
+++ subversion/trunk/subversion/tests/libsvn_subr/cache-test.c Mon Jul 27 15:55:31 2026 (r1936642)
@@ -100,6 +100,47 @@ deserialize_revnum(void **out,
return SVN_NO_ERROR;
}
+/* Implements svn_cache__partial_setter_func_t */
+static svn_error_t *
+add_revnum_inplace_partial_setter_func(void **data,
+ apr_size_t *data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ svn_revnum_t *in_rev = (svn_revnum_t *) (*data);
+ const svn_revnum_t *addend = (const svn_revnum_t *) baton;
+
+ if (*data_len != sizeof(*in_rev))
+ return svn_error_create(SVN_ERR_REVNUM_PARSE_FAILURE, NULL,
+ _("Bad size for revision number in cache"));
+
+ *in_rev += *addend;
+
+ return SVN_NO_ERROR;
+}
+
+/* Implements svn_cache__partial_setter_func_t */
+static svn_error_t *
+add_revnum_dup_partial_setter_func(void **data,
+ apr_size_t *data_len,
+ void *baton,
+ apr_pool_t *result_pool)
+{
+ svn_revnum_t *in_rev = (svn_revnum_t *) (*data);
+ const svn_revnum_t *addend = (const svn_revnum_t *) baton;
+
+ if (*data_len != sizeof(*in_rev))
+ return svn_error_create(SVN_ERR_REVNUM_PARSE_FAILURE, NULL,
+ _("Bad size for revision number in cache"));
+
+ *in_rev += *addend;
+
+ *data = apr_pmemdup(result_pool, in_rev, sizeof(*in_rev));
+ *data_len = sizeof(*in_rev);
+
+ return SVN_NO_ERROR;
+}
+
/* Reset cache stats. */
static svn_error_t *
reset_cache_stats(svn_cache__t *cache, apr_pool_t *pool)
@@ -231,6 +272,65 @@ basic_cache_test(svn_cache__t *cache,
}
static svn_error_t *
+partial_cache_test(svn_cache__t *cache,
+ 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(reset_cache_stats(cache, subpool));
+ SVN_ERR(svn_cache__set(cache, "partial", &thirty, subpool));
+ ASSERT_CACHE_STATS(cache, 0, 0, 1, subpool);
+ svn_pool_clear(subpool);
+
+ SVN_ERR(reset_cache_stats(cache, subpool));
+ SVN_ERR(svn_cache__set_partial(cache, "partial",
+ add_revnum_inplace_partial_setter_func,
+ &twenty, subpool));
+ ASSERT_CACHE_STATS(cache, 0, 0, 1, subpool);
+ svn_pool_clear(subpool);
+
+ SVN_ERR(reset_cache_stats(cache, subpool));
+ SVN_ERR(svn_cache__get((void **)&answer, &found, cache, "partial", subpool));
+ if (!found)
+ return svn_error_create(SVN_ERR_TEST_FAILED, NULL,
+ "cache failed to find entry for 'partial'");
+ if (*answer != 50)
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "expected 50 but found '%ld'", *answer);
+ ASSERT_CACHE_STATS(cache, 1, 1, 0, subpool);
+ svn_pool_clear(subpool);
+
+ SVN_ERR(reset_cache_stats(cache, subpool));
+ SVN_ERR(svn_cache__set_partial(cache, "partial",
+ add_revnum_dup_partial_setter_func,
+ &twenty, subpool));
+ ASSERT_CACHE_STATS(cache, 0, 0, 1, subpool);
+ svn_pool_clear(subpool);
+
+ SVN_ERR(reset_cache_stats(cache, subpool));
+ SVN_ERR(svn_cache__get((void **)&answer, &found, cache, "partial", subpool));
+ if (!found)
+ return svn_error_create(SVN_ERR_TEST_FAILED, NULL,
+ "cache failed to find entry for 'partial'");
+ if (*answer != 70)
+ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+ "expected 70 but found '%ld'", *answer);
+ ASSERT_CACHE_STATS(cache, 1, 1, 0, subpool);
+ svn_pool_clear(subpool);
+
+ svn_pool_destroy(subpool);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
test_inprocess_cache_basic(apr_pool_t *pool)
{
svn_cache__t *cache;
@@ -250,6 +350,25 @@ test_inprocess_cache_basic(apr_pool_t *p
}
static svn_error_t *
+test_inprocess_cache_partial(apr_pool_t *pool)
+{
+ svn_cache__t *cache;
+
+ /* Create a cache with just one entry. */
+ SVN_ERR(svn_cache__create_inprocess(&cache,
+ serialize_revnum,
+ deserialize_revnum,
+ APR_HASH_KEY_STRING,
+ 1,
+ 1,
+ TRUE,
+ "",
+ pool));
+
+ return partial_cache_test(cache, pool);
+}
+
+static svn_error_t *
test_memcache_basic(const svn_test_opts_t *opts,
apr_pool_t *pool)
{
@@ -301,6 +420,30 @@ test_membuffer_cache_basic(apr_pool_t *p
return basic_cache_test(cache, FALSE, pool);
}
+static svn_error_t *
+test_membuffer_cache_partial(apr_pool_t *pool)
+{
+ svn_cache__t *cache;
+ svn_membuffer_t *membuffer;
+
+ 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,
+ deserialize_revnum,
+ APR_HASH_KEY_STRING,
+ "cache:",
+ SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY,
+ FALSE,
+ FALSE,
+ pool,
+ pool));
+
+ return partial_cache_test(cache, pool);
+}
+
/* Implements svn_cache__deserialize_func_t */
static svn_error_t *
raise_error_deserialize_func(void **out,
@@ -673,13 +816,17 @@ static struct svn_test_descriptor_t test
{
SVN_TEST_NULL,
SVN_TEST_PASS2(test_inprocess_cache_basic,
- "basic inprocess svn_cache test"),
+ "inprocess svn_cache basic test"),
+ SVN_TEST_PASS2(test_inprocess_cache_partial,
+ "inprocess svn_cache partial set test"),
SVN_TEST_OPTS_PASS(test_memcache_basic,
"basic memcache svn_cache test"),
SVN_TEST_OPTS_PASS(test_memcache_long_key,
"memcache svn_cache with very long keys"),
SVN_TEST_PASS2(test_membuffer_cache_basic,
- "basic membuffer svn_cache test"),
+ "membuffer svn_cache basic test"),
+ SVN_TEST_PASS2(test_inprocess_cache_partial,
+ "membuffer svn_cache partial set test"),
SVN_TEST_PASS2(test_membuffer_serializer_error_handling,
"test for error handling in membuffer svn_cache"),
SVN_TEST_PASS2(test_membuffer_cache_clearing,