diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e8f2a1c5d5..245f4cffa4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm This method is used to check if an `Instrument` instance is a zero-value. (#5431) - Store and provide the emitted `context.Context` in `ScopeRecords` of `go.opentelemetry.io/otel/sdk/log/logtest`. (#5468) - `SimpleProcessor.OnEmit` in `go.opentelemetry.io/otel/sdk/log` no longer allocates a slice which makes it possible to have a zero-allocation log processing using `SimpleProcessor`. (#5493) +- The `AssertRecordEqual` method to `go.opentelemetry.io/otel/log/logtest` to allow comparison of two log records in tests. (#5499) ### Changed diff --git a/log/logtest/assertions.go b/log/logtest/assertions.go new file mode 100644 index 00000000000..8fb72e65ea2 --- /dev/null +++ b/log/logtest/assertions.go @@ -0,0 +1,70 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package logtest // import "go.opentelemetry.io/otel/log/logtest" + +import ( + "slices" + "testing" + + "go.opentelemetry.io/otel/log" +) + +// AssertRecordEqual compares two log records, and fails the test if they are +// not equal. +func AssertRecordEqual(t testing.TB, want, got log.Record) bool { + t.Helper() + + if !want.Timestamp().Equal(got.Timestamp()) { + t.Errorf("Timestamp value is not equal:\nwant: %v\ngot: %v", want.Timestamp(), got.Timestamp()) + return false + } + if !want.ObservedTimestamp().Equal(got.ObservedTimestamp()) { + t.Errorf("ObservedTimestamp value is not equal:\nwant: %v\ngot: %v", want.ObservedTimestamp(), got.ObservedTimestamp()) + return false + } + if want.Severity() != got.Severity() { + t.Errorf("Severity value is not equal:\nwant: %v\ngot: %v", want.Severity(), got.Severity()) + return false + } + if want.SeverityText() != got.SeverityText() { + t.Errorf("SeverityText value is not equal:\nwant: %v\ngot: %v", want.SeverityText(), got.SeverityText()) + return false + } + if !assertBody(t, want.Body(), got) { + return false + } + + var attrs []log.KeyValue + want.WalkAttributes(func(kv log.KeyValue) bool { + attrs = append(attrs, kv) + return true + }) + return assertAttributes(t, attrs, got) +} + +func assertBody(t testing.TB, want log.Value, r log.Record) bool { + t.Helper() + got := r.Body() + if !got.Equal(want) { + t.Errorf("Body value is not equal:\nwant: %v\ngot: %v", want, got) + return false + } + + return true +} + +func assertAttributes(t testing.TB, want []log.KeyValue, r log.Record) bool { + 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) + return false + } + + return true +} diff --git a/log/logtest/assertions_test.go b/log/logtest/assertions_test.go new file mode 100644 index 00000000000..7f4e91b675e --- /dev/null +++ b/log/logtest/assertions_test.go @@ -0,0 +1,33 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package logtest + +import ( + "testing" + "time" + + "go.opentelemetry.io/otel/log" +) + +func TestAssertRecord(t *testing.T) { + r1 := log.Record{} + r2 := log.Record{} + now := time.Now() + + AssertRecordEqual(t, r1, r2) + + r1.SetTimestamp(now) + r2.SetTimestamp(now) + r1.SetObservedTimestamp(now) + r2.SetObservedTimestamp(now) + r1.SetSeverity(log.SeverityTrace1) + r2.SetSeverity(log.SeverityTrace1) + r1.SetSeverityText("trace") + r2.SetSeverityText("trace") + r1.SetBody(log.StringValue("log body")) + r2.SetBody(log.StringValue("log body")) + r1.AddAttributes(log.Bool("attr", true)) + r2.AddAttributes(log.Bool("attr", true)) + AssertRecordEqual(t, r1, r2) +} diff --git a/log/logtest/factory_test.go b/log/logtest/factory_test.go index 6fa61049aae..8cfae272081 100644 --- a/log/logtest/factory_test.go +++ b/log/logtest/factory_test.go @@ -4,7 +4,6 @@ package logtest import ( - "slices" "testing" "time" @@ -66,48 +65,3 @@ func TestRecordFactoryMultiple(t *testing.T) { assert.Equal(t, now, record1.Timestamp()) assertAttributes(t, attrs, record1) } - -func assertRecord(t *testing.T, want log.Record, got log.Record) { - t.Helper() - - if !want.Timestamp().Equal(got.Timestamp()) { - t.Errorf("Timestamp value is not equal:\nwant: %v\ngot: %v", want.Timestamp(), got.Timestamp()) - } - if !want.ObservedTimestamp().Equal(got.ObservedTimestamp()) { - t.Errorf("ObservedTimestamp value is not equal:\nwant: %v\ngot: %v", want.ObservedTimestamp(), got.ObservedTimestamp()) - } - if want.Severity() != got.Severity() { - t.Errorf("Severity value is not equal:\nwant: %v\ngot: %v", want.Severity(), got.Severity()) - } - if want.SeverityText() != got.SeverityText() { - t.Errorf("SeverityText value is not equal:\nwant: %v\ngot: %v", want.SeverityText(), got.SeverityText()) - } - assertBody(t, want.Body(), got) - - var attrs []log.KeyValue - want.WalkAttributes(func(kv log.KeyValue) bool { - attrs = append(attrs, kv) - return true - }) - assertAttributes(t, attrs, got) -} - -func assertBody(t *testing.T, want log.Value, r log.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 log.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) - } -} diff --git a/log/logtest/recorder_test.go b/log/logtest/recorder_test.go index a66ebe96cf1..15f67d0e6de 100644 --- a/log/logtest/recorder_test.go +++ b/log/logtest/recorder_test.go @@ -133,11 +133,11 @@ func TestRecorderEmitAndReset(t *testing.T) { nl.Emit(ctx2, r2) assert.Len(t, r.Result()[0].Records, 1) - assertRecord(t, r.Result()[0].Records[0].Record, r1) + AssertRecordEqual(t, r.Result()[0].Records[0].Record, r1) assert.Equal(t, r.Result()[0].Records[0].Context(), ctx) assert.Len(t, r.Result()[1].Records, 1) - assertRecord(t, r.Result()[1].Records[0].Record, r2) + AssertRecordEqual(t, r.Result()[1].Records[0].Record, r2) assert.Equal(t, r.Result()[1].Records[0].Context(), ctx2) r.Reset()