aboutsummaryrefslogtreecommitdiff
path: root/tests/test_error_handler_spm_perror.c
blob: a5a5c9c89e157cb48bd2d6b6f838b5d9fd988a89 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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_int = ENOENT},
        {.caseValue.sptr = "kaboom", .truthValue.sptr = "kaboom: Failed to fetch package", .arg[0].signed_int = 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_int;
        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);
    }
}