aboutsummaryrefslogtreecommitdiff
path: root/tests/test_download.c
blob: cee76833eaf81ad4324ab947dae74dfbfaed892e (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
44
45
46
47
48
49
50
#include "testing.h"

void test_download() {
    struct testcase {
        const char *url;
        long http_code;
        const char *data;
        const char *errmsg;
    };
    struct testcase tc[] = {
            {.url = "https://ssb.stsci.edu/jhunk/stasis_test/test_download.txt", .http_code = 200L, .data = "It works!\n", .errmsg = NULL},
            {.url = "https://ssb.stsci.edu/jhunk/stasis_test/test_download.broken", .http_code = 404L, .data = "<html", .errmsg = NULL},
            {.url = "https://example.tld", .http_code = -1L, .data = NULL, .errmsg = "Couldn't resolve host name"},
    };

    for (size_t i = 0; i < sizeof(tc) / sizeof(*tc); i++) {
        const char *filename = "output.txt";
        char errmsg[BUFSIZ] = {0};
        char *errmsg_p = errmsg;
        long http_code = download((char *) tc[i].url, filename, &errmsg_p);
        if (tc[i].errmsg) {
            STASIS_ASSERT(strlen(errmsg_p), "an error should have been thrown by curl, but wasn't");
            fflush(stderr);
            SYSERROR("curl error message: %s", errmsg_p);
        } else {
            STASIS_ASSERT(!strlen(errmsg_p), "unexpected error thrown by curl");
        }
        STASIS_ASSERT(http_code == tc[i].http_code, "expecting non-error HTTP code");

        char **data = file_readlines(filename, 0, 100, NULL);
        if (http_code >= 0) {
            STASIS_ASSERT(data != NULL, "data should not be null");
            STASIS_ASSERT(strncmp(data[0], tc[i].data, strlen(tc[i].data)) == 0, "data file does not match the expected contents");
        } else {
            STASIS_ASSERT(http_code == -1, "http_code should be -1 on fatal curl error");
            STASIS_ASSERT(data == NULL, "data should be NULL on fatal curl error");
        }
        guard_free(data);
        remove(filename);
    }
}

int main(int argc, char *argv[]) {
    STASIS_TEST_BEGIN_MAIN();
    STASIS_TEST_FUNC *tests[] = {
            test_download,
    };
    STASIS_TEST_RUN(tests);
    STASIS_TEST_END_MAIN();
}