newlisp/qa-specific-tests/qa-message

135 lines
3.2 KiB
Text
Executable file

#!/usr/bin/newlisp
(println)
(println "testing message API")
; qa-message, check send and receive functions
; child processes
(when (find ostype '("Windows"))
(println "qa-message runs only run on Unix - exit")
(exit)
)
(sleep 1000)
; --------------------------------- status update
(set 'N 100)
(set 'k 10)
(println k " child processes transmit " 100 " random status numbers")
(define (child-process N)
(set 'ppid (sys-info -4)) ; get parent pid
(set 'cpid (sys-info -3)) ; get this pid
(dotimes (i N)
(until (send ppid (random) ))
)
)
; parent starts k child processes, listens and displays
(dotimes (i k) (spawn 'result (child-process N) true))
(set 'start (time-of-day));
(set 'cnt 0)
(while (< cnt (* k N))
(dolist (cpid (receive)) ; iterate thru child pids
(receive cpid msg) (inc cnt)
)
)
(abort) ; cancel child-processes
(set 'ms (div (- (time-of-day) start) (* k N )))
(println ">>>>> Time per simple message: " (mul ms 1000) " micro seconds")
; --------------------------------- roundtrip test
(set 'N 10)
(set 'k 10)
(println)
(println N " round trips to " k " child processes")
(println "send out and receive it back uppercased with child pid appended")
(define (child-process , pid pppid msg)
(setq ppid (sys-info -4)) ; parent pid
(setq pid (sys-info -3)) ; this child pid
(while true
(until (receive ppid msg) )
(until (send ppid (upper-case (string msg "-" pid)))) )
)
(dotimes (i k)
(spawn 'r (child-process) true))
(set 'start (time-of-day))
(dotimes (i N)
(dolist (ch (sync))
(until (send ch "pid") ) ; send out message
(until (receive ch msg)) ; get response
(unless (= msg (string "PID-" ch)) ; check
(setq error-msg (append " >>>> ERROR in round trip test: " msg )))
)
)
(set 'ms (div (- (time-of-day) start) (* k N )))
(println ">>>>> Time per round trip : " (mul ms 1000) " micros seconds")
(abort) (sleep 100)
; --------------------------------- proxy test
(set 'N 100)
(println)
; proxy messageing A -> parent -> B
; sender child process of the message
(set 'A (spawn 'result
(begin
(dotimes (i N)
(set 'ppid (sys-info -4))
/* the following statement in msg will be evaluated in the proxy */
(set 'msg '(until (send B (string "greetings from " A))))
(until (send ppid msg)))
(until (send ppid '(begin
(println "parent exiting ...\n")
(set 'finished true))))
) true))
; receiver child process of the message
(set 'B (spawn 'result
(begin
(set 'ppid (sys-info -4))
(while true
(until (receive ppid msg))
(unless (= msg (string "greetings from " A))
(println ">>> ERROR in proxy message: " msg))
)
(println)
) true))
; parent functioning as a proxy evaluating messages or any other code
(println "A:" A "-> parent-proxy:" (sys-info -3) " -> B:" B "\n")
(sleep 200)
(set 'start (time-of-day))
; listen to messages from A
(until finished (if (receive A msg) (eval msg)))
(set 'ms (div (- (time-of-day) start) N))
(println ">>>>> Time per proxy trip: " (mul ms 1000) " micro seconds")
(println)
(sleep 300)
(abort)
(sleep 300)
(if error-msg
(println ">>>>> PROBLEM " error-msg)
(println ">>>>> Message API tested SUCCESSFUL"))
(exit)
;; eof