Blame


1 e342de7d 2015-11-11 adrien package p9p
2 e342de7d 2015-11-11 adrien
3 e342de7d 2015-11-11 adrien import (
4 e342de7d 2015-11-11 adrien "bytes"
5 e342de7d 2015-11-11 adrien "errors"
6 e342de7d 2015-11-11 adrien "reflect"
7 e342de7d 2015-11-11 adrien "testing"
8 e342de7d 2015-11-11 adrien "time"
9 e342de7d 2015-11-11 adrien )
10 e342de7d 2015-11-11 adrien
11 e342de7d 2015-11-11 adrien func TestEncodeDecode(t *testing.T) {
12 e342de7d 2015-11-11 adrien codec := NewCodec()
13 e342de7d 2015-11-11 adrien for _, testcase := range []struct {
14 e342de7d 2015-11-11 adrien description string
15 e342de7d 2015-11-11 adrien target interface{}
16 e342de7d 2015-11-11 adrien marshaled []byte
17 e342de7d 2015-11-11 adrien }{
18 e342de7d 2015-11-11 adrien {
19 e342de7d 2015-11-11 adrien description: "uint8",
20 e342de7d 2015-11-11 adrien target: uint8('U'),
21 e342de7d 2015-11-11 adrien marshaled: []byte{0x55},
22 e342de7d 2015-11-11 adrien },
23 e342de7d 2015-11-11 adrien {
24 e342de7d 2015-11-11 adrien description: "uint16",
25 e342de7d 2015-11-11 adrien target: uint16(0x5544),
26 e342de7d 2015-11-11 adrien marshaled: []byte{0x44, 0x55},
27 e342de7d 2015-11-11 adrien },
28 e342de7d 2015-11-11 adrien {
29 e342de7d 2015-11-11 adrien description: "string",
30 e342de7d 2015-11-11 adrien target: "asdf",
31 e342de7d 2015-11-11 adrien marshaled: []byte{0x4, 0x0, 0x61, 0x73, 0x64, 0x66},
32 e342de7d 2015-11-11 adrien },
33 e342de7d 2015-11-11 adrien {
34 e342de7d 2015-11-11 adrien description: "[]string",
35 e342de7d 2015-11-11 adrien target: []string{"asdf", "qwer", "zxcv"},
36 e342de7d 2015-11-11 adrien marshaled: []byte{
37 e342de7d 2015-11-11 adrien 0x3, 0x0, // len(target)
38 e342de7d 2015-11-11 adrien 0x4, 0x0, 0x61, 0x73, 0x64, 0x66,
39 e342de7d 2015-11-11 adrien 0x4, 0x0, 0x71, 0x77, 0x65, 0x72,
40 e342de7d 2015-11-11 adrien 0x4, 0x0, 0x7a, 0x78, 0x63, 0x76},
41 e342de7d 2015-11-11 adrien },
42 e342de7d 2015-11-11 adrien {
43 e342de7d 2015-11-11 adrien description: "Qid",
44 e342de7d 2015-11-11 adrien target: Qid{
45 e342de7d 2015-11-11 adrien Type: QTDIR,
46 e342de7d 2015-11-11 adrien Version: 0x10203040,
47 e342de7d 2015-11-11 adrien Path: 0x1020304050607080},
48 e342de7d 2015-11-11 adrien marshaled: []byte{
49 e342de7d 2015-11-11 adrien byte(QTDIR), // qtype
50 e342de7d 2015-11-11 adrien 0x40, 0x30, 0x20, 0x10, // version
51 e342de7d 2015-11-11 adrien 0x80, 0x70, 0x60, 0x50, 0x40, 0x30, 0x20, 0x10, // path
52 e342de7d 2015-11-11 adrien },
53 e342de7d 2015-11-11 adrien },
54 e342de7d 2015-11-11 adrien // Dir
55 e342de7d 2015-11-11 adrien {
56 e342de7d 2015-11-11 adrien description: "Tversion fcall",
57 e342de7d 2015-11-11 adrien target: &Fcall{
58 e342de7d 2015-11-11 adrien Type: Tversion,
59 e342de7d 2015-11-11 adrien Tag: 2255,
60 e342de7d 2015-11-11 adrien Message: MessageTversion{
61 e342de7d 2015-11-11 adrien MSize: uint32(1024),
62 e342de7d 2015-11-11 adrien Version: "9PTEST",
63 e342de7d 2015-11-11 adrien },
64 e342de7d 2015-11-11 adrien },
65 e342de7d 2015-11-11 adrien marshaled: []byte{
66 e342de7d 2015-11-11 adrien 0x64, 0xcf, 0x8, 0x0, 0x4, 0x0, 0x0,
67 e342de7d 2015-11-11 adrien 0x6, 0x0, 0x39, 0x50, 0x54, 0x45, 0x53, 0x54},
68 e342de7d 2015-11-11 adrien },
69 e342de7d 2015-11-11 adrien {
70 e342de7d 2015-11-11 adrien description: "Rversion fcall",
71 e342de7d 2015-11-11 adrien target: &Fcall{
72 e342de7d 2015-11-11 adrien Type: Rversion,
73 e342de7d 2015-11-11 adrien Tag: 2255,
74 e342de7d 2015-11-11 adrien Message: MessageRversion{
75 e342de7d 2015-11-11 adrien MSize: uint32(1024),
76 e342de7d 2015-11-11 adrien Version: "9PTEST",
77 e342de7d 2015-11-11 adrien },
78 e342de7d 2015-11-11 adrien },
79 e342de7d 2015-11-11 adrien marshaled: []byte{
80 e342de7d 2015-11-11 adrien 0x65, 0xcf, 0x8, 0x0, 0x4, 0x0, 0x0,
81 e342de7d 2015-11-11 adrien 0x6, 0x0, 0x39, 0x50, 0x54, 0x45, 0x53, 0x54},
82 e342de7d 2015-11-11 adrien },
83 e342de7d 2015-11-11 adrien {
84 e342de7d 2015-11-11 adrien description: "Twalk fcall",
85 e342de7d 2015-11-11 adrien target: &Fcall{
86 e342de7d 2015-11-11 adrien Type: Twalk,
87 e342de7d 2015-11-11 adrien Tag: 5666,
88 e342de7d 2015-11-11 adrien Message: MessageTwalk{
89 e342de7d 2015-11-11 adrien Fid: 1010,
90 e342de7d 2015-11-11 adrien Newfid: 1011,
91 e342de7d 2015-11-11 adrien Wnames: []string{"a", "b", "c"},
92 e342de7d 2015-11-11 adrien },
93 e342de7d 2015-11-11 adrien },
94 e342de7d 2015-11-11 adrien marshaled: []byte{
95 e342de7d 2015-11-11 adrien 0x6e, 0x22, 0x16, 0xf2, 0x3, 0x0, 0x0, 0xf3, 0x3, 0x0, 0x0,
96 e342de7d 2015-11-11 adrien 0x3, 0x0, // len(wnames)
97 e342de7d 2015-11-11 adrien 0x1, 0x0, 0x61, // "a"
98 e342de7d 2015-11-11 adrien 0x1, 0x0, 0x62, // "b"
99 e342de7d 2015-11-11 adrien 0x1, 0x0, 0x63}, // "c"
100 e342de7d 2015-11-11 adrien },
101 e342de7d 2015-11-11 adrien {
102 e342de7d 2015-11-11 adrien description: "Rwalk call",
103 e342de7d 2015-11-11 adrien target: &Fcall{
104 e342de7d 2015-11-11 adrien Type: Rwalk,
105 e342de7d 2015-11-11 adrien Tag: 5556,
106 e342de7d 2015-11-11 adrien Message: MessageRwalk{
107 e342de7d 2015-11-11 adrien Qids: []Qid{
108 e342de7d 2015-11-11 adrien Qid{
109 e342de7d 2015-11-11 adrien Type: QTDIR,
110 e342de7d 2015-11-11 adrien Path: 1111,
111 e342de7d 2015-11-11 adrien Version: 11112,
112 e342de7d 2015-11-11 adrien },
113 e342de7d 2015-11-11 adrien Qid{Type: QTFILE,
114 e342de7d 2015-11-11 adrien Version: 1112,
115 e342de7d 2015-11-11 adrien Path: 11114},
116 e342de7d 2015-11-11 adrien },
117 e342de7d 2015-11-11 adrien },
118 e342de7d 2015-11-11 adrien },
119 e342de7d 2015-11-11 adrien marshaled: []byte{
120 e342de7d 2015-11-11 adrien 0x6f, 0xb4, 0x15,
121 e342de7d 2015-11-11 adrien 0x2, 0x0,
122 e342de7d 2015-11-11 adrien 0x80, 0x68, 0x2b, 0x0, 0x0, 0x57, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
123 e342de7d 2015-11-11 adrien 0x0, 0x58, 0x4, 0x0, 0x0, 0x6a, 0x2b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
124 e342de7d 2015-11-11 adrien },
125 e342de7d 2015-11-11 adrien {
126 e342de7d 2015-11-11 adrien description: "Rread fcall",
127 e342de7d 2015-11-11 adrien target: &Fcall{
128 e342de7d 2015-11-11 adrien Type: Rread,
129 e342de7d 2015-11-11 adrien Tag: 5556,
130 e342de7d 2015-11-11 adrien Message: MessageRread{
131 e342de7d 2015-11-11 adrien Data: []byte("a lot of byte data"),
132 e342de7d 2015-11-11 adrien },
133 e342de7d 2015-11-11 adrien },
134 e342de7d 2015-11-11 adrien marshaled: []byte{
135 e342de7d 2015-11-11 adrien 0x75, 0xb4, 0x15,
136 e342de7d 2015-11-11 adrien 0x12, 0x0, 0x0, 0x0,
137 e342de7d 2015-11-11 adrien 0x61, 0x20, 0x6c, 0x6f, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x79, 0x74, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61},
138 e342de7d 2015-11-11 adrien },
139 e342de7d 2015-11-11 adrien {
140 e342de7d 2015-11-11 adrien description: "",
141 e342de7d 2015-11-11 adrien target: &Fcall{
142 e342de7d 2015-11-11 adrien Type: Rstat,
143 e342de7d 2015-11-11 adrien Tag: 5556,
144 e342de7d 2015-11-11 adrien Message: MessageRstat{
145 e342de7d 2015-11-11 adrien Stat: Dir{
146 e342de7d 2015-11-11 adrien Type: ^uint16(0),
147 e342de7d 2015-11-11 adrien Dev: ^uint32(0),
148 e342de7d 2015-11-11 adrien Qid: Qid{
149 e342de7d 2015-11-11 adrien Type: QTDIR,
150 e342de7d 2015-11-11 adrien Version: ^uint32(0),
151 e342de7d 2015-11-11 adrien Path: ^uint64(0),
152 e342de7d 2015-11-11 adrien },
153 e342de7d 2015-11-11 adrien Mode: DMDIR | DMREAD,
154 e342de7d 2015-11-11 adrien AccessTime: time.Date(2006, 01, 02, 03, 04, 05, 0, time.UTC),
155 e342de7d 2015-11-11 adrien ModTime: time.Date(2006, 01, 02, 03, 04, 05, 0, time.UTC),
156 e342de7d 2015-11-11 adrien Length: ^uint64(0),
157 e342de7d 2015-11-11 adrien Name: "somedir",
158 e342de7d 2015-11-11 adrien UID: "uid",
159 e342de7d 2015-11-11 adrien GID: "gid",
160 e342de7d 2015-11-11 adrien MUID: "muid",
161 e342de7d 2015-11-11 adrien },
162 e342de7d 2015-11-11 adrien },
163 e342de7d 2015-11-11 adrien },
164 e342de7d 2015-11-11 adrien marshaled: []byte{
165 e342de7d 2015-11-11 adrien 0x7d, 0xb4, 0x15,
166 e342de7d 2015-11-11 adrien 0x42, 0x0, // TODO(stevvooe): Include Dir size. Not straightforward.
167 e342de7d 2015-11-11 adrien 0x40, 0x0, // TODO(stevvooe): Include Dir size. Not straightforward.
168 e342de7d 2015-11-11 adrien 0xff, 0xff, // type
169 e342de7d 2015-11-11 adrien 0xff, 0xff, 0xff, 0xff, // dev
170 e342de7d 2015-11-11 adrien 0x80, 0xff, 0xff, 0xff, 0xff, // qid.type, qid.version
171 e342de7d 2015-11-11 adrien 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // qid.path
172 e342de7d 2015-11-11 adrien 0x4, 0x0, 0x0, 0x80, // mode
173 e342de7d 2015-11-11 adrien 0x25, 0x98, 0xb8, 0x43, // atime
174 e342de7d 2015-11-11 adrien 0x25, 0x98, 0xb8, 0x43, // mtime
175 e342de7d 2015-11-11 adrien 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // length
176 e342de7d 2015-11-11 adrien 0x7, 0x0, 0x73, 0x6f, 0x6d, 0x65, 0x64, 0x69, 0x72,
177 e342de7d 2015-11-11 adrien 0x3, 0x0, 0x75, 0x69, 0x64, // uid
178 e342de7d 2015-11-11 adrien 0x3, 0x0, 0x67, 0x69, 0x64, // gid
179 e342de7d 2015-11-11 adrien 0x4, 0x0, 0x6d, 0x75, 0x69, 0x64}, // muid
180 e342de7d 2015-11-11 adrien },
181 e342de7d 2015-11-11 adrien {
182 e342de7d 2015-11-11 adrien description: "Rerror fcall",
183 e342de7d 2015-11-11 adrien target: newErrorFcall(5556, errors.New("A serious error")),
184 e342de7d 2015-11-11 adrien marshaled: []byte{
185 e342de7d 2015-11-11 adrien 0x6b, // Rerror
186 e342de7d 2015-11-11 adrien 0xb4, 0x15, // Tag
187 e342de7d 2015-11-11 adrien 0xf, 0x0, // String size.
188 e342de7d 2015-11-11 adrien 0x41, 0x20, 0x73, 0x65, 0x72, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72},
189 e342de7d 2015-11-11 adrien },
190 e342de7d 2015-11-11 adrien } {
191 e342de7d 2015-11-11 adrien t.Logf("target under test: %#v %T", testcase.target, testcase.target)
192 e342de7d 2015-11-11 adrien fatalf := func(format string, args ...interface{}) {
193 e342de7d 2015-11-11 adrien t.Fatalf(testcase.description+": "+format, args...)
194 e342de7d 2015-11-11 adrien }
195 e342de7d 2015-11-11 adrien
196 e342de7d 2015-11-11 adrien p, err := codec.Marshal(testcase.target)
197 e342de7d 2015-11-11 adrien if err != nil {
198 e342de7d 2015-11-11 adrien fatalf("error writing fcall: %v", err)
199 e342de7d 2015-11-11 adrien }
200 e342de7d 2015-11-11 adrien
201 e342de7d 2015-11-11 adrien if !bytes.Equal(p, testcase.marshaled) {
202 e342de7d 2015-11-11 adrien fatalf("unexpected bytes for fcall: \n%#v != \n%#v", p, testcase.marshaled)
203 e342de7d 2015-11-11 adrien }
204 e342de7d 2015-11-11 adrien
205 e342de7d 2015-11-11 adrien if size9p(testcase.target) == 0 {
206 e342de7d 2015-11-11 adrien fatalf("size of target should never be zero")
207 e342de7d 2015-11-11 adrien }
208 e342de7d 2015-11-11 adrien
209 e342de7d 2015-11-11 adrien // check that size9p is working correctly
210 e342de7d 2015-11-11 adrien if int(size9p(testcase.target)) != len(testcase.marshaled) {
211 e342de7d 2015-11-11 adrien fatalf("size not correct: %v != %v", int(size9p(testcase.target)), len(testcase.marshaled))
212 e342de7d 2015-11-11 adrien }
213 e342de7d 2015-11-11 adrien
214 e342de7d 2015-11-11 adrien var v interface{}
215 e342de7d 2015-11-11 adrien targetType := reflect.TypeOf(testcase.target)
216 e342de7d 2015-11-11 adrien
217 e342de7d 2015-11-11 adrien if targetType.Kind() == reflect.Ptr {
218 e342de7d 2015-11-11 adrien v = reflect.New(targetType.Elem()).Interface()
219 e342de7d 2015-11-11 adrien } else {
220 e342de7d 2015-11-11 adrien v = reflect.New(targetType).Interface()
221 e342de7d 2015-11-11 adrien }
222 e342de7d 2015-11-11 adrien
223 e342de7d 2015-11-11 adrien if err := codec.Unmarshal(p, v); err != nil {
224 e342de7d 2015-11-11 adrien fatalf("error reading: %v", err)
225 e342de7d 2015-11-11 adrien }
226 e342de7d 2015-11-11 adrien
227 e342de7d 2015-11-11 adrien if targetType.Kind() != reflect.Ptr {
228 e342de7d 2015-11-11 adrien v = reflect.Indirect(reflect.ValueOf(v)).Interface()
229 e342de7d 2015-11-11 adrien }
230 e342de7d 2015-11-11 adrien
231 e342de7d 2015-11-11 adrien if !reflect.DeepEqual(v, testcase.target) {
232 e342de7d 2015-11-11 adrien fatalf("not equal: %v != %v (\n%#v\n%#v\n)",
233 e342de7d 2015-11-11 adrien v, testcase.target,
234 e342de7d 2015-11-11 adrien v, testcase.target)
235 e342de7d 2015-11-11 adrien }
236 e342de7d 2015-11-11 adrien
237 e342de7d 2015-11-11 adrien t.Logf("%#v", v)
238 e342de7d 2015-11-11 adrien
239 e342de7d 2015-11-11 adrien }
240 e342de7d 2015-11-11 adrien }