diff options
-rw-r--r-- | lib/error_handler.c | 12 | ||||
-rw-r--r-- | tests/test_error_handler_spm_perror.c | 43 |
2 files changed, 52 insertions, 3 deletions
diff --git a/lib/error_handler.c b/lib/error_handler.c index 4e06919..cb2ef51 100644 --- a/lib/error_handler.c +++ b/lib/error_handler.c @@ -16,13 +16,19 @@ const char *SPM_ERR_STRING[] = { NULL, }; +/** + * Append error text to an existing spmerrno error string + * @param reason message text + */ void spmerrno_cause(const char *reason) { char *buf = spmerrbuf_reason; - sprintf(buf, " (%s)", reason); - return; + if (reason != NULL) { + sprintf(buf, " (%s)", reason); + } } + /** - * + * Translate a spmerrno code to an error string * @param code * @return */ diff --git a/tests/test_error_handler_spm_perror.c b/tests/test_error_handler_spm_perror.c new file mode 100644 index 0000000..a8b55db --- /dev/null +++ b/tests/test_error_handler_spm_perror.c @@ -0,0 +1,43 @@ +#include "spm.h" +#include "framework.h" + +const char *testFmt = "case %s: returned '%s', expected '%s'\n"; +struct TestCase testCase[] = { + {.caseValue.sptr = "oh no it broke", .truthValue.sptr = "oh no it broke: No such file or directory", .arg[0].signed_integer = ENOENT}, + {.caseValue.sptr = "kaboom", .truthValue.sptr = "kaboom: Failed to fetch package", .arg[0].signed_integer = SPM_ERR_PKG_FETCH}, +}; +size_t numCases = sizeof(testCase) / sizeof(struct TestCase); + +int main(int argc, char *argv[]) { + char *tty_path = NULL; + if ((tty_path = ttyname(STDERR_FILENO)) == NULL) { + perror("tty check"); + return 0; + } + + for (size_t i = 0; i < numCases; i++) { + char buf[BUFSIZ] = {0,}; + char *buffer = buf; + int stderr_save = 0; + + fflush(stderr); + + // Redirect stdout + stderr_save = dup(STDERR_FILENO); + freopen("/dev/null", "w", stderr); + setvbuf(stderr, buffer, _IOLBF, sizeof(buf)); + + // Do test + spmerrno = testCase[i].arg[0].signed_integer; + spm_perror(testCase[i].caseValue.sptr); + fflush(stderr); + + strip(buffer); + + // Restore stderr + dup2(stderr_save, STDERR_FILENO); + setvbuf(stderr, NULL, _IONBF, 0); + + myassert(strcmp(buffer, testCase[i].truthValue.sptr) == 0, testFmt, testCase[i].caseValue.sptr, buffer, testCase[i].truthValue.sptr); + } +} |