Blame tests/stress/diff.c

Packit ae9e2a
#include "clar_libgit2.h"
Packit ae9e2a
#include "../diff/diff_helpers.h"
Packit ae9e2a
Packit ae9e2a
static git_repository *g_repo = NULL;
Packit ae9e2a
Packit ae9e2a
void test_stress_diff__initialize(void)
Packit ae9e2a
{
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_stress_diff__cleanup(void)
Packit ae9e2a
{
Packit ae9e2a
	cl_git_sandbox_cleanup();
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
#define ANOTHER_POEM \
Packit ae9e2a
"OH, glorious are the guarded heights\nWhere guardian souls abide—\nSelf-exiled from our gross delights—\nAbove, beyond, outside:\nAn ampler arc their spirit swings—\nCommands a juster view—\nWe have their word for all these things,\nNo doubt their words are true.\n\nYet we, the bond slaves of our day,\nWhom dirt and danger press—\nCo-heirs of insolence, delay,\nAnd leagued unfaithfulness—\nSuch is our need must seek indeed\nAnd, having found, engage\nThe men who merely do the work\nFor which they draw the wage.\n\nFrom forge and farm and mine and bench,\nDeck, altar, outpost lone—\nMill, school, battalion, counter, trench,\nRail, senate, sheepfold, throne—\nCreation's cry goes up on high\nFrom age to cheated age:\n\"Send us the men who do the work\n\"For which they draw the wage!\"\n"
Packit ae9e2a
Packit ae9e2a
static void test_with_many(int expected_new)
Packit ae9e2a
{
Packit ae9e2a
	git_index *index;
Packit ae9e2a
	git_tree *tree, *new_tree;
Packit ae9e2a
	git_diff *diff = NULL;
Packit ae9e2a
	diff_expects exp;
Packit ae9e2a
	git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT;
Packit ae9e2a
	git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_index(&index, g_repo));
Packit ae9e2a
	cl_git_pass(
Packit ae9e2a
		git_revparse_single((git_object **)&tree, g_repo, "HEAD^{tree}"));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(p_rename("renames/ikeepsix.txt", "renames/ikeepsix2.txt"));
Packit ae9e2a
	cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt"));
Packit ae9e2a
	cl_git_pass(git_index_add_bypath(index, "ikeepsix2.txt"));
Packit ae9e2a
	cl_git_pass(git_index_write(index));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_diff_tree_to_index(&diff, g_repo, tree, index, &diffopts));
Packit ae9e2a
Packit ae9e2a
	memset(&exp, 0, sizeof(exp));
Packit ae9e2a
	cl_git_pass(git_diff_foreach(
Packit ae9e2a
		diff, diff_file_cb, NULL, NULL, NULL, &exp);;
Packit ae9e2a
	cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]);
Packit ae9e2a
	cl_assert_equal_i(expected_new + 1, exp.file_status[GIT_DELTA_ADDED]);
Packit ae9e2a
	cl_assert_equal_i(expected_new + 2, exp.files);
Packit ae9e2a
Packit ae9e2a
	opts.flags = GIT_DIFF_FIND_ALL;
Packit ae9e2a
	cl_git_pass(git_diff_find_similar(diff, &opts));
Packit ae9e2a
Packit ae9e2a
	memset(&exp, 0, sizeof(exp));
Packit ae9e2a
	cl_git_pass(git_diff_foreach(
Packit ae9e2a
		diff, diff_file_cb, NULL, NULL, NULL, &exp);;
Packit ae9e2a
	cl_assert_equal_i(1, exp.file_status[GIT_DELTA_RENAMED]);
Packit ae9e2a
	cl_assert_equal_i(expected_new, exp.file_status[GIT_DELTA_ADDED]);
Packit ae9e2a
	cl_assert_equal_i(expected_new + 1, exp.files);
Packit ae9e2a
Packit ae9e2a
	git_diff_free(diff);
Packit ae9e2a
Packit ae9e2a
	cl_repo_commit_from_index(NULL, g_repo, NULL, 1372350000, "yoyoyo");
Packit ae9e2a
	cl_git_pass(git_revparse_single(
Packit ae9e2a
		(git_object **)&new_tree, g_repo, "HEAD^{tree}"));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_diff_tree_to_tree(
Packit ae9e2a
		&diff, g_repo, tree, new_tree, &diffopts));
Packit ae9e2a
Packit ae9e2a
	memset(&exp, 0, sizeof(exp));
Packit ae9e2a
	cl_git_pass(git_diff_foreach(
Packit ae9e2a
		diff, diff_file_cb, NULL, NULL, NULL, &exp);;
Packit ae9e2a
	cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]);
Packit ae9e2a
	cl_assert_equal_i(expected_new + 1, exp.file_status[GIT_DELTA_ADDED]);
Packit ae9e2a
	cl_assert_equal_i(expected_new + 2, exp.files);
Packit ae9e2a
Packit ae9e2a
	opts.flags = GIT_DIFF_FIND_ALL;
Packit ae9e2a
	cl_git_pass(git_diff_find_similar(diff, &opts));
Packit ae9e2a
Packit ae9e2a
	memset(&exp, 0, sizeof(exp));
Packit ae9e2a
	cl_git_pass(git_diff_foreach(
Packit ae9e2a
		diff, diff_file_cb, NULL, NULL, NULL, &exp);;
Packit ae9e2a
	cl_assert_equal_i(1, exp.file_status[GIT_DELTA_RENAMED]);
Packit ae9e2a
	cl_assert_equal_i(expected_new, exp.file_status[GIT_DELTA_ADDED]);
Packit ae9e2a
	cl_assert_equal_i(expected_new + 1, exp.files);
Packit ae9e2a
Packit ae9e2a
	git_diff_free(diff);
Packit ae9e2a
Packit ae9e2a
	git_tree_free(new_tree);
Packit ae9e2a
	git_tree_free(tree);
Packit ae9e2a
	git_index_free(index);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_stress_diff__rename_big_files(void)
Packit ae9e2a
{
Packit ae9e2a
	git_index *index;
Packit ae9e2a
	char tmp[64];
Packit ae9e2a
	int i, j;
Packit ae9e2a
	git_buf b = GIT_BUF_INIT;
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("renames");
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_index(&index, g_repo));
Packit ae9e2a
Packit ae9e2a
	for (i = 0; i < 100; i += 1) {
Packit ae9e2a
		p_snprintf(tmp, sizeof(tmp), "renames/newfile%03d", i);
Packit ae9e2a
		for (j = i * 256; j > 0; --j)
Packit ae9e2a
			git_buf_printf(&b, "more content %d\n", i);
Packit ae9e2a
		cl_git_mkfile(tmp, b.ptr);
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	for (i = 0; i < 100; i += 1) {
Packit ae9e2a
		p_snprintf(tmp, sizeof(tmp), "renames/newfile%03d", i);
Packit ae9e2a
		cl_git_pass(git_index_add_bypath(index, tmp + strlen("renames/")));
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	git_buf_free(&b);
Packit ae9e2a
	git_index_free(index);
Packit ae9e2a
Packit ae9e2a
	test_with_many(100);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_stress_diff__rename_many_files(void)
Packit ae9e2a
{
Packit ae9e2a
	git_index *index;
Packit ae9e2a
	char tmp[64];
Packit ae9e2a
	int i;
Packit ae9e2a
	git_buf b = GIT_BUF_INIT;
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("renames");
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_index(&index, g_repo));
Packit ae9e2a
Packit ae9e2a
	git_buf_printf(&b, "%08d\n" ANOTHER_POEM "%08d\n" ANOTHER_POEM ANOTHER_POEM, 0, 0);
Packit ae9e2a
Packit ae9e2a
	for (i = 0; i < 2500; i += 1) {
Packit ae9e2a
		p_snprintf(tmp, sizeof(tmp), "renames/newfile%03d", i);
Packit ae9e2a
		p_snprintf(b.ptr, 9, "%08d", i);
Packit ae9e2a
		b.ptr[8] = '\n';
Packit ae9e2a
		cl_git_mkfile(tmp, b.ptr);
Packit ae9e2a
	}
Packit ae9e2a
	git_buf_free(&b);
Packit ae9e2a
Packit ae9e2a
	for (i = 0; i < 2500; i += 1) {
Packit ae9e2a
		p_snprintf(tmp, sizeof(tmp), "renames/newfile%03d", i);
Packit ae9e2a
		cl_git_pass(git_index_add_bypath(index, tmp + strlen("renames/")));
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	git_index_free(index);
Packit ae9e2a
Packit ae9e2a
	test_with_many(2500);
Packit ae9e2a
}