Commit 0c2d0d4b by Patrick Steinhardt

tests: object: refactor largefile test to not use `p_fallocate`

The `p_fallocate` platform is currently in use in our tests,
only, but it proved to be quite burdensome to get it implemented
in a cross-platform way. The only "real" user is the test
object::tree::read::largefile, where it's used to allocate a
large file in the filesystem only to commit it to the repo and
read its object back again. We can simplify this quite a bit by
just using an in-memory buffer of 4GB. Sure, this cannot be used
on platforms with low resources. But creating 4GB files is not
any better, and we already skip the test if the environment
variable "GITTEST_INVASIVE_FS_SIZE" is not set. So we're arguably
not worse off than before.
parent c3179eff
...@@ -79,46 +79,36 @@ void test_object_tree_read__two(void) ...@@ -79,46 +79,36 @@ void test_object_tree_read__two(void)
void test_object_tree_read__largefile(void) void test_object_tree_read__largefile(void)
{ {
git_reference *ref; const git_tree_entry *entry;
git_index_entry ie;
git_commit *commit; git_commit *commit;
git_object *object;
git_index *index;
git_tree *tree; git_tree *tree;
git_oid oid; git_oid oid;
const git_tree_entry *entry; char *buf;
git_object *object;
git_buf file = GIT_BUF_INIT;
int fd;
git_index *idx;
if (!cl_is_env_set("GITTEST_INVASIVE_FS_SIZE")) if (!cl_is_env_set("GITTEST_INVASIVE_FS_SIZE"))
cl_skip(); cl_skip();
cl_git_pass(git_reference_lookup(&ref, g_repo, "refs/heads/master")); cl_assert(buf = git__calloc(1, BIGFILE_SIZE));
cl_git_pass(git_repository_index(&idx, g_repo));
cl_git_pass(git_buf_puts(&file, git_repository_workdir(g_repo))); memset(&ie, 0, sizeof(ie));
cl_git_pass(git_buf_joinpath(&file, file.ptr, BIGFILE)); ie.mode = GIT_FILEMODE_BLOB;
ie.path = BIGFILE;
fd = p_open(git_buf_cstr(&file), O_CREAT|O_RDWR, 0644); cl_git_pass(git_repository_index(&index, g_repo));
cl_assert_(fd >= 0, "invalid file descriptor"); cl_git_pass(git_index_add_frombuffer(index, &ie, buf, BIGFILE_SIZE));
cl_repo_commit_from_index(&oid, g_repo, NULL, 0, BIGFILE);
cl_must_pass(p_fallocate(fd, 0, BIGFILE_SIZE));
cl_must_pass(p_close(fd));
cl_git_pass(git_index_add_bypath(idx, BIGFILE));
cl_repo_commit_from_index(&oid, g_repo, NULL, 0, "bigfile");
cl_git_pass(git_commit_lookup(&commit, g_repo, &oid)); cl_git_pass(git_commit_lookup(&commit, g_repo, &oid));
cl_git_pass(git_commit_tree(&tree, commit)); cl_git_pass(git_commit_tree(&tree, commit));
cl_assert(entry = git_tree_entry_byname(tree, BIGFILE));
entry = git_tree_entry_byname(tree, BIGFILE);
cl_assert_(entry, "entry was NULL");
cl_git_pass(git_tree_entry_to_object(&object, g_repo, entry)); cl_git_pass(git_tree_entry_to_object(&object, g_repo, entry));
git_buf_dispose(&file);
git_object_free(object); git_object_free(object);
git_tree_free(tree); git_tree_free(tree);
git_index_free(idx); git_index_free(index);
git_commit_free(commit); git_commit_free(commit);
git_reference_free(ref); git__free(buf);
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment