Blame tests/index/nsec.c

Packit Service 20376f
#include "clar_libgit2.h"
Packit Service 20376f
#include "index.h"
Packit Service 20376f
#include "git2/sys/index.h"
Packit Service 20376f
#include "git2/repository.h"
Packit Service 20376f
#include "../reset/reset_helpers.h"
Packit Service 20376f
Packit Service 20376f
static git_repository *repo;
Packit Service 20376f
static git_index *repo_index;
Packit Service 20376f
Packit Service 20376f
#define TEST_REPO_PATH "nsecs"
Packit Service 20376f
Packit Service 20376f
// Fixture setup and teardown
Packit Service 20376f
void test_index_nsec__initialize(void)
Packit Service 20376f
{
Packit Service 20376f
	repo = cl_git_sandbox_init("nsecs");
Packit Service 20376f
	git_repository_index(&repo_index, repo);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_index_nsec__cleanup(void)
Packit Service 20376f
{
Packit Service 20376f
	git_index_free(repo_index);
Packit Service 20376f
	repo_index = NULL;
Packit Service 20376f
Packit Service 20376f
	cl_git_sandbox_cleanup();
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static bool try_create_file_with_nsec_timestamp(const char *path)
Packit Service 20376f
{
Packit Service 20376f
	struct stat st;
Packit Service 20376f
	int try;
Packit Service 20376f
Packit Service 20376f
	/* retry a few times to avoid nanos *actually* equal 0 race condition */
Packit Service 20376f
	for (try = 0; try < 3; try++) {
Packit Service 20376f
		cl_git_mkfile(path, "This is hopefully a file with nanoseconds!");
Packit Service 20376f
Packit Service 20376f
		cl_must_pass(p_stat(path, &st);;
Packit Service 20376f
Packit Service 20376f
		if (st.st_ctime_nsec && st.st_mtime_nsec)
Packit Service 20376f
			return true;
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	return false;
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
/* try to determine if the underlying filesystem supports a resolution
Packit Service 20376f
 * higher than a single second.  (i'm looking at you, hfs+)
Packit Service 20376f
 */
Packit Service 20376f
static bool should_expect_nsecs(void)
Packit Service 20376f
{
Packit Service 20376f
	git_buf nsec_path = GIT_BUF_INIT;
Packit Service 20376f
	bool expect;
Packit Service 20376f
Packit Service 20376f
	git_buf_joinpath(&nsec_path, clar_sandbox_path(), "nsec_test");
Packit Service 20376f
Packit Service 20376f
	expect = try_create_file_with_nsec_timestamp(nsec_path.ptr);
Packit Service 20376f
Packit Service 20376f
	p_unlink(nsec_path.ptr);
Packit Service 20376f
Packit Service 20376f
	git_buf_free(&nsec_path);
Packit Service 20376f
Packit Service 20376f
	return expect;
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static bool has_nsecs(void)
Packit Service 20376f
{
Packit Service 20376f
	const git_index_entry *entry;
Packit Service 20376f
	size_t i;
Packit Service 20376f
	bool has_nsecs = false;
Packit Service 20376f
Packit Service 20376f
	for (i = 0; i < git_index_entrycount(repo_index); i++) {
Packit Service 20376f
		entry = git_index_get_byindex(repo_index, i);
Packit Service 20376f
Packit Service 20376f
		if (entry->ctime.nanoseconds || entry->mtime.nanoseconds) {
Packit Service 20376f
			has_nsecs = true;
Packit Service 20376f
			break;
Packit Service 20376f
		}
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	return has_nsecs;
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_index_nsec__has_nanos(void)
Packit Service 20376f
{
Packit Service 20376f
	cl_assert_equal_b(true, has_nsecs());
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_index_nsec__staging_maintains_other_nanos(void)
Packit Service 20376f
{
Packit Service 20376f
	const git_index_entry *entry;
Packit Service 20376f
	bool expect_nsec, test_file_has_nsec;
Packit Service 20376f
Packit Service 20376f
	expect_nsec = should_expect_nsecs();
Packit Service 20376f
	test_file_has_nsec = try_create_file_with_nsec_timestamp("nsecs/a.txt");
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_b(expect_nsec, test_file_has_nsec);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(repo_index, "a.txt"));
Packit Service 20376f
	cl_git_pass(git_index_write(repo_index));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_index_write(repo_index));
Packit Service 20376f
Packit Service 20376f
	git_index_read(repo_index, 1);
Packit Service 20376f
	cl_assert_equal_b(true, has_nsecs());
Packit Service 20376f
Packit Service 20376f
	cl_assert((entry = git_index_get_bypath(repo_index, "a.txt", 0)));
Packit Service 20376f
Packit Service 20376f
	/* if we are writing nanoseconds to the index, expect them to be
Packit Service 20376f
	 * nonzero.
Packit Service 20376f
	 */
Packit Service 20376f
	if (expect_nsec) {
Packit Service 20376f
		cl_assert(entry->ctime.nanoseconds != 0);
Packit Service 20376f
		cl_assert(entry->mtime.nanoseconds != 0);
Packit Service 20376f
	} else {
Packit Service 20376f
		cl_assert_equal_i(0, entry->ctime.nanoseconds);
Packit Service 20376f
		cl_assert_equal_i(0, entry->mtime.nanoseconds);
Packit Service 20376f
	}
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_index_nsec__status_doesnt_clear_nsecs(void)
Packit Service 20376f
{
Packit Service 20376f
	git_status_list *statuslist;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, repo, NULL));
Packit Service 20376f
Packit Service 20376f
	git_index_read(repo_index, 1);
Packit Service 20376f
	cl_assert_equal_b(true, has_nsecs());
Packit Service 20376f
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
}