Skip to content

Commit 1495951

Browse files
committed
chore: use testcontainers
1 parent 3fa88f3 commit 1495951

File tree

14 files changed

+610
-513
lines changed

14 files changed

+610
-513
lines changed

cmd/spicedb/integration/migrate_integration_test.go

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,17 @@ package integration_test
44

55
import (
66
"bytes"
7+
"context"
78
"fmt"
9+
"io"
810
"slices"
11+
"strings"
912
"testing"
1013

1114
"github.com/google/uuid"
12-
"github.com/ory/dockertest/v3"
13-
"github.com/ory/dockertest/v3/docker"
1415
"github.com/stretchr/testify/require"
16+
"github.com/testcontainers/testcontainers-go"
17+
"github.com/testcontainers/testcontainers-go/network"
1518

1619
testdatastore "github.com/authzed/spicedb/internal/testserver/datastore"
1720
"github.com/authzed/spicedb/pkg/datastore"
@@ -20,18 +23,14 @@ import (
2023
var toSkip = []string{"memory"}
2124

2225
func TestMigrate(t *testing.T) {
26+
ctx := context.Background()
2327
bridgeNetworkName := fmt.Sprintf("bridge-%s", uuid.New().String())
2428

25-
pool, err := dockertest.NewPool("")
26-
require.NoError(t, err)
27-
2829
// Create a bridge network for testing.
29-
network, err := pool.Client.CreateNetwork(docker.CreateNetworkOptions{
30-
Name: bridgeNetworkName,
31-
})
30+
net, err := network.New(ctx, network.WithDriver("bridge"), network.WithLabels(map[string]string{"name": bridgeNetworkName}))
3231
require.NoError(t, err)
3332
t.Cleanup(func() {
34-
_ = pool.Client.RemoveNetwork(network.ID)
33+
_ = net.Remove(ctx)
3534
})
3635

3736
for _, engineKey := range datastore.Engines {
@@ -45,43 +44,43 @@ func TestMigrate(t *testing.T) {
4544
r := testdatastore.RunDatastoreEngineWithBridge(t, engineKey, bridgeNetworkName)
4645
db := r.NewDatabase(t)
4746

48-
envVars := []string{}
47+
envVars := map[string]string{}
4948
if wev, ok := r.(testdatastore.RunningEngineForTestWithEnvVars); ok {
50-
envVars = wev.ExternalEnvVars()
49+
for _, env := range wev.ExternalEnvVars() {
50+
parts := strings.SplitN(env, "=", 2)
51+
if len(parts) == 2 {
52+
envVars[parts[0]] = parts[1]
53+
}
54+
}
5155
}
5256

5357
// Run the migrate command and wait for it to complete.
54-
resource, err := pool.RunWithOptions(&dockertest.RunOptions{
55-
Repository: "authzed/spicedb",
56-
Tag: "ci",
57-
Cmd: []string{"migrate", "head", "--datastore-engine", engineKey, "--datastore-conn-uri", db},
58-
NetworkID: bridgeNetworkName,
59-
Env: envVars,
60-
}, func(config *docker.HostConfig) {
61-
config.RestartPolicy = docker.RestartPolicy{
62-
Name: "no",
63-
}
58+
container, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
59+
ContainerRequest: testcontainers.ContainerRequest{
60+
Image: "authzed/spicedb:ci",
61+
Cmd: []string{"migrate", "head", "--datastore-engine", engineKey, "--datastore-conn-uri", db},
62+
Networks: []string{bridgeNetworkName},
63+
Env: envVars,
64+
},
65+
Started: true,
6466
})
6567
require.NoError(t, err)
6668
t.Cleanup(func() {
67-
_ = pool.Purge(resource)
69+
_ = container.Terminate(ctx)
6870
})
6971

7072
// Ensure the command completed successfully.
71-
status, err := pool.Client.WaitContainerWithContext(resource.Container.ID, t.Context())
73+
state, err := container.State(ctx)
7274
require.NoError(t, err)
7375

74-
if status != 0 {
76+
if state.ExitCode != 0 {
7577
stream := new(bytes.Buffer)
7678

77-
lerr := pool.Client.Logs(docker.LogsOptions{
78-
Context: t.Context(),
79-
OutputStream: stream,
80-
ErrorStream: stream,
81-
Stdout: true,
82-
Stderr: true,
83-
Container: resource.Container.ID,
84-
})
79+
logReader, lerr := container.Logs(ctx)
80+
require.NoError(t, lerr)
81+
defer logReader.Close()
82+
83+
_, lerr = io.Copy(stream, logReader)
8584
require.NoError(t, lerr)
8685

8786
require.Fail(t, "Got non-zero exit code", stream.String())

cmd/spicedb/integration/restgateway_integration_test.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,16 @@ import (
88
"net/http"
99
"testing"
1010

11-
"github.com/ory/dockertest/v3"
1211
"github.com/stretchr/testify/require"
12+
"github.com/testcontainers/testcontainers-go"
1313
)
1414

1515
func TestRESTGateway(t *testing.T) {
1616
require := require.New(t)
1717

1818
tester, err := newTester(t,
19-
&dockertest.RunOptions{
20-
Repository: "authzed/spicedb",
21-
Tag: "ci",
19+
testcontainers.ContainerRequest{
20+
Image: "authzed/spicedb:ci",
2221
Cmd: []string{"serve", "--log-level", "debug", "--grpc-preshared-key", "somerandomkeyhere", "--http-enabled"},
2322
ExposedPorts: []string{"50051/tcp", "8443/tcp"},
2423
},

cmd/spicedb/integration/schemawatch_integration_test.go

Lines changed: 43 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@ package integration_test
55
import (
66
"context"
77
"fmt"
8+
"io"
9+
"strings"
810
"testing"
911
"time"
1012

1113
"github.com/google/uuid"
12-
"github.com/ory/dockertest/v3"
13-
"github.com/ory/dockertest/v3/docker"
1414
"github.com/stretchr/testify/assert"
1515
"github.com/stretchr/testify/require"
16+
"github.com/testcontainers/testcontainers-go"
17+
"github.com/testcontainers/testcontainers-go/network"
1618

1719
testdatastore "github.com/authzed/spicedb/internal/testserver/datastore"
1820
"github.com/authzed/spicedb/pkg/datastore"
@@ -33,83 +35,75 @@ func TestSchemaWatch(t *testing.T) {
3335
}
3436

3537
t.Run(driverName, func(t *testing.T) {
38+
ctx := context.Background()
3639
bridgeNetworkName := fmt.Sprintf("bridge-%s", uuid.New().String())
3740

38-
pool, err := dockertest.NewPool("")
39-
require.NoError(t, err)
40-
4141
// Create a bridge network for testing.
42-
network, err := pool.Client.CreateNetwork(docker.CreateNetworkOptions{
43-
Name: bridgeNetworkName,
44-
})
42+
net, err := network.New(ctx, network.WithDriver("bridge"), network.WithLabels(map[string]string{"name": bridgeNetworkName}))
4543
require.NoError(t, err)
4644
t.Cleanup(func() {
47-
_ = pool.Client.RemoveNetwork(network.ID)
45+
_ = net.Remove(ctx)
4846
})
4947

5048
engine := testdatastore.RunDatastoreEngineWithBridge(t, driverName, bridgeNetworkName)
5149

52-
envVars := []string{}
50+
envVars := map[string]string{}
5351
if wev, ok := engine.(testdatastore.RunningEngineForTestWithEnvVars); ok {
54-
envVars = wev.ExternalEnvVars()
52+
for _, env := range wev.ExternalEnvVars() {
53+
parts := strings.SplitN(env, "=", 2)
54+
if len(parts) == 2 {
55+
envVars[parts[0]] = parts[1]
56+
}
57+
}
5558
}
5659

5760
// Run the migrate command and wait for it to complete.
5861
db := engine.NewDatabase(t)
59-
migrateResource, err := pool.RunWithOptions(&dockertest.RunOptions{
60-
Repository: "authzed/spicedb",
61-
Tag: "ci",
62-
Cmd: []string{"migrate", "head", "--datastore-engine", driverName, "--datastore-conn-uri", db},
63-
NetworkID: bridgeNetworkName,
64-
Env: envVars,
65-
}, func(config *docker.HostConfig) {
66-
config.RestartPolicy = docker.RestartPolicy{
67-
Name: "no",
68-
}
62+
migrateContainer, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
63+
ContainerRequest: testcontainers.ContainerRequest{
64+
Image: "authzed/spicedb:ci",
65+
Cmd: []string{"migrate", "head", "--datastore-engine", driverName, "--datastore-conn-uri", db},
66+
Networks: []string{bridgeNetworkName},
67+
Env: envVars,
68+
},
69+
Started: true,
6970
})
7071
require.NoError(t, err)
7172
t.Cleanup(func() {
72-
_ = pool.Purge(migrateResource)
73+
_ = migrateContainer.Terminate(ctx)
7374
})
7475

7576
// Ensure the command completed successfully.
76-
status, err := pool.Client.WaitContainerWithContext(migrateResource.Container.ID, t.Context())
77+
exitCode, err := migrateContainer.State(ctx)
7778
require.NoError(t, err)
78-
require.Equal(t, 0, status)
79+
require.Equal(t, 0, exitCode.ExitCode)
7980

8081
// Run a serve and immediately close, ensuring it shuts down gracefully.
81-
serveResource, err := pool.RunWithOptions(&dockertest.RunOptions{
82-
Repository: "authzed/spicedb",
83-
Tag: "ci",
84-
Cmd: []string{"serve", "--grpc-preshared-key", "firstkey", "--datastore-engine", driverName, "--datastore-conn-uri", db, "--datastore-gc-interval", "1s", "--telemetry-endpoint", "", "--log-level", "trace", "--enable-experimental-watchable-schema-cache"},
85-
NetworkID: bridgeNetworkName,
86-
Env: envVars,
87-
}, func(config *docker.HostConfig) {
88-
config.RestartPolicy = docker.RestartPolicy{
89-
Name: "no",
90-
}
82+
serveContainer, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
83+
ContainerRequest: testcontainers.ContainerRequest{
84+
Image: "authzed/spicedb:ci",
85+
Cmd: []string{"serve", "--grpc-preshared-key", "firstkey", "--datastore-engine", driverName, "--datastore-conn-uri", db, "--datastore-gc-interval", "1s", "--telemetry-endpoint", "", "--log-level", "trace", "--enable-experimental-watchable-schema-cache"},
86+
Networks: []string{bridgeNetworkName},
87+
Env: envVars,
88+
},
89+
Started: true,
9190
})
9291
require.NoError(t, err)
9392
t.Cleanup(func() {
94-
_ = pool.Purge(serveResource)
93+
_ = serveContainer.Terminate(ctx)
9594
})
9695

9796
ww := &watchingWriter{make(chan bool, 1), "starting watching cache"}
9897

99-
// Grab logs and ensure GC has run before starting a graceful shutdown.
100-
opts := docker.LogsOptions{
101-
Context: context.Background(),
102-
Stderr: true,
103-
Stdout: true,
104-
Follow: true,
105-
Timestamps: true,
106-
RawTerminal: true,
107-
Container: serveResource.Container.ID,
108-
OutputStream: ww,
109-
}
110-
98+
// Grab logs and ensure schema watch has started before graceful shutdown.
11199
go (func() {
112-
err = pool.Client.Logs(opts)
100+
logReader, err := serveContainer.Logs(ctx)
101+
if err != nil {
102+
assert.NoError(t, err)
103+
return
104+
}
105+
defer logReader.Close()
106+
_, err = io.Copy(ww, logReader)
113107
assert.NoError(t, err)
114108
})()
115109

@@ -121,7 +115,7 @@ func TestSchemaWatch(t *testing.T) {
121115
require.Fail(t, "timed out waiting for schema watch to run")
122116
}
123117

124-
require.True(t, gracefulShutdown(pool, serveResource))
118+
require.True(t, gracefulShutdown(ctx, serveContainer))
125119
})
126120
}
127121
}

0 commit comments

Comments
 (0)