(include "../ulex/ulex.scm")
(module ulex-test *
(import scheme
(chicken io)
(chicken base)
(chicken time)
(chicken file)
(chicken file posix)
(chicken string)
(chicken process-context)
(chicken process-context posix)
miscmacros
;; nng
srfi-18
srfi-69
test
matchable
typed-records
system-information
directory-utils
ulex
)
(define help "Usage: ulex-test COMMAND
where COMMAND is one of:
run host:port : start test server - start several in same dir
")
(define (call uconn msg addr)
(print "Sent: "msg", received: "
(send-receive uconn addr 'hello msg)))
;; start => hello 0
;; hello 0 => hello 1
;; hello 1 => hello 2
;; ...
;; hello 11 => 'done
;;
(define (process-message mesg)
(let ((parts (string-split mesg)))
(match
parts
((msg c)
(let ((count (string->number c)))
(if (> count 10)
'done
(conc msg " " (if count count 0)))))
((msg)
(conc msg " 0"))
(else
"hello 0"))))
(define (main)
(match
(command-line-arguments)
((run myport)
;; start listener
;; put myaddr into file by host-pid in .runners
;; for 1 minute
;; get all in .runners
;; call each with a message
;;
(let* ((port (string->number myport))
(endtimes (+ (current-seconds) 20)) ;; run for 20 seconds
(handler (lambda (rem-host-port qrykey cmd params)
(process-message params)))
(uconn (run-listener handler myport))
(rfile (conc ".runners/"(get-host-name)"-"(current-process-id))))
(if (not (and (file-exists? ".runners")
(directory? ".runners")))
(create-directory ".runners" #t))
(with-output-to-file rfile
(lambda ()
(print myport)))
(let loop ((entries '()))
(if (> (current-seconds) endtimes)
(begin
(delete-file* rfile)
(sleep 1)
(exit))
(if (null? entries)
(loop (glob ".runners/*"))
(let* ((entry (car entries))
(destaddr (with-input-from-file entry read-line)))
(call uconn (conc "hello-from-"myport"to-"destaddr) destaddr)
;; (thread-sleep! 0.025)
(loop (cdr entries))))))))
((cmd)(print "ERROR: command "cmd", not recognised.\n\n"help))
(else
(print help))))
) ;; end module
(import ulex-test)
(main)