diff options
Diffstat (limited to 'test-suite/tests/net-db.test')
-rw-r--r-- | test-suite/tests/net-db.test | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/test-suite/tests/net-db.test b/test-suite/tests/net-db.test new file mode 100644 index 000000000..edd87cef8 --- /dev/null +++ b/test-suite/tests/net-db.test @@ -0,0 +1,110 @@ +;;;; net-db.test --- Test suite for `net-db' -*- mode: scheme; coding: utf-8; -*- +;;;; Ludovic Courtès <ludo@gnu.org> +;;;; +;;;; Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc. +;;;; +;;;; This library is free software; you can redistribute it and/or +;;;; modify it under the terms of the GNU Lesser General Public +;;;; License as published by the Free Software Foundation; either +;;;; version 3 of the License, or (at your option) any later version. +;;;; +;;;; This library is distributed in the hope that it will be useful, +;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;;; Lesser General Public License for more details. +;;;; +;;;; You should have received a copy of the GNU Lesser General Public +;;;; License along with this library; if not, write to the Free Software +;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +(define-module (test-suite test-net-db) + #:use-module (srfi srfi-1) + #:use-module (test-suite lib)) + +(if (provided? 'net-db) + (with-test-prefix "getaddrinfo" + + (pass-if "127.0.0.1, any service" + (let ((ai (getaddrinfo "127.0.0.1" #f AI_NUMERICHOST))) + (and (> (length ai) 0) + (fold (lambda (sa ok?) + (and ok? + (= (sockaddr:addr sa) INADDR_LOOPBACK))) + #t + (map addrinfo:addr ai))))) + + (pass-if "127.0.0.1:80" + (let ((ai (getaddrinfo "127.0.0.1" "80" + (logior AI_NUMERICHOST AI_NUMERICSERV)))) + (and (> (length ai) 0) + (fold (lambda (sa ok?) + (and ok? + (= (sockaddr:addr sa) INADDR_LOOPBACK) + (= (sockaddr:port sa) 80))) + #t + (map addrinfo:addr ai))))) + + (pass-if "port 80" + (let ((ai (getaddrinfo #f "80" (logior AI_ADDRCONFIG AI_NUMERICSERV)))) + (and (> (length ai) 0) + (fold (lambda (ai ok?) + (let ((sa (addrinfo:addr ai))) + (and ok? + (= (sockaddr:port sa) 80)))) + #t + ai)))) + + (pass-if "port 80 with family and socket type" + (let ((ai (getaddrinfo #f "80" (logior AI_ADDRCONFIG AI_NUMERICSERV) + AF_UNSPEC SOCK_STREAM))) + (and (> (length ai) 0) + (fold (lambda (ai ok?) + (let ((sa (addrinfo:addr ai))) + (and ok? + (= (sockaddr:port sa) 80)))) + #t + ai)))) + + (pass-if "no name" + (catch 'getaddrinfo-error + (lambda () + (pk "getaddrinfo for \"does-not-exist\" succeeded!" + (getaddrinfo "does-not-exist")) + (throw 'unresolved)) + (lambda (key errcode) + ;; In some cases (e.g., in a chroot without + ;; /etc/{hosts,resolv.conf}), this can result in + ;; `EAI_EAGAIN' (glibc 2.11), or `EAI_NODATA' (glibc 2.12). + (and (or (= errcode EAI_NONAME) + (and (defined? 'EAI_NODATA) ; GNU extension + (= errcode EAI_NODATA)) + (= errcode EAI_AGAIN) + (begin + (format #t "unexpected error code: ~a ~s~%" + errcode (gai-strerror errcode)) + #f)) + (string? (gai-strerror errcode)))))) + + (pass-if "wrong service name" + (catch 'getaddrinfo-error + (lambda () + (getaddrinfo "127.0.0.1" "does-not-exist" AI_NUMERICHOST) + + ;; XXX: The call above unexpectedly suceeds on + ;; `i386-apple-darwin9.2.2', but not on `i386-apple-darwin9.6.0'. + ;; For now we just skip it until a better solution is found. See + ;; http://lists.gnu.org/archive/html/bug-gnulib/2010-02/msg00061.html + ;; for details. + (if (string-contains %host-type "darwin9.2") + (throw 'unresolved) + #f)) + (lambda (key errcode) + ;; According to POSIX, both error codes are valid (glibc 2.11 + ;; chooses `EAI_SERVICE'; Darwin 8.11.0 chooses the non-POSIX + ;; `EAI_NODATA', and more recent Darwin versions choose + ;; `EAI_NONAME'.) + (and (or (= errcode EAI_SERVICE) + (= errcode EAI_NONAME) + (and (defined? 'EAI_NODATA) + (= errcode EAI_NODATA))) + (string? (gai-strerror errcode)))))))) |