diff options
author | Ben Straub <bs@github.com> | 2013-11-14 14:05:52 -0800 |
---|---|---|
committer | Ben Straub <bs@github.com> | 2013-11-14 14:05:52 -0800 |
commit | 1782038144ef3413831801bb9c2f3038a84ac6f4 (patch) | |
tree | f074cc30890a20f5418c10fae1815ca516588a27 /tests/online/fetch.c | |
parent | 7b947bf5cc59eefa83c28eb5f5fd8434207ebb8b (diff) | |
download | libgit2-1782038144ef3413831801bb9c2f3038a84ac6f4.tar.gz |
Rename tests-clar to tests
Diffstat (limited to 'tests/online/fetch.c')
-rw-r--r-- | tests/online/fetch.c | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/tests/online/fetch.c b/tests/online/fetch.c new file mode 100644 index 000000000..5153a7ae0 --- /dev/null +++ b/tests/online/fetch.c @@ -0,0 +1,171 @@ +#include "clar_libgit2.h" + +static git_repository *_repo; +static int counter; + +void test_online_fetch__initialize(void) +{ + cl_git_pass(git_repository_init(&_repo, "./fetch", 0)); +} + +void test_online_fetch__cleanup(void) +{ + git_repository_free(_repo); + _repo = NULL; + + cl_fixture_cleanup("./fetch"); +} + +static int update_tips(const char *refname, const git_oid *a, const git_oid *b, void *data) +{ + GIT_UNUSED(refname); GIT_UNUSED(a); GIT_UNUSED(b); GIT_UNUSED(data); + + ++counter; + + return 0; +} + +static int progress(const git_transfer_progress *stats, void *payload) +{ + size_t *bytes_received = (size_t *)payload; + *bytes_received = stats->received_bytes; + return 0; +} + +static void do_fetch(const char *url, git_remote_autotag_option_t flag, int n) +{ + git_remote *remote; + git_remote_callbacks callbacks = GIT_REMOTE_CALLBACKS_INIT; + size_t bytes_received = 0; + + callbacks.transfer_progress = progress; + callbacks.update_tips = update_tips; + callbacks.payload = &bytes_received; + counter = 0; + + cl_git_pass(git_remote_create(&remote, _repo, "test", url)); + git_remote_set_callbacks(remote, &callbacks); + git_remote_set_autotag(remote, flag); + cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH)); + cl_git_pass(git_remote_download(remote)); + cl_git_pass(git_remote_update_tips(remote)); + git_remote_disconnect(remote); + cl_assert_equal_i(counter, n); + cl_assert(bytes_received > 0); + + git_remote_free(remote); +} + +void test_online_fetch__default_git(void) +{ + do_fetch("git://github.com/libgit2/TestGitRepository.git", GIT_REMOTE_DOWNLOAD_TAGS_AUTO, 6); +} + +void test_online_fetch__default_http(void) +{ + do_fetch("http://github.com/libgit2/TestGitRepository.git", GIT_REMOTE_DOWNLOAD_TAGS_AUTO, 6); +} + +void test_online_fetch__default_https(void) +{ + do_fetch("https://github.com/libgit2/TestGitRepository.git", GIT_REMOTE_DOWNLOAD_TAGS_AUTO, 6); +} + +void test_online_fetch__no_tags_git(void) +{ + do_fetch("git://github.com/libgit2/TestGitRepository.git", GIT_REMOTE_DOWNLOAD_TAGS_NONE, 3); +} + +void test_online_fetch__no_tags_http(void) +{ + do_fetch("http://github.com/libgit2/TestGitRepository.git", GIT_REMOTE_DOWNLOAD_TAGS_NONE, 3); +} + +static int transferProgressCallback(const git_transfer_progress *stats, void *payload) +{ + bool *invoked = (bool *)payload; + + GIT_UNUSED(stats); + *invoked = true; + return 0; +} + +void test_online_fetch__doesnt_retrieve_a_pack_when_the_repository_is_up_to_date(void) +{ + git_repository *_repository; + bool invoked = false; + git_remote *remote; + git_remote_callbacks callbacks = GIT_REMOTE_CALLBACKS_INIT; + git_clone_options opts = GIT_CLONE_OPTIONS_INIT; + opts.bare = true; + + cl_git_pass(git_clone(&_repository, "https://github.com/libgit2/TestGitRepository.git", + "./fetch/lg2", &opts)); + git_repository_free(_repository); + + cl_git_pass(git_repository_open(&_repository, "./fetch/lg2")); + + cl_git_pass(git_remote_load(&remote, _repository, "origin")); + cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH)); + + cl_assert_equal_i(false, invoked); + + callbacks.transfer_progress = &transferProgressCallback; + callbacks.payload = &invoked; + git_remote_set_callbacks(remote, &callbacks); + cl_git_pass(git_remote_download(remote)); + + cl_assert_equal_i(false, invoked); + + cl_git_pass(git_remote_update_tips(remote)); + git_remote_disconnect(remote); + + git_remote_free(remote); + git_repository_free(_repository); +} + +static int cancel_at_half(const git_transfer_progress *stats, void *payload) +{ + GIT_UNUSED(payload); + + if (stats->received_objects > (stats->total_objects/2)) + return -1; + return 0; +} + +void test_online_fetch__can_cancel(void) +{ + git_remote *remote; + size_t bytes_received = 0; + git_remote_callbacks callbacks = GIT_REMOTE_CALLBACKS_INIT; + + cl_git_pass(git_remote_create(&remote, _repo, "test", + "http://github.com/libgit2/TestGitRepository.git")); + + callbacks.transfer_progress = cancel_at_half; + callbacks.payload = &bytes_received; + git_remote_set_callbacks(remote, &callbacks); + + cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH)); + cl_git_fail_with(git_remote_download(remote), GIT_EUSER); + git_remote_disconnect(remote); + git_remote_free(remote); +} + +void test_online_fetch__ls_disconnected(void) +{ + const git_remote_head **refs; + size_t refs_len_before, refs_len_after; + git_remote *remote; + + cl_git_pass(git_remote_create(&remote, _repo, "test", + "http://github.com/libgit2/TestGitRepository.git")); + cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH)); + cl_git_pass(git_remote_ls(&refs, &refs_len_before, remote)); + git_remote_disconnect(remote); + cl_git_pass(git_remote_ls(&refs, &refs_len_after, remote)); + + cl_assert_equal_i(refs_len_before, refs_len_after); + + git_remote_free(remote); +} |