Commit 42281e007e15713713b2ff4324d60360332e194e

Vicent Marti 2010-05-16T01:52:31

Add unit tests for Commit parsing A few initial tests for commit parsing: "parse_buffer_test" tests git_commit__parse_buffer() with several malformed commit messages and a few corner cases which should pass. "parse_oid_test" tests git_commit__parse_oid() with several malformed commit lines containing broken SHA1 OIDs. Signed-off-by: Vicent Marti <tanoku@gmail.com> Signed-off-by: Andreas Ericsson <ae@op5.se>

diff --git a/src/commit.c b/src/commit.c
index bbb0d9b..1b30c5d 100644
--- a/src/commit.c
+++ b/src/commit.c
@@ -40,6 +40,9 @@ git_commit *git_commit_lookup(git_revpool *pool, const git_oid *id)
     git_obj commit_obj;
     git_commit *commit = NULL;
 
+    if (pool == NULL || pool->db == NULL)
+        return NULL;
+
     /*
      * TODO: check if the commit is already cached in the
      * revpool instead of loading it from the odb
diff --git a/tests/NAMING b/tests/NAMING
index 73bb602..eba9147 100644
--- a/tests/NAMING
+++ b/tests/NAMING
@@ -20,3 +20,5 @@ Categories
 02__: Basic object read access.
 
 03__: Basic object writing.
+
+04__: Parsing and loading commit data
diff --git a/tests/t0401-parse.c b/tests/t0401-parse.c
new file mode 100644
index 0000000..5b209c9
--- /dev/null
+++ b/tests/t0401-parse.c
@@ -0,0 +1,163 @@
+#include "test_lib.h"
+#include "test_helpers.h"
+#include "commit.h"
+#include <git/odb.h>
+#include <git/commit.h>
+
+static char *test_commits_broken[] = {
+
+    // empty commit
+"",
+
+    // random garbage
+"asd97sa9du902e9a0jdsuusad09as9du098709aweu8987sd\n",
+
+    // broken endlines 1
+"tree f6c0dad3c7b3481caa9d73db21f91964894a945b\r\n\
+parent 05452d6349abcd67aa396dfb28660d765d8b2a36\r\n\
+author Vicent Marti <tanoku@gmail.com> 1273848544 +0200\r\n\
+committer Vicent Marti <tanoku@gmail.com> 1273848544 +0200\r\n\
+\r\n\
+a test commit with broken endlines\r\n",
+
+    // broken endlines 2
+"tree f6c0dad3c7b3481caa9d73db21f91964894a945b\
+parent 05452d6349abcd67aa396dfb28660d765d8b2a36\
+author Vicent Marti <tanoku@gmail.com> 1273848544 +0200\
+committer Vicent Marti <tanoku@gmail.com> 1273848544 +0200\
+\
+another test commit with broken endlines",
+
+    // starting endlines
+"\ntree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\
+parent 05452d6349abcd67aa396dfb28660d765d8b2a36\n\
+author Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
+committer Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
+\n\
+a test commit with a starting endline\n",
+
+    // corrupted commit 1
+"tree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\
+parent 05452d6349abcd67aa396df",
+
+    // corrupted commit 2
+"tree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\
+parent ",
+
+    // corrupted commit 3
+"tree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\
+parent ",
+
+    // corrupted commit 4
+"tree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\
+par",
+
+    // FIXME: duplicated parents?
+    // It this supposed to pass?
+/*
+"tree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\
+parent 05452d6349abcd67aa396dfb28660d765d8b2a36\n\
+parent 05452d6349abcd67aa396dfb28660d765d8b2a36\n\
+author Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
+committer Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
+\n\
+duplicated parent",
+*/
+};
+
+
+static char *test_commits_working[] = {
+    // simple commit with no message
+"tree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\
+author Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
+committer Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
+\n",
+
+    // simple commit, no parent
+"tree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\
+author Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
+committer Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
+\n\
+a simple commit which works\n",
+
+    // simple commit, 1 parents
+"tree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\
+parent 05452d6349abcd67aa396dfb28660d765d8b2a36\n\
+author Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
+committer Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
+\n\
+a simple commit which works\n",
+};
+
+BEGIN_TEST(parse_oid_test)
+
+    git_oid oid;
+
+#define TEST_OID_PASS(string, header){ \
+    char *ptr = string;\
+    char *ptr_original = ptr;\
+    size_t len = strlen(ptr);\
+    must_pass(git_commit__parse_oid(&oid, &ptr, ptr + len, header));\
+    must_be_true(ptr == ptr_original + len);\
+}
+
+#define TEST_OID_FAIL(string, header){ \
+    char *ptr = string;\
+    size_t len = strlen(ptr);\
+    must_fail(git_commit__parse_oid(&oid, &ptr, ptr + len, header));\
+}
+
+    TEST_OID_PASS("parent 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "parent ");
+    TEST_OID_PASS("tree 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "tree ");
+    TEST_OID_PASS("random_heading 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "random_heading ");
+    TEST_OID_PASS("stuck_heading05452d6349abcd67aa396dfb28660d765d8b2a36\n", "stuck_heading");
+    TEST_OID_PASS("tree 5F4BEFFC0759261D015AA63A3A85613FF2F235DE\n", "tree ");
+    TEST_OID_PASS("tree 1A669B8AB81B5EB7D9DB69562D34952A38A9B504\n", "tree ");
+    TEST_OID_PASS("tree 5B20DCC6110FCC75D31C6CEDEBD7F43ECA65B503\n", "tree ");
+    TEST_OID_PASS("tree 173E7BF00EA5C33447E99E6C1255954A13026BE4\n", "tree ");
+
+    TEST_OID_FAIL("parent 05452d6349abcd67aa396dfb28660d765d8b2a36", "parent ");
+    TEST_OID_FAIL("05452d6349abcd67aa396dfb28660d765d8b2a36\n", "tree ");
+    TEST_OID_FAIL("parent05452d6349abcd67aa396dfb28660d765d8b2a6a\n", "parent ");
+    TEST_OID_FAIL("parent 05452d6349abcd67aa396dfb280d765d8b2a6\n", "parent ");
+    TEST_OID_FAIL("tree  05452d6349abcd67aa396dfb28660d765d8b2a36\n", "tree ");
+    TEST_OID_FAIL("parent 0545xd6349abcd67aa396dfb28660d765d8b2a36\n", "parent ");
+    TEST_OID_FAIL("parent 0545xd6349abcd67aa396dfb28660d765d8b2a36FF\n", "parent ");
+    TEST_OID_FAIL("", "tree ");
+    TEST_OID_FAIL("", "");
+
+#undef TEST_OID_PASS
+#undef TEST_OID_FAIL
+
+END_TEST
+
+BEGIN_TEST(parse_buffer_test)
+    const int broken_commit_count = sizeof(test_commits_broken) / sizeof(*test_commits_broken);
+    const int working_commit_count = sizeof(test_commits_working) / sizeof(*test_commits_working);
+    int i;
+
+    for (i = 0; i < broken_commit_count; ++i) {
+        git_commit commit;
+        commit.parsed = 0;
+        commit.pool = NULL;
+
+        must_fail(git_commit__parse_buffer(
+                    &commit,
+                    test_commits_broken[i],
+                    strlen(test_commits_broken[i]))
+                );
+    }
+
+    for (i = 0; i < working_commit_count; ++i) {
+        git_commit commit;
+        commit.parsed = 0;
+        commit.pool = NULL;
+
+        must_pass(git_commit__parse_buffer(
+                    &commit,
+                    test_commits_working[i],
+                    strlen(test_commits_working[i]))
+                );
+    }
+
+END_TEST