;;;; -*- mode: lisp -*-
;;;;
;;;; $Id: test-xml-rpc.lisp,v 1.4 2008-02-15 15:42:40 scaekenberghe Exp $
;;;;
;;;; Unit and functional tests for xml-rpc.lisp
;;;;
;;;; Copyright (C) 2002, 2004 Sven Van Caekenberghe, Beta Nine BVBA.
;;;;
;;;; You are granted the rights to distribute and use this software
;;;; as governed by the terms of the Lisp Lesser General Public License
;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL.
(in-package :s-xml-rpc)
(assert
(let ((now (get-universal-time)))
(equal (iso8601->universal-time (universal-time->iso8601 now))
now)))
(assert
(equal (with-input-from-string (in (encode-xml-rpc-call "add" 1 2))
(decode-xml-rpc in))
'("add" 1 2)))
(assert
(equal (with-input-from-string (in (encode-xml-rpc-result '(1 2)))
(car (decode-xml-rpc in)))
'(1 2)))
(let ((condition (with-input-from-string (in (encode-xml-rpc-fault "Fatal Error" 100))
(decode-xml-rpc in))))
(assert (typep condition 'xml-rpc-fault))
(assert (equal (xml-rpc-fault-string condition) "Fatal Error"))
(assert (equal (xml-rpc-fault-code condition) 100)))
(assert
(xml-rpc-time-p (xml-rpc-call (encode-xml-rpc-call "currentTime.getCurrentTime")
:host "time.xmlrpc.com")))
(assert
(equal (xml-rpc-call (encode-xml-rpc-call "examples.getStateName" 41)
:host "betty.userland.com")
"South Dakota"))
(assert
(equal (call-xml-rpc-server '(:host "betty.userland.com") "examples.getStateName" 41)
"South Dakota"))
#-clisp
(assert
(let ((server-process (start-xml-rpc-server :port 8080)))
(import 's-xml-rpc::xml-rpc-implementation-version :s-xml-rpc-exports)
(sleep 1) ; give the server some time to come up ;-)
(unwind-protect
(equal (xml-rpc-call (encode-xml-rpc-call "XML-RPC-IMPLEMENTATION-VERSION") :port 8080)
(xml-rpc-implementation-version))
(s-sysdeps:kill-process server-process)
(unintern 's-xml-rpc::xml-rpc-implementation-version :s-xml-rpc-exports))))
(assert
(let* ((struct-in (xml-rpc-struct :foo 100 :bar ""))
(xml (with-output-to-string (out)
(encode-xml-rpc-value struct-in out)))
(struct-out (with-input-from-string (in xml)
(decode-xml-rpc in))))
(xml-rpc-struct-equal struct-in struct-out)))
;; testing whitespace handling
(assert (null (decode-xml-rpc (make-string-input-stream
"
"))))
(assert (equalp (decode-xml-rpc (make-string-input-stream
"
foo
12
Egypt
1
fgo
-31
-12.214
19980717T14:08:55
eW91IGNhbid0IHJlYWQgdGhpcyE=
"))
`("
foo
"
(12
"Egypt"
T
" "
" "
" fgo "
-31
""
-12.214D0
,(xml-rpc-time (iso8601->universal-time "19980717T14:08:55"))
#(121 111 117 32 99 97 110 39 116 32 114 101 97 100 32 116 104 105 115 33)))))
(assert (equalp (decode-xml-rpc (make-string-input-stream
"
"))
'("")))
(assert (equalp (decode-xml-rpc (make-string-input-stream
"
XYZ
"))
'("XYZ")))
;; double decoding
(assert (< (abs (- (decode-xml-rpc (make-string-input-stream "3.141592653589793"))
pi))
0.000000000001D0))
;; string decoding
(assert (equal (decode-xml-rpc (make-string-input-stream "foo"))
"foo"))
(assert (equal (decode-xml-rpc (make-string-input-stream "foo"))
"foo"))
(assert (equal (decode-xml-rpc (make-string-input-stream ""))
""))
(assert (equal (decode-xml-rpc (make-string-input-stream ""))
""))
;; boolean encoding
(assert (equal (with-output-to-string (out)
(encode-xml-rpc-value t out))
"1"))
(assert (equal (with-output-to-string (out)
(encode-xml-rpc-value nil out))
"0"))
;; boolean decoding
(assert (equal (decode-xml-rpc (make-string-input-stream "1"))
t))
(assert (equal (decode-xml-rpc (make-string-input-stream "0"))
nil))
;;;; eof