]> asedeno.scripts.mit.edu Git - cl-protobufs.git/blob - tests/wire-tests.lisp
8b2765a24d7d62d7be5336854d65242eb6145078
[cl-protobufs.git] / tests / wire-tests.lisp
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;;;                                                                  ;;;
3 ;;; Free Software published under an MIT-like license. See LICENSE   ;;;
4 ;;;                                                                  ;;;
5 ;;; Copyright (c) 2012 Google, Inc.  All rights reserved.            ;;;
6 ;;;                                                                  ;;;
7 ;;; Original author: Scott McKay                                     ;;;
8 ;;; Based on original work by Robert Brown                           ;;;
9 ;;;                                                                  ;;;
10 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11
12 (in-package "PROTO-TEST")
13
14
15 ;;; Wire format unit tests
16
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)))))
51          (round-trip64 (n)
52            (assert-true (= n (zig-zag-decode64 (zig-zag-encode64 n))))))
53     (dolist (n '(0 1 -1 14927 -3612))
54       (round-trip32 n))
55     (dolist (n '(0 1 -1 14927 -3612 856912304801416 -75123905439571256))
56       (round-trip64 n))))
57
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.
73
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)
79                  when encoder
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))))
86                  when decoder
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
94             #'decode-uint32
95             '((#x0 (#x00))
96               (#x1 (#x01))
97               (#x7f (#x7f))
98               (#x80 (#x80 #x01))
99               (#x3fff (#xff #x7f))
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))))
106     (verify nil
107             #'decode-int32
108             '((#x0 (#x00))
109               (#x1 (#x01))
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
114             #'decode-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
125             #'decode-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
144             #'decode-uint64
145             '((#x0 (#x00))
146               (#x1 (#x01))
147               (#x7f (#x7f))
148               (#x80 (#x80 #x01))
149               (#x3fff (#xff #x7f))
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))))
166     (verify nil
167             #'decode-int64
168             '((#x0 (#x00))
169               (#x1 (#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
174             #'decode-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
193             #'decode-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))))))
227
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
232
233 (define-test-suite wire-tests ()
234   (zig-zag-test)
235   (encode-length-tests)
236   (encode/decode-ints-tests))
237
238 (register-test 'wire-tests)