1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3 ;;; Free Software published under an MIT-like license. See LICENSE ;;;
5 ;;; Copyright (c) 2012 Google, Inc. All rights reserved. ;;;
7 ;;; Original author: Scott McKay ;;;
8 ;;; Based on original work by Robert Brown ;;;
10 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12 (in-package "PROTO-TEST")
15 ;;; Wire format unit tests
17 (define-test zig-zag-test ()
18 (flet ((verify (encoder pairs)
19 (loop for (input output) in pairs
20 do (assert-true (= (funcall encoder input) output)))))
21 (verify #'zig-zag-encode32
22 `((0 0) (-1 1) (1 2) (-2 3)
23 (#x3fffffff #x7ffffffe)
24 (,(- #xc0000000 (ash 1 32)) #x7fffffff)
25 (#x7fffffff #xfffffffe)
26 (,(- #x80000000 (ash 1 32)) #xffffffff)))
27 (verify #'zig-zag-decode32
28 `((0 0) (1 -1) (2 1) (3 -2)
29 (#x7ffffffe #x3fffffff)
30 (#x7fffffff ,(- #xc0000000 (ash 1 32)))
31 (#xfffffffe #x7fffffff)
32 (#xffffffff ,(- #x80000000 (ash 1 32)))))
33 (verify #'zig-zag-encode64
34 `((0 0) (-1 1) (1 2) (-2 3)
35 (#x000000003fffffff #x000000007ffffffe)
36 (,(- #xffffffffc0000000 (ash 1 64)) #x000000007fffffff)
37 (#x000000007fffffff #x00000000fffffffe)
38 (,(- #xffffffff80000000 (ash 1 64)) #x00000000ffffffff)
39 (#x7fffffffffffffff #xfffffffffffffffe)
40 (,(- #x8000000000000000 (ash 1 64)) #xffffffffffffffff)))
41 (verify #'zig-zag-decode64
42 `((0 0) (1 -1) (2 1) (3 -2)
43 (#x000000007ffffffe #x000000003fffffff)
44 (#x000000007fffffff ,(- #xffffffffc0000000 (ash 1 64)))
45 (#x00000000fffffffe #x000000007fffffff)
46 (#x00000000ffffffff ,(- #xffffffff80000000 (ash 1 64)))
47 (#xfffffffffffffffe #x7fffffffffffffff)
48 (#xffffffffffffffff ,(- #x8000000000000000 (ash 1 64))))))
49 (flet ((round-trip32 (n)
50 (assert-true (= n (zig-zag-decode32 (zig-zag-encode32 n)))))
52 (assert-true (= n (zig-zag-decode64 (zig-zag-encode64 n))))))
53 (dolist (n '(0 1 -1 14927 -3612))
55 (dolist (n '(0 1 -1 14927 -3612 856912304801416 -75123905439571256))
58 (define-test encode-length-tests ()
59 (flet ((verify (encoder pairs)
60 (loop for (input output) in pairs
61 do (assert-true (= (funcall encoder input) output)))))
63 '((#x0 1) (#x7f 1) ; 0-7 bits
64 (#x80 2) (#x3fff 2) ; 8-14 bits
65 (#x4000 3) (#x1fffff 3) ; 15-21 bits
66 (#x200000 4) (#xfffffff 4) ; 22-28 bits
67 (#x10000000 5) (#xffffffff 5))) ; 29-35 bits, though we'll actually stop at 32 bits.
69 '((#x0 1) (#x7f 1) ; 0-7 bits
70 (#x80 2) (#x3fff 2) ; 8-14 bits
71 (#x4000 3) (#x1fffff 3) ; 15-21 bits
72 (#x200000 4) (#xfffffff 4) ; 22-28 bits
73 (#x10000000 5) (#x7ffffffff 5) ; 29-35 bits
74 (#x800000000 6) (#x3ffffffffff 6) ; 36-42 bits
75 (#x40000000000 7) (#x1ffffffffffff 7) ; 29-49 bits
76 (#x2000000000000 8) (#xffffffffffffff 8) ; 29-54 bits
77 (#x100000000000000 9) (#x7fffffffffffffff 9) ; 29-63 bits
78 (#x8000000000000000 10) (#xffffffffffffffff 10))))) ; 64-72 bits, though we'll actually stop at 64 bits.
80 (define-test encode/decode-ints-tests ()
81 (flet ((verify (encoder decoder pairs)
82 (loop for (input expected) in pairs
83 for expected-buf = (coerce expected '(vector (unsigned-byte 8)))
84 for filler = (random #xff)
86 do (let* ((buf (make-array '(16) :element-type '(unsigned-byte 8) :initial-element filler))
87 (index (funcall encoder input buf 0)))
88 ;; Are the bytes as expected?
89 (assert-true (equalp (subseq buf 0 index) expected-buf))
90 ;; Is the rest of the buffer untouched?
91 (assert-true (every #'(lambda (x) (= x filler)) (subseq buf index))))
93 do (multiple-value-bind (decoded-value index)
94 (funcall decoder expected-buf 0)
95 ;; Did we get the right value?
96 (assert-true (= decoded-value input))
97 ;; Did we get the right index increment?
98 (assert-true (= (length expected) index))))))
99 (verify #'encode-uint32
106 (#x4000 (#x80 #x80 #x01))
107 (#x1fffff (#xff #xff #x7f))
108 (#x200000 (#x80 #x80 #x80 #x01))
109 (#xfffffff (#xff #xff #xff #x7f))
110 (#x10000000 (#x80 #x80 #x80 #x80 #x01))
111 (#xffffffff (#xff #xff #xff #xff #x0f))))
116 (#x7fffffff (#xff #xff #xff #xff #x07))
117 (#x-80000000 (#x80 #x80 #x80 #x80 #x08))
118 (#x-1 (#xff #xff #xff #xff #x0f))))
119 (verify #'encode-fixed32
121 '((#x0 (#x00 #x00 #x00 #x00))
122 (#x1 (#x01 #x00 #x00 #x00))
123 (#xff (#xff #x00 #x00 #x00))
124 (#x100 (#x00 #x01 #x00 #x00))
125 (#xffff (#xff #xff #x00 #x00))
126 (#x10000 (#x00 #x00 #x01 #x00))
127 (#xffffff (#xff #xff #xff #x00))
128 (#x1000000 (#x00 #x00 #x00 #x01))
129 (#xffffffff (#xff #xff #xff #xff))))
130 (verify #'encode-sfixed32
132 '((#x0 (#x00 #x00 #x00 #x00))
133 (#x1 (#x01 #x00 #x00 #x00))
134 (#x-1 (#xff #xff #xff #xff))
135 (#xff (#xff #x00 #x00 #x00))
136 (#x-ff (#x01 #xff #xff #xff))
137 (#x100 (#x00 #x01 #x00 #x00))
138 (#x-100 (#x00 #xff #xff #xff))
139 (#xffff (#xff #xff #x00 #x00))
140 (#x-ffff (#x01 #x00 #xff #xff))
141 (#x10000 (#x00 #x00 #x01 #x00))
142 (#x-10000 (#x00 #x00 #xff #xff))
143 (#xffffff (#xff #xff #xff #x00))
144 (#x-ffffff (#x01 #x00 #x00 #xff))
145 (#x1000000 (#x00 #x00 #x00 #x01))
146 (#x-1000000 (#x00 #x00 #x00 #xff))
147 (#x7fffffff (#xff #xff #xff #x7f))
148 (#x-80000000 (#x00 #x00 #x00 #x80))))
149 (verify #'encode-uint64
156 (#x4000 (#x80 #x80 #x01))
157 (#x1fffff (#xff #xff #x7f))
158 (#x200000 (#x80 #x80 #x80 #x01))
159 (#xfffffff (#xff #xff #xff #x7f))
160 (#x10000000 (#x80 #x80 #x80 #x80 #x01))
161 (#x7ffffffff (#xff #xff #xff #xff #x7f))
162 (#x800000000 (#x80 #x80 #x80 #x80 #x80 #x01))
163 (#x3ffffffffff (#xff #xff #xff #xff #xff #x7f))
164 (#x40000000000 (#x80 #x80 #x80 #x80 #x80 #x80 #x01))
165 (#x1ffffffffffff (#xff #xff #xff #xff #xff #xff #x7f))
166 (#x2000000000000 (#x80 #x80 #x80 #x80 #x80 #x80 #x80 #x01))
167 (#xffffffffffffff (#xff #xff #xff #xff #xff #xff #xff #x7f))
168 (#x100000000000000 (#x80 #x80 #x80 #x80 #x80 #x80 #x80 #x80 #x01))
169 (#x7fffffffffffffff (#xff #xff #xff #xff #xff #xff #xff #xff #x7f))
170 (#x8000000000000000 (#x80 #x80 #x80 #x80 #x80 #x80 #x80 #x80 #x80 #x01))
171 (#xffffffffffffffff (#xff #xff #xff #xff #xff #xff #xff #xff #xff #x01))))
176 (#x7fffffffffffffff (#xff #xff #xff #xff #xff #xff #xff #xff #xff #x00))
177 (#x-8000000000000000 (#x80 #x80 #x80 #x80 #x80 #x80 #x80 #x80 #x80 #x01))
178 (#x-1 (#xff #xff #xff #xff #xff #xff #xff #xff #xff #x01))))
179 (verify #'encode-fixed64
181 '((#x0 (#x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00))
182 (#x1 (#x01 #x00 #x00 #x00 #x00 #x00 #x00 #x00))
183 (#xff (#xff #x00 #x00 #x00 #x00 #x00 #x00 #x00))
184 (#x100 (#x00 #x01 #x00 #x00 #x00 #x00 #x00 #x00))
185 (#xffff (#xff #xff #x00 #x00 #x00 #x00 #x00 #x00))
186 (#x10000 (#x00 #x00 #x01 #x00 #x00 #x00 #x00 #x00))
187 (#xffffff (#xff #xff #xff #x00 #x00 #x00 #x00 #x00))
188 (#x1000000 (#x00 #x00 #x00 #x01 #x00 #x00 #x00 #x00))
189 (#xffffffff (#xff #xff #xff #xff #x00 #x00 #x00 #x00))
190 (#x100000000 (#x00 #x00 #x00 #x00 #x01 #x00 #x00 #x00))
191 (#xffffffffff (#xff #xff #xff #xff #xff #x00 #x00 #x00))
192 (#x10000000000 (#x00 #x00 #x00 #x00 #x00 #x01 #x00 #x00))
193 (#xffffffffffff (#xff #xff #xff #xff #xff #xff #x00 #x00))
194 (#x1000000000000 (#x00 #x00 #x00 #x00 #x00 #x00 #x01 #x00))
195 (#xffffffffffffff (#xff #xff #xff #xff #xff #xff #xff #x00))
196 (#x100000000000000 (#x00 #x00 #x00 #x00 #x00 #x00 #x00 #x01))
197 (#xffffffffffffffff (#xff #xff #xff #xff #xff #xff #xff #xff))))
198 (verify #'encode-sfixed64
200 '((#x0 (#x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00))
201 (#x1 (#x01 #x00 #x00 #x00 #x00 #x00 #x00 #x00))
202 (#x-1 (#xff #xff #xff #xff #xff #xff #xff #xff))
203 (#xff (#xff #x00 #x00 #x00 #x00 #x00 #x00 #x00))
204 (#x-ff (#x01 #xff #xff #xff #xff #xff #xff #xff))
205 (#x100 (#x00 #x01 #x00 #x00 #x00 #x00 #x00 #x00))
206 (#x-100 (#x00 #xff #xff #xff #xff #xff #xff #xff))
207 (#xffff (#xff #xff #x00 #x00 #x00 #x00 #x00 #x00))
208 (#x-ffff (#x01 #x00 #xff #xff #xff #xff #xff #xff))
209 (#x10000 (#x00 #x00 #x01 #x00 #x00 #x00 #x00 #x00))
210 (#x-10000 (#x00 #x00 #xff #xff #xff #xff #xff #xff))
211 (#xffffff (#xff #xff #xff #x00 #x00 #x00 #x00 #x00))
212 (#x-ffffff (#x01 #x00 #x00 #xff #xff #xff #xff #xff))
213 (#x1000000 (#x00 #x00 #x00 #x01 #x00 #x00 #x00 #x00))
214 (#x-1000000 (#x00 #x00 #x00 #xff #xff #xff #xff #xff))
215 (#x7fffffff (#xff #xff #xff #x7f #x00 #x00 #x00 #x00))
216 (#x-ffffffff (#x01 #x00 #x00 #x00 #xff #xff #xff #xff))
217 (#x100000000 (#x00 #x00 #x00 #x00 #x01 #x00 #x00 #x00))
218 (#x-100000000 (#x00 #x00 #x00 #x00 #xff #xff #xff #xff))
219 (#x7fffffffff (#xff #xff #xff #xff #x7f #x00 #x00 #x00))
220 (#x-ffffffffff (#x01 #x00 #x00 #x00 #x00 #xff #xff #xff))
221 (#x10000000000 (#x00 #x00 #x00 #x00 #x00 #x01 #x00 #x00))
222 (#x-10000000000 (#x00 #x00 #x00 #x00 #x00 #xff #xff #xff))
223 (#x7fffffffffff (#xff #xff #xff #xff #xff #x7f #x00 #x00))
224 (#x-ffffffffffff (#x01 #x00 #x00 #x00 #x00 #x00 #xff #xff))
225 (#x1000000000000 (#x00 #x00 #x00 #x00 #x00 #x00 #x01 #x00))
226 (#x-1000000000000 (#x00 #x00 #x00 #x00 #x00 #x00 #xff #xff))
227 (#x7fffffffffffff (#xff #xff #xff #xff #xff #xff #x7f #x00))
228 (#x-ffffffffffffff (#x01 #x00 #x00 #x00 #x00 #x00 #x00 #xff))
229 (#x100000000000000 (#x00 #x00 #x00 #x00 #x00 #x00 #x00 #x01))
230 (#x-100000000000000 (#x00 #x00 #x00 #x00 #x00 #x00 #x00 #xff))
231 (#x7fffffffffffffff (#xff #xff #xff #xff #xff #xff #xff #x7f))
232 (#x-8000000000000000 (#x00 #x00 #x00 #x00 #x00 #x00 #x00 #x80))))))
234 ;;--- We need more tests:
235 ;;--- (de)serialize-prim, (de)serialize-packed, (de)serialize-enum
236 ;;--- prim-size, packed-size, enum-size
237 ;;--- encode/decode-single/double
239 (define-test-suite wire-tests ()
241 (encode-length-tests)
242 (encode/decode-ints-tests))
244 (register-test 'wire-tests)