]> git.ipfire.org Git - location/libloc.git/blobdiff - src/test-database.c
location-importer.in: skip networks with unknown country codes
[location/libloc.git] / src / test-database.c
index 2dd052851c59da040a29d8c17b370c010fe69d45..da4b11c9faeffdd8a2afc6c38b9c0f12b976ef96 100644 (file)
 #include <ctype.h>
 #include <errno.h>
 #include <unistd.h>
+#include <syslog.h>
 
 #include <loc/libloc.h>
+#include <loc/database.h>
 #include <loc/writer.h>
-#include "database.h"
 
+const char* VENDOR = "Test Vendor";
 const char* DESCRIPTION =
        "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
        "Proin ultrices pulvinar dolor, et sollicitudin eros ultricies "
@@ -34,6 +36,36 @@ const char* DESCRIPTION =
        "tempor felis enim. Integer congue nisi in maximus pretium. "
        "Pellentesque et turpis elementum, luctus mi at, interdum erat. "
        "Maecenas ut venenatis nunc.";
+const char* LICENSE = "CC";
+
+const char* networks[] = {
+       "2001:db8::/32",
+       "2001:db8:1000::/48",
+       "2001:db8:2000::/48",
+       "2001:db8:2020::/48",
+       NULL,
+};
+
+static int attempt_to_open(struct loc_ctx* ctx, char* path) {
+       FILE* f = fopen(path, "r");
+       if (!f)
+               return -1;
+
+       struct loc_database* db;
+       int r = loc_database_new(ctx, &db, f);
+
+       if (r == 0) {
+               fprintf(stderr, "Opening %s was unexpectedly successful\n", path);
+               loc_database_unref(db);
+
+               r = 1;
+       }
+
+       // Close the file again
+       fclose(f);
+
+       return r;
+}
 
 int main(int argc, char** argv) {
        int err;
@@ -43,23 +75,41 @@ int main(int argc, char** argv) {
        if (err < 0)
                exit(EXIT_FAILURE);
 
+       // Enable debug logging
+       loc_set_log_priority(ctx, LOG_DEBUG);
+
+       // Try opening an empty file
+       err = attempt_to_open(ctx, "/dev/null");
+       if (err == 0)
+               exit(EXIT_FAILURE);
+
+       // Try opening a file with all zeroes
+       err = attempt_to_open(ctx, "/dev/zero");
+       if (err == 0)
+               exit(EXIT_FAILURE);
+
+       // Try opening a file with random data
+       err = attempt_to_open(ctx, "/dev/urandom");
+       if (err == 0)
+               exit(EXIT_FAILURE);
+
        // Create a database
        struct loc_writer* writer;
-       err = loc_writer_new(ctx, &writer);
+       err = loc_writer_new(ctx, &writer, NULL, NULL);
        if (err < 0)
                exit(EXIT_FAILURE);
 
        // Set the vendor
-       err = loc_writer_set_vendor(writer, "Test Vendor");
+       err = loc_writer_set_vendor(writer, VENDOR);
        if (err) {
                fprintf(stderr, "Could not set vendor\n");
                exit(EXIT_FAILURE);
        }
 
        // Retrieve vendor
-       const char* vendor1 = loc_writer_get_vendor(writer);
-       if (vendor1) {
-               printf("Vendor is: %s\n", vendor1);
+       const char* vendor = loc_writer_get_vendor(writer);
+       if (vendor) {
+               printf("Vendor is: %s\n", vendor);
        } else {
                fprintf(stderr, "Could not retrieve vendor\n");
                exit(EXIT_FAILURE);
@@ -81,28 +131,54 @@ int main(int argc, char** argv) {
                exit(EXIT_FAILURE);
        }
 
-       FILE* f = fopen("test.db", "w");
-       if (!f) {
-               fprintf(stderr, "Could not open file for writing: %s\n", strerror(errno));
+       // Set a license
+       err = loc_writer_set_license(writer, LICENSE);
+       if (err) {
+               fprintf(stderr, "Could not set license\n");
                exit(EXIT_FAILURE);
        }
 
-       err = loc_writer_write(writer, f);
-       if (err) {
-               fprintf(stderr, "Could not write database: %s\n", strerror(err));
+       // Retrieve license
+       const char* license = loc_writer_get_license(writer);
+       if (license) {
+               printf("License is: %s\n", license);
+       } else {
+               fprintf(stderr, "Could not retrieve license\n");
                exit(EXIT_FAILURE);
        }
 
-       // Close the file
-       fclose(f);
+       struct loc_network* network = NULL;
 
-       // And open it again from disk
-       f = fopen("test.db", "r");
+       // Add some networks
+       const char** n = networks;
+       while (*n) {
+               err = loc_writer_add_network(writer, &network, *n);
+               if (err) {
+                       fprintf(stderr, "Could not add network %s\n", *n);
+                       exit(EXIT_FAILURE);
+               }
+
+               // Set a country
+               loc_network_set_country_code(network, "XX");
+
+               // Next one
+               n++;
+       }
+
+       FILE* f = tmpfile();
        if (!f) {
-               fprintf(stderr, "Could not open file for reading: %s\n", strerror(errno));
+               fprintf(stderr, "Could not open file for writing: %s\n", strerror(errno));
                exit(EXIT_FAILURE);
        }
 
+       err = loc_writer_write(writer, f, LOC_DATABASE_VERSION_UNSET);
+       if (err) {
+               fprintf(stderr, "Could not write database: %s\n", strerror(err));
+               exit(EXIT_FAILURE);
+       }
+       loc_writer_unref(writer);
+
+       // And open it again from disk
        struct loc_database* db;
        err = loc_database_new(ctx, &db, f);
        if (err) {
@@ -110,20 +186,47 @@ int main(int argc, char** argv) {
                exit(EXIT_FAILURE);
        }
 
-       const char* vendor2 = loc_database_get_vendor(db);
-       if (!vendor2) {
+       // Try reading something from the database
+       vendor = loc_database_get_vendor(db);
+       if (!vendor) {
                fprintf(stderr, "Could not retrieve vendor\n");
                exit(EXIT_FAILURE);
-       } else if (strcmp(vendor1, vendor2) != 0) {
-               fprintf(stderr, "Vendor doesn't match: %s != %s\n", vendor1, vendor2);
+       } else if (strcmp(vendor, VENDOR) != 0) {
+               fprintf(stderr, "Vendor doesn't match: %s != %s\n", vendor, VENDOR);
                exit(EXIT_FAILURE);
        }
 
+       // Enumerator
+       struct loc_database_enumerator* enumerator;
+       err = loc_database_enumerator_new(&enumerator, db, LOC_DB_ENUMERATE_NETWORKS, 0);
+       if (err) {
+               fprintf(stderr, "Could not initialise the enumerator: %d\n", err);
+               exit(EXIT_FAILURE);
+       }
+
+       // Walk through all networks
+       while (1) {
+               err = loc_database_enumerator_next_network(enumerator, &network);
+               if (err) {
+                       fprintf(stderr, "Error fetching the next network: %d\n", err);
+                       exit(EXIT_FAILURE);
+               }
+
+               if (!network)
+                       break;
+
+               char* s = loc_network_str(network);
+               printf("Got network: %s\n", s);
+               free(s);
+       }
+
+       // Free the enumerator
+       loc_database_enumerator_unref(enumerator);
+
        // Close the database
        loc_database_unref(db);
-
-       loc_writer_unref(writer);
        loc_unref(ctx);
+       fclose(f);
 
        return EXIT_SUCCESS;
 }