diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/odb/loose.c | 21 | ||||
-rw-r--r-- | tests/pack/packbuilder.c | 25 | ||||
-rw-r--r-- | tests/refs/create.c | 67 |
3 files changed, 79 insertions, 34 deletions
diff --git a/tests/odb/loose.c b/tests/odb/loose.c index fd4a53837..dd686aa01 100644 --- a/tests/odb/loose.c +++ b/tests/odb/loose.c @@ -3,6 +3,7 @@ #include "git2/odb_backend.h" #include "posix.h" #include "loose_data.h" +#include "repository.h" #ifdef __ANDROID_API__ # define S_IREAD S_IRUSR @@ -184,3 +185,23 @@ void test_odb_loose__fsync_obeys_global_setting(void) write_object_to_loose_odb(0); cl_assert(p_fsync__cnt > 0); } + +void test_odb_loose__fsync_obeys_repo_setting(void) +{ + git_repository *repo; + git_odb *odb; + git_oid oid; + + cl_git_pass(git_repository_init(&repo, "test-objects", 1)); + cl_git_pass(git_repository_odb__weakptr(&odb, repo)); + cl_git_pass(git_odb_write(&oid, odb, "No fsync here\n", 14, GIT_OBJ_BLOB)); + cl_assert(p_fsync__cnt == 0); + git_repository_free(repo); + + cl_git_pass(git_repository_open(&repo, "test-objects")); + cl_repo_set_bool(repo, "core.fsyncObjectFiles", true); + cl_git_pass(git_repository_odb__weakptr(&odb, repo)); + cl_git_pass(git_odb_write(&oid, odb, "Now fsync\n", 10, GIT_OBJ_BLOB)); + cl_assert(p_fsync__cnt > 0); + git_repository_free(repo); +} diff --git a/tests/pack/packbuilder.c b/tests/pack/packbuilder.c index 5cdd9a8d2..1d7becef7 100644 --- a/tests/pack/packbuilder.c +++ b/tests/pack/packbuilder.c @@ -198,22 +198,31 @@ void test_pack_packbuilder__does_not_fsync_by_default(void) cl_assert_equal_sz(0, p_fsync__cnt); } -void test_pack_packbuilder__fsync_when_asked(void) -{ - /* We fsync the packfile and index. On non-Windows, we also fsync - * the parent directories. - */ +/* We fsync the packfile and index. On non-Windows, we also fsync + * the parent directories. + */ #ifdef GIT_WIN32 - int expected = 2; +static int expected_fsyncs = 2; #else - int expected = 4; +static int expected_fsyncs = 4; #endif +void test_pack_packbuilder__fsync_global_setting(void) +{ cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_SYNCHRONOUS_OBJECT_CREATION, 1)); p_fsync__cnt = 0; seed_packbuilder(); git_packbuilder_write(_packbuilder, ".", 0666, NULL, NULL); - cl_assert_equal_sz(expected, p_fsync__cnt); + cl_assert_equal_sz(expected_fsyncs, p_fsync__cnt); +} + +void test_pack_packbuilder__fsync_repo_setting(void) +{ + cl_repo_set_bool(_repo, "core.fsyncObjectFiles", true); + p_fsync__cnt = 0; + seed_packbuilder(); + git_packbuilder_write(_packbuilder, ".", 0666, NULL, NULL); + cl_assert_equal_sz(expected_fsyncs, p_fsync__cnt); } static int foreach_cb(void *buf, size_t len, void *payload) diff --git a/tests/refs/create.c b/tests/refs/create.c index 6265aee47..7b582d708 100644 --- a/tests/refs/create.c +++ b/tests/refs/create.c @@ -300,53 +300,68 @@ void test_refs_create__creating_a_loose_ref_with_invalid_windows_name(void) test_win32_name("refs/heads/com1"); } -void test_refs_create__does_not_fsync_by_default(void) +/* Creating a loose ref involves fsync'ing the reference, the + * reflog and (on non-Windows) the containing directories. + * Creating a packed ref involves fsync'ing the packed ref file + * and (on non-Windows) the containing directory. + */ +#ifdef GIT_WIN32 +static int expected_fsyncs_create = 2, expected_fsyncs_compress = 1; +#else +static int expected_fsyncs_create = 4, expected_fsyncs_compress = 2; +#endif + +static void count_fsyncs(size_t *create_count, size_t *compress_count) { git_reference *ref = NULL; git_refdb *refdb; git_oid id; + p_fsync__cnt = 0; + git_oid_fromstr(&id, current_master_tip); cl_git_pass(git_reference_create(&ref, g_repo, "refs/heads/fsync_test", &id, 0, "log message")); git_reference_free(ref); + *create_count = p_fsync__cnt; + p_fsync__cnt = 0; + cl_git_pass(git_repository_refdb(&refdb, g_repo)); cl_git_pass(git_refdb_compress(refdb)); git_refdb_free(refdb); - cl_assert_equal_i(0, p_fsync__cnt); + *compress_count = p_fsync__cnt; + p_fsync__cnt = 0; } -void test_refs_create__fsyncs_when_requested(void) +void test_refs_create__does_not_fsync_by_default(void) { - git_reference *ref = NULL; - git_refdb *refdb; - git_oid id; + size_t create_count, compress_count; + count_fsyncs(&create_count, &compress_count); - /* Creating a loose ref involves fsync'ing the reference, the - * reflog and (on non-Windows) the containing directories. - * Creating a packed ref involves fsync'ing the packed ref file - * and (on non-Windows) the containing directory. - */ -#ifdef GIT_WIN32 - int expected_create = 2, expected_compress = 1; -#else - int expected_create = 4, expected_compress = 2; -#endif + cl_assert_equal_i(0, create_count); + cl_assert_equal_i(0, compress_count); +} + +void test_refs_create__fsyncs_when_global_opt_set(void) +{ + size_t create_count, compress_count; cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_SYNCHRONOUS_OBJECT_CREATION, 1)); - p_fsync__cnt = 0; + count_fsyncs(&create_count, &compress_count); - git_oid_fromstr(&id, current_master_tip); - cl_git_pass(git_reference_create(&ref, g_repo, "refs/heads/fsync_test", &id, 0, "log message")); - git_reference_free(ref); - cl_assert_equal_i(expected_create, p_fsync__cnt); + cl_assert_equal_i(expected_fsyncs_create, create_count); + cl_assert_equal_i(expected_fsyncs_compress, compress_count); +} - p_fsync__cnt = 0; +void test_refs_create__fsyncs_when_repo_config_set(void) +{ + size_t create_count, compress_count; - cl_git_pass(git_repository_refdb(&refdb, g_repo)); - cl_git_pass(git_refdb_compress(refdb)); - git_refdb_free(refdb); + cl_repo_set_bool(g_repo, "core.fsyncObjectFiles", true); + + count_fsyncs(&create_count, &compress_count); - cl_assert_equal_i(expected_compress, p_fsync__cnt); + cl_assert_equal_i(expected_fsyncs_create, create_count); + cl_assert_equal_i(expected_fsyncs_compress, compress_count); } |