128 lines
5.0 KiB
Racket
128 lines
5.0 KiB
Racket
#lang racket/base
|
|
|
|
(require net/private/ip tests/eli-tester)
|
|
|
|
(require (only-in rackunit require/expose))
|
|
(require/expose net/private/ip
|
|
(ipv4-string->bytes ipv6-string->bytes ipv4->string ipv6->string
|
|
compress bytes-of-length))
|
|
|
|
(provide tests)
|
|
(module+ main (tests))
|
|
(define (tests)
|
|
(test
|
|
;; ----------------------------------------
|
|
(make-ip-address "127.0.0.1")
|
|
=> (ipv4 (bytes 127 0 0 1))
|
|
(make-ip-address (bytes 127 0 0 1))
|
|
=> (ipv4 (bytes 127 0 0 1))
|
|
(make-ip-address "2607:f8b0:4009:800::100e")
|
|
=> (ipv6 (bytes 38 7 248 176 64 9 8 0 0 0 0 0 0 0 16 14))
|
|
(make-ip-address (bytes 38 7 248 176 64 9 8 0 0 0 0 0 0 0 16 14))
|
|
=> (ipv6 (bytes 38 7 248 176 64 9 8 0 0 0 0 0 0 0 16 14))
|
|
(make-ip-address "0.0.0.1")
|
|
=> (ipv4 (bytes 0 0 0 1))
|
|
(not (equal? (make-ip-address "128.0.0.1")
|
|
(make-ip-address "255.3.255.0")))
|
|
do (let ([ip-bytes (bytes 127 0 0 1)])
|
|
(define ip (make-ip-address ip-bytes))
|
|
(bytes-set! ip-bytes 0 255)
|
|
(test #:failure-message "IP addresses should be immutable"
|
|
ip => (make-ip-address "127.0.0.1")))
|
|
;; ----------------------------------------
|
|
(ip-address-string? "0.0.0.0")
|
|
(ip-address-string? "0.1.0.2")
|
|
(ip-address-string? "8.8.8.8")
|
|
(ip-address-string? "12.81.255.109")
|
|
(ip-address-string? "192.168.0.1")
|
|
(ip-address-string? "2001:0db8:85a3:0000:0000:8a2e:0370:7334")
|
|
(ip-address-string? "2001:200:dff:fff1:216:3eff:feb1:44d7")
|
|
(ip-address-string? "2001:db8:85a3:0:0:8a2e:370:7334")
|
|
(ip-address-string? "2001:db8:85a3::8a2e:370:7334")
|
|
(ip-address-string? "0:0:0:0:0:0:0:1")
|
|
(ip-address-string? "0:0:0:0:0:0:0:0")
|
|
(ip-address-string? "::")
|
|
(ip-address-string? "::0")
|
|
(ip-address-string? "::ffff:c000:0280")
|
|
(ip-address-string? "2001:db8::2:1")
|
|
(ip-address-string? "2001:db8:0:0:1::1")
|
|
(not (ip-address-string? ""))
|
|
(not (ip-address-string? ":::"))
|
|
(not (ip-address-string? "::0::"))
|
|
(not (ip-address-string? "2001::db8::2:1"))
|
|
(not (ip-address-string? "2001:::db8:2:1"))
|
|
(not (ip-address-string? "52001:db8::2:1"))
|
|
(not (ip-address-string? "80.8.800.8"))
|
|
(not (ip-address-string? "80.8.800.0"))
|
|
(not (ip-address-string? "080.8.800.8"))
|
|
(not (ip-address-string? "vas8.8.800.8"))
|
|
(not (ip-address-string? "80.8.128.8dd"))
|
|
(not (ip-address-string? "0.8.800.008"))
|
|
(not (ip-address-string? "0.8.800.a8"))
|
|
(not (ip-address-string? "potatoes"))
|
|
(not (ip-address-string? "127.0.0"))
|
|
;; ----------------------------------------
|
|
(ipv4-string->bytes "0.8.255.0")
|
|
=> (bytes 0 8 255 0)
|
|
(ipv4-string->bytes "8.8.8.8")
|
|
=> (bytes 8 8 8 8)
|
|
(ipv4-string->bytes "12.81.255.109")
|
|
=> (bytes 12 81 255 109)
|
|
(ipv4-string->bytes "192.168.0.1")
|
|
=> (bytes 192 168 0 1)
|
|
;; ----------------------------------------
|
|
(ipv6-string->bytes "2001:0db8:85a3:0000:0000:8a2e:0370:7334")
|
|
=> (bytes 32 1 13 184 133 163 0 0 0 0 138 46 3 112 115 52)
|
|
(ipv6-string->bytes "2001:200:dff:fff1:216:3eff:feb1:44d7")
|
|
=> (bytes 32 1 2 0 13 255 255 241 2 22 62 255 254 177 68 215)
|
|
(ipv6-string->bytes "2001:db8:85a3:0:0:8a2e:370:7334")
|
|
=> (bytes 32 1 13 184 133 163 0 0 0 0 138 46 3 112 115 52)
|
|
(ipv6-string->bytes "2001:db8:85a3::8a2e:370:7334")
|
|
=> (bytes 32 1 13 184 133 163 0 0 0 0 138 46 3 112 115 52)
|
|
(ipv6-string->bytes "2607:f8b0:4009:800::100e")
|
|
=> (bytes 38 7 248 176 64 9 8 0 0 0 0 0 0 0 16 14)
|
|
(ipv6-string->bytes "::1")
|
|
=> (bytes 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1)
|
|
(ipv6-string->bytes "::ffff")
|
|
=> (bytes 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255)
|
|
;; ----------------------------------------
|
|
(ip-address->bytes (make-ip-address "8.8.8.8"))
|
|
=> (bytes 8 8 8 8)
|
|
(ip-address->bytes (make-ip-address "::1"))
|
|
=> (bytes 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1)
|
|
;; ----------------------------------------
|
|
(ip-address->string (make-ip-address "8.8.8.8"))
|
|
=> "8.8.8.8"
|
|
(ip-address->string (make-ip-address "::1"))
|
|
=> "::1"
|
|
;; ----------------------------------------
|
|
(ipv4->string (bytes 0 0 0 0))
|
|
=> "0.0.0.0"
|
|
(ipv4->string (bytes 255 255 0 1))
|
|
=> "255.255.0.1"
|
|
(ipv4->string (bytes 127 0 0 1))
|
|
=> "127.0.0.1"
|
|
(ipv4->string (bytes 8 8 8 8))
|
|
=> "8.8.8.8"
|
|
;; ----------------------------------------
|
|
(ipv6->string (bytes 32 1 13 184 133 163 0 0 0 0 138 46 3 112 115 52))
|
|
=> "2001:db8:85a3::8a2e:370:7334"
|
|
(ipv6->string (bytes 38 7 248 176 64 9 8 0 0 0 0 0 0 0 16 14))
|
|
=> "2607:f8b0:4009:800::100e"
|
|
(ipv6->string (bytes 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255))
|
|
=> "::ffff"
|
|
(ipv6->string (bytes 255 255 0 0 0 0 0 0 0 0 0 0 0 0 255 255))
|
|
=> "ffff::ffff"
|
|
;; ----------------------------------------
|
|
(compress '(0 0 0 5 5)) => '(:: 5 5)
|
|
(compress '(0 5 5)) => '(0 5 5)
|
|
(compress '(0 0 5 0 0 5)) => '(:: 5 0 0 5)
|
|
(compress '(0 5 0 0 0 5)) => '(0 5 :: 5)
|
|
;; ----------------------------------------
|
|
((bytes-of-length 5) (bytes 1 2 3 4 5))
|
|
(not ((bytes-of-length 5) "moogle"))
|
|
;; ----------------------------------------
|
|
))
|
|
|
|
(module+ test (require (submod ".." main))) ; for raco test & drdr
|