--- /dev/null
+#include "test_lib.h"
+#include "test_helpers.h"
+#include "index.h"
+
+#include <git/odb.h>
+#include <git/index.h>
+
+#define TEST_INDEX_PATH "../resources/index"
+#define TEST_INDEX2_PATH "../resources/gitgit.index"
+
+#define TEST_INDEX_ENTRY_COUNT 109
+#define TEST_INDEX2_ENTRY_COUNT 1437
+
+struct test_entry {
+ unsigned int index;
+ char path[128];
+ size_t file_size;
+ uint32_t mtime;
+};
+
+struct test_entry TEST_ENTRIES[] = {
+ {4, "Makefile", 5064, 0x4C3F7F33},
+ {62, "tests/Makefile", 2631, 0x4C3F7F33},
+ {36, "src/index.c", 10014, 0x4C43368D},
+ {6, "git.git-authors", 2709, 0x4C3F7F33},
+ {48, "src/revobject.h", 1448, 0x4C3F7FE2}
+};
+
+BEGIN_TEST(index_loadempty_test)
+ git_index *index;
+
+ index = git_index_alloc("in-memory-index");
+ must_be_true(index != NULL);
+ must_be_true(index->on_disk == 0);
+
+ must_pass(git_index_read(index));
+
+ must_be_true(index->on_disk == 0);
+ must_be_true(index->entry_count == 0);
+ must_be_true(index->sorted);
+
+ git_index_free(index);
+END_TEST
+
+BEGIN_TEST(index_load_test)
+ git_index *index;
+ unsigned int i;
+
+ index = git_index_alloc(TEST_INDEX_PATH);
+ must_be_true(index != NULL);
+ must_be_true(index->on_disk);
+
+ must_pass(git_index_read(index));
+
+ must_be_true(index->on_disk);
+ must_be_true(index->entry_count == TEST_INDEX_ENTRY_COUNT);
+ must_be_true(index->sorted);
+
+ for (i = 0; i < ARRAY_SIZE(TEST_ENTRIES); ++i) {
+ git_index_entry *e = &index->entries[TEST_ENTRIES[i].index];
+
+ must_be_true(strcmp(e->path, TEST_ENTRIES[i].path) == 0);
+ must_be_true(e->mtime.seconds == TEST_ENTRIES[i].mtime);
+ must_be_true(e->file_size == TEST_ENTRIES[i].file_size);
+ }
+
+ git_index_free(index);
+END_TEST
+
+BEGIN_TEST(index2_load_test)
+ git_index *index;
+
+ index = git_index_alloc(TEST_INDEX2_PATH);
+ must_be_true(index != NULL);
+ must_be_true(index->on_disk);
+
+ must_pass(git_index_read(index));
+
+ must_be_true(index->on_disk);
+ must_be_true(index->entry_count == TEST_INDEX2_ENTRY_COUNT);
+ must_be_true(index->sorted);
+ must_be_true(index->tree != NULL);
+
+ git_index_free(index);
+END_TEST
+
+BEGIN_TEST(index_find_test)
+ git_index *index;
+ unsigned int i;
+
+ index = git_index_alloc(TEST_INDEX_PATH);
+ must_be_true(index != NULL);
+ must_pass(git_index_read(index));
+
+ for (i = 0; i < ARRAY_SIZE(TEST_ENTRIES); ++i) {
+ int idx = git_index_find(index, TEST_ENTRIES[i].path);
+ must_be_true((unsigned int)idx == TEST_ENTRIES[i].index);
+ }
+
+ git_index_free(index);
+END_TEST
+
+BEGIN_TEST(index_findempty_test)
+ git_index *index;
+ unsigned int i;
+
+ index = git_index_alloc("fake-index");
+ must_be_true(index != NULL);
+
+ for (i = 0; i < ARRAY_SIZE(TEST_ENTRIES); ++i) {
+ int idx = git_index_find(index, TEST_ENTRIES[i].path);
+ must_be_true(idx == GIT_ENOTFOUND);
+ }
+
+ git_index_free(index);
+END_TEST
--- /dev/null
+#include "test_lib.h"
+#include "test_helpers.h"
+#include "index.h"
+
+#include <git/odb.h>
+#include <git/index.h>
+
+#define TEST_INDEX_PATH "../resources/index"
+
+int filecmp(const char *filename1, const char *filename2)
+{
+ git_file file1, file2;
+ struct stat stat1, stat2;
+
+ /* char buffer1[1024], buffer2[1024]; */
+
+ file1 = gitfo_open(filename1, O_RDONLY);
+ file2 = gitfo_open(filename2, O_RDONLY);
+
+ if (file1 < 0 || file2 < 0)
+ return GIT_ERROR;
+
+ gitfo_fstat(file1, &stat1);
+ gitfo_fstat(file2, &stat2);
+
+ if (stat1.st_size != stat2.st_size)
+ return GIT_ERROR;
+
+ /* TODO: byte-per-byte comparison */
+
+ return 0;
+}
+
+BEGIN_TEST(index_load_test)
+ git_index *index;
+ git_filelock out_file;
+
+ index = git_index_alloc(TEST_INDEX_PATH);
+ must_be_true(index != NULL);
+ must_pass(git_index_read(index));
+ must_be_true(index->on_disk);
+
+ must_pass(git_filelock_init(&out_file, "index_rewrite"));
+ must_pass(git_filelock_lock(&out_file, 0));
+ must_pass(git_index__write(index, &out_file));
+ must_pass(git_filelock_commit(&out_file));
+
+ git_index_free(index);
+END_TEST
--- /dev/null
+#include "test_lib.h"
+#include "test_helpers.h"
+#include "index.h"
+
+#include <git/odb.h>
+#include <git/index.h>
+
+#define TEST_INDEX_PATH "../t0600-objects/index"
+
+void print_entries(git_index *index)
+{
+ unsigned int i;
+
+ for (i = 0; i < index->entry_count; ++i)
+ printf("%d: %s\n", i, index->entries[i].path);
+}
+
+void randomize_entries(git_index *index)
+{
+ unsigned int i, j;
+ git_index_entry tmp;
+
+ srand(time(NULL));
+
+ for (i = 0; i < index->entry_count; ++i) {
+ j = rand() % index->entry_count;
+ memcpy(&tmp, &index->entries[j], sizeof(git_index_entry));
+ memcpy(&index->entries[j], &index->entries[i], sizeof(git_index_entry));
+ memcpy(&index->entries[i], &tmp, sizeof(git_index_entry));
+ }
+
+ index->sorted = 0;
+}
+
+BEGIN_TEST(index_sort_test)
+ git_index *index;
+ unsigned int i;
+
+ index = git_index_alloc(TEST_INDEX_PATH);
+ must_be_true(index != NULL);
+ must_pass(git_index_read(index));
+
+ randomize_entries(index);
+
+ git_index__sort(index);
+ must_be_true(index->sorted);
+
+ for (i = 1; i < index->entry_count; ++i)
+ must_be_true(strcmp(index->entries[i - 1].path,
+ index->entries[i].path) < 0);
+
+ git_index_free(index);
+END_TEST
+
+BEGIN_TEST(index_sort_empty_test)
+ git_index *index;
+ index = git_index_alloc("fake-index");
+ must_be_true(index != NULL);
+
+ git_index__sort(index);
+ must_be_true(index->sorted);
+
+ git_index_free(index);
+END_TEST