Blame tests/online/fetch.c

Packit ae9e2a
#include "clar_libgit2.h"
Packit ae9e2a
Packit ae9e2a
static git_repository *_repo;
Packit ae9e2a
static int counter;
Packit ae9e2a
Packit ae9e2a
void test_online_fetch__initialize(void)
Packit ae9e2a
{
Packit ae9e2a
	cl_git_pass(git_repository_init(&_repo, "./fetch", 0));
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_online_fetch__cleanup(void)
Packit ae9e2a
{
Packit ae9e2a
	git_repository_free(_repo);
Packit ae9e2a
	_repo = NULL;
Packit ae9e2a
Packit ae9e2a
	cl_fixture_cleanup("./fetch");
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
static int update_tips(const char *refname, const git_oid *a, const git_oid *b, void *data)
Packit ae9e2a
{
Packit ae9e2a
	GIT_UNUSED(refname); GIT_UNUSED(a); GIT_UNUSED(b); GIT_UNUSED(data);
Packit ae9e2a
Packit ae9e2a
	++counter;
Packit ae9e2a
Packit ae9e2a
	return 0;
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
static int progress(const git_transfer_progress *stats, void *payload)
Packit ae9e2a
{
Packit ae9e2a
	size_t *bytes_received = (size_t *)payload;
Packit ae9e2a
	*bytes_received = stats->received_bytes;
Packit ae9e2a
	return 0;
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
static void do_fetch(const char *url, git_remote_autotag_option_t flag, int n)
Packit ae9e2a
{
Packit ae9e2a
	git_remote *remote;
Packit ae9e2a
	git_fetch_options options = GIT_FETCH_OPTIONS_INIT;
Packit ae9e2a
	size_t bytes_received = 0;
Packit ae9e2a
Packit ae9e2a
	options.callbacks.transfer_progress = progress;
Packit ae9e2a
	options.callbacks.update_tips = update_tips;
Packit ae9e2a
	options.callbacks.payload = &bytes_received;
Packit ae9e2a
	options.download_tags = flag;
Packit ae9e2a
	counter = 0;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_remote_create(&remote, _repo, "test", url));
Packit ae9e2a
	cl_git_pass(git_remote_fetch(remote, NULL, &options, NULL));
Packit ae9e2a
	cl_assert_equal_i(counter, n);
Packit ae9e2a
	cl_assert(bytes_received > 0);
Packit ae9e2a
Packit ae9e2a
	git_remote_free(remote);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_online_fetch__default_git(void)
Packit ae9e2a
{
Packit ae9e2a
	do_fetch("git://github.com/libgit2/TestGitRepository.git", GIT_REMOTE_DOWNLOAD_TAGS_AUTO, 6);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_online_fetch__default_http(void)
Packit ae9e2a
{
Packit ae9e2a
	do_fetch("http://github.com/libgit2/TestGitRepository.git", GIT_REMOTE_DOWNLOAD_TAGS_AUTO, 6);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_online_fetch__default_https(void)
Packit ae9e2a
{
Packit ae9e2a
	do_fetch("https://github.com/libgit2/TestGitRepository.git", GIT_REMOTE_DOWNLOAD_TAGS_AUTO, 6);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_online_fetch__no_tags_git(void)
Packit ae9e2a
{
Packit ae9e2a
	do_fetch("git://github.com/libgit2/TestGitRepository.git", GIT_REMOTE_DOWNLOAD_TAGS_NONE, 3);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_online_fetch__no_tags_http(void)
Packit ae9e2a
{
Packit ae9e2a
	do_fetch("http://github.com/libgit2/TestGitRepository.git", GIT_REMOTE_DOWNLOAD_TAGS_NONE, 3);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_online_fetch__fetch_twice(void)
Packit ae9e2a
{
Packit ae9e2a
	git_remote *remote;
Packit ae9e2a
	cl_git_pass(git_remote_create(&remote, _repo, "test", "git://github.com/libgit2/TestGitRepository.git"));
Packit ae9e2a
	cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL, NULL));
Packit ae9e2a
	cl_git_pass(git_remote_download(remote, NULL, NULL));
Packit ae9e2a
    	git_remote_disconnect(remote);
Packit ae9e2a
    	
Packit ae9e2a
	git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL, NULL);
Packit ae9e2a
	cl_git_pass(git_remote_download(remote, NULL, NULL));
Packit ae9e2a
	git_remote_disconnect(remote);
Packit ae9e2a
	
Packit ae9e2a
	git_remote_free(remote);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
static int transferProgressCallback(const git_transfer_progress *stats, void *payload)
Packit ae9e2a
{
Packit ae9e2a
	bool *invoked = (bool *)payload;
Packit ae9e2a
Packit ae9e2a
	GIT_UNUSED(stats);
Packit ae9e2a
	*invoked = true;
Packit ae9e2a
	return 0;
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_online_fetch__doesnt_retrieve_a_pack_when_the_repository_is_up_to_date(void)
Packit ae9e2a
{
Packit ae9e2a
	git_repository *_repository;
Packit ae9e2a
	bool invoked = false;
Packit ae9e2a
	git_remote *remote;
Packit ae9e2a
	git_fetch_options options = GIT_FETCH_OPTIONS_INIT;
Packit ae9e2a
	git_clone_options opts = GIT_CLONE_OPTIONS_INIT;
Packit ae9e2a
	opts.bare = true;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_clone(&_repository, "https://github.com/libgit2/TestGitRepository.git",
Packit ae9e2a
				"./fetch/lg2", &opts));
Packit ae9e2a
	git_repository_free(_repository);
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_open(&_repository, "./fetch/lg2"));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_remote_lookup(&remote, _repository, "origin"));
Packit ae9e2a
	cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_i(false, invoked);
Packit ae9e2a
Packit ae9e2a
	options.callbacks.transfer_progress = &transferProgressCallback;
Packit ae9e2a
	options.callbacks.payload = &invoked;
Packit ae9e2a
	cl_git_pass(git_remote_download(remote, NULL, &options));
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_i(false, invoked);
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_remote_update_tips(remote, &options.callbacks, 1, options.download_tags, NULL));
Packit ae9e2a
	git_remote_disconnect(remote);
Packit ae9e2a
Packit ae9e2a
	git_remote_free(remote);
Packit ae9e2a
	git_repository_free(_repository);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
static int cancel_at_half(const git_transfer_progress *stats, void *payload)
Packit ae9e2a
{
Packit ae9e2a
	GIT_UNUSED(payload);
Packit ae9e2a
Packit ae9e2a
	if (stats->received_objects > (stats->total_objects/2))
Packit ae9e2a
		return -4321;
Packit ae9e2a
	return 0;
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_online_fetch__can_cancel(void)
Packit ae9e2a
{
Packit ae9e2a
	git_remote *remote;
Packit ae9e2a
	size_t bytes_received = 0;
Packit ae9e2a
	git_fetch_options options = GIT_FETCH_OPTIONS_INIT;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_remote_create(&remote, _repo, "test",
Packit ae9e2a
				"http://github.com/libgit2/TestGitRepository.git"));
Packit ae9e2a
Packit ae9e2a
	options.callbacks.transfer_progress = cancel_at_half;
Packit ae9e2a
	options.callbacks.payload = &bytes_received;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL, NULL));
Packit ae9e2a
	cl_git_fail_with(git_remote_download(remote, NULL, &options), -4321);
Packit ae9e2a
	git_remote_disconnect(remote);
Packit ae9e2a
	git_remote_free(remote);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_online_fetch__ls_disconnected(void)
Packit ae9e2a
{
Packit ae9e2a
	const git_remote_head **refs;
Packit ae9e2a
	size_t refs_len_before, refs_len_after;
Packit ae9e2a
	git_remote *remote;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_remote_create(&remote, _repo, "test",
Packit ae9e2a
				"http://github.com/libgit2/TestGitRepository.git"));
Packit ae9e2a
	cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL, NULL));
Packit ae9e2a
	cl_git_pass(git_remote_ls(&refs, &refs_len_before, remote));
Packit ae9e2a
	git_remote_disconnect(remote);
Packit ae9e2a
	cl_git_pass(git_remote_ls(&refs, &refs_len_after, remote));
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_i(refs_len_before, refs_len_after);
Packit ae9e2a
Packit ae9e2a
	git_remote_free(remote);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_online_fetch__remote_symrefs(void)
Packit ae9e2a
{
Packit ae9e2a
	const git_remote_head **refs;
Packit ae9e2a
	size_t refs_len;
Packit ae9e2a
	git_remote *remote;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_remote_create(&remote, _repo, "test",
Packit ae9e2a
				"http://github.com/libgit2/TestGitRepository.git"));
Packit ae9e2a
	cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL, NULL));
Packit ae9e2a
	git_remote_disconnect(remote);
Packit ae9e2a
	cl_git_pass(git_remote_ls(&refs, &refs_len, remote));
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_s("HEAD", refs[0]->name);
Packit ae9e2a
	cl_assert_equal_s("refs/heads/master", refs[0]->symref_target);
Packit ae9e2a
Packit ae9e2a
	git_remote_free(remote);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_online_fetch__twice(void)
Packit ae9e2a
{
Packit ae9e2a
	git_remote *remote;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_remote_create(&remote, _repo, "test", "http://github.com/libgit2/TestGitRepository.git"));
Packit ae9e2a
	cl_git_pass(git_remote_fetch(remote, NULL, NULL, NULL));
Packit ae9e2a
	cl_git_pass(git_remote_fetch(remote, NULL, NULL, NULL));
Packit ae9e2a
Packit ae9e2a
	git_remote_free(remote);
Packit ae9e2a
}