blob: be7a7b8081de95c9c0fda2132dde9f452d55cd21 [file] [log] [blame]
#include "clar_libgit2.h"
#include "array.h"
#include "cancellation.h"
void test_core_cancellation__can_cancel(void)
{
git_cancellation *c;
cl_git_pass(git_cancellation_new(&c));
cl_assert(!git_cancellation_requested(c));
cl_git_pass(git_cancellation_request(c));
cl_assert(git_cancellation_requested(c));
git_cancellation_free(c);
}
static int cancel_second(git_cancellation *cancellation, void *payload)
{
git_cancellation *c;
GIT_UNUSED(cancellation);
c = (git_cancellation *) payload;
cl_git_pass(git_cancellation_request(c));
return 0;
}
void test_core_cancellation__can_register(void)
{
git_cancellation *c1, *c2;
cl_git_pass(git_cancellation_new(&c1));
cl_git_pass(git_cancellation_new(&c2));
cl_git_pass(git_cancellation_register(c1, cancel_second, c2));
cl_assert(!git_cancellation_requested(c1));
cl_assert(!git_cancellation_requested(c2));
cl_git_pass(git_cancellation_request(c1));
cl_assert(git_cancellation_requested(c1));
cl_assert(git_cancellation_requested(c2));
git_cancellation_free(c1);
git_cancellation_free(c2);
}
static int cancel_count(git_cancellation *cancellation, void *payload)
{
int *i;
GIT_UNUSED(cancellation);
i = (int *) payload;
*i += 1;
return 0;
}
void test_core_cancellation__registration_fires_once(void)
{
git_cancellation *c;
int cancelled_times = 0;
cl_git_pass(git_cancellation_new(&c));
cl_git_pass(git_cancellation_register(c, cancel_count, &cancelled_times));
cl_assert(!git_cancellation_requested(c));
cl_git_pass(git_cancellation_request(c));
cl_assert(git_cancellation_requested(c));
cl_git_pass(git_cancellation_request(c));
cl_assert(git_cancellation_requested(c));
cl_assert_equal_i(1, cancelled_times);
git_cancellation_free(c);
}
static int cancel_fail(git_cancellation *cancellation, void *payload)
{
int *i;
GIT_UNUSED(cancellation);
i = (int *) payload;
*i += 1;
return GIT_EUSER;
}
void test_core_cancellation__trigger_failure(void)
{
git_cancellation *c;
int cancelled_times = 0;
cl_git_pass(git_cancellation_new(&c));
/* Register twice, but we fail on the first time, so we should only inc once */
cl_git_pass(git_cancellation_register(c, cancel_fail, &cancelled_times));
cl_git_pass(git_cancellation_register(c, cancel_fail, &cancelled_times));
cl_assert(!git_cancellation_requested(c));
cl_git_fail_with(GIT_EUSER, git_cancellation_request(c));
cl_assert(git_cancellation_requested(c));
cl_git_pass(git_cancellation_request(c));
cl_assert(git_cancellation_requested(c));
cl_assert_equal_i(1, cancelled_times);
git_cancellation_free(c);
}
void test_core_cancellation__detect_current(void)
{
git_cancellation *c;
cl_git_pass(git_cancellation_new(&c));
cl_git_pass(git_cancellation_activate(c));
cl_assert_equal_i(0, git_cancellation__canceled());
cl_git_pass(git_cancellation_request(c));
cl_assert_equal_i(1, git_cancellation__canceled());
cl_git_pass(git_cancellation_deactivate());
}