src/url_test.c
author Tero Marttila <terom@fixme.fi>
Thu, 09 Oct 2008 00:33:37 +0300
changeset 16 74fb62022fb3
parent 15 a8d183e79ed9
child 17 0a024b29b16d
permissions -rw-r--r--
starting to work
15
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#include <stdlib.h>
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
#include <stdio.h>
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
#include <string.h>
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
#include "lib/url.h"
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
16
74fb62022fb3 starting to work
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
     8
#define FAIL(...) do { printf("FAIL: "); printf(__VA_ARGS__); printf("\n"); return -1; } while (0)
15
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
16
74fb62022fb3 starting to work
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    10
struct url_schema basic_http = { 1, { "http" } };
15
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
struct url_test {
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    const char *url;
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    const struct url expected;
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
} url_tests[] = {
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
    {   "localhost:http",   {
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
        NULL, NULL, NULL, "localhost", "http", NULL, NULL
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
    } },
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
16
74fb62022fb3 starting to work
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    20
    {   "http://example.com/path",  {
74fb62022fb3 starting to work
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    21
        &basic_http, NULL, NULL, "example.com", NULL, "path", NULL 
74fb62022fb3 starting to work
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    22
    } },
15
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
    
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    {   NULL,               {   } },
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
};
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
int cmp_url_str (const char *field, const char *test, const char *real) {
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
    if (!test) {
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
        if (real)
16
74fb62022fb3 starting to work
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    30
            FAIL("%s shouldn't be present", field);
15
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
    } else if (!real) {
16
74fb62022fb3 starting to work
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    33
        FAIL("%s is missing", field);
15
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
    } else {
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
        if (strcmp(test, real) != 0)
16
74fb62022fb3 starting to work
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    37
            FAIL("%s differs: %s -> %s", field, test, real);
15
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
    }
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
    // ok
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
    return 0;
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
}
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
int cmp_url (const struct url *test, const struct url *real) {
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
    int i;
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
    // test schema
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
    if (!test->schema) {
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
        if (real->schema)
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
            FAIL("test has no schema, but real does");
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
    } else if (!real->schema) {
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
        FAIL("test has a schema, but real doesn't");
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
    } else {
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
        if (test->schema->count != test->schema->count)
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
            FAIL("inconsistent scheme count");
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
        
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
        for (i = 0; i < test->schema->count; i++) {
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
            if (strcmp(test->schema->list[i], real->schema->list[i]) != 0)
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
                FAIL("differing scheme #%d", i);
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
        }
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
    }
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
    
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
    // test username
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
    if (cmp_url_str("username", test->username, real->username))
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
        goto error;
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
    // test password
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
    if (cmp_url_str("password", test->password, real->password))
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
        goto error;
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
    // test hostname
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
    if (cmp_url_str("hostname", test->hostname, real->hostname))
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
        goto error;
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
    // test service
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
    if (cmp_url_str("service", test->service, real->service))
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
        goto error;
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
    // test path
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
    if (cmp_url_str("path", test->path, real->path))
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
        goto error;
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
    // test query
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
    if (!test->opts) {
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
        if (real->opts)
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
            FAIL("test has no opts, but real does");
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
    } else if (!real->opts) {
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
        FAIL("test has opts, but real doesn't");
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
    } else {
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
        if (test->opts->count != test->opts->count)
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
            FAIL("inconsistent opts count");
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
        
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
        for (i = 0; i < test->opts->count; i++) {
16
74fb62022fb3 starting to work
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    98
            if (strcmp(test->opts->list[i].key, real->opts->list[i].key) != 0)
15
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
                FAIL("differing scheme key #%d", i);
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
            
16
74fb62022fb3 starting to work
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   101
            if (strcmp(test->opts->list[i].value, real->opts->list[i].value) != 0)
15
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
                FAIL("differing scheme value #%d", i);
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
        }
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
    }
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
    // ok
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
    return 0;
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
error:
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
    return -1;
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
}
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
void usage (const char *exec_name) {
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
    printf("Usage: %s\n\n\tNo arguments are accepted\n", exec_name);
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
    exit(EXIT_FAILURE);
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
}
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
int main (int argc, char **argv) {
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
    const struct url_test *test;
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
    struct url url;
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
    if (argc > 1)
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
        usage(argv[0]);
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
    // run the tests
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
    for (test = url_tests; test->url; test++) {
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
        // first output the URL we are handling...
16
74fb62022fb3 starting to work
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   129
        printf("%-80s - ", test->url);
15
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
        fflush(stdout);
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
        
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
        // parse the URL
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
        memset(&url, 0, sizeof(url));
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
        if (url_parse(&url, test->url)) {
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
            printf("FATAL: url_parse failed\n");
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
            return EXIT_FAILURE;
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
        }
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
        
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
        // compare it
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
        if (cmp_url(&test->expected, &url)) {
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
            printf("\texpected: ");
16
74fb62022fb3 starting to work
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   143
            url_dump(&test->expected, stdout);
15
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
            printf("\tresult:   ");
16
74fb62022fb3 starting to work
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   146
            url_dump(&url, stdout);
15
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
        } else {
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
            printf("OK\n\t");
16
74fb62022fb3 starting to work
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   150
            url_dump(&url, stdout);
15
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
        }
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
    }
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
}
a8d183e79ed9 look ma, it compiles\!
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154