1
0
mirror of https://github.com/open-telemetry/opentelemetry-go.git synced 2025-02-01 13:07:51 +02:00
opentelemetry-go/sdk/log/logtest/factory_test.go
Tyler Yahn 36bee9356a
Use reflect to construct a Record in logtest (#5275)
* Use reflect to construct Record

* Fix merge

* Fix merge
2024-05-06 09:03:14 -07:00

129 lines
3.4 KiB
Go

// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
package logtest
import (
"slices"
"testing"
"time"
"github.com/stretchr/testify/assert"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/log"
"go.opentelemetry.io/otel/sdk/instrumentation"
sdklog "go.opentelemetry.io/otel/sdk/log"
"go.opentelemetry.io/otel/sdk/resource"
"go.opentelemetry.io/otel/trace"
)
func TestRecordFactoryEmpty(t *testing.T) {
assert.Equal(t, sdklog.Record{}, RecordFactory{}.NewRecord())
}
func TestRecordFactory(t *testing.T) {
now := time.Now()
observed := now.Add(time.Second)
severity := log.SeverityDebug
severityText := "DBG"
body := log.StringValue("Message")
attrs := []log.KeyValue{
log.Int("int", 1),
log.String("str", "foo"),
log.Float64("flt", 3.14),
}
traceID := trace.TraceID([16]byte{1})
spanID := trace.SpanID([8]byte{2})
traceFlags := trace.FlagsSampled
dropped := 3
scope := instrumentation.Scope{
Name: t.Name(),
}
r := resource.NewSchemaless(attribute.Bool("works", true))
got := RecordFactory{
Timestamp: now,
ObservedTimestamp: observed,
Severity: severity,
SeverityText: severityText,
Body: body,
Attributes: attrs,
TraceID: traceID,
SpanID: spanID,
TraceFlags: traceFlags,
DroppedAttributes: dropped,
InstrumentationScope: &scope,
Resource: r,
}.NewRecord()
assert.Equal(t, now, got.Timestamp())
assert.Equal(t, observed, got.ObservedTimestamp())
assert.Equal(t, severity, got.Severity())
assert.Equal(t, severityText, got.SeverityText())
assertBody(t, body, got)
assertAttributes(t, attrs, got)
assert.Equal(t, dropped, got.DroppedAttributes())
assert.Equal(t, traceID, got.TraceID())
assert.Equal(t, spanID, got.SpanID())
assert.Equal(t, traceFlags, got.TraceFlags())
assert.Equal(t, scope, got.InstrumentationScope())
assert.Equal(t, *r, got.Resource())
}
func TestRecordFactoryMultiple(t *testing.T) {
now := time.Now()
attrs := []log.KeyValue{
log.Int("int", 1),
log.String("str", "foo"),
log.Float64("flt", 3.14),
}
scope := instrumentation.Scope{
Name: t.Name(),
}
f := RecordFactory{
Timestamp: now,
Attributes: attrs,
DroppedAttributes: 1,
InstrumentationScope: &scope,
}
record1 := f.NewRecord()
f.Attributes = append(f.Attributes, log.Bool("added", true))
f.DroppedAttributes = 2
record2 := f.NewRecord()
assert.Equal(t, now, record2.Timestamp())
assertAttributes(t, append(attrs, log.Bool("added", true)), record2)
assert.Equal(t, 2, record2.DroppedAttributes())
assert.Equal(t, scope, record2.InstrumentationScope())
// Previously returned record is unharmed by the builder changes.
assert.Equal(t, now, record1.Timestamp())
assertAttributes(t, attrs, record1)
assert.Equal(t, 1, record1.DroppedAttributes())
assert.Equal(t, scope, record1.InstrumentationScope())
}
func assertBody(t *testing.T, want log.Value, r sdklog.Record) {
t.Helper()
got := r.Body()
if !got.Equal(want) {
t.Errorf("Body value is not equal:\nwant: %v\ngot: %v", want, got)
}
}
func assertAttributes(t *testing.T, want []log.KeyValue, r sdklog.Record) {
t.Helper()
var got []log.KeyValue
r.WalkAttributes(func(kv log.KeyValue) bool {
got = append(got, kv)
return true
})
if !slices.EqualFunc(want, got, log.KeyValue.Equal) {
t.Errorf("Attributes are not equal:\nwant: %v\ngot: %v", want, got)
}
}