#include "clar_libgit2.h" #include "patch.h" #include "patch_parse.h" #include "patch_common.h" static void ensure_patch_validity(git_patch *patch) { const git_diff_delta *delta; char idstr[GIT_OID_HEXSZ+1] = {0}; cl_assert((delta = git_patch_get_delta(patch)) != NULL); cl_assert_equal_i(2, delta->nfiles); cl_assert_equal_s(delta->old_file.path, "file.txt"); cl_assert(delta->old_file.mode == GIT_FILEMODE_BLOB); cl_assert_equal_i(7, delta->old_file.id_abbrev); git_oid_nfmt(idstr, delta->old_file.id_abbrev, &delta->old_file.id); cl_assert_equal_s(idstr, "9432026"); cl_assert_equal_i(0, delta->old_file.size); cl_assert_equal_s(delta->new_file.path, "file.txt"); cl_assert(delta->new_file.mode == GIT_FILEMODE_BLOB); cl_assert_equal_i(7, delta->new_file.id_abbrev); git_oid_nfmt(idstr, delta->new_file.id_abbrev, &delta->new_file.id); cl_assert_equal_s(idstr, "cd8fd12"); cl_assert_equal_i(0, delta->new_file.size); } void test_patch_parse__original_to_change_middle(void) { git_patch *patch; cl_git_pass(git_patch_from_buffer( &patch, PATCH_ORIGINAL_TO_CHANGE_MIDDLE, strlen(PATCH_ORIGINAL_TO_CHANGE_MIDDLE), NULL)); ensure_patch_validity(patch); git_patch_free(patch); } void test_patch_parse__leading_and_trailing_garbage(void) { git_patch *patch; const char *leading = "This is some leading garbage.\n" "Maybe it's email headers?\n" "\n" PATCH_ORIGINAL_TO_CHANGE_MIDDLE; const char *trailing = PATCH_ORIGINAL_TO_CHANGE_MIDDLE "\n" "This is some trailing garbage.\n" "Maybe it's an email signature?\n"; const char *both = "Here's some leading garbage\n" PATCH_ORIGINAL_TO_CHANGE_MIDDLE "And here's some trailing.\n"; cl_git_pass(git_patch_from_buffer(&patch, leading, strlen(leading), NULL)); ensure_patch_validity(patch); git_patch_free(patch); cl_git_pass(git_patch_from_buffer(&patch, trailing, strlen(trailing), NULL)); ensure_patch_validity(patch); git_patch_free(patch); cl_git_pass(git_patch_from_buffer(&patch, both, strlen(both), NULL)); ensure_patch_validity(patch); git_patch_free(patch); } void test_patch_parse__nonpatches_fail_with_notfound(void) { git_patch *patch; cl_git_fail_with(GIT_ENOTFOUND, git_patch_from_buffer(&patch, PATCH_NOT_A_PATCH, strlen(PATCH_NOT_A_PATCH), NULL)); } void test_patch_parse__invalid_patches_fails(void) { git_patch *patch; cl_git_fail_with(GIT_ERROR, git_patch_from_buffer(&patch, PATCH_CORRUPT_GIT_HEADER, strlen(PATCH_CORRUPT_GIT_HEADER), NULL)); cl_git_fail_with(GIT_ERROR, git_patch_from_buffer(&patch, PATCH_CORRUPT_MISSING_NEW_FILE, strlen(PATCH_CORRUPT_MISSING_NEW_FILE), NULL)); cl_git_fail_with(GIT_ERROR, git_patch_from_buffer(&patch, PATCH_CORRUPT_MISSING_OLD_FILE, strlen(PATCH_CORRUPT_MISSING_OLD_FILE), NULL)); cl_git_fail_with(GIT_ERROR, git_patch_from_buffer(&patch, PATCH_CORRUPT_NO_CHANGES, strlen(PATCH_CORRUPT_NO_CHANGES), NULL)); cl_git_fail_with(GIT_ERROR, git_patch_from_buffer(&patch, PATCH_CORRUPT_MISSING_HUNK_HEADER, strlen(PATCH_CORRUPT_MISSING_HUNK_HEADER), NULL)); }