11 func TestEncodeDecode(t *testing.T) {
13 for _, testcase := range []struct {
21 marshaled: []byte{0x55},
24 description: "uint16",
25 target: uint16(0x5544),
26 marshaled: []byte{0x44, 0x55},
29 description: "string",
31 marshaled: []byte{0x4, 0x0, 0x61, 0x73, 0x64, 0x66},
34 description: "StringSlice",
35 target: []string{"asdf", "qwer", "zxcv"},
37 0x3, 0x0, // len(target)
38 0x4, 0x0, 0x61, 0x73, 0x64, 0x66,
39 0x4, 0x0, 0x71, 0x77, 0x65, 0x72,
40 0x4, 0x0, 0x7a, 0x78, 0x63, 0x76},
47 Path: 0x1020304050607080},
50 0x40, 0x30, 0x20, 0x10, // version
51 0x80, 0x70, 0x60, 0x50, 0x40, 0x30, 0x20, 0x10, // path
56 description: "TversionFcall",
60 Message: MessageTversion{
66 0x64, 0xcf, 0x8, 0x0, 0x4, 0x0, 0x0,
67 0x6, 0x0, 0x39, 0x50, 0x54, 0x45, 0x53, 0x54},
70 description: "RversionFcall",
74 Message: MessageRversion{
80 0x65, 0xcf, 0x8, 0x0, 0x4, 0x0, 0x0,
81 0x6, 0x0, 0x39, 0x50, 0x54, 0x45, 0x53, 0x54},
84 description: "TwalkFcall",
88 Message: MessageTwalk{
91 Wnames: []string{"a", "b", "c"},
95 0x6e, 0x22, 0x16, 0xf2, 0x3, 0x0, 0x0, 0xf3, 0x3, 0x0, 0x0,
96 0x3, 0x0, // len(wnames)
97 0x1, 0x0, 0x61, // "a"
98 0x1, 0x0, 0x62, // "b"
99 0x1, 0x0, 0x63}, // "c"
102 description: "RwalkFcall",
106 Message: MessageRwalk{
122 0x80, 0x68, 0x2b, 0x0, 0x0, 0x57, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
123 0x0, 0x58, 0x4, 0x0, 0x0, 0x6a, 0x2b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
126 description: "EmptyRreadFcall",
130 Message: MessageRread{},
137 description: "EmptyTwriteFcall",
141 Message: MessageTwrite{},
144 byte(Twrite), 0xb4, 0x15,
146 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
150 description: "RreadFcall",
154 Message: MessageRread{
155 Data: []byte("a lot of byte data"),
161 0x61, 0x20, 0x6c, 0x6f, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x79, 0x74, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61},
164 description: "RstatFcall",
168 Message: MessageRstat{
177 Mode: DMDIR | DMREAD,
178 AccessTime: time.Date(2006, 01, 02, 03, 04, 05, 0, time.UTC),
179 ModTime: time.Date(2006, 01, 02, 03, 04, 05, 0, time.UTC),
190 0x42, 0x0, // TODO(stevvooe): Include Dir size. Not straightforward.
191 0x40, 0x0, // TODO(stevvooe): Include Dir size. Not straightforward.
193 0xff, 0xff, 0xff, 0xff, // dev
194 0x80, 0xff, 0xff, 0xff, 0xff, // qid.type, qid.version
195 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // qid.path
196 0x4, 0x0, 0x0, 0x80, // mode
197 0x25, 0x98, 0xb8, 0x43, // atime
198 0x25, 0x98, 0xb8, 0x43, // mtime
199 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // length
200 0x7, 0x0, 0x73, 0x6f, 0x6d, 0x65, 0x64, 0x69, 0x72,
201 0x3, 0x0, 0x75, 0x69, 0x64, // uid
202 0x3, 0x0, 0x67, 0x69, 0x64, // gid
203 0x4, 0x0, 0x6d, 0x75, 0x69, 0x64}, // muid
206 description: "DirSlice",
216 Mode: DMDIR | DMREAD,
217 AccessTime: time.Date(2006, 01, 02, 03, 04, 05, 0, time.UTC),
218 ModTime: time.Date(2006, 01, 02, 03, 04, 05, 0, time.UTC),
233 Mode: DMDIR | DMREAD,
234 AccessTime: time.Date(2006, 01, 02, 03, 04, 05, 0, time.UTC),
235 ModTime: time.Date(2006, 01, 02, 03, 04, 05, 0, time.UTC),
250 Mode: DMDIR | DMREAD,
251 AccessTime: time.Date(2006, 01, 02, 03, 04, 05, 0, time.UTC),
252 ModTime: time.Date(2006, 01, 02, 03, 04, 05, 0, time.UTC),
267 Mode: DMDIR | DMREAD,
268 AccessTime: time.Date(2006, 01, 02, 03, 04, 05, 0, time.UTC),
269 ModTime: time.Date(2006, 01, 02, 03, 04, 05, 0, time.UTC),
280 0x0, 0x0, 0x0, 0x0, // dev
281 0x80, // qid.type == QTDIR
282 0x0, 0x0, 0x0, 0x0, // qid.vers
283 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // qid.path
284 0x4, 0x0, 0x0, 0x80, // mode
285 0x25, 0x98, 0xb8, 0x43, // atime
286 0x25, 0x98, 0xb8, 0x43, // mtime
287 0x88, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, // length
291 0x35, 0x30, 0x31, // 501
295 0x6e, 0x6f, 0x6e, 0x65, // none
299 0x0, 0x0, 0x0, 0x0, // dev
300 0x80, // qid.type == QTDIR
301 0x0, 0x0, 0x0, 0x0, // qid.vers
302 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // qid.path
303 0x4, 0x0, 0x0, 0x80, // mode
304 0x25, 0x98, 0xb8, 0x43, // atime
305 0x25, 0x98, 0xb8, 0x43, // mtime
306 0x3e, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, // length
310 0x35, 0x30, 0x31, // 501
314 0x6e, 0x6f, 0x6e, 0x65, // none
318 0x0, 0x0, 0x0, 0x0, // dev
319 0x80, // qid.type == QTDIR
320 0x0, 0x0, 0x0, 0x0, // qid.vers
321 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // qid.Path
322 0x4, 0x0, 0x0, 0x80, // mode
323 0x25, 0x98, 0xb8, 0x43, // atime
324 0x25, 0x98, 0xb8, 0x43, // mtime
325 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, // length
327 0x68, 0x65, 0x6c, 0x6c, 0x6f, // hello
329 0x35, 0x30, 0x31, // 501
333 0x6e, 0x6f, 0x6e, 0x65, // none
337 0x0, 0x0, 0x0, 0x0, // dev
338 0x80, // qid.type == QTDIR
339 0x0, 0x0, 0x0, 0x0, //qid.vers
340 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // qid.path
341 0x4, 0x0, 0x0, 0x80, // mode
342 0x25, 0x98, 0xb8, 0x43, // atime
343 0x25, 0x98, 0xb8, 0x43, // mtime
344 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, // length
346 0x74, 0x68, 0x65, 0x72, 0x65, // there
348 0x35, 0x30, 0x31, // 501
352 0x6e, 0x6f, 0x6e, 0x65, // none
356 description: "RerrorFcall",
357 target: newErrorFcall(5556, errors.New("A serious error")),
361 0xf, 0x0, // String size.
362 0x41, 0x20, 0x73, 0x65, 0x72, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72},
366 t.Run(testcase.description, func(t *testing.T) {
367 p, err := codec.Marshal(testcase.target)
369 t.Fatalf("error writing fcall: %v", err)
372 if !bytes.Equal(p, testcase.marshaled) {
373 t.Fatalf("unexpected bytes for fcall: \n%#v != \n%#v", p, testcase.marshaled)
376 if size9p(testcase.target) == 0 {
377 t.Fatalf("size of target should never be zero")
380 // check that size9p is working correctly
381 if int(size9p(testcase.target)) != len(testcase.marshaled) {
382 t.Fatalf("size not correct: %v != %v", int(size9p(testcase.target)), len(testcase.marshaled))
386 targetType := reflect.TypeOf(testcase.target)
388 if targetType.Kind() == reflect.Ptr {
389 v = reflect.New(targetType.Elem()).Interface()
391 v = reflect.New(targetType).Interface()
394 if err := codec.Unmarshal(p, v); err != nil {
395 t.Fatalf("error reading: %v", err)
398 if targetType.Kind() != reflect.Ptr {
399 v = reflect.Indirect(reflect.ValueOf(v)).Interface()
402 if !reflect.DeepEqual(v, testcase.target) {
403 t.Fatalf("not equal: %v != %v (\n%#v\n%#v\n)",