Blame tests/index/version.c

Packit Service 20376f
#include "clar_libgit2.h"
Packit Service 20376f
#include "index.h"
Packit Service 20376f
Packit Service 20376f
static git_repository *g_repo = NULL;
Packit Service 20376f
Packit Service 20376f
void test_index_version__cleanup(void)
Packit Service 20376f
{
Packit Service 20376f
        cl_git_sandbox_cleanup();
Packit Service 20376f
        g_repo = NULL;
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_index_version__can_read_v4(void)
Packit Service 20376f
{
Packit Service 20376f
	const char *paths[] = {
Packit Service 20376f
	    "file.tx", "file.txt", "file.txz", "foo", "zzz",
Packit Service 20376f
	};
Packit Service 20376f
	git_index *index;
Packit Service 20376f
	size_t i;
Packit Service 20376f
Packit Service 20376f
	g_repo = cl_git_sandbox_init("indexv4");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_index(&index, g_repo));
Packit Service 20376f
	cl_assert_equal_sz(git_index_entrycount(index), 5);
Packit Service 20376f
Packit Service 20376f
	for (i = 0; i < ARRAY_SIZE(paths); i++) {
Packit Service 20376f
		const git_index_entry *entry =
Packit Service 20376f
		    git_index_get_bypath(index, paths[i], GIT_INDEX_STAGE_NORMAL);
Packit Service 20376f
Packit Service 20376f
		cl_assert(entry != NULL);
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_index_version__can_write_v4(void)
Packit Service 20376f
{
Packit Service 20376f
	const char *paths[] = {
Packit Service 20376f
	    "foo",
Packit Service 20376f
	    "foox",
Packit Service 20376f
	    "foobar",
Packit Service 20376f
	    "foobal",
Packit Service 20376f
	    "x",
Packit Service 20376f
	    "xz",
Packit Service 20376f
	    "xyzzyx"
Packit Service 20376f
	};
Packit Service 20376f
	git_index_entry entry;
Packit Service 20376f
	git_index *index;
Packit Service 20376f
	size_t i;
Packit Service 20376f
Packit Service 20376f
	g_repo = cl_git_sandbox_init("empty_standard_repo");
Packit Service 20376f
	cl_git_pass(git_repository_index(&index, g_repo));
Packit Service 20376f
	cl_git_pass(git_index_set_version(index, 4));
Packit Service 20376f
Packit Service 20376f
	for (i = 0; i < ARRAY_SIZE(paths); i++) {
Packit Service 20376f
		memset(&entry, 0, sizeof(entry));
Packit Service 20376f
		entry.path = paths[i];
Packit Service 20376f
		entry.mode = GIT_FILEMODE_BLOB;
Packit Service 20376f
		cl_git_pass(git_index_add_frombuffer(index, &entry, paths[i],
Packit Service 20376f
						     strlen(paths[i]) + 1));
Packit Service 20376f
	}
Packit Service 20376f
	cl_assert_equal_sz(git_index_entrycount(index), ARRAY_SIZE(paths));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_index_write(index));
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_index(&index, g_repo));
Packit Service 20376f
	cl_assert(git_index_version(index) == 4);
Packit Service 20376f
Packit Service 20376f
	for (i = 0; i < ARRAY_SIZE(paths); i++) {
Packit Service 20376f
		const git_index_entry *e;
Packit Service 20376f
Packit Service 20376f
		cl_assert(e = git_index_get_bypath(index, paths[i], 0));
Packit Service 20376f
		cl_assert_equal_s(paths[i], e->path);
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_index_version__v4_uses_path_compression(void)
Packit Service 20376f
{
Packit Service 20376f
	git_index_entry entry;
Packit Service 20376f
	git_index *index;
Packit Service 20376f
	char path[250], buf[1];
Packit Service 20376f
	struct stat st;
Packit Service 20376f
	char i, j;
Packit Service 20376f
Packit Service 20376f
	memset(path, 'a', sizeof(path));
Packit Service 20376f
	memset(buf, 'a', sizeof(buf));
Packit Service 20376f
Packit Service 20376f
	memset(&entry, 0, sizeof(entry));
Packit Service 20376f
	entry.path = path;
Packit Service 20376f
	entry.mode = GIT_FILEMODE_BLOB;
Packit Service 20376f
Packit Service 20376f
	g_repo = cl_git_sandbox_init("indexv4");
Packit Service 20376f
	cl_git_pass(git_repository_index(&index, g_repo));
Packit Service 20376f
Packit Service 20376f
	/* write 676 paths of 250 bytes length */
Packit Service 20376f
	for (i = 'a'; i <= 'z'; i++) {
Packit Service 20376f
		for (j = 'a'; j < 'z'; j++) {
Packit Service 20376f
			path[ARRAY_SIZE(path) - 3] = i;
Packit Service 20376f
			path[ARRAY_SIZE(path) - 2] = j;
Packit Service 20376f
			path[ARRAY_SIZE(path) - 1] = '\0';
Packit Service 20376f
			cl_git_pass(git_index_add_frombuffer(index, &entry, buf, sizeof(buf)));
Packit Service 20376f
		}
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_index_write(index));
Packit Service 20376f
	cl_git_pass(p_stat(git_index_path(index), &st);;
Packit Service 20376f
Packit Service 20376f
	/*
Packit Service 20376f
	 * Without path compression, the written paths would at
Packit Service 20376f
	 * least take
Packit Service 20376f
	 *
Packit Service 20376f
	 *    (entries * pathlen) = len
Packit Service 20376f
	 *    (676 * 250) = 169000
Packit Service 20376f
	 *
Packit Service 20376f
	 *  bytes. As index v4 uses suffix-compression and our
Packit Service 20376f
	 *  written paths only differ in the last two entries,
Packit Service 20376f
	 *  this number will be much smaller, e.g.
Packit Service 20376f
	 *
Packit Service 20376f
	 *    (1 * pathlen) + (675 * 2) = len
Packit Service 20376f
	 *    676 + 1350 = 2026
Packit Service 20376f
	 *
Packit Service 20376f
	 *    bytes.
Packit Service 20376f
	 *
Packit Service 20376f
	 *    Note that the above calculations do not include
Packit Service 20376f
	 *    additional metadata of the index, e.g. OIDs or
Packit Service 20376f
	 *    index extensions. Including those we get an index
Packit Service 20376f
	 *    of approx. 200kB without compression and 40kB with
Packit Service 20376f
	 *    compression. As this is a lot smaller than without
Packit Service 20376f
	 *    compression, we can verify that path compression is
Packit Service 20376f
	 *    used.
Packit Service 20376f
	 */
Packit Service 20376f
	cl_assert_(st.st_size < 75000, "path compression not enabled");
Packit Service 20376f
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
}