// Copyright 2017, OpenCensus Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // package tag import ( "context" "reflect" "sort" "testing" ) func TestEncodeDecode(t *testing.T) { k1, _ := NewKey("k1") k2, _ := NewKey("k2") k3, _ := NewKey("k3 is very weird <>.,?/'\";:`~!@#$%^&*()_-+={[}]|\\") k4, _ := NewKey("k4") type keyValue struct { k Key v string } testCases := []struct { label string pairs []keyValue }{ { "0", []keyValue{}, }, { "1", []keyValue{ {k1, "v1"}, }, }, { "2", []keyValue{ {k1, "v1"}, {k2, "v2"}, }, }, { "3", []keyValue{ {k1, "v1"}, {k2, "v2"}, {k3, "v3"}, }, }, { "4", []keyValue{ {k1, "v1"}, {k2, "v2"}, {k3, "v3"}, {k4, "v4 is very weird <>.,?/'\";:`~!@#$%^&*()_-+={[}]|\\"}, }, }, } for _, tc := range testCases { mods := make([]Mutator, len(tc.pairs)) for i, pair := range tc.pairs { mods[i] = Upsert(pair.k, pair.v) } ctx, err := New(context.Background(), mods...) if err != nil { t.Errorf("%v: New = %v", tc.label, err) } encoded := Encode(FromContext(ctx)) decoded, err := Decode(encoded) if err != nil { t.Errorf("%v: decoding encoded tag map failed: %v", tc.label, err) } got := make([]keyValue, 0) for k, v := range decoded.m { got = append(got, keyValue{k, string(v)}) } want := tc.pairs sort.Slice(got, func(i, j int) bool { return got[i].k.name < got[j].k.name }) sort.Slice(want, func(i, j int) bool { return got[i].k.name < got[j].k.name }) if !reflect.DeepEqual(got, tc.pairs) { t.Errorf("%v: decoded tag map = %#v; want %#v", tc.label, got, want) } } } func TestDecode(t *testing.T) { k1, _ := NewKey("k1") ctx, _ := New(context.Background(), Insert(k1, "v1")) tests := []struct { name string bytes []byte want *Map wantErr bool }{ { name: "valid", bytes: []byte{0, 0, 2, 107, 49, 2, 118, 49}, want: FromContext(ctx), wantErr: false, }, { name: "non-ascii key", bytes: []byte{0, 0, 2, 107, 49, 2, 118, 49, 0, 2, 107, 25, 2, 118, 49}, want: nil, wantErr: true, }, { name: "non-ascii value", bytes: []byte{0, 0, 2, 107, 49, 2, 118, 49, 0, 2, 107, 50, 2, 118, 25}, want: nil, wantErr: true, }, { name: "long value", bytes: []byte{0, 0, 2, 107, 49, 2, 118, 49, 0, 2, 107, 50, 172, 2, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97}, want: nil, wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := Decode(tt.bytes) if (err != nil) != tt.wantErr { t.Errorf("Decode() error = %v, wantErr %v", err, tt.wantErr) return } if !reflect.DeepEqual(got, tt.want) { t.Errorf("Decode() = %v, want %v", got, tt.want) } }) } }