]> asedeno.scripts.mit.edu Git - cl-protobufs.git/blob - tests/wire-tests.lisp
tests: Fix tests for serialization of negative :int32 values
[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 #'length32
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.
68     (verify #'length64
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.
79
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)
85                  when encoder
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))))
92                  when decoder
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
100             #'decode-uint32
101             '((#x0 (#x00))
102               (#x1 (#x01))
103               (#x7f (#x7f))
104               (#x80 (#x80 #x01))
105               (#x3fff (#xff #x7f))
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))))
112     (verify nil
113             #'decode-int32
114             '((#x0 (#x00))
115               (#x1 (#x01))
116               (#x7fffffff (#xff #xff #xff #xff #x07))
117               (#x-80000000 (#x80 #x80 #x80 #x80 #x80 #x80 #x80 #x80 #x80 #x08))
118               (#x-1 (#xff #xff #xff #xff #xff #xff #xff #xff #xff #x0f))))
119     (verify #'encode-fixed32
120             #'decode-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
131             #'decode-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
150             #'decode-uint64
151             '((#x0 (#x00))
152               (#x1 (#x01))
153               (#x7f (#x7f))
154               (#x80 (#x80 #x01))
155               (#x3fff (#xff #x7f))
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))))
172     (verify nil
173             #'decode-int64
174             '((#x0 (#x00))
175               (#x1 (#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
180             #'decode-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
199             #'decode-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))))))
233
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
238
239 (define-test-suite wire-tests ()
240   (zig-zag-test)
241   (encode-length-tests)
242   (encode/decode-ints-tests))
243
244 (register-test 'wire-tests)