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,
48 Path: 0x1020304050607080,
52 0x40, 0x30, 0x20, 0x10, // version
53 0x80, 0x70, 0x60, 0x50, 0x40, 0x30, 0x20, 0x10, // path
58 description: "TversionFcall",
62 Message: MessageTversion{
68 0x64, 0xcf, 0x8, 0x0, 0x4, 0x0, 0x0,
69 0x6, 0x0, 0x39, 0x50, 0x54, 0x45, 0x53, 0x54,
73 description: "RversionFcall",
77 Message: MessageRversion{
83 0x65, 0xcf, 0x8, 0x0, 0x4, 0x0, 0x0,
84 0x6, 0x0, 0x39, 0x50, 0x54, 0x45, 0x53, 0x54,
88 description: "TwalkFcall",
92 Message: MessageTwalk{
95 Wnames: []string{"a", "b", "c"},
99 0x6e, 0x22, 0x16, 0xf2, 0x3, 0x0, 0x0, 0xf3, 0x3, 0x0, 0x0,
100 0x3, 0x0, // len(wnames)
101 0x1, 0x0, 0x61, // "a"
102 0x1, 0x0, 0x62, // "b"
103 0x1, 0x0, 0x63, // "c"
107 description: "RwalkFcall",
111 Message: MessageRwalk{
129 0x80, 0x68, 0x2b, 0x0, 0x0, 0x57, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
130 0x0, 0x58, 0x4, 0x0, 0x0, 0x6a, 0x2b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
134 description: "EmptyRreadFcall",
138 Message: MessageRread{},
146 description: "EmptyTwriteFcall",
150 Message: MessageTwrite{},
153 byte(Twrite), 0xb4, 0x15,
155 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
160 description: "RreadFcall",
164 Message: MessageRread{
165 Data: []byte("a lot of byte data"),
171 0x61, 0x20, 0x6c, 0x6f, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x79, 0x74, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61,
175 description: "RstatFcall",
179 Message: MessageRstat{
188 Mode: DMDIR | DMREAD,
189 AccessTime: time.Date(2006, 01, 02, 03, 04, 05, 0, time.UTC),
190 ModTime: time.Date(2006, 01, 02, 03, 04, 05, 0, time.UTC),
201 0x42, 0x0, // TODO(stevvooe): Include Dir size. Not straightforward.
202 0x40, 0x0, // TODO(stevvooe): Include Dir size. Not straightforward.
204 0xff, 0xff, 0xff, 0xff, // dev
205 0x80, 0xff, 0xff, 0xff, 0xff, // qid.type, qid.version
206 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // qid.path
207 0x4, 0x0, 0x0, 0x80, // mode
208 0x25, 0x98, 0xb8, 0x43, // atime
209 0x25, 0x98, 0xb8, 0x43, // mtime
210 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // length
211 0x7, 0x0, 0x73, 0x6f, 0x6d, 0x65, 0x64, 0x69, 0x72,
212 0x3, 0x0, 0x75, 0x69, 0x64, // uid
213 0x3, 0x0, 0x67, 0x69, 0x64, // gid
214 0x4, 0x0, 0x6d, 0x75, 0x69, 0x64, // muid
218 description: "DirSlice",
228 Mode: DMDIR | DMREAD,
229 AccessTime: time.Date(2006, 01, 02, 03, 04, 05, 0, time.UTC),
230 ModTime: time.Date(2006, 01, 02, 03, 04, 05, 0, time.UTC),
245 Mode: DMDIR | DMREAD,
246 AccessTime: time.Date(2006, 01, 02, 03, 04, 05, 0, time.UTC),
247 ModTime: time.Date(2006, 01, 02, 03, 04, 05, 0, time.UTC),
262 Mode: DMDIR | DMREAD,
263 AccessTime: time.Date(2006, 01, 02, 03, 04, 05, 0, time.UTC),
264 ModTime: time.Date(2006, 01, 02, 03, 04, 05, 0, time.UTC),
279 Mode: DMDIR | DMREAD,
280 AccessTime: time.Date(2006, 01, 02, 03, 04, 05, 0, time.UTC),
281 ModTime: time.Date(2006, 01, 02, 03, 04, 05, 0, time.UTC),
292 0x0, 0x0, 0x0, 0x0, // dev
293 0x80, // qid.type == QTDIR
294 0x0, 0x0, 0x0, 0x0, // qid.vers
295 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // qid.path
296 0x4, 0x0, 0x0, 0x80, // mode
297 0x25, 0x98, 0xb8, 0x43, // atime
298 0x25, 0x98, 0xb8, 0x43, // mtime
299 0x88, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, // length
303 0x35, 0x30, 0x31, // 501
307 0x6e, 0x6f, 0x6e, 0x65, // none
311 0x0, 0x0, 0x0, 0x0, // dev
312 0x80, // qid.type == QTDIR
313 0x0, 0x0, 0x0, 0x0, // qid.vers
314 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // qid.path
315 0x4, 0x0, 0x0, 0x80, // mode
316 0x25, 0x98, 0xb8, 0x43, // atime
317 0x25, 0x98, 0xb8, 0x43, // mtime
318 0x3e, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, // length
322 0x35, 0x30, 0x31, // 501
326 0x6e, 0x6f, 0x6e, 0x65, // none
330 0x0, 0x0, 0x0, 0x0, // dev
331 0x80, // qid.type == QTDIR
332 0x0, 0x0, 0x0, 0x0, // qid.vers
333 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // qid.Path
334 0x4, 0x0, 0x0, 0x80, // mode
335 0x25, 0x98, 0xb8, 0x43, // atime
336 0x25, 0x98, 0xb8, 0x43, // mtime
337 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, // length
339 0x68, 0x65, 0x6c, 0x6c, 0x6f, // hello
341 0x35, 0x30, 0x31, // 501
345 0x6e, 0x6f, 0x6e, 0x65, // none
349 0x0, 0x0, 0x0, 0x0, // dev
350 0x80, // qid.type == QTDIR
351 0x0, 0x0, 0x0, 0x0, //qid.vers
352 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // qid.path
353 0x4, 0x0, 0x0, 0x80, // mode
354 0x25, 0x98, 0xb8, 0x43, // atime
355 0x25, 0x98, 0xb8, 0x43, // mtime
356 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, // length
358 0x74, 0x68, 0x65, 0x72, 0x65, // there
360 0x35, 0x30, 0x31, // 501
364 0x6e, 0x6f, 0x6e, 0x65, // none
368 description: "RerrorFcall",
369 target: newErrorFcall(5556, errors.New("A serious error")),
373 0xf, 0x0, // String size.
374 0x41, 0x20, 0x73, 0x65, 0x72, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72,
379 t.Run(testcase.description, func(t *testing.T) {
380 p, err := codec.Marshal(testcase.target)
382 t.Fatalf("error writing fcall: %v", err)
385 if !bytes.Equal(p, testcase.marshaled) {
386 t.Fatalf("unexpected bytes for fcall: \n%#v != \n%#v", p, testcase.marshaled)
389 if size9p(testcase.target) == 0 {
390 t.Fatalf("size of target should never be zero")
393 // check that size9p is working correctly
394 if int(size9p(testcase.target)) != len(testcase.marshaled) {
395 t.Fatalf("size not correct: %v != %v", int(size9p(testcase.target)), len(testcase.marshaled))
399 targetType := reflect.TypeOf(testcase.target)
401 if targetType.Kind() == reflect.Ptr {
402 v = reflect.New(targetType.Elem()).Interface()
404 v = reflect.New(targetType).Interface()
407 if err := codec.Unmarshal(p, v); err != nil {
408 t.Fatalf("error reading: %v", err)
411 if targetType.Kind() != reflect.Ptr {
412 v = reflect.Indirect(reflect.ValueOf(v)).Interface()
415 if !reflect.DeepEqual(v, testcase.target) {
416 t.Fatalf("not equal: %v != %v (\n%#v\n%#v\n)",