blob: cda50e6377567a703a62efb535f24397207835fc [file] [log] [blame]
// Copyright 2019 The Go 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 ocagent
import (
"encoding/json"
"errors"
"reflect"
"testing"
"golang.org/x/tools/internal/telemetry"
"golang.org/x/tools/internal/telemetry/export/ocagent/wire"
"golang.org/x/tools/internal/telemetry/tag"
)
func TestConvert_annotation(t *testing.T) {
tests := []struct {
name string
event telemetry.Event
want *wire.Annotation
}{
{
name: "no tags",
want: nil,
},
{
name: "description no error",
event: telemetry.Event{
Message: "cache miss",
Tags: telemetry.TagList{
tag.Of("db", "godb"),
},
},
want: &wire.Annotation{
Description: &wire.TruncatableString{Value: "cache miss"},
Attributes: &wire.Attributes{
AttributeMap: map[string]wire.Attribute{
"db": wire.StringAttribute{StringValue: &wire.TruncatableString{Value: "godb"}},
},
},
},
},
{
name: "description and error",
event: telemetry.Event{
Message: "cache miss",
Error: errors.New("no network connectivity"),
Tags: telemetry.TagList{
tag.Of("db", "godb"),
},
},
want: &wire.Annotation{
Description: &wire.TruncatableString{Value: "cache miss"},
Attributes: &wire.Attributes{
AttributeMap: map[string]wire.Attribute{
"Error": wire.StringAttribute{StringValue: &wire.TruncatableString{Value: "no network connectivity"}},
"db": wire.StringAttribute{StringValue: &wire.TruncatableString{Value: "godb"}},
},
},
},
},
{
name: "no description, but error",
event: telemetry.Event{
Error: errors.New("no network connectivity"),
Tags: telemetry.TagList{
tag.Of("db", "godb"),
},
},
want: &wire.Annotation{
Description: &wire.TruncatableString{Value: "no network connectivity"},
Attributes: &wire.Attributes{
AttributeMap: map[string]wire.Attribute{
"db": wire.StringAttribute{StringValue: &wire.TruncatableString{Value: "godb"}},
},
},
},
},
{
name: "enumerate all attribute types",
event: telemetry.Event{
Message: "cache miss",
Tags: telemetry.TagList{
tag.Of("db", "godb"),
tag.Of("age", 0.456), // Constant converted into "float64"
tag.Of("ttl", float32(5000)),
tag.Of("expiry_ms", float64(1e3)),
tag.Of("retry", false),
tag.Of("stale", true),
tag.Of("max", 0x7fff), // Constant converted into "int"
tag.Of("opcode", int8(0x7e)),
tag.Of("base", int16(1<<9)),
tag.Of("checksum", int32(0x11f7e294)),
tag.Of("mode", int64(0644)),
tag.Of("min", uint(1)),
tag.Of("mix", uint8(44)),
tag.Of("port", uint16(55678)),
tag.Of("min_hops", uint32(1<<9)),
tag.Of("max_hops", uint64(0xffffff)),
},
},
want: &wire.Annotation{
Description: &wire.TruncatableString{Value: "cache miss"},
Attributes: &wire.Attributes{
AttributeMap: map[string]wire.Attribute{
"db": wire.StringAttribute{StringValue: &wire.TruncatableString{Value: "godb"}},
"age": wire.DoubleAttribute{DoubleValue: 0.456},
"ttl": wire.DoubleAttribute{DoubleValue: 5000.0},
"expiry_ms": wire.DoubleAttribute{DoubleValue: 1e3},
"retry": wire.BoolAttribute{BoolValue: false},
"stale": wire.BoolAttribute{BoolValue: true},
"max": wire.IntAttribute{IntValue: 0x7fff},
"opcode": wire.IntAttribute{IntValue: 0x7e},
"base": wire.IntAttribute{IntValue: 1 << 9},
"checksum": wire.IntAttribute{IntValue: 0x11f7e294},
"mode": wire.IntAttribute{IntValue: 0644},
"min": wire.IntAttribute{IntValue: 1},
"mix": wire.IntAttribute{IntValue: 44},
"port": wire.IntAttribute{IntValue: 55678},
"min_hops": wire.IntAttribute{IntValue: 1 << 9},
"max_hops": wire.IntAttribute{IntValue: 0xffffff},
},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := convertAnnotation(tt.event)
if !reflect.DeepEqual(got, tt.want) {
t.Fatalf("Got:\n%s\nWant:\n%s", marshaled(got), marshaled(tt.want))
}
})
}
}
func marshaled(v interface{}) string {
blob, _ := json.MarshalIndent(v, "", " ")
return string(blob)
}