tests: core: test deinitialization and concurrent initialization

Exercise the logic surrounding deinitialization of the libgit2
library as well as repeated concurrent de- and reinitialization.
This tries to catch races and makes sure that it is possible to
reinitialize libgit2 multiple times.

After deinitializing libgit2, we have to make sure to setup
options required for testing. Currently, this only includes
setting up the configuration search path again. Before, this has
been set up once in `tests/main.c`.
diff --git a/tests/core/init.c b/tests/core/init.c
index e17b784..cd90b37 100644
--- a/tests/core/init.c
+++ b/tests/core/init.c
@@ -12,3 +12,43 @@
 	cl_assert_equal_i(1, git_libgit2_shutdown());
 }
 
+void test_core_init__reinit_succeeds(void)
+{
+	cl_assert_equal_i(0, git_libgit2_shutdown());
+	cl_assert_equal_i(1, git_libgit2_init());
+	cl_sandbox_set_search_path_defaults();
+}
+
+#ifdef GIT_THREADS
+static void *reinit(void *unused)
+{
+	unsigned i;
+
+	for (i = 0; i < 20; i++) {
+		cl_assert(git_libgit2_init() > 0);
+		cl_assert(git_libgit2_shutdown() >= 0);
+	}
+
+	return unused;
+}
+#endif
+
+void test_core_init__concurrent_init_succeeds(void)
+{
+#ifdef GIT_THREADS
+	git_thread threads[10];
+	unsigned i;
+
+	cl_assert_equal_i(0, git_libgit2_shutdown());
+
+	for (i = 0; i < ARRAY_SIZE(threads); i++)
+		git_thread_create(&threads[i], reinit, NULL);
+	for (i = 0; i < ARRAY_SIZE(threads); i++)
+		git_thread_join(&threads[i], NULL);
+
+	cl_assert_equal_i(1, git_libgit2_init());
+	cl_sandbox_set_search_path_defaults();
+#else
+	cl_skip();
+#endif
+}