Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/libgit2.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'tests/refs/iterator.c')
-rw-r--r--tests/refs/iterator.c160
1 files changed, 142 insertions, 18 deletions
diff --git a/tests/refs/iterator.c b/tests/refs/iterator.c
index 266410fdf..c77451309 100644
--- a/tests/refs/iterator.c
+++ b/tests/refs/iterator.c
@@ -46,36 +46,43 @@ static int refcmp_cb(const void *a, const void *b)
return strcmp(refa->name, refb->name);
}
+static void assert_all_refnames_match(git_vector *output)
+{
+ size_t i;
+ git_reference *ref;
+
+ cl_assert_equal_sz(output->length, ARRAY_SIZE(refnames));
+
+ git_vector_sort(output);
+
+ git_vector_foreach(output, i, ref) {
+ cl_assert_equal_s(ref->name, refnames[i]);
+ git_reference_free(ref);
+ }
+
+ git_vector_free(output);
+}
+
void test_refs_iterator__list(void)
{
git_reference_iterator *iter;
git_vector output;
git_reference *ref;
- int error;
- size_t i;
cl_git_pass(git_vector_init(&output, 32, &refcmp_cb));
cl_git_pass(git_reference_iterator_new(&iter, repo));
- do {
- error = git_reference_next(&ref, iter);
- cl_assert(error == 0 || error == GIT_ITEROVER);
- if (error != GIT_ITEROVER) {
- cl_git_pass(git_vector_insert(&output, ref));
- }
- } while (!error);
+ while (1) {
+ int error = git_reference_next(&ref, iter);
+ if (error == GIT_ITEROVER)
+ break;
+ cl_git_pass(error);
+ cl_git_pass(git_vector_insert(&output, ref));
+ }
git_reference_iterator_free(iter);
- cl_assert_equal_sz(output.length, ARRAY_SIZE(refnames));
-
- git_vector_sort(&output);
-
- git_vector_foreach(&output, i, ref) {
- cl_assert_equal_s(ref->name, refnames[i]);
- git_reference_free(ref);
- }
- git_vector_free(&output);
+ assert_all_refnames_match(&output);
}
void test_refs_iterator__empty(void)
@@ -95,3 +102,120 @@ void test_refs_iterator__empty(void)
git_odb_free(odb);
git_repository_free(empty);
}
+
+static int refs_foreach_cb(git_reference *reference, void *payload)
+{
+ git_vector *output = payload;
+ cl_git_pass(git_vector_insert(output, reference));
+ return 0;
+}
+
+void test_refs_iterator__foreach(void)
+{
+ git_vector output;
+ cl_git_pass(git_vector_init(&output, 32, &refcmp_cb));
+ cl_git_pass(git_reference_foreach(repo, refs_foreach_cb, &output));
+ assert_all_refnames_match(&output);
+}
+
+static int refs_foreach_cancel_cb(git_reference *reference, void *payload)
+{
+ int *cancel_after = payload;
+
+ git_reference_free(reference);
+
+ if (!*cancel_after)
+ return -333;
+ (*cancel_after)--;
+ return 0;
+}
+
+void test_refs_iterator__foreach_can_cancel(void)
+{
+ int cancel_after = 3;
+ cl_git_fail_with(
+ git_reference_foreach(repo, refs_foreach_cancel_cb, &cancel_after),
+ -333);
+ cl_assert_equal_i(0, cancel_after);
+}
+
+static int refs_foreach_name_cb(const char *name, void *payload)
+{
+ git_vector *output = payload;
+ cl_git_pass(git_vector_insert(output, git__strdup(name)));
+ return 0;
+}
+
+void test_refs_iterator__foreach_name(void)
+{
+ git_vector output;
+ size_t i;
+ char *name;
+
+ cl_git_pass(git_vector_init(&output, 32, &git__strcmp_cb));
+ cl_git_pass(
+ git_reference_foreach_name(repo, refs_foreach_name_cb, &output));
+
+ cl_assert_equal_sz(output.length, ARRAY_SIZE(refnames));
+ git_vector_sort(&output);
+
+ git_vector_foreach(&output, i, name) {
+ cl_assert_equal_s(name, refnames[i]);
+ git__free(name);
+ }
+
+ git_vector_free(&output);
+}
+
+static int refs_foreach_name_cancel_cb(const char *name, void *payload)
+{
+ int *cancel_after = payload;
+ if (!*cancel_after)
+ return -333;
+ GIT_UNUSED(name);
+ (*cancel_after)--;
+ return 0;
+}
+
+void test_refs_iterator__foreach_name_can_cancel(void)
+{
+ int cancel_after = 5;
+ cl_git_fail_with(
+ git_reference_foreach_name(
+ repo, refs_foreach_name_cancel_cb, &cancel_after),
+ -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;
+}