test-datagram.lisp - clic - Clic is an command line interactive client for gopher written in Common LISP
HTML git clone git://bitreich.org/clic/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/clic/
DIR Log
DIR Files
DIR Refs
DIR Tags
DIR README
DIR LICENSE
---
test-datagram.lisp (4810B)
---
1 ;;;; -*- Mode: LISP; Base: 10; Syntax: ANSI-Common-lisp; Package: USOCKET-TEST -*-
2 ;;;; See LICENSE for licensing information.
3
4 (in-package :usocket-test)
5
6 (defvar *echo-server*)
7 (defvar *echo-server-port*)
8
9 (defun start-server ()
10 (multiple-value-bind (thread socket)
11 (socket-server "127.0.0.1" 0 #'identity nil
12 :in-new-thread t
13 :protocol :datagram)
14 (setq *echo-server* thread
15 *echo-server-port* (get-local-port socket))))
16
17 (defparameter *max-buffer-size* 32)
18
19 (defvar *send-buffer*
20 (make-array *max-buffer-size* :element-type '(unsigned-byte 8) :initial-element 0))
21
22 (defvar *receive-buffer*
23 (make-array *max-buffer-size* :element-type '(unsigned-byte 8) :initial-element 0))
24
25 (defun clean-buffers ()
26 (fill *send-buffer* 0)
27 (fill *receive-buffer* 0))
28
29 ;;; UDP Send Test #1: connected socket
30 (deftest udp-send.1
31 (progn
32 (unless (and *echo-server* *echo-server-port*)
33 (start-server))
34 (let ((s (socket-connect "127.0.0.1" *echo-server-port* :protocol :datagram)))
35 (clean-buffers)
36 (replace *send-buffer* #(1 2 3 4 5))
37 (socket-send s *send-buffer* 5)
38 (wait-for-input s :timeout 3)
39 (multiple-value-bind (buffer size host port)
40 (socket-receive s *receive-buffer* *max-buffer-size*)
41 (declare (ignore buffer size host port))
42 (reduce #'+ *receive-buffer* :start 0 :end 5))))
43 15)
44
45 ;;; UDP Send Test #2: unconnected socket
46 (deftest udp-send.2
47 (progn
48 (unless (and *echo-server* *echo-server-port*)
49 (start-server))
50 (let ((s (socket-connect nil nil :protocol :datagram)))
51 (clean-buffers)
52 (replace *send-buffer* #(1 2 3 4 5))
53 (socket-send s *send-buffer* 5 :host "127.0.0.1" :port *echo-server-port*)
54 (wait-for-input s :timeout 3)
55 (multiple-value-bind (buffer size host port)
56 (socket-receive s *receive-buffer* *max-buffer-size*)
57 (declare (ignore buffer size host port))
58 (reduce #'+ *receive-buffer* :start 0 :end 5))))
59 15)
60
61 (deftest mark-h-david ; Mark H. David's remarkable UDP test code
62 (let* ((host "localhost")
63 (port 1111)
64 (server-sock
65 (socket-connect nil nil :protocol ':datagram :local-host host :local-port port))
66 (client-sock
67 (socket-connect host port :protocol ':datagram))
68 (octet-vector
69 (make-array 2 :element-type '(unsigned-byte 8) :initial-contents `(,(char-code #\O) ,(char-code #\K))))
70 (recv-octet-vector
71 (make-array 2 :element-type '(unsigned-byte 8))))
72 (socket-send client-sock octet-vector 2)
73 (socket-receive server-sock recv-octet-vector 2)
74 (prog1 (and (equalp octet-vector recv-octet-vector)
75 recv-octet-vector)
76 (socket-close server-sock)
77 (socket-close client-sock)))
78 #(79 75))
79
80 (deftest frank-james ; Frank James' test code for LispWorks/UDP
81 (with-caught-conditions (#+win32 CONNECTION-RESET-ERROR
82 #-win32 CONNECTION-REFUSED-ERROR
83 nil)
84 (let ((sock (socket-connect "localhost" 1234
85 :protocol ':datagram :element-type '(unsigned-byte 8))))
86 (unwind-protect
87 (progn
88 (socket-send sock (make-array 16 :element-type '(unsigned-byte 8) :initial-element 0) 16)
89 (let ((buffer (make-array 16 :element-type '(unsigned-byte 8) :initial-element 0)))
90 (socket-receive sock buffer 16)))
91 (socket-close sock))))
92 nil)
93
94 (defun frank-wfi-test ()
95 (let ((s (socket-connect nil nil :protocol :datagram
96 :element-type '(unsigned-byte 8)
97 :local-port 8001)))
98 (unwind-protect
99 (do ((i 0 (1+ i))
100 (buffer (make-array 1024 :element-type '(unsigned-byte 8)
101 :initial-element 0))
102 (now (get-universal-time))
103 (done nil))
104 ((or done (= i 4))
105 nil)
106 (format t "~Ds ~D Waiting state ~S~%" (- (get-universal-time) now) i (usocket::state s))
107 (when (wait-for-input s :ready-only t :timeout 5)
108 (format t "~D state ~S~%" i (usocket::state s))
109 (handler-bind
110 ((error (lambda (c)
111 (format t "socket-receive error: ~A~%" c)
112 (break)
113 nil)))
114 (multiple-value-bind (buffer count remote-host remote-port)
115 (socket-receive s buffer 1024)
116 (handler-bind
117 ((error (lambda (c)
118 (format t "socket-send error: ~A~%" c)
119 (break))))
120 (when buffer
121 (socket-send s (subseq buffer 0 count) count
122 :host remote-host
123 :port remote-port)))))))
124 (socket-close s))))