1 #include "clar_libgit2.h"
3 void test_errors__public_api(void)
8 cl_assert(git_error_last() == NULL
);
12 cl_assert(git_error_last() != NULL
);
13 cl_assert(git_error_last()->klass
== GIT_ERROR_NOMEMORY
);
14 str_in_error
= strstr(git_error_last()->message
, "memory");
15 cl_assert(str_in_error
!= NULL
);
19 git_error_set_str(GIT_ERROR_REPOSITORY
, "This is a test");
21 cl_assert(git_error_last() != NULL
);
22 str_in_error
= strstr(git_error_last()->message
, "This is a test");
23 cl_assert(str_in_error
!= NULL
);
26 cl_assert(git_error_last() == NULL
);
33 void test_errors__new_school(void)
38 cl_assert(git_error_last() == NULL
);
40 git_error_set_oom(); /* internal fn */
42 cl_assert(git_error_last() != NULL
);
43 cl_assert(git_error_last()->klass
== GIT_ERROR_NOMEMORY
);
44 str_in_error
= strstr(git_error_last()->message
, "memory");
45 cl_assert(str_in_error
!= NULL
);
49 git_error_set(GIT_ERROR_REPOSITORY
, "This is a test"); /* internal fn */
51 cl_assert(git_error_last() != NULL
);
52 str_in_error
= strstr(git_error_last()->message
, "This is a test");
53 cl_assert(str_in_error
!= NULL
);
56 cl_assert(git_error_last() == NULL
);
60 memset(&st
, 0, sizeof(st
));
61 cl_assert(p_lstat("this_file_does_not_exist", &st
) < 0);
64 git_error_set(GIT_ERROR_OS
, "stat failed"); /* internal fn */
66 cl_assert(git_error_last() != NULL
);
67 str_in_error
= strstr(git_error_last()->message
, "stat failed");
68 cl_assert(str_in_error
!= NULL
);
69 cl_assert(git__prefixcmp(str_in_error
, "stat failed: ") == 0);
70 cl_assert(strlen(str_in_error
) > strlen("stat failed: "));
75 /* The MSDN docs use this to generate a sample error */
76 cl_assert(GetProcessId(NULL
) == 0);
77 git_error_set(GIT_ERROR_OS
, "GetProcessId failed"); /* internal fn */
79 cl_assert(git_error_last() != NULL
);
80 str_in_error
= strstr(git_error_last()->message
, "GetProcessId failed");
81 cl_assert(str_in_error
!= NULL
);
82 cl_assert(git__prefixcmp(str_in_error
, "GetProcessId failed: ") == 0);
83 cl_assert(strlen(str_in_error
) > strlen("GetProcessId failed: "));
89 void test_errors__restore(void)
91 git_error_state err_state
= {0};
94 cl_assert(git_error_last() == NULL
);
96 cl_assert_equal_i(0, git_error_state_capture(&err_state
, 0));
98 memset(&err_state
, 0x0, sizeof(git_error_state
));
100 git_error_set(42, "Foo: %s", "bar");
101 cl_assert_equal_i(-1, git_error_state_capture(&err_state
, -1));
103 cl_assert(git_error_last() == NULL
);
105 git_error_set(99, "Bar: %s", "foo");
107 git_error_state_restore(&err_state
);
109 cl_assert_equal_i(42, git_error_last()->klass
);
110 cl_assert_equal_s("Foo: bar", git_error_last()->message
);
113 void test_errors__free_state(void)
115 git_error_state err_state
= {0};
119 git_error_set(42, "Foo: %s", "bar");
120 cl_assert_equal_i(-1, git_error_state_capture(&err_state
, -1));
122 git_error_set(99, "Bar: %s", "foo");
124 git_error_state_free(&err_state
);
126 cl_assert_equal_i(99, git_error_last()->klass
);
127 cl_assert_equal_s("Bar: foo", git_error_last()->message
);
129 git_error_state_restore(&err_state
);
131 cl_assert(git_error_last() == NULL
);
134 void test_errors__restore_oom(void)
136 git_error_state err_state
= {0};
137 const git_error
*oom_error
= NULL
;
141 git_error_set_oom(); /* internal fn */
142 oom_error
= git_error_last();
143 cl_assert(oom_error
);
145 cl_assert_equal_i(-1, git_error_state_capture(&err_state
, -1));
147 cl_assert(git_error_last() == NULL
);
148 cl_assert_equal_i(GIT_ERROR_NOMEMORY
, err_state
.error_msg
.klass
);
149 cl_assert_equal_s("Out of memory", err_state
.error_msg
.message
);
151 git_error_state_restore(&err_state
);
153 cl_assert(git_error_last()->klass
== GIT_ERROR_NOMEMORY
);
154 cl_assert_(git_error_last() == oom_error
, "static oom error not restored");
159 static int test_arraysize_multiply(size_t nelem
, size_t size
)
162 GIT_ERROR_CHECK_ALLOC_MULTIPLY(&out
, nelem
, size
);
166 void test_errors__integer_overflow_alloc_multiply(void)
168 cl_git_pass(test_arraysize_multiply(10, 10));
169 cl_git_pass(test_arraysize_multiply(1000, 1000));
170 cl_git_pass(test_arraysize_multiply(SIZE_MAX
/sizeof(void *), sizeof(void *)));
171 cl_git_pass(test_arraysize_multiply(0, 10));
172 cl_git_pass(test_arraysize_multiply(10, 0));
174 cl_git_fail(test_arraysize_multiply(SIZE_MAX
-1, sizeof(void *)));
175 cl_git_fail(test_arraysize_multiply((SIZE_MAX
/sizeof(void *))+1, sizeof(void *)));
177 cl_assert_equal_i(GIT_ERROR_NOMEMORY
, git_error_last()->klass
);
178 cl_assert_equal_s("Out of memory", git_error_last()->message
);
181 static int test_arraysize_add(size_t one
, size_t two
)
184 GIT_ERROR_CHECK_ALLOC_ADD(&out
, one
, two
);
188 void test_errors__integer_overflow_alloc_add(void)
190 cl_git_pass(test_arraysize_add(10, 10));
191 cl_git_pass(test_arraysize_add(1000, 1000));
192 cl_git_pass(test_arraysize_add(SIZE_MAX
-10, 10));
194 cl_git_fail(test_arraysize_multiply(SIZE_MAX
-1, 2));
195 cl_git_fail(test_arraysize_multiply(SIZE_MAX
, SIZE_MAX
));
197 cl_assert_equal_i(GIT_ERROR_NOMEMORY
, git_error_last()->klass
);
198 cl_assert_equal_s("Out of memory", git_error_last()->message
);
201 void test_errors__integer_overflow_sets_oom(void)
206 cl_assert(!GIT_ADD_SIZET_OVERFLOW(&out
, SIZE_MAX
-1, 1));
207 cl_assert_equal_p(NULL
, git_error_last());
210 cl_assert(!GIT_ADD_SIZET_OVERFLOW(&out
, 42, 69));
211 cl_assert_equal_p(NULL
, git_error_last());
214 cl_assert(GIT_ADD_SIZET_OVERFLOW(&out
, SIZE_MAX
, SIZE_MAX
));
215 cl_assert_equal_i(GIT_ERROR_NOMEMORY
, git_error_last()->klass
);
216 cl_assert_equal_s("Out of memory", git_error_last()->message
);
219 cl_assert(GIT_ADD_SIZET_OVERFLOW(&out
, SIZE_MAX
, SIZE_MAX
));
220 cl_assert_equal_i(GIT_ERROR_NOMEMORY
, git_error_last()->klass
);
221 cl_assert_equal_s("Out of memory", git_error_last()->message
);