Blame t/read_node_t.c

Packit eed199
#include "maxminddb_test_helper.h"
Packit eed199
Packit eed199
void test_entry_data(MMDB_s *mmdb, MMDB_entry_s *entry, uint32_t node_number,
Packit eed199
                     char * node_record)
Packit eed199
{
Packit eed199
    MMDB_entry_data_s entry_data;
Packit eed199
    int status =
Packit eed199
        MMDB_get_value(entry, &entry_data, "ip",
Packit eed199
                       NULL);
Packit eed199
    cmp_ok(status, "==", MMDB_SUCCESS,
Packit eed199
           "successful data lookup for node");
Packit eed199
    cmp_ok(
Packit eed199
        entry_data.type, "==", MMDB_DATA_TYPE_UTF8_STRING,
Packit eed199
        "returned entry type is UTF8_STRING for %s record of node %i",
Packit eed199
        node_record, node_number);
Packit eed199
}
Packit eed199
Packit eed199
void run_read_node_tests(MMDB_s *mmdb, const uint32_t tests[][5],
Packit eed199
                         int test_count,
Packit eed199
                         uint8_t record_size)
Packit eed199
{
Packit eed199
    for (int i = 0; i < test_count; i++) {
Packit eed199
        uint32_t node_number = tests[i][0];
Packit eed199
        MMDB_search_node_s node;
Packit eed199
        int status = MMDB_read_node(mmdb, node_number, &node);
Packit eed199
        if (MMDB_SUCCESS == status) {
Packit eed199
            cmp_ok(node.left_record, "==", tests[i][1],
Packit eed199
                   "left record for node %i is %i - %i bit DB",
Packit eed199
                   node_number, tests[i][1], record_size);
Packit eed199
            cmp_ok(node.left_record_type, "==", tests[i][2],
Packit eed199
                   "left record type for node %i is %i", node_number,
Packit eed199
                   tests[i][2]);
Packit eed199
            if (node.left_record_type == MMDB_RECORD_TYPE_DATA) {
Packit eed199
                test_entry_data(mmdb, &node.left_record_entry, node_number,
Packit eed199
                                "left");
Packit eed199
            }
Packit eed199
Packit eed199
            cmp_ok(node.right_record, "==", tests[i][3],
Packit eed199
                   "right record for node %i is %i - %i bit DB",
Packit eed199
                   node_number, tests[i][3], record_size);
Packit eed199
            cmp_ok(node.right_record_type, "==", tests[i][4],
Packit eed199
                   "right record type for node %i is %i", node_number,
Packit eed199
                   tests[i][4]);
Packit eed199
Packit eed199
            if (node.right_record_type == MMDB_RECORD_TYPE_DATA) {
Packit eed199
                test_entry_data(mmdb, &node.right_record_entry, node_number,
Packit eed199
                                "right");
Packit eed199
            }
Packit eed199
        } else {
Packit eed199
            diag("call to MMDB_read_node for node %i failed - %i bit DB",
Packit eed199
                 node_number,
Packit eed199
                 record_size);
Packit eed199
        }
Packit eed199
    }
Packit eed199
}
Packit eed199
Packit eed199
void run_24_bit_record_tests(int mode, const char *mode_desc)
Packit eed199
{
Packit eed199
    const char *filename = "MaxMind-DB-test-mixed-24.mmdb";
Packit eed199
    const char *path = test_database_path(filename);
Packit eed199
    MMDB_s *mmdb = open_ok(path, mode, mode_desc);
Packit eed199
    free((void *)path);
Packit eed199
Packit eed199
    const uint32_t tests[7][5] = {
Packit eed199
        { 0,   1,   MMDB_RECORD_TYPE_SEARCH_NODE, 242,
Packit eed199
          MMDB_RECORD_TYPE_EMPTY },
Packit eed199
        { 80,  81,  MMDB_RECORD_TYPE_SEARCH_NODE, 197,
Packit eed199
          MMDB_RECORD_TYPE_SEARCH_NODE, },
Packit eed199
        { 96,  97,  MMDB_RECORD_TYPE_SEARCH_NODE, 242,
Packit eed199
          MMDB_RECORD_TYPE_EMPTY, },
Packit eed199
        { 103, 242, MMDB_RECORD_TYPE_EMPTY,       104,
Packit eed199
          MMDB_RECORD_TYPE_SEARCH_NODE, },
Packit eed199
        { 127, 242, MMDB_RECORD_TYPE_EMPTY,       315,
Packit eed199
          MMDB_RECORD_TYPE_DATA, },
Packit eed199
        { 132, 329, MMDB_RECORD_TYPE_DATA,       242,
Packit eed199
          MMDB_RECORD_TYPE_EMPTY, },
Packit eed199
        { 241, 96,  MMDB_RECORD_TYPE_SEARCH_NODE, 242,
Packit eed199
          MMDB_RECORD_TYPE_EMPTY, }
Packit eed199
    };
Packit eed199
    run_read_node_tests(mmdb, tests, 7, 24);
Packit eed199
Packit eed199
    MMDB_close(mmdb);
Packit eed199
    free(mmdb);
Packit eed199
}
Packit eed199
Packit eed199
void run_28_bit_record_tests(int mode, const char *mode_desc)
Packit eed199
{
Packit eed199
    const char *filename = "MaxMind-DB-test-mixed-28.mmdb";
Packit eed199
    const char *path = test_database_path(filename);
Packit eed199
    MMDB_s *mmdb = open_ok(path, mode, mode_desc);
Packit eed199
    free((void *)path);
Packit eed199
Packit eed199
    const uint32_t tests[7][5] = {
Packit eed199
        { 0,   1,   MMDB_RECORD_TYPE_SEARCH_NODE, 242,
Packit eed199
          MMDB_RECORD_TYPE_EMPTY },
Packit eed199
        { 80,  81,  MMDB_RECORD_TYPE_SEARCH_NODE, 197,
Packit eed199
          MMDB_RECORD_TYPE_SEARCH_NODE, },
Packit eed199
        { 96,  97,  MMDB_RECORD_TYPE_SEARCH_NODE, 242,
Packit eed199
          MMDB_RECORD_TYPE_EMPTY, },
Packit eed199
        { 103, 242, MMDB_RECORD_TYPE_EMPTY,       104,
Packit eed199
          MMDB_RECORD_TYPE_SEARCH_NODE, },
Packit eed199
        { 127, 242, MMDB_RECORD_TYPE_EMPTY,       315,
Packit eed199
          MMDB_RECORD_TYPE_DATA, },
Packit eed199
        { 132, 329, MMDB_RECORD_TYPE_DATA,       242,
Packit eed199
          MMDB_RECORD_TYPE_EMPTY, },
Packit eed199
        { 241, 96,  MMDB_RECORD_TYPE_SEARCH_NODE, 242,
Packit eed199
          MMDB_RECORD_TYPE_EMPTY, }
Packit eed199
    };
Packit eed199
    run_read_node_tests(mmdb, tests, 7, 28);
Packit eed199
Packit eed199
    MMDB_close(mmdb);
Packit eed199
    free(mmdb);
Packit eed199
}
Packit eed199
Packit eed199
void run_32_bit_record_tests(int mode, const char *mode_desc)
Packit eed199
{
Packit eed199
    const char *filename = "MaxMind-DB-test-mixed-32.mmdb";
Packit eed199
    const char *path = test_database_path(filename);
Packit eed199
    MMDB_s *mmdb = open_ok(path, mode, mode_desc);
Packit eed199
    free((void *)path);
Packit eed199
Packit eed199
    const uint32_t tests[7][5] = {
Packit eed199
        { 0,   1,   MMDB_RECORD_TYPE_SEARCH_NODE, 242,
Packit eed199
          MMDB_RECORD_TYPE_EMPTY },
Packit eed199
        { 80,  81,  MMDB_RECORD_TYPE_SEARCH_NODE, 197,
Packit eed199
          MMDB_RECORD_TYPE_SEARCH_NODE, },
Packit eed199
        { 96,  97,  MMDB_RECORD_TYPE_SEARCH_NODE, 242,
Packit eed199
          MMDB_RECORD_TYPE_EMPTY, },
Packit eed199
        { 103, 242, MMDB_RECORD_TYPE_EMPTY,       104,
Packit eed199
          MMDB_RECORD_TYPE_SEARCH_NODE, },
Packit eed199
        { 127, 242, MMDB_RECORD_TYPE_EMPTY,       315,
Packit eed199
          MMDB_RECORD_TYPE_DATA, },
Packit eed199
        { 132, 329, MMDB_RECORD_TYPE_DATA,       242,
Packit eed199
          MMDB_RECORD_TYPE_EMPTY, },
Packit eed199
        { 241, 96,  MMDB_RECORD_TYPE_SEARCH_NODE, 242,
Packit eed199
          MMDB_RECORD_TYPE_EMPTY, }
Packit eed199
    };
Packit eed199
Packit eed199
    run_read_node_tests(mmdb, tests, 7, 32);
Packit eed199
Packit eed199
    MMDB_close(mmdb);
Packit eed199
    free(mmdb);
Packit eed199
}
Packit eed199
Packit eed199
void run_tests(int mode, const char *mode_desc)
Packit eed199
{
Packit eed199
    run_24_bit_record_tests(mode, mode_desc);
Packit eed199
    run_28_bit_record_tests(mode, mode_desc);
Packit eed199
    run_32_bit_record_tests(mode, mode_desc);
Packit eed199
}
Packit eed199
Packit eed199
int main(void)
Packit eed199
{
Packit eed199
    plan(NO_PLAN);
Packit eed199
    for_all_modes(&run_tests);
Packit eed199
    done_testing();
Packit eed199
}