| // 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) | |
| } | |
| }) | |
| } | |
| } |