aboutsummaryrefslogtreecommitdiffstats
path: root/geoip
diff options
context:
space:
mode:
Diffstat (limited to 'geoip')
-rw-r--r--geoip/ip.lisp8
-rw-r--r--geoip/tests.lisp34
2 files changed, 38 insertions, 4 deletions
diff --git a/geoip/ip.lisp b/geoip/ip.lisp
index 3e3790e..31149f4 100644
--- a/geoip/ip.lisp
+++ b/geoip/ip.lisp
@@ -191,9 +191,8 @@
(with-slots (ptr data-offset node-count) mmdb
(alexandria:when-let* ((record (record-value mmdb ip-bits))
(offset (+ data-offset (- record node-count 16))))
- (mread-data
- (make-db-reader :db-ptr (inc-pointer ptr offset)
- :head-ptr ptr :data-offset data-offset)))))
+ (make-db-reader :db-ptr (inc-pointer ptr offset)
+ :head-ptr ptr :data-offset data-offset))))
(defun integer-to-bits (n bit-count)
"Convert integer to list of bits (MSB first)"
@@ -205,7 +204,8 @@
(with-slots (ip-version) mmdb
(when (and (= ip-version 4) (= ip-v 6))
(error "Can't query IPv6 address in IPv4 database"))
- (lookup-ip-bits mmdb (integer-to-bits ip-val (if (= ip-version 4) 32 128))))))
+ (alexandria:when-let ((reader (lookup-ip-bits mmdb (integer-to-bits ip-val (if (= ip-version 4) 32 128)))))
+ (mread-data reader)))))
(defun mmap->mmdb (file ptr fd size)
(let* ((metadata-start (find-metadata-start ptr size))
diff --git a/geoip/tests.lisp b/geoip/tests.lisp
index c1d7d40..b7cd0be 100644
--- a/geoip/tests.lisp
+++ b/geoip/tests.lisp
@@ -18,3 +18,37 @@
(is (eq (get-in data 'q) 6))
(is (eq (get-in data 'l 'r) 's))
(is (eq (get-in data 'l :p) 'q))))
+
+(test integer-to-bits-conversion
+ "Test integer to bits conversion"
+ (is (equal (geoip::integer-to-bits 0 8) '(0 0 0 0 0 0 0 0)))
+ (is (equal (geoip::integer-to-bits 255 8) '(1 1 1 1 1 1 1 1)))
+ (is (equal (geoip::integer-to-bits 170 8) '(1 0 1 0 1 0 1 0)))
+ (is (equal (geoip::integer-to-bits 1 4) '(0 0 0 1)))
+ (is (equal (geoip::integer-to-bits 15 4) '(1 1 1 1))))
+
+(test specific
+ (let ((data #(#x44 #x54 #x65 #x73 #x74 ;; string: Test
+ #xA1 #x0F
+ #xC2 #xAF #x6C
+ #xE2 ;; map of 2 elements
+ #x20 0 ;; key: pointer to first string
+ #x20 5 ;; val: pointer to int
+ #x43 107 101 121 ;; key: key
+ #x20 7 ;; val: pointer to the uint16
+ 1 7 ;; true
+ 4 1 #xFF #xFF #xFF #xF0 ;; int32: -16
+ 2 4 #x42 65 79 #x48 195 160 195 188 195 159 195 177 ;; list
+ #x68 #x40 #x45 #x28 #x36 #x5C #xB3 #x5F #x3D
+ )))
+ (with-foreign-array (a data `(:array :uint8 ,(length data)))
+ (let ((r (geoip::make-db-reader :db-ptr a :head-ptr a)))
+ (is (string= "Test" (geoip::mread-data r)))
+ (is (= #x0F (geoip::mread-data r)))
+ (is (= #xAF6C (geoip::mread-data r)))
+ (is (equalp '((:test . #x0F) (:key . #xAF6C))
+ (geoip::mread-data r)))
+ (is (eq t (geoip::mread-data r)))
+ (is (= -16 (geoip::mread-data r)))
+ (is (equalp '("AO" "àüßñ") (geoip::mread-data r)))
+ (is (= 42.314159d0 (geoip::mread-data r))) ))))