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)))))
62 (verify #'varint-length
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) (#x7ffffffff 5) ; 29-35 bits
68 (#x800000000 6) (#x3ffffffffff 6) ; 36-42 bits
69 (#x40000000000 7) (#x1ffffffffffff 7) ; 29-49 bits
70 (#x2000000000000 8) (#xffffffffffffff 8) ; 29-54 bits
71 (#x100000000000000 9) (#x7fffffffffffffff 9) ; 29-63 bits
72 (#x8000000000000000 10) (#xffffffffffffffff 10))))) ; 64-72 bits, though we'll actually stop at 64 bits.
74 (define-test encode/decode-ints-tests ()
75 (flet ((verify (encoder decoder pairs)
76 (loop for (input expected) in pairs
77 for expected-buf = (coerce expected '(vector (unsigned-byte 8)))
78 for filler = (random #xff)
80 do (let* ((buf (make-array '(16) :element-type '(unsigned-byte 8) :initial-element filler))
81 (index (funcall encoder input buf 0)))
82 ;; Are the bytes as expected?
83 (assert-true (equalp (subseq buf 0 index) expected-buf))
84 ;; Is the rest of the buffer untouched?
85 (assert-true (every #'(lambda (x) (= x filler)) (subseq buf index))))
87 do (multiple-value-bind (decoded-value index)
88 (funcall decoder expected-buf 0)
89 ;; Did we get the right value?
90 (assert-true (= decoded-value input))
91 ;; Did we get the right index increment?
92 (assert-true (= (length expected) index))))))
93 (verify #'encode-uint32
100 (#x4000 (#x80 #x80 #x01))
101 (#x1fffff (#xff #xff #x7f))
102 (#x200000 (#x80 #x80 #x80 #x01))
103 (#xfffffff (#xff #xff #xff #x7f))
104 (#x10000000 (#x80 #x80 #x80 #x80 #x01))
105 (#xffffffff (#xff #xff #xff #xff #x0f))))
110 (#x7fffffff (#xff #xff #xff #xff #x07))
111 (#x-80000000 (#x80 #x80 #x80 #x80 #x80 #x80 #x80 #x80 #x80 #x08))
112 (#x-1 (#xff #xff #xff #xff #xff #xff #xff #xff #xff #x0f))))
113 (verify #'encode-fixed32
115 '((#x0 (#x00 #x00 #x00 #x00))
116 (#x1 (#x01 #x00 #x00 #x00))
117 (#xff (#xff #x00 #x00 #x00))
118 (#x100 (#x00 #x01 #x00 #x00))
119 (#xffff (#xff #xff #x00 #x00))
120 (#x10000 (#x00 #x00 #x01 #x00))
121 (#xffffff (#xff #xff #xff #x00))
122 (#x1000000 (#x00 #x00 #x00 #x01))
123 (#xffffffff (#xff #xff #xff #xff))))
124 (verify #'encode-sfixed32
126 '((#x0 (#x00 #x00 #x00 #x00))
127 (#x1 (#x01 #x00 #x00 #x00))
128 (#x-1 (#xff #xff #xff #xff))
129 (#xff (#xff #x00 #x00 #x00))
130 (#x-ff (#x01 #xff #xff #xff))
131 (#x100 (#x00 #x01 #x00 #x00))
132 (#x-100 (#x00 #xff #xff #xff))
133 (#xffff (#xff #xff #x00 #x00))
134 (#x-ffff (#x01 #x00 #xff #xff))
135 (#x10000 (#x00 #x00 #x01 #x00))
136 (#x-10000 (#x00 #x00 #xff #xff))
137 (#xffffff (#xff #xff #xff #x00))
138 (#x-ffffff (#x01 #x00 #x00 #xff))
139 (#x1000000 (#x00 #x00 #x00 #x01))
140 (#x-1000000 (#x00 #x00 #x00 #xff))
141 (#x7fffffff (#xff #xff #xff #x7f))
142 (#x-80000000 (#x00 #x00 #x00 #x80))))
143 (verify #'encode-uint64
150 (#x4000 (#x80 #x80 #x01))
151 (#x1fffff (#xff #xff #x7f))
152 (#x200000 (#x80 #x80 #x80 #x01))
153 (#xfffffff (#xff #xff #xff #x7f))
154 (#x10000000 (#x80 #x80 #x80 #x80 #x01))
155 (#x7ffffffff (#xff #xff #xff #xff #x7f))
156 (#x800000000 (#x80 #x80 #x80 #x80 #x80 #x01))
157 (#x3ffffffffff (#xff #xff #xff #xff #xff #x7f))
158 (#x40000000000 (#x80 #x80 #x80 #x80 #x80 #x80 #x01))
159 (#x1ffffffffffff (#xff #xff #xff #xff #xff #xff #x7f))
160 (#x2000000000000 (#x80 #x80 #x80 #x80 #x80 #x80 #x80 #x01))
161 (#xffffffffffffff (#xff #xff #xff #xff #xff #xff #xff #x7f))
162 (#x100000000000000 (#x80 #x80 #x80 #x80 #x80 #x80 #x80 #x80 #x01))
163 (#x7fffffffffffffff (#xff #xff #xff #xff #xff #xff #xff #xff #x7f))
164 (#x8000000000000000 (#x80 #x80 #x80 #x80 #x80 #x80 #x80 #x80 #x80 #x01))
165 (#xffffffffffffffff (#xff #xff #xff #xff #xff #xff #xff #xff #xff #x01))))
170 (#x7fffffffffffffff (#xff #xff #xff #xff #xff #xff #xff #xff #xff #x00))
171 (#x-8000000000000000 (#x80 #x80 #x80 #x80 #x80 #x80 #x80 #x80 #x80 #x01))
172 (#x-1 (#xff #xff #xff #xff #xff #xff #xff #xff #xff #x01))))
173 (verify #'encode-fixed64
175 '((#x0 (#x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00))
176 (#x1 (#x01 #x00 #x00 #x00 #x00 #x00 #x00 #x00))
177 (#xff (#xff #x00 #x00 #x00 #x00 #x00 #x00 #x00))
178 (#x100 (#x00 #x01 #x00 #x00 #x00 #x00 #x00 #x00))
179 (#xffff (#xff #xff #x00 #x00 #x00 #x00 #x00 #x00))
180 (#x10000 (#x00 #x00 #x01 #x00 #x00 #x00 #x00 #x00))
181 (#xffffff (#xff #xff #xff #x00 #x00 #x00 #x00 #x00))
182 (#x1000000 (#x00 #x00 #x00 #x01 #x00 #x00 #x00 #x00))
183 (#xffffffff (#xff #xff #xff #xff #x00 #x00 #x00 #x00))
184 (#x100000000 (#x00 #x00 #x00 #x00 #x01 #x00 #x00 #x00))
185 (#xffffffffff (#xff #xff #xff #xff #xff #x00 #x00 #x00))
186 (#x10000000000 (#x00 #x00 #x00 #x00 #x00 #x01 #x00 #x00))
187 (#xffffffffffff (#xff #xff #xff #xff #xff #xff #x00 #x00))
188 (#x1000000000000 (#x00 #x00 #x00 #x00 #x00 #x00 #x01 #x00))
189 (#xffffffffffffff (#xff #xff #xff #xff #xff #xff #xff #x00))
190 (#x100000000000000 (#x00 #x00 #x00 #x00 #x00 #x00 #x00 #x01))
191 (#xffffffffffffffff (#xff #xff #xff #xff #xff #xff #xff #xff))))
192 (verify #'encode-sfixed64
194 '((#x0 (#x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00))
195 (#x1 (#x01 #x00 #x00 #x00 #x00 #x00 #x00 #x00))
196 (#x-1 (#xff #xff #xff #xff #xff #xff #xff #xff))
197 (#xff (#xff #x00 #x00 #x00 #x00 #x00 #x00 #x00))
198 (#x-ff (#x01 #xff #xff #xff #xff #xff #xff #xff))
199 (#x100 (#x00 #x01 #x00 #x00 #x00 #x00 #x00 #x00))
200 (#x-100 (#x00 #xff #xff #xff #xff #xff #xff #xff))
201 (#xffff (#xff #xff #x00 #x00 #x00 #x00 #x00 #x00))
202 (#x-ffff (#x01 #x00 #xff #xff #xff #xff #xff #xff))
203 (#x10000 (#x00 #x00 #x01 #x00 #x00 #x00 #x00 #x00))
204 (#x-10000 (#x00 #x00 #xff #xff #xff #xff #xff #xff))
205 (#xffffff (#xff #xff #xff #x00 #x00 #x00 #x00 #x00))
206 (#x-ffffff (#x01 #x00 #x00 #xff #xff #xff #xff #xff))
207 (#x1000000 (#x00 #x00 #x00 #x01 #x00 #x00 #x00 #x00))
208 (#x-1000000 (#x00 #x00 #x00 #xff #xff #xff #xff #xff))
209 (#x7fffffff (#xff #xff #xff #x7f #x00 #x00 #x00 #x00))
210 (#x-ffffffff (#x01 #x00 #x00 #x00 #xff #xff #xff #xff))
211 (#x100000000 (#x00 #x00 #x00 #x00 #x01 #x00 #x00 #x00))
212 (#x-100000000 (#x00 #x00 #x00 #x00 #xff #xff #xff #xff))
213 (#x7fffffffff (#xff #xff #xff #xff #x7f #x00 #x00 #x00))
214 (#x-ffffffffff (#x01 #x00 #x00 #x00 #x00 #xff #xff #xff))
215 (#x10000000000 (#x00 #x00 #x00 #x00 #x00 #x01 #x00 #x00))
216 (#x-10000000000 (#x00 #x00 #x00 #x00 #x00 #xff #xff #xff))
217 (#x7fffffffffff (#xff #xff #xff #xff #xff #x7f #x00 #x00))
218 (#x-ffffffffffff (#x01 #x00 #x00 #x00 #x00 #x00 #xff #xff))
219 (#x1000000000000 (#x00 #x00 #x00 #x00 #x00 #x00 #x01 #x00))
220 (#x-1000000000000 (#x00 #x00 #x00 #x00 #x00 #x00 #xff #xff))
221 (#x7fffffffffffff (#xff #xff #xff #xff #xff #xff #x7f #x00))
222 (#x-ffffffffffffff (#x01 #x00 #x00 #x00 #x00 #x00 #x00 #xff))
223 (#x100000000000000 (#x00 #x00 #x00 #x00 #x00 #x00 #x00 #x01))
224 (#x-100000000000000 (#x00 #x00 #x00 #x00 #x00 #x00 #x00 #xff))
225 (#x7fffffffffffffff (#xff #xff #xff #xff #xff #xff #xff #x7f))
226 (#x-8000000000000000 (#x00 #x00 #x00 #x00 #x00 #x00 #x00 #x80))))))
228 ;;--- We need more tests:
229 ;;--- (de)serialize-prim, (de)serialize-packed, (de)serialize-enum
230 ;;--- prim-size, packed-size, enum-size
231 ;;--- encode/decode-single/double
233 (define-test-suite wire-tests ()
235 (encode-length-tests)
236 (encode/decode-ints-tests))
238 (register-test 'wire-tests)