(use bokbok) (use matchable) (define *server* #f) (define (open-handler con) (printf "OPEN from ~a @ ~s\n" (connection-user con) (connection-addr con))) (define (close-handler con) (printf "CLOSE from ~a @ ~s\n" (connection-user con) (connection-addr con))) (define (request-handler con request) (printf "REQUEST from ~a @ ~s: ~s\n" (connection-user con) (connection-addr con) request) (match request (("error") (error "Error raised")) (("callback") (let ((response (request! con '("called you back")))) (thread-start! (make-thread (lambda () (request! con '("callback" "1")) (thread-sleep! 1) (request! con '("callback" "2")) (thread-sleep! 1) (request! con '("callback" "3"))))) (list "did it" (sprintf "~s" response)))) (("kill") (if *server* (begin (stop-server! *server*) (list "ok")) (error "I'm not a server"))) (else (cons "echo" request)))) (define (expect exp actual) (unless (equal? exp actual) (printf "Expected ~s but got ~s\n" exp actual))) (define (run-client! con) (expect '("echo" "hello") (request! con '("hello"))) (expect "\"Error raised\" in (#f)" (handle-exceptions exn (if (remote-error? exn) (remote-error-message exn) #f) (request! con '("error")) #f)) (expect '("did it" "(\"echo\" \"called you back\")") (request! con '("callback"))) (thread-sleep! 10) #; (expect '(ok ("ok")) (request! con '("kill"))) (close-connection! con)) (define (run-server! server) (set! *server* server) (printf "Running server...\n") (wait-until-server-stopped server)) (match (command-line-arguments) (("client" "unix" path) (run-client! (open-connection `(unix ,path) #f #f request-handler close-handler))) (("client" "unix" path user pass) (run-client! (open-connection `(unix ,path) user (passphrase->key pass) request-handler close-handler))) (("server" "unix" path) (run-server! (start-server `(unix ,path) 10 #f open-handler request-handler close-handler))) (("server" "unix" path pass) (run-server! (start-server `(unix ,path) 10 (lambda _ (passphrase->key pass)) open-handler request-handler close-handler))) (("client" "tcp" addr port) (run-client! (open-connection `(tcp ,addr ,(string->number port)) #f #f request-handler close-handler))) (("client" "tcp" addr port user pass) (run-client! (open-connection `(tcp ,addr ,(string->number port)) user (passphrase->key pass) request-handler close-handler))) (("server" "tcp" port) (run-server! (start-server `(tcp #f ,(string->number port)) 10 #f open-handler request-handler close-handler))) (("server" "tcp" port pass) (run-server! (start-server `(tcp #f ,(string->number port)) 10 (lambda _ (passphrase->key pass)) open-handler request-handler close-handler))) (else (printf "Imagine a comprehensive usage screen here!\n")))