summaryrefslogtreecommitdiff
path: root/tests-clar/commit/write.c
diff options
context:
space:
mode:
authorBen Straub <ben@straubnet.net>2012-03-19 21:41:29 -0700
committerBen Straub <ben@straubnet.net>2012-03-20 23:11:24 -0700
commite0799b6cd09faa729dca9e4c8cdf16a99ee60368 (patch)
tree0e431fb2ecf55586067ec593d4b0d775070bf746 /tests-clar/commit/write.c
parente71b78b02b6f28d1cf94dc5023fe1faba3f4026c (diff)
downloadlibgit2-e0799b6cd09faa729dca9e4c8cdf16a99ee60368.tar.gz
Ported t04_commit.c to Clar.
Created a copy of tests/resources/testrepo.git that is compatible with the Clar sandboxing helpers. Restructured commit test suites to use Clar sandbox helpers. Now using typed data arrays rather than lots of macros to define test cases.
Diffstat (limited to 'tests-clar/commit/write.c')
-rw-r--r--tests-clar/commit/write.c141
1 files changed, 141 insertions, 0 deletions
diff --git a/tests-clar/commit/write.c b/tests-clar/commit/write.c
new file mode 100644
index 00000000..66fe2bfc
--- /dev/null
+++ b/tests-clar/commit/write.c
@@ -0,0 +1,141 @@
+#include "clar_libgit2.h"
+
+static const char *committer_name = "Vicent Marti";
+static const char *committer_email = "vicent@github.com";
+static const char *commit_message = "This commit has been created in memory\n\
+ This is a commit created in memory and it will be written back to disk\n";
+static const char *tree_oid = "1810dff58d8a660512d4832e740f692884338ccd";
+static const char *root_commit_message = "This is a root commit\n\
+This is a root commit and should be the only one in this branch\n";
+
+
+// Fixture setup
+static git_repository *g_repo;
+void test_commit_write__initialize(void)
+{
+ g_repo = cl_git_sandbox_init("testrepo");
+}
+void test_commit_write__cleanup(void)
+{
+ cl_git_sandbox_cleanup();
+}
+
+
+// write a new commit object from memory to disk
+void test_commit_write__from_memory(void)
+{
+ git_commit *commit;
+ git_oid tree_id, parent_id, commit_id;
+ git_signature *author, *committer;
+ const git_signature *author1, *committer1;
+ git_commit *parent;
+ git_tree *tree;
+ const char *commit_id_str = "8496071c1b46c854b31185ea97743be6a8774479";
+
+ git_oid_fromstr(&tree_id, tree_oid);
+ cl_git_pass(git_tree_lookup(&tree, g_repo, &tree_id));
+
+ git_oid_fromstr(&parent_id, commit_id_str);
+ cl_git_pass(git_commit_lookup(&parent, g_repo, &parent_id));
+
+ /* create signatures */
+ cl_git_pass(git_signature_new(&committer, committer_name, committer_email, 123456789, 60));
+ cl_git_pass(git_signature_new(&author, committer_name, committer_email, 987654321, 90));
+
+ cl_git_pass(git_commit_create_v(
+ &commit_id, /* out id */
+ g_repo,
+ NULL, /* do not update the HEAD */
+ author,
+ committer,
+ NULL,
+ commit_message,
+ tree,
+ 1, parent));
+
+ git_object_free((git_object *)parent);
+ git_object_free((git_object *)tree);
+
+ git_signature_free(committer);
+ git_signature_free(author);
+
+ cl_git_pass(git_commit_lookup(&commit, g_repo, &commit_id));
+
+ /* Check attributes were set correctly */
+ author1 = git_commit_author(commit);
+ cl_assert(author1 != NULL);
+ cl_assert(strcmp(author1->name, committer_name) == 0);
+ cl_assert(strcmp(author1->email, committer_email) == 0);
+ cl_assert(author1->when.time == 987654321);
+ cl_assert(author1->when.offset == 90);
+
+ committer1 = git_commit_committer(commit);
+ cl_assert(committer1 != NULL);
+ cl_assert(strcmp(committer1->name, committer_name) == 0);
+ cl_assert(strcmp(committer1->email, committer_email) == 0);
+ cl_assert(committer1->when.time == 123456789);
+ cl_assert(committer1->when.offset == 60);
+
+ cl_assert(strcmp(git_commit_message(commit), commit_message) == 0);
+
+#ifndef GIT_WIN32
+ cl_assert((loose_object_mode(REPOSITORY_FOLDER, (git_object *)commit) & 0777) == GIT_OBJECT_FILE_MODE);
+#endif
+}
+
+
+
+// create a root commit
+void test_commit_write__root(void)
+{
+ git_commit *commit;
+ git_oid tree_id, commit_id;
+ const git_oid *branch_oid;
+ git_signature *author, *committer;
+ const char *branch_name = "refs/heads/root-commit-branch";
+ git_reference *head, *branch;
+ char *head_old;
+ git_tree *tree;
+
+ git_oid_fromstr(&tree_id, tree_oid);
+ cl_git_pass(git_tree_lookup(&tree, g_repo, &tree_id));
+
+ /* create signatures */
+ cl_git_pass(git_signature_new(&committer, committer_name, committer_email, 123456789, 60));
+ cl_git_pass(git_signature_new(&author, committer_name, committer_email, 987654321, 90));
+
+ /* First we need to update HEAD so it points to our non-existant branch */
+ cl_git_pass(git_reference_lookup(&head, g_repo, "HEAD"));
+ cl_assert(git_reference_type(head) == GIT_REF_SYMBOLIC);
+ head_old = git__strdup(git_reference_target(head));
+ cl_assert(head_old != NULL);
+
+ cl_git_pass(git_reference_set_target(head, branch_name));
+
+ cl_git_pass(git_commit_create_v(
+ &commit_id, /* out id */
+ g_repo,
+ "HEAD",
+ author,
+ committer,
+ NULL,
+ root_commit_message,
+ tree,
+ 0));
+
+ git_object_free((git_object *)tree);
+ git_signature_free(committer);
+ git_signature_free(author);
+
+ /*
+ * The fact that creating a commit works has already been
+ * tested. Here we just make sure it's our commit and that it was
+ * written as a root commit.
+ */
+ cl_git_pass(git_commit_lookup(&commit, g_repo, &commit_id));
+ cl_assert(git_commit_parentcount(commit) == 0);
+ cl_git_pass(git_reference_lookup(&branch, g_repo, branch_name));
+ branch_oid = git_reference_oid(branch);
+ cl_git_pass(git_oid_cmp(branch_oid, &commit_id));
+ cl_assert(!strcmp(git_commit_message(commit), root_commit_message));
+}