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,