mirror of
https://github.com/isc-projects/bind9.git
synced 2026-06-08 20:32:06 -04:00
add GeoIP2 lookups to unit test
This commit is contained in:
parent
6e0b93e5a0
commit
6399a70cb4
2 changed files with 194 additions and 152 deletions
|
|
@ -35,12 +35,12 @@
|
|||
#if defined(HAVE_GEOIP2)
|
||||
#include <maxminddb.h>
|
||||
|
||||
/* TODO GEOIP2 */
|
||||
#define TEST_GEOIP_DATA ""
|
||||
/* Use GeoIP2 databases from the 'geoip2' system test */
|
||||
#define TEST_GEOIP_DATA "../../../bin/tests/system/geoip2/data"
|
||||
#elif defined(HAVE_GEOIP)
|
||||
#include <GeoIP.h>
|
||||
|
||||
/* We use GeoIP databases from the 'geoip' system test */
|
||||
/* Use GeoIP databases from the 'geoip' system test */
|
||||
#define TEST_GEOIP_DATA "../../../bin/tests/system/geoip/data"
|
||||
#endif
|
||||
|
||||
|
|
@ -69,13 +69,36 @@ _teardown(void **state) {
|
|||
static dns_geoip_databases_t geoip = DNS_GEOIP_DATABASE_INIT;
|
||||
#endif /* HAVE_GEOIP || HAVE_GEOIP2 */
|
||||
|
||||
#ifdef HAVE_GEOIP
|
||||
/*
|
||||
* Helper functions
|
||||
* (Mostly copied from bin/named/geoip.c)
|
||||
*/
|
||||
static dns_geoip_databases_t geoip = { NULL };
|
||||
#if defined(HAVE_GEOIP2)
|
||||
static MMDB_s geoip_country, geoip_city, geoip_as, geoip_isp, geoip_domain;
|
||||
|
||||
static MMDB_s *
|
||||
open_geoip2(const char *dir, const char *dbfile, MMDB_s *mmdb) {
|
||||
char pathbuf[PATH_MAX];
|
||||
int ret;
|
||||
|
||||
snprintf(pathbuf, sizeof(pathbuf), "%s/%s", dir, dbfile);
|
||||
ret = MMDB_open(pathbuf, MMDB_MODE_MMAP, mmdb);
|
||||
if (ret == MMDB_SUCCESS) {
|
||||
return (mmdb);
|
||||
}
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
load_geoip(const char *dir) {
|
||||
geoip.country = open_geoip2(dir, "GeoIP2-Country.mmdb",
|
||||
&geoip_country);
|
||||
geoip.city = open_geoip2(dir, "GeoIP2-City.mmdb", &geoip_city);
|
||||
geoip.as = open_geoip2(dir, "GeoLite2-ASN.mmdb", &geoip_as);
|
||||
geoip.isp = open_geoip2(dir, "GeoIP2-ISP.mmdb", &geoip_isp);
|
||||
geoip.domain = open_geoip2(dir, "GeoIP2-Domain.mmdb", &geoip_domain);
|
||||
}
|
||||
#elif defined(HAVE_GEOIP)
|
||||
/*
|
||||
* Helper functions (mostly copied from bin/named/geoip.c)
|
||||
*/
|
||||
static void
|
||||
init_geoip_db(void **dbp, GeoIPDBTypes edition, GeoIPDBTypes fallback,
|
||||
GeoIPOptions method, const char *name)
|
||||
|
|
@ -153,6 +176,24 @@ load_geoip(const char *dir) {
|
|||
method, "NetSpeed");
|
||||
}
|
||||
|
||||
static bool
|
||||
do_lookup_int(const char *addr, dns_geoip_subtype_t subtype, int id) {
|
||||
dns_geoip_elem_t elt;
|
||||
struct in_addr in4;
|
||||
isc_netaddr_t na;
|
||||
|
||||
inet_pton(AF_INET, addr, &in4);
|
||||
isc_netaddr_fromin(&na, &in4);
|
||||
|
||||
elt.subtype = subtype;
|
||||
elt.as_int = id;
|
||||
|
||||
return (dns_geoip_match(&na, &geoip, &elt));
|
||||
}
|
||||
|
||||
#endif /* HAVE_GEOIP */
|
||||
|
||||
#if defined(HAVE_GEOIP) || defined(HAVE_GEOIP2)
|
||||
static bool
|
||||
do_lookup_string(const char *addr, dns_geoip_subtype_t subtype,
|
||||
const char *string)
|
||||
|
|
@ -187,21 +228,6 @@ do_lookup_string_v6(const char *addr, dns_geoip_subtype_t subtype,
|
|||
return (dns_geoip_match(&na, &geoip, &elt));
|
||||
}
|
||||
|
||||
static bool
|
||||
do_lookup_int(const char *addr, dns_geoip_subtype_t subtype, int id) {
|
||||
dns_geoip_elem_t elt;
|
||||
struct in_addr in4;
|
||||
isc_netaddr_t na;
|
||||
|
||||
inet_pton(AF_INET, addr, &in4);
|
||||
isc_netaddr_fromin(&na, &in4);
|
||||
|
||||
elt.subtype = subtype;
|
||||
elt.as_int = id;
|
||||
|
||||
return (dns_geoip_match(&na, &geoip, &elt));
|
||||
}
|
||||
|
||||
/* GeoIP country matching */
|
||||
static void
|
||||
country(void **state) {
|
||||
|
|
@ -212,16 +238,19 @@ country(void **state) {
|
|||
/* Use databases from the geoip system test */
|
||||
load_geoip(TEST_GEOIP_DATA);
|
||||
|
||||
#ifdef HAVE_GEOIP2
|
||||
if (geoip.country == NULL) {
|
||||
skip();
|
||||
}
|
||||
#else /* HAVE_GEOIP */
|
||||
if (geoip.country_v4 == NULL) {
|
||||
skip();
|
||||
}
|
||||
#endif /* HAVE_GEOIP */
|
||||
|
||||
match = do_lookup_string("10.53.0.1", dns_geoip_country_code, "AU");
|
||||
assert_true(match);
|
||||
|
||||
match = do_lookup_string("10.53.0.1", dns_geoip_country_code3, "AUS");
|
||||
assert_true(match);
|
||||
|
||||
match = do_lookup_string("10.53.0.1",
|
||||
dns_geoip_country_name, "Australia");
|
||||
assert_true(match);
|
||||
|
|
@ -244,18 +273,20 @@ country_v6(void **state) {
|
|||
/* Use databases from the geoip system test */
|
||||
load_geoip(TEST_GEOIP_DATA);
|
||||
|
||||
#ifdef HAVE_GEOIP2
|
||||
if (geoip.country == NULL) {
|
||||
skip();
|
||||
}
|
||||
#else /* HAVE_GEOIP */
|
||||
if (geoip.country_v6 == NULL) {
|
||||
skip();
|
||||
}
|
||||
#endif /* HAVE_GEOIP */
|
||||
|
||||
match = do_lookup_string_v6("fd92:7065:b8e:ffff::1",
|
||||
dns_geoip_country_code, "AU");
|
||||
assert_true(match);
|
||||
|
||||
match = do_lookup_string_v6("fd92:7065:b8e:ffff::1",
|
||||
dns_geoip_country_code3, "AUS");
|
||||
assert_true(match);
|
||||
|
||||
match = do_lookup_string_v6("fd92:7065:b8e:ffff::1",
|
||||
dns_geoip_country_name, "Australia");
|
||||
assert_true(match);
|
||||
|
|
@ -271,9 +302,15 @@ city(void **state) {
|
|||
/* Use databases from the geoip system test */
|
||||
load_geoip(TEST_GEOIP_DATA);
|
||||
|
||||
#ifdef HAVE_GEOIP2
|
||||
if (geoip.city == NULL) {
|
||||
skip();
|
||||
}
|
||||
#else /* HAVE_GEOIP */
|
||||
if (geoip.city_v4 == NULL) {
|
||||
skip();
|
||||
}
|
||||
#endif /* HAVE_GEOIP */
|
||||
|
||||
match = do_lookup_string("10.53.0.1",
|
||||
dns_geoip_city_continentcode, "NA");
|
||||
|
|
@ -283,10 +320,6 @@ city(void **state) {
|
|||
dns_geoip_city_countrycode, "US");
|
||||
assert_true(match);
|
||||
|
||||
match = do_lookup_string("10.53.0.1",
|
||||
dns_geoip_city_countrycode3, "USA");
|
||||
assert_true(match);
|
||||
|
||||
match = do_lookup_string("10.53.0.1",
|
||||
dns_geoip_city_countryname, "United States");
|
||||
assert_true(match);
|
||||
|
|
@ -307,11 +340,13 @@ city(void **state) {
|
|||
dns_geoip_city_postalcode, "94063");
|
||||
assert_true(match);
|
||||
|
||||
#ifdef HAVE_GEOIP
|
||||
match = do_lookup_int("10.53.0.1", dns_geoip_city_areacode, 650);
|
||||
assert_true(match);
|
||||
|
||||
match = do_lookup_int("10.53.0.1", dns_geoip_city_metrocode, 807);
|
||||
assert_true(match);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* GeoIP city (ipv6) matching */
|
||||
|
|
@ -324,9 +359,15 @@ city_v6(void **state) {
|
|||
/* Use databases from the geoip system test */
|
||||
load_geoip(TEST_GEOIP_DATA);
|
||||
|
||||
#ifdef HAVE_GEOIP2
|
||||
if (geoip.city == NULL) {
|
||||
skip();
|
||||
}
|
||||
#else /* HAVE_GEOIP */
|
||||
if (geoip.city_v6 == NULL) {
|
||||
skip();
|
||||
}
|
||||
#endif /* HAVE_GEOIP */
|
||||
|
||||
match = do_lookup_string_v6("fd92:7065:b8e:ffff::1",
|
||||
dns_geoip_city_continentcode, "NA");
|
||||
|
|
@ -336,10 +377,6 @@ city_v6(void **state) {
|
|||
dns_geoip_city_countrycode, "US");
|
||||
assert_true(match);
|
||||
|
||||
match = do_lookup_string_v6("fd92:7065:b8e:ffff::1",
|
||||
dns_geoip_city_countrycode3, "USA");
|
||||
assert_true(match);
|
||||
|
||||
match = do_lookup_string_v6("fd92:7065:b8e:ffff::1",
|
||||
dns_geoip_city_countryname,
|
||||
"United States");
|
||||
|
|
@ -362,7 +399,90 @@ city_v6(void **state) {
|
|||
assert_true(match);
|
||||
}
|
||||
|
||||
/* GeoIP asnum matching */
|
||||
static void
|
||||
asnum(void **state) {
|
||||
bool match;
|
||||
|
||||
UNUSED(state);
|
||||
|
||||
/* Use databases from the geoip system test */
|
||||
load_geoip(TEST_GEOIP_DATA);
|
||||
|
||||
if (geoip.as == NULL) {
|
||||
skip();
|
||||
}
|
||||
|
||||
|
||||
match = do_lookup_string("10.53.0.3", dns_geoip_as_asnum, "AS100003");
|
||||
assert_true(match);
|
||||
}
|
||||
|
||||
/* GeoIP isp matching */
|
||||
static void
|
||||
isp(void **state) {
|
||||
bool match;
|
||||
|
||||
UNUSED(state);
|
||||
|
||||
/* Use databases from the geoip system test */
|
||||
load_geoip(TEST_GEOIP_DATA);
|
||||
|
||||
if (geoip.isp == NULL) {
|
||||
skip();
|
||||
}
|
||||
|
||||
match = do_lookup_string("10.53.0.1", dns_geoip_isp_name,
|
||||
"One Systems, Inc.");
|
||||
assert_true(match);
|
||||
}
|
||||
|
||||
/* GeoIP org matching */
|
||||
static void
|
||||
org(void **state) {
|
||||
bool match;
|
||||
|
||||
UNUSED(state);
|
||||
|
||||
/* Use databases from the geoip system test */
|
||||
load_geoip(TEST_GEOIP_DATA);
|
||||
|
||||
#ifdef HAVE_GEOIP2
|
||||
if (geoip.as == NULL) {
|
||||
skip();
|
||||
}
|
||||
#else /* HAVE_GEOIP */
|
||||
if (geoip.org == NULL) {
|
||||
skip();
|
||||
}
|
||||
#endif /* HAVE_GEOIP */
|
||||
|
||||
match = do_lookup_string("10.53.0.2", dns_geoip_org_name,
|
||||
"Two Technology Ltd.");
|
||||
assert_true(match);
|
||||
}
|
||||
|
||||
/* GeoIP domain matching */
|
||||
static void
|
||||
domain(void **state) {
|
||||
bool match;
|
||||
|
||||
UNUSED(state);
|
||||
|
||||
/* Use databases from the geoip system test */
|
||||
load_geoip(TEST_GEOIP_DATA);
|
||||
|
||||
if (geoip.domain == NULL) {
|
||||
skip();
|
||||
}
|
||||
|
||||
match = do_lookup_string("10.53.0.5",
|
||||
dns_geoip_domain_name, "five.es");
|
||||
assert_true(match);
|
||||
}
|
||||
#endif /* HAVE_GEOIP || HAVE_GEOIP2 */
|
||||
|
||||
#ifdef HAVE_GEOIP
|
||||
/* GeoIP region matching */
|
||||
static void
|
||||
region(void **state) {
|
||||
|
|
@ -390,6 +510,33 @@ region(void **state) {
|
|||
assert_true(match);
|
||||
}
|
||||
|
||||
/* GeoIP netspeed matching */
|
||||
static void
|
||||
netspeed(void **state) {
|
||||
bool match;
|
||||
|
||||
UNUSED(state);
|
||||
|
||||
/* Use databases from the geoip system test */
|
||||
load_geoip(TEST_GEOIP_DATA);
|
||||
|
||||
if (geoip.netspeed == NULL) {
|
||||
skip();
|
||||
}
|
||||
|
||||
match = do_lookup_int("10.53.0.1", dns_geoip_netspeed_id, 0);
|
||||
assert_true(match);
|
||||
|
||||
match = do_lookup_int("10.53.0.2", dns_geoip_netspeed_id, 1);
|
||||
assert_true(match);
|
||||
|
||||
match = do_lookup_int("10.53.0.3", dns_geoip_netspeed_id, 2);
|
||||
assert_true(match);
|
||||
|
||||
match = do_lookup_int("10.53.0.4", dns_geoip_netspeed_id, 3);
|
||||
assert_true(match);
|
||||
}
|
||||
|
||||
/*
|
||||
* GeoIP best-database matching
|
||||
* (With no specified databse and a city database available, answers
|
||||
|
|
@ -463,136 +610,30 @@ best(void **state) {
|
|||
dns_geoip_countryname, "Canada");
|
||||
assert_true(match);
|
||||
}
|
||||
|
||||
|
||||
/* GeoIP asnum matching */
|
||||
static void
|
||||
asnum(void **state) {
|
||||
bool match;
|
||||
|
||||
UNUSED(state);
|
||||
|
||||
/* Use databases from the geoip system test */
|
||||
load_geoip(TEST_GEOIP_DATA);
|
||||
|
||||
if (geoip.as == NULL) {
|
||||
skip();
|
||||
}
|
||||
|
||||
|
||||
match = do_lookup_string("10.53.0.3", dns_geoip_as_asnum,
|
||||
"AS100003 Three Network Labs");
|
||||
assert_true(match);
|
||||
}
|
||||
|
||||
/* GeoIP isp matching */
|
||||
static void
|
||||
isp(void **state) {
|
||||
bool match;
|
||||
|
||||
UNUSED(state);
|
||||
|
||||
/* Use databases from the geoip system test */
|
||||
load_geoip(TEST_GEOIP_DATA);
|
||||
|
||||
if (geoip.isp == NULL) {
|
||||
skip();
|
||||
}
|
||||
|
||||
match = do_lookup_string("10.53.0.1", dns_geoip_isp_name,
|
||||
"One Systems, Inc.");
|
||||
assert_true(match);
|
||||
}
|
||||
|
||||
/* GeoIP org matching */
|
||||
static void
|
||||
org(void **state) {
|
||||
bool match;
|
||||
|
||||
UNUSED(state);
|
||||
|
||||
/* Use databases from the geoip system test */
|
||||
load_geoip(TEST_GEOIP_DATA);
|
||||
|
||||
if (geoip.org == NULL) {
|
||||
skip();
|
||||
}
|
||||
|
||||
match = do_lookup_string("10.53.0.2", dns_geoip_org_name,
|
||||
"Two Technology Ltd.");
|
||||
assert_true(match);
|
||||
}
|
||||
|
||||
/* GeoIP domain matching */
|
||||
static void
|
||||
domain(void **state) {
|
||||
bool match;
|
||||
|
||||
UNUSED(state);
|
||||
|
||||
/* Use databases from the geoip system test */
|
||||
load_geoip(TEST_GEOIP_DATA);
|
||||
|
||||
if (geoip.domain == NULL) {
|
||||
skip();
|
||||
}
|
||||
|
||||
match = do_lookup_string("10.53.0.4",
|
||||
dns_geoip_domain_name, "four.com");
|
||||
assert_true(match);
|
||||
}
|
||||
|
||||
/* GeoIP netspeed matching */
|
||||
static void
|
||||
netspeed(void **state) {
|
||||
bool match;
|
||||
|
||||
UNUSED(state);
|
||||
|
||||
/* Use databases from the geoip system test */
|
||||
load_geoip(TEST_GEOIP_DATA);
|
||||
|
||||
if (geoip.netspeed == NULL) {
|
||||
skip();
|
||||
}
|
||||
|
||||
match = do_lookup_int("10.53.0.1", dns_geoip_netspeed_id, 0);
|
||||
assert_true(match);
|
||||
|
||||
match = do_lookup_int("10.53.0.2", dns_geoip_netspeed_id, 1);
|
||||
assert_true(match);
|
||||
|
||||
match = do_lookup_int("10.53.0.3", dns_geoip_netspeed_id, 2);
|
||||
assert_true(match);
|
||||
|
||||
match = do_lookup_int("10.53.0.4", dns_geoip_netspeed_id, 3);
|
||||
assert_true(match);
|
||||
}
|
||||
#endif /* HAVE_GEOIP */
|
||||
|
||||
int
|
||||
main(void) {
|
||||
#if defined(HAVE_GEOIP2)
|
||||
/* TODO GEOIP2 */
|
||||
print_message("1..0 # Skip geoip2 tests not complete\n");
|
||||
#elif defined(HAVE_GEOIP)
|
||||
#if defined(HAVE_GEOIP) || defined(HAVE_GEOIP2)
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test_setup_teardown(country, _setup, _teardown),
|
||||
cmocka_unit_test_setup_teardown(country_v6, _setup, _teardown),
|
||||
cmocka_unit_test_setup_teardown(city, _setup, _teardown),
|
||||
cmocka_unit_test_setup_teardown(city_v6, _setup, _teardown),
|
||||
cmocka_unit_test_setup_teardown(region, _setup, _teardown),
|
||||
cmocka_unit_test_setup_teardown(best, _setup, _teardown),
|
||||
cmocka_unit_test_setup_teardown(asnum, _setup, _teardown),
|
||||
cmocka_unit_test_setup_teardown(isp, _setup, _teardown),
|
||||
cmocka_unit_test_setup_teardown(org, _setup, _teardown),
|
||||
cmocka_unit_test_setup_teardown(domain, _setup, _teardown),
|
||||
#ifdef HAVE_GEOIP
|
||||
cmocka_unit_test_setup_teardown(region, _setup, _teardown),
|
||||
cmocka_unit_test_setup_teardown(netspeed, _setup, _teardown),
|
||||
cmocka_unit_test_setup_teardown(best, _setup, _teardown),
|
||||
#endif /* HAVE_GEOIP */
|
||||
};
|
||||
|
||||
return (cmocka_run_group_tests(tests, NULL, NULL));
|
||||
#else
|
||||
print_message("1..0 # Skip geoip not enabled\n");
|
||||
print_message("1..0 # Skip GeoIP not enabled\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -519,7 +519,7 @@ parse_geoip_element(const cfg_obj_t *obj, isc_log_t *lctx,
|
|||
}
|
||||
if (geoip_dbnames[i] == NULL) {
|
||||
cfg_obj_log(obj, lctx, ISC_LOG_ERROR,
|
||||
"database '%s' is not defined for GeoIP",
|
||||
"database '%s' is not defined for GeoIP2",
|
||||
dbname);
|
||||
return (ISC_R_UNEXPECTED);
|
||||
}
|
||||
|
|
@ -862,6 +862,7 @@ parse_geoip_element(const cfg_obj_t *obj, isc_log_t *lctx,
|
|||
cfg_obj_log(obj, lctx, ISC_LOG_ERROR,
|
||||
"database '%s' is not defined for GeoIP",
|
||||
dbname);
|
||||
return (ISC_R_UNEXPECTED);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue