Commit 0f65733b by Vicent Marti

Clar: skip tests

parent ada157b2
...@@ -137,14 +137,14 @@ void test_blame_simple__trivial_libgit2(void) ...@@ -137,14 +137,14 @@ void test_blame_simple__trivial_libgit2(void)
/* If we can't open the libgit2 repo or if it isn't a full repo /* If we can't open the libgit2 repo or if it isn't a full repo
* with proper history, just skip this test */ * with proper history, just skip this test */
if (git_repository_open(&g_repo, cl_fixture("../..")) < 0 || if (git_repository_open(&g_repo, cl_fixture("../..")) < 0)
git_repository_is_shallow(g_repo) || cl_skip();
git_revparse_single(&obj, g_repo, "359fc2d") < 0)
{ if (git_repository_is_shallow(g_repo))
printf("NOT INSIDE VALID LIBGIT2 REPO; skipping blame test\n"); cl_skip();
giterr_clear();
return; if (git_revparse_single(&obj, g_repo, "359fc2d") < 0)
} cl_skip();
git_oid_cpy(&opts.newest_commit, git_object_id(obj)); git_oid_cpy(&opts.newest_commit, git_object_id(obj));
git_object_free(obj); git_object_free(obj);
......
...@@ -109,10 +109,11 @@ static struct { ...@@ -109,10 +109,11 @@ static struct {
int argc; int argc;
char **argv; char **argv;
enum cl_test_status test_status;
const char *active_test; const char *active_test;
const char *active_suite; const char *active_suite;
int suite_errors; int total_skipped;
int total_errors; int total_errors;
int tests_ran; int tests_ran;
...@@ -150,7 +151,7 @@ struct clar_suite { ...@@ -150,7 +151,7 @@ struct clar_suite {
static void clar_print_init(int test_count, int suite_count, const char *suite_names); static void clar_print_init(int test_count, int suite_count, const char *suite_names);
static void clar_print_shutdown(int test_count, int suite_count, int error_count); static void clar_print_shutdown(int test_count, int suite_count, int error_count);
static void clar_print_error(int num, const struct clar_error *error); static void clar_print_error(int num, const struct clar_error *error);
static void clar_print_ontest(const char *test_name, int test_number, int failed); static void clar_print_ontest(const char *test_name, int test_number, enum cl_test_status failed);
static void clar_print_onsuite(const char *suite_name, int suite_index); static void clar_print_onsuite(const char *suite_name, int suite_index);
static void clar_print_onabort(const char *msg, ...); static void clar_print_onabort(const char *msg, ...);
...@@ -186,8 +187,7 @@ clar_run_test( ...@@ -186,8 +187,7 @@ clar_run_test(
const struct clar_func *initialize, const struct clar_func *initialize,
const struct clar_func *cleanup) const struct clar_func *cleanup)
{ {
int error_st = _clar.suite_errors; _clar.test_status = CL_TEST_OK;
_clar.trampoline_enabled = 1; _clar.trampoline_enabled = 1;
if (setjmp(_clar.trampoline) == 0) { if (setjmp(_clar.trampoline) == 0) {
...@@ -211,14 +211,11 @@ clar_run_test( ...@@ -211,14 +211,11 @@ clar_run_test(
_clar.local_cleanup = NULL; _clar.local_cleanup = NULL;
_clar.local_cleanup_payload = NULL; _clar.local_cleanup_payload = NULL;
if (_clar.report_errors_only) if (_clar.report_errors_only) {
clar_report_errors(); clar_report_errors();
else } else {
clar_print_ontest( clar_print_ontest(test->name, _clar.tests_ran, _clar.test_status);
test->name, }
_clar.tests_ran,
(_clar.suite_errors > error_st)
);
} }
static void static void
...@@ -237,7 +234,6 @@ clar_run_suite(const struct clar_suite *suite, const char *filter) ...@@ -237,7 +234,6 @@ clar_run_suite(const struct clar_suite *suite, const char *filter)
clar_print_onsuite(suite->name, ++_clar.suites_ran); clar_print_onsuite(suite->name, ++_clar.suites_ran);
_clar.active_suite = suite->name; _clar.active_suite = suite->name;
_clar.suite_errors = 0;
if (filter) { if (filter) {
size_t suitelen = strlen(suite->name); size_t suitelen = strlen(suite->name);
...@@ -413,6 +409,25 @@ clar_test(int argc, char **argv) ...@@ -413,6 +409,25 @@ clar_test(int argc, char **argv)
return errors; return errors;
} }
static void abort_test(void)
{
if (!_clar.trampoline_enabled) {
clar_print_onabort(
"Fatal error: a cleanup method raised an exception.");
clar_report_errors();
exit(-1);
}
longjmp(_clar.trampoline, -1);
}
void clar__skip(void)
{
_clar.test_status = CL_TEST_SKIP;
_clar.total_skipped++;
abort_test();
}
void clar__fail( void clar__fail(
const char *file, const char *file,
int line, int line,
...@@ -440,19 +455,11 @@ void clar__fail( ...@@ -440,19 +455,11 @@ void clar__fail(
if (description != NULL) if (description != NULL)
error->description = strdup(description); error->description = strdup(description);
_clar.suite_errors++;
_clar.total_errors++; _clar.total_errors++;
_clar.test_status = CL_TEST_FAILURE;
if (should_abort) { if (should_abort)
if (!_clar.trampoline_enabled) { abort_test();
clar_print_onabort(
"Fatal error: a cleanup method raised an exception.");
clar_report_errors();
exit(-1);
}
longjmp(_clar.trampoline, -1);
}
} }
void clar__assert( void clar__assert(
......
...@@ -9,6 +9,12 @@ ...@@ -9,6 +9,12 @@
#include <stdlib.h> #include <stdlib.h>
enum cl_test_status {
CL_TEST_OK,
CL_TEST_FAILURE,
CL_TEST_SKIP
};
void clar_test_init(int argc, char *argv[]); void clar_test_init(int argc, char *argv[]);
int clar_test_run(void); int clar_test_run(void);
void clar_test_shutdown(void); void clar_test_shutdown(void);
...@@ -60,6 +66,8 @@ void cl_fixture_cleanup(const char *fixture_name); ...@@ -60,6 +66,8 @@ void cl_fixture_cleanup(const char *fixture_name);
#define cl_fail(desc) clar__fail(__FILE__, __LINE__, "Test failed.", desc, 1) #define cl_fail(desc) clar__fail(__FILE__, __LINE__, "Test failed.", desc, 1)
#define cl_warning(desc) clar__fail(__FILE__, __LINE__, "Warning during test execution:", desc, 0) #define cl_warning(desc) clar__fail(__FILE__, __LINE__, "Warning during test execution:", desc, 0)
#define cl_skip() clar__skip()
/** /**
* Typed assertion macros * Typed assertion macros
*/ */
...@@ -77,6 +85,7 @@ void cl_fixture_cleanup(const char *fixture_name); ...@@ -77,6 +85,7 @@ void cl_fixture_cleanup(const char *fixture_name);
#define cl_assert_equal_p(p1,p2) clar__assert_equal(__FILE__,__LINE__,"Pointer mismatch: " #p1 " != " #p2, 1, "%p", (p1), (p2)) #define cl_assert_equal_p(p1,p2) clar__assert_equal(__FILE__,__LINE__,"Pointer mismatch: " #p1 " != " #p2, 1, "%p", (p1), (p2))
void clar__skip(void);
void clar__fail( void clar__fail(
const char *file, const char *file,
......
...@@ -35,11 +35,17 @@ static void clar_print_error(int num, const struct clar_error *error) ...@@ -35,11 +35,17 @@ static void clar_print_error(int num, const struct clar_error *error)
fflush(stdout); fflush(stdout);
} }
static void clar_print_ontest(const char *test_name, int test_number, int failed) static void clar_print_ontest(const char *test_name, int test_number, enum cl_test_status status)
{ {
(void)test_name; (void)test_name;
(void)test_number; (void)test_number;
printf("%c", failed ? 'F' : '.');
switch(status) {
case CL_TEST_OK: printf("."); break;
case CL_TEST_FAILURE: printf("F"); break;
case CL_TEST_SKIP: printf("S"); break;
}
fflush(stdout); fflush(stdout);
} }
......
...@@ -200,15 +200,8 @@ void test_online_clone__cred_callback_failure_return_code_is_tunnelled(void) ...@@ -200,15 +200,8 @@ void test_online_clone__cred_callback_failure_return_code_is_tunnelled(void)
const char *remote_url = cl_getenv("GITTEST_REMOTE_URL"); const char *remote_url = cl_getenv("GITTEST_REMOTE_URL");
const char *remote_user = cl_getenv("GITTEST_REMOTE_USER"); const char *remote_user = cl_getenv("GITTEST_REMOTE_USER");
if (!remote_url) { if (!remote_url || !remote_user)
printf("GITTEST_REMOTE_URL unset; skipping clone test\n"); clar__skip();
return;
}
if (!remote_user) {
printf("GITTEST_REMOTE_USER unset; skipping clone test\n");
return;
}
g_options.remote_callbacks.credentials = cred_failure_cb; g_options.remote_callbacks.credentials = cred_failure_cb;
......
...@@ -315,46 +315,47 @@ void test_online_push__initialize(void) ...@@ -315,46 +315,47 @@ void test_online_push__initialize(void)
_remote_default = cl_getenv("GITTEST_REMOTE_DEFAULT"); _remote_default = cl_getenv("GITTEST_REMOTE_DEFAULT");
_remote = NULL; _remote = NULL;
if (_remote_url) { /* Skip the test if we're missing the remote URL */
cl_git_pass(git_remote_create(&_remote, _repo, "test", _remote_url)); if (!_remote_url)
cl_skip();
record_callbacks_data_clear(&_record_cbs_data); cl_git_pass(git_remote_create(&_remote, _repo, "test", _remote_url));
git_remote_set_callbacks(_remote, &_record_cbs);
cl_git_pass(git_remote_connect(_remote, GIT_DIRECTION_PUSH)); record_callbacks_data_clear(&_record_cbs_data);
git_remote_set_callbacks(_remote, &_record_cbs);
/* Clean up previously pushed branches. Fails if receive.denyDeletes is cl_git_pass(git_remote_connect(_remote, GIT_DIRECTION_PUSH));
* set on the remote. Also, on Git 1.7.0 and newer, you must run
* 'git config receive.denyDeleteCurrent ignore' in the remote repo in
* order to delete the remote branch pointed to by HEAD (usually master).
* See: https://raw.github.com/git/git/master/Documentation/RelNotes/1.7.0.txt
*/
cl_git_pass(git_remote_ls(&heads, &heads_len, _remote));
cl_git_pass(create_deletion_refspecs(&delete_specs, heads, heads_len));
if (delete_specs.length) {
git_push *push;
cl_git_pass(git_push_new(&push, _remote)); /* Clean up previously pushed branches. Fails if receive.denyDeletes is
* set on the remote. Also, on Git 1.7.0 and newer, you must run
* 'git config receive.denyDeleteCurrent ignore' in the remote repo in
* order to delete the remote branch pointed to by HEAD (usually master).
* See: https://raw.github.com/git/git/master/Documentation/RelNotes/1.7.0.txt
*/
cl_git_pass(git_remote_ls(&heads, &heads_len, _remote));
cl_git_pass(create_deletion_refspecs(&delete_specs, heads, heads_len));
if (delete_specs.length) {
git_push *push;
git_vector_foreach(&delete_specs, i, curr_del_spec) { cl_git_pass(git_push_new(&push, _remote));
git_push_add_refspec(push, curr_del_spec);
git__free(curr_del_spec);
}
cl_git_pass(git_push_finish(push)); git_vector_foreach(&delete_specs, i, curr_del_spec) {
git_push_free(push); git_push_add_refspec(push, curr_del_spec);
git__free(curr_del_spec);
} }
git_remote_disconnect(_remote); cl_git_pass(git_push_finish(push));
git_vector_free(&delete_specs); git_push_free(push);
}
/* Now that we've deleted everything, fetch from the remote */ git_remote_disconnect(_remote);
cl_git_pass(git_remote_connect(_remote, GIT_DIRECTION_FETCH)); git_vector_free(&delete_specs);
cl_git_pass(git_remote_download(_remote));
cl_git_pass(git_remote_update_tips(_remote, NULL, NULL)); /* Now that we've deleted everything, fetch from the remote */
git_remote_disconnect(_remote); cl_git_pass(git_remote_connect(_remote, GIT_DIRECTION_FETCH));
} else cl_git_pass(git_remote_download(_remote));
printf("GITTEST_REMOTE_URL unset; skipping push test\n"); cl_git_pass(git_remote_update_tips(_remote, NULL, NULL));
git_remote_disconnect(_remote);
} }
void test_online_push__cleanup(void) void test_online_push__cleanup(void)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment