Skip to content

Commit 5f1382c

Browse files
committed
Add a row leak test
Signed-off-by: Felix Yuan <[email protected]>
1 parent 19cf776 commit 5f1382c

File tree

1 file changed

+139
-0
lines changed

1 file changed

+139
-0
lines changed

collector/pg_stat_database_test.go

+139
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ func TestPGStatDatabaseCollector(t *testing.T) {
8080
16,
8181
823,
8282
srT)
83+
8384
mock.ExpectQuery(sanitizeQuery(statDatabaseQuery)).WillReturnRows(rows)
8485

8586
ch := make(chan prometheus.Metric)
@@ -218,3 +219,141 @@ func TestPGStatDatabaseCollectorNullValues(t *testing.T) {
218219
t.Errorf("there were unfulfilled exceptions: %s", err)
219220
}
220221
}
222+
func TestPGStatDatabaseCollectorRowLeakTest(t *testing.T) {
223+
db, mock, err := sqlmock.New()
224+
if err != nil {
225+
t.Fatalf("Error opening a stub db connection: %s", err)
226+
}
227+
defer db.Close()
228+
229+
inst := &instance{db: db}
230+
231+
columns := []string{
232+
"datid",
233+
"datname",
234+
"numbackends",
235+
"xact_commit",
236+
"xact_rollback",
237+
"blks_read",
238+
"blks_hit",
239+
"tup_returned",
240+
"tup_fetched",
241+
"tup_inserted",
242+
"tup_updated",
243+
"tup_deleted",
244+
"conflicts",
245+
"temp_files",
246+
"temp_bytes",
247+
"deadlocks",
248+
"blk_read_time",
249+
"blk_write_time",
250+
"stats_reset",
251+
}
252+
253+
srT, err := time.Parse("2006-01-02 15:04:05.00000-07", "2023-05-25 17:10:42.81132-07")
254+
if err != nil {
255+
t.Fatalf("Error parsing time: %s", err)
256+
}
257+
258+
rows := sqlmock.NewRows(columns).
259+
AddRow(
260+
"pid",
261+
"postgres",
262+
354,
263+
4945,
264+
289097744,
265+
1242257,
266+
3275602074,
267+
89320867,
268+
450139,
269+
2034563757,
270+
0,
271+
2725688749,
272+
23,
273+
52,
274+
74,
275+
925,
276+
16,
277+
823,
278+
srT).
279+
AddRow(
280+
nil,
281+
nil,
282+
nil,
283+
nil,
284+
nil,
285+
nil,
286+
nil,
287+
nil,
288+
nil,
289+
nil,
290+
nil,
291+
nil,
292+
nil,
293+
nil,
294+
nil,
295+
nil,
296+
nil,
297+
nil,
298+
nil,
299+
)
300+
301+
mock.ExpectQuery(sanitizeQuery(statDatabaseQuery)).WillReturnRows(rows)
302+
303+
ch := make(chan prometheus.Metric)
304+
go func() {
305+
defer close(ch)
306+
c := PGStatDatabaseCollector{}
307+
308+
if err := c.Update(context.Background(), inst, ch); err != nil {
309+
t.Errorf("Error calling PGStatDatabaseCollector.Update: %s", err)
310+
}
311+
}()
312+
313+
expected := []MetricResult{
314+
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_GAUGE, value: 354},
315+
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 4945},
316+
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 289097744},
317+
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 1242257},
318+
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 3275602074},
319+
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 89320867},
320+
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 450139},
321+
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 2034563757},
322+
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 0},
323+
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 2725688749},
324+
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 23},
325+
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 52},
326+
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 74},
327+
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 925},
328+
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 16},
329+
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 823},
330+
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 1685059842},
331+
{labels: labelMap{"datid": "unknown", "datname": "unknown"}, metricType: dto.MetricType_GAUGE, value: 0},
332+
{labels: labelMap{"datid": "unknown", "datname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
333+
{labels: labelMap{"datid": "unknown", "datname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
334+
{labels: labelMap{"datid": "unknown", "datname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
335+
{labels: labelMap{"datid": "unknown", "datname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
336+
{labels: labelMap{"datid": "unknown", "datname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
337+
{labels: labelMap{"datid": "unknown", "datname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
338+
{labels: labelMap{"datid": "unknown", "datname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
339+
{labels: labelMap{"datid": "unknown", "datname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
340+
{labels: labelMap{"datid": "unknown", "datname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
341+
{labels: labelMap{"datid": "unknown", "datname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
342+
{labels: labelMap{"datid": "unknown", "datname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
343+
{labels: labelMap{"datid": "unknown", "datname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
344+
{labels: labelMap{"datid": "unknown", "datname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
345+
{labels: labelMap{"datid": "unknown", "datname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
346+
{labels: labelMap{"datid": "unknown", "datname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
347+
{labels: labelMap{"datid": "unknown", "datname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
348+
}
349+
350+
convey.Convey("Metrics comparison", t, func() {
351+
for _, expect := range expected {
352+
m := readMetric(<-ch)
353+
convey.So(expect, convey.ShouldResemble, m)
354+
}
355+
})
356+
if err := mock.ExpectationsWereMet(); err != nil {
357+
t.Errorf("there were unfulfilled exceptions: %s", err)
358+
}
359+
}

0 commit comments

Comments
 (0)