Skip to content

Commit 6e60272

Browse files
[-] return the error from MultiWriter.DefineMetrics(), fixes #1222 (#1224)
* Fix: return the accumulated error instead of nil #1222 * improve tests --------- Co-authored-by: Pavlo Golub <pavlo.golub@gmail.com>
1 parent 34df504 commit 6e60272

2 files changed

Lines changed: 106 additions & 49 deletions

File tree

internal/sinks/multiwriter.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ func (mw *MultiWriter) DefineMetrics(metrics *metrics.Metrics) (err error) {
7777
err = errors.Join(err, definer.DefineMetrics(metrics))
7878
}
7979
}
80-
return nil
80+
return
8181
}
8282

8383
func (mw *MultiWriter) SyncMetric(sourceName, metricName string, op SyncOp) (err error) {

internal/sinks/multiwriter_test.go

Lines changed: 105 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,31 @@ import (
99
"github.com/stretchr/testify/assert"
1010
)
1111

12-
type MockWriter struct{}
12+
// mockWriter implements Writer and Migrator interfaces
13+
type mockWriter struct {
14+
err error
15+
needsMigration bool
16+
needsMigrationErr error
17+
}
18+
19+
func (m *mockWriter) SyncMetric(string, string, sinks.SyncOp) error {
20+
return m.err
21+
}
22+
23+
func (m *mockWriter) Write(metrics.MeasurementEnvelope) error {
24+
return m.err
25+
}
26+
27+
func (m *mockWriter) Migrate() error {
28+
return m.err
29+
}
1330

14-
func (mw *MockWriter) SyncMetric(_, _ string, _ sinks.SyncOp) error {
15-
return nil
31+
func (m *mockWriter) NeedsMigration() (bool, error) {
32+
return m.needsMigration, m.needsMigrationErr
1633
}
1734

18-
func (mw *MockWriter) Write(_ metrics.MeasurementEnvelope) error {
19-
return nil
35+
func (m *mockWriter) DefineMetrics(*metrics.Metrics) error {
36+
return m.err
2037
}
2138

2239
func TestNewMultiWriter(t *testing.T) {
@@ -66,50 +83,27 @@ func TestNewMultiWriter(t *testing.T) {
6683

6784
func TestAddWriter(t *testing.T) {
6885
mw := &sinks.MultiWriter{}
69-
mockWriter := &MockWriter{}
86+
mockWriter := &mockWriter{}
7087
mw.AddWriter(mockWriter)
7188
assert.Equal(t, 1, mw.Count())
7289
}
7390

7491
func TestSyncMetrics(t *testing.T) {
7592
mw := &sinks.MultiWriter{}
76-
mockWriter := &MockWriter{}
93+
mockWriter := &mockWriter{}
7794
mw.AddWriter(mockWriter)
7895
err := mw.SyncMetric("db", "metric", sinks.InvalidOp)
7996
assert.NoError(t, err)
8097
}
8198

8299
func TestWriteMeasurements(t *testing.T) {
83100
mw := &sinks.MultiWriter{}
84-
mockWriter := &MockWriter{}
101+
mockWriter := &mockWriter{}
85102
mw.AddWriter(mockWriter)
86103
err := mw.Write(metrics.MeasurementEnvelope{})
87104
assert.NoError(t, err)
88105
}
89106

90-
// mockMigratableWriter implements Writer and Migrator interfaces
91-
type mockMigratableWriter struct {
92-
migrateErr error
93-
needsMigration bool
94-
needsMigrationErr error
95-
}
96-
97-
func (m *mockMigratableWriter) SyncMetric(string, string, sinks.SyncOp) error {
98-
return nil
99-
}
100-
101-
func (m *mockMigratableWriter) Write(metrics.MeasurementEnvelope) error {
102-
return nil
103-
}
104-
105-
func (m *mockMigratableWriter) Migrate() error {
106-
return m.migrateErr
107-
}
108-
109-
func (m *mockMigratableWriter) NeedsMigration() (bool, error) {
110-
return m.needsMigration, m.needsMigrationErr
111-
}
112-
113107
func TestMultiWriterMigrate(t *testing.T) {
114108
tests := []struct {
115109
name string
@@ -119,45 +113,45 @@ func TestMultiWriterMigrate(t *testing.T) {
119113
{
120114
name: "no migratable writers",
121115
writers: []sinks.Writer{
122-
&MockWriter{},
116+
&mockWriter{},
123117
},
124118
expectError: false,
125119
},
126120
{
127121
name: "single migratable writer success",
128122
writers: []sinks.Writer{
129-
&mockMigratableWriter{},
123+
&mockWriter{},
130124
},
131125
expectError: false,
132126
},
133127
{
134128
name: "single migratable writer error",
135129
writers: []sinks.Writer{
136-
&mockMigratableWriter{migrateErr: assert.AnError},
130+
&mockWriter{err: assert.AnError},
137131
},
138132
expectError: true,
139133
},
140134
{
141135
name: "multiple migratable writers success",
142136
writers: []sinks.Writer{
143-
&mockMigratableWriter{},
144-
&mockMigratableWriter{},
137+
&mockWriter{},
138+
&mockWriter{},
145139
},
146140
expectError: false,
147141
},
148142
{
149143
name: "multiple writers with one error",
150144
writers: []sinks.Writer{
151-
&mockMigratableWriter{},
152-
&mockMigratableWriter{migrateErr: assert.AnError},
145+
&mockWriter{},
146+
&mockWriter{err: assert.AnError},
153147
},
154148
expectError: true,
155149
},
156150
{
157151
name: "mixed writers with migration error",
158152
writers: []sinks.Writer{
159-
&MockWriter{},
160-
&mockMigratableWriter{migrateErr: assert.AnError},
153+
&mockWriter{},
154+
&mockWriter{err: assert.AnError},
161155
},
162156
expectError: true,
163157
},
@@ -179,6 +173,69 @@ func TestMultiWriterMigrate(t *testing.T) {
179173
}
180174
}
181175

176+
func TestDefineMetrics(t *testing.T) {
177+
tests := []struct {
178+
name string
179+
writers []sinks.Writer
180+
expectError bool
181+
}{
182+
{
183+
name: "writer without DefineMetrics",
184+
writers: []sinks.Writer{&mockWriter{}},
185+
expectError: false,
186+
},
187+
{
188+
name: "single definer success",
189+
writers: []sinks.Writer{&mockWriter{err: nil}},
190+
expectError: false,
191+
},
192+
{
193+
name: "single definer error",
194+
writers: []sinks.Writer{&mockWriter{err: assert.AnError}},
195+
expectError: true,
196+
},
197+
{
198+
name: "two definers errors",
199+
writers: []sinks.Writer{
200+
&mockWriter{err: assert.AnError},
201+
&mockWriter{err: assert.AnError},
202+
},
203+
expectError: true,
204+
},
205+
{
206+
name: "mixed writers error",
207+
writers: []sinks.Writer{
208+
&mockWriter{},
209+
&mockWriter{err: assert.AnError},
210+
},
211+
expectError: true,
212+
},
213+
{
214+
name: "mixed writers success",
215+
writers: []sinks.Writer{
216+
&mockWriter{},
217+
&mockWriter{err: nil},
218+
},
219+
expectError: false,
220+
},
221+
}
222+
223+
for _, tt := range tests {
224+
t.Run(tt.name, func(t *testing.T) {
225+
mw := &sinks.MultiWriter{}
226+
for _, w := range tt.writers {
227+
mw.AddWriter(w)
228+
}
229+
err := mw.DefineMetrics(&metrics.Metrics{})
230+
if tt.expectError {
231+
assert.Error(t, err)
232+
} else {
233+
assert.NoError(t, err)
234+
}
235+
})
236+
}
237+
}
238+
182239
func TestMultiWriterNeedsMigration(t *testing.T) {
183240
tests := []struct {
184241
name string
@@ -189,49 +246,49 @@ func TestMultiWriterNeedsMigration(t *testing.T) {
189246
{
190247
name: "no migratable writers",
191248
writers: []sinks.Writer{
192-
&MockWriter{},
249+
&mockWriter{},
193250
},
194251
expectNeedsMigrate: false,
195252
expectError: false,
196253
},
197254
{
198255
name: "single writer needs migration",
199256
writers: []sinks.Writer{
200-
&mockMigratableWriter{needsMigration: true},
257+
&mockWriter{needsMigration: true},
201258
},
202259
expectNeedsMigrate: true,
203260
expectError: false,
204261
},
205262
{
206263
name: "single writer no migration needed",
207264
writers: []sinks.Writer{
208-
&mockMigratableWriter{needsMigration: false},
265+
&mockWriter{needsMigration: false},
209266
},
210267
expectNeedsMigrate: false,
211268
expectError: false,
212269
},
213270
{
214271
name: "multiple writers one needs migration",
215272
writers: []sinks.Writer{
216-
&mockMigratableWriter{needsMigration: false},
217-
&mockMigratableWriter{needsMigration: true},
273+
&mockWriter{needsMigration: false},
274+
&mockWriter{needsMigration: true},
218275
},
219276
expectNeedsMigrate: true,
220277
expectError: false,
221278
},
222279
{
223280
name: "error checking migration",
224281
writers: []sinks.Writer{
225-
&mockMigratableWriter{needsMigrationErr: assert.AnError},
282+
&mockWriter{needsMigrationErr: assert.AnError},
226283
},
227284
expectNeedsMigrate: false,
228285
expectError: true,
229286
},
230287
{
231288
name: "mixed writers one needs migration",
232289
writers: []sinks.Writer{
233-
&MockWriter{},
234-
&mockMigratableWriter{needsMigration: true},
290+
&mockWriter{},
291+
&mockWriter{needsMigration: true},
235292
},
236293
expectNeedsMigrate: true,
237294
expectError: false,

0 commit comments

Comments
 (0)