Skip to content
This repository was archived by the owner on Apr 2, 2024. It is now read-only.

Commit ac605ef

Browse files
committed
Better debug logs on failed tests
Print the database logs when an e2e test fails.
1 parent 9e7afaf commit ac605ef

File tree

5 files changed

+85
-18
lines changed

5 files changed

+85
-18
lines changed

pkg/internal/testhelpers/containers.go

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ package testhelpers
66

77
import (
88
"context"
9+
"encoding/binary"
910
"fmt"
11+
"io"
1012
"io/ioutil"
1113
"os"
1214
"runtime"
@@ -37,7 +39,54 @@ func (s stdoutLogConsumer) Accept(l testcontainers.Log) {
3739
}
3840
}
3941

40-
func StopContainer(ctx context.Context, container testcontainers.Container, printLogs bool) {
42+
func PrintContainerLogs(container testcontainers.Container) {
43+
logs, err := container.Logs(context.TODO())
44+
if err != nil {
45+
fmt.Println("Error fetching logs: ", err)
46+
return
47+
}
48+
defer logs.Close()
49+
50+
logSlice := make([]string, 0)
51+
h := make([]byte, 8)
52+
for {
53+
_, err := logs.Read(h)
54+
if err != nil {
55+
if err == io.EOF {
56+
break
57+
}
58+
fmt.Println("Error reading from logs: ", err)
59+
return
60+
}
61+
62+
count := binary.BigEndian.Uint32(h[4:])
63+
if count == 0 {
64+
continue
65+
}
66+
b := make([]byte, count)
67+
_, err = logs.Read(b)
68+
if err != nil {
69+
if err == io.EOF {
70+
break
71+
}
72+
fmt.Println("Error reading from logs: ", err)
73+
return
74+
}
75+
logSlice = append(logSlice, string(b))
76+
}
77+
78+
fmt.Printf("DB container logs (last 100 lines): \n")
79+
n := len(logSlice) - 100 /* get last 100 lines */
80+
if n < 0 {
81+
n = 0
82+
}
83+
fmt.Println(logSlice[n:])
84+
}
85+
86+
func StopContainer(ctx context.Context, container testcontainers.Container, printLogs bool, t Result) {
87+
if !printLogs && t != nil && t.Failed() {
88+
PrintContainerLogs(container)
89+
}
4190
if printLogs {
4291
err := container.StopLogProducer()
4392
if err != nil {

pkg/internal/testhelpers/containers_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func runMain(m *testing.M) int {
6666
// TODO (james): Replace hardcoded value
6767
extensionState := NewTestOptions(timescaleBit, "ghcr.io/timescale/dev_promscale_extension:develop-ts2-pg14")
6868
if !testing.Short() && *useDocker {
69-
_, closer, err := StartPGContainer(ctx, extensionState, "", false)
69+
_, closer, err := StartPGContainer(ctx, nil, extensionState, "", false)
7070
if err != nil {
7171
fmt.Println("Error setting up container", err)
7272
os.Exit(1)

pkg/internal/testhelpers/postgres_container.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ const (
3636
NoSuperuser = false
3737
)
3838

39+
type Result interface {
40+
Failed() bool
41+
}
42+
3943
var (
4044
users = []string{
4145
promUser,
@@ -286,16 +290,18 @@ func DbSetup(DBName string, superuser SuperuserStatus, deferNode2Setup bool, ext
286290
// StartPGContainer starts a postgreSQL container for use in testing
287291
func StartPGContainer(
288292
ctx context.Context,
293+
t Result,
289294
extensionState TestOptions,
290295
testDataDir string,
291296
printLogs bool,
292297
) (testcontainers.Container, io.Closer, error) {
293298
image := extensionState.GetDockerImageName()
294299

295-
return StartDatabaseImage(ctx, image, testDataDir, "", printLogs, extensionState)
300+
return StartDatabaseImage(ctx, t, image, testDataDir, "", printLogs, extensionState)
296301
}
297302

298303
func StartDatabaseImage(ctx context.Context,
304+
t Result,
299305
image string,
300306
testDataDir string,
301307
dataDir string,
@@ -316,6 +322,7 @@ func StartDatabaseImage(ctx context.Context,
316322
startContainer := func(containerPort nat.Port) (testcontainers.Container, error) {
317323
container, closer, err := startPGInstance(
318324
ctx,
325+
t,
319326
image,
320327
testDataDir,
321328
dataDir,
@@ -442,6 +449,7 @@ func removeTimescaleExtension(container testcontainers.Container) error {
442449

443450
func startPGInstance(
444451
ctx context.Context,
452+
t Result,
445453
image string,
446454
testDataDir string,
447455
dataDir string,
@@ -462,7 +470,7 @@ func startPGInstance(
462470
ExposedPorts: []string{string(containerPort)},
463471
WaitingFor: wait.ForSQL(containerPort, "pgx", func(port nat.Port) string {
464472
return "dbname=postgres password=password user=postgres host=127.0.0.1 port=" + port.Port()
465-
}).Timeout(120 * time.Second),
473+
}).Timeout(60 * time.Second),
466474
Env: map[string]string{
467475
"POSTGRES_PASSWORD": "password",
468476
"PGDATA": "/var/lib/postgresql/data",
@@ -531,6 +539,7 @@ func startPGInstance(
531539

532540
err = container.Start(context.Background())
533541
if err != nil {
542+
PrintContainerLogs(container)
534543
return nil, nil, err
535544
}
536545

@@ -543,7 +552,7 @@ func startPGInstance(
543552
}
544553

545554
closer := func() {
546-
StopContainer(ctx, container, printLogs)
555+
StopContainer(ctx, container, printLogs, t)
547556
}
548557

549558
if isDataNode {

pkg/tests/end_to_end_tests/main_test.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,16 @@ func setExtensionState() {
9090
testOptions.SetTimescaleDockerImage(*timescaleDockerImage)
9191
}
9292

93+
type testResult struct {
94+
code int
95+
}
96+
97+
func (t *testResult) Failed() bool {
98+
return t.code != 0
99+
}
100+
93101
func TestMain(m *testing.M) {
94-
var code int
102+
res := &testResult{1}
95103
func() {
96104
flag.Parse()
97105
ctx := context.Background()
@@ -111,6 +119,7 @@ func TestMain(m *testing.M) {
111119

112120
pgContainer, closer, err = testhelpers.StartPGContainer(
113121
ctx,
122+
res,
114123
testOptions,
115124
pgContainerTestDataDir,
116125
*printLogs,
@@ -154,9 +163,9 @@ func TestMain(m *testing.M) {
154163
}
155164
}()
156165
}
157-
code = m.Run()
166+
res.code = m.Run()
158167
}()
159-
os.Exit(code)
168+
os.Exit(res.code)
160169
}
161170

162171
func attachDataNode2(t testing.TB, DBName string, connectURL string) {

pkg/tests/upgrade_tests/upgrade_test.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ func withDBStartingAtOldVersionAndUpgrading(
381381
// Start a db with the prev extension and a prev connector as well
382382
// Then run preUpgrade and shut everything down.
383383
func() {
384-
dbContainer, closer, err := testhelpers.StartDatabaseImage(ctx, prevDBImage, tmpDir, dataDir, *printLogs, extensionState)
384+
dbContainer, closer, err := testhelpers.StartDatabaseImage(ctx, t, prevDBImage, tmpDir, dataDir, *printLogs, extensionState)
385385
if err != nil {
386386
t.Fatal("Error setting up container", err)
387387
}
@@ -400,7 +400,7 @@ func withDBStartingAtOldVersionAndUpgrading(
400400
if err != nil {
401401
log.Fatal(err.Error())
402402
}
403-
defer testhelpers.StopContainer(ctx, connector, *printLogs)
403+
defer testhelpers.StopContainer(ctx, connector, *printLogs, t)
404404

405405
connectorHost, err := connector.Host(ctx)
406406
if err != nil {
@@ -419,7 +419,7 @@ func withDBStartingAtOldVersionAndUpgrading(
419419

420420
//Start a new connector and migrate.
421421
//Then run postUpgrade
422-
dbContainer, closer, err := testhelpers.StartDatabaseImage(ctx, cleanImage, tmpDir, dataDir, *printLogs, extensionState)
422+
dbContainer, closer, err := testhelpers.StartDatabaseImage(ctx, t, cleanImage, tmpDir, dataDir, *printLogs, extensionState)
423423
if err != nil {
424424
t.Fatal("Error setting up container", err)
425425
}
@@ -466,7 +466,7 @@ func withNewDBAtCurrentVersion(t testing.TB, DBName string, extensionState testh
466466
}
467467

468468
func() {
469-
container, closer, err := testhelpers.StartDatabaseImage(ctx, cleanImage, tmpDir, dataDir, *printLogs, extensionState)
469+
container, closer, err := testhelpers.StartDatabaseImage(ctx, t, cleanImage, tmpDir, dataDir, *printLogs, extensionState)
470470
if err != nil {
471471
fmt.Println("Error setting up container", err)
472472
os.Exit(1)
@@ -487,7 +487,7 @@ func withNewDBAtCurrentVersion(t testing.TB, DBName string, extensionState testh
487487
preRestart(container, connectURL, db, tmpDir)
488488
})
489489
}()
490-
container, closer, err := testhelpers.StartDatabaseImage(ctx, cleanImage, tmpDir, dataDir, *printLogs, extensionState)
490+
container, closer, err := testhelpers.StartDatabaseImage(ctx, t, cleanImage, tmpDir, dataDir, *printLogs, extensionState)
491491
if err != nil {
492492
fmt.Println("Error setting up container", err)
493493
os.Exit(1)
@@ -625,7 +625,7 @@ func TestExtensionUpgrade(t *testing.T) {
625625
if err != nil {
626626
t.Fatal(err)
627627
}
628-
defer testhelpers.StopContainer(ctx, connector, *printLogs)
628+
defer testhelpers.StopContainer(ctx, connector, *printLogs, t)
629629
err = db.QueryRow(ctx, `SELECT extversion FROM pg_extension where extname='timescaledb'`).Scan(&version)
630630
if err != nil {
631631
t.Fatal(err)
@@ -649,7 +649,7 @@ func TestExtensionUpgrade(t *testing.T) {
649649
if err != nil {
650650
t.Fatal(err)
651651
}
652-
defer testhelpers.StopContainer(ctx, connector, *printLogs)
652+
defer testhelpers.StopContainer(ctx, connector, *printLogs, t)
653653

654654
var versionStr string
655655
db, err = pgx.Connect(ctx, testhelpers.PgConnectURL("postgres", testhelpers.Superuser))
@@ -711,7 +711,7 @@ func TestMigrationFailure(t *testing.T) {
711711
if err != nil {
712712
t.Fatal(err)
713713
}
714-
defer testhelpers.StopContainer(ctx, connector, *printLogs)
714+
defer testhelpers.StopContainer(ctx, connector, *printLogs, t)
715715

716716
db, err = pgx.Connect(ctx, testhelpers.PgConnectURL("postgres", testhelpers.Superuser))
717717
if err != nil {
@@ -739,7 +739,7 @@ func TestMigrationFailure(t *testing.T) {
739739
if err != nil {
740740
t.Fatal(err)
741741
}
742-
defer testhelpers.StopContainer(ctx, connector, *printLogs)
742+
defer testhelpers.StopContainer(ctx, connector, *printLogs, t)
743743

744744
var version string
745745
db, err = pgx.Connect(ctx, testhelpers.PgConnectURL("postgres", testhelpers.Superuser))
@@ -791,7 +791,7 @@ func startDB(t *testing.T, ctx context.Context) (*pgx.Conn, testcontainers.Conta
791791
// TODO (james): Replace hardcoded value
792792
extensionState := testhelpers.NewTestOptions(testhelpers.Timescale, "ghcr.io/timescale/dev_promscale_extension:develop-ts2-pg14")
793793

794-
dbContainer, closer, err := testhelpers.StartDatabaseImage(ctx, "timescaledev/promscale-extension:testing-extension-upgrade", tmpDir, dataDir, *printLogs, extensionState)
794+
dbContainer, closer, err := testhelpers.StartDatabaseImage(ctx, t, "timescaledev/promscale-extension:testing-extension-upgrade", tmpDir, dataDir, *printLogs, extensionState)
795795
if err != nil {
796796
t.Fatal("Error setting up container", err)
797797
}

0 commit comments

Comments
 (0)