]> git.proxmox.com Git - libgit2.git/commitdiff
refs: failing test for concurrent ref access
authorCarlos Martín Nieto <cmn@dwim.me>
Mon, 2 Jun 2014 14:46:47 +0000 (16:46 +0200)
committerCarlos Martín Nieto <cmn@dwim.me>
Mon, 2 Jun 2014 14:46:47 +0000 (16:46 +0200)
If we remove a reference while we're iterating through the packed refs,
the position in the iterator will be off.

tests/refs/iterator.c

index a29b0cf8bc90c1b1fbed46d1e0bb2e7f9eb2ba95..c7745130908bae61ecec49aa41c7b62b1f8b6ec4 100644 (file)
@@ -186,3 +186,36 @@ void test_refs_iterator__foreach_name_can_cancel(void)
                -333);
        cl_assert_equal_i(0, cancel_after);
 }
+
+void test_refs_iterator__concurrent_delete(void)
+{
+       git_reference_iterator *iter;
+       size_t full_count = 0, concurrent_count = 0;
+       const char *name;
+       int error;
+
+       git_repository_free(repo);
+       repo = cl_git_sandbox_init("testrepo");
+
+       cl_git_pass(git_reference_iterator_new(&iter, repo));
+       while ((error = git_reference_next_name(&name, iter)) == 0) {
+               full_count++;
+       }
+
+       git_reference_iterator_free(iter);
+       cl_assert_equal_i(GIT_ITEROVER, error);
+
+       cl_git_pass(git_reference_iterator_new(&iter, repo));
+       while ((error = git_reference_next_name(&name, iter)) == 0) {
+               cl_git_pass(git_reference_remove(repo, name));
+               concurrent_count++;
+       }
+
+       git_reference_iterator_free(iter);
+       cl_assert_equal_i(GIT_ITEROVER, error);
+
+       cl_assert_equal_i(full_count, concurrent_count);
+
+       cl_git_sandbox_cleanup();
+       repo = NULL;
+}