(require-extension spiffy uri-common intarweb) (server-port (string->number (or (getenv "SPIFFY_TEST_PORT") "8080"))) (define (check-port) (let ((listener #f) (msg (sprintf "Checking port ~A is available" (server-port)))) (handle-exceptions exn (void) (set! listener (tcp-listen (server-port)))) (test-assert msg (tcp-listener? listener)) (tcp-close listener))) (define spiffy-thread #f) (define (can-connect?) (handle-exceptions exn #f (receive (in out) (tcp-connect "127.0.0.1" (server-port)) (close-input-port in) (close-output-port out) #t))) (define (wait-for-spiffy times) (if (zero? times) #f (begin (thread-sleep! 1) (or (can-connect?) (wait-for-spiffy (sub1 times)))))) (define NOT-FOUND "file not found") (define (send-string/code code reason string) (current-response (update-response (current-response) code: code reason: reason)) (write-logged-response) (display string (response-port (current-response)))) (define EXN "Some exception was thrown") (define (start-spiffy) (check-port) (set! spiffy-thread (make-thread (lambda () (parameterize ((root-path "./testweb") (error-log (getenv "SPIFFY_ERROR_LOG")) (handle-not-found (lambda (p) (send-string/code 404 "Not found" NOT-FOUND))) (handle-exception (lambda (exn chain) (log-to (error-log) (build-error-message exn chain #t)) (send-string/code 500 "Internal server error" EXN)))) (start-server))))) (thread-start! spiffy-thread) (test-assert "Spiffy responds in 3 seconds" (wait-for-spiffy 3))) ;;;; test tools (define (fetch-file file host #!key (send-headers `((host: ,host))) (get-headers #f) (version '(1 0)) (absolute-uri #t)) (let ((uri (uri-reference (if absolute-uri (sprintf "http://~A:~A/~A" host (server-port) file) (sprintf "/~A" file))))) (receive (in out) (tcp-connect "127.0.0.1" (server-port)) (let* ((req-headers (headers send-headers)) (req (make-request method: 'GET uri: uri major: (car version) minor: (cadr version) headers: req-headers port: out))) (write-request req) (let* ((resp (read-response in)) (str (read-string (header-value 'content-length (response-headers resp)) in))) (close-output-port out) (close-input-port in) (if get-headers (response-headers resp) (list (response-code resp) str)))))))