| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package mdns |
| |
| import ( |
| "crypto/rand" |
| "encoding/base64" |
| "reflect" |
| "sort" |
| "testing" |
| |
| "v.io/v23/discovery" |
| ) |
| |
| func TestEncodeAdId(t *testing.T) { |
| for i := 0; i < 10; i++ { |
| var id discovery.AdId |
| _, err := rand.Read(id[:]) |
| if err != nil { |
| panic(err) |
| } |
| |
| encoded := encodeAdId(&id) |
| |
| var decoded discovery.AdId |
| if err := decodeAdId(encoded, &decoded); err != nil { |
| t.Errorf("decode id failed: %v", err) |
| continue |
| } |
| if id != decoded { |
| t.Errorf("decoded to %v, but want %v", decoded, id) |
| } |
| } |
| } |
| |
| func TestEncodeLargeTxt(t *testing.T) { |
| tests := [][]string{ |
| []string{randTxt(maxTxtRecordLen / 2)}, |
| []string{randTxt(maxTxtRecordLen / 2), randTxt(maxTxtRecordLen / 3)}, |
| []string{randTxt(maxTxtRecordLen * 2)}, |
| []string{randTxt(maxTxtRecordLen * 2), randTxt(maxTxtRecordLen * 3)}, |
| []string{randTxt(maxTxtRecordLen / 2), randTxt(maxTxtRecordLen * 3), randTxt(maxTxtRecordLen * 2), randTxt(maxTxtRecordLen / 3)}, |
| } |
| |
| for i, test := range tests { |
| var splitted []string |
| for i, txt := range test { |
| xseq := i*3 + 1 // To test non-sequential index. |
| txts, nxseq := maybeSplitTxtRecord(txt, xseq) |
| if len(txts) > 1 { |
| xseq++ |
| } |
| if nxseq != xseq { |
| t.Errorf("[%d]: got xseq %d; but wanted %d", nxseq, xseq) |
| } |
| splitted = append(splitted, txts...) |
| } |
| |
| for _, v := range splitted { |
| if len(v) > maxTxtRecordLen { |
| t.Errorf("[%d]: too large encoded txt %d - %v", i, len(v), v) |
| } |
| } |
| |
| txts, err := maybeJoinTxtRecords(splitted) |
| if err != nil { |
| t.Errorf("[%d]: decodeLargeTxt failed: %v", i, err) |
| continue |
| } |
| |
| sort.Strings(txts) |
| sort.Strings(test) |
| if !reflect.DeepEqual(txts, test) { |
| t.Errorf("[%d]: decoded to %v, but want %v", i, txts, test) |
| } |
| } |
| } |
| |
| func randTxt(n int) string { |
| b := make([]byte, int((n*3+3)/4)) |
| _, err := rand.Read(b) |
| if err != nil { |
| panic(err) |
| } |
| return base64.RawStdEncoding.EncodeToString(b)[:n] |
| } |