@@ -5,14 +5,16 @@ package integration_test
55import (
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