@@ -72,25 +72,30 @@ func CreateSpannerInstance(ctx context.Context, uri ParsedURI) error {
7272 return err
7373}
7474
75- func CreateSpannerDB (ctx context.Context , uri ParsedURI ) error {
75+ func CreateSpannerDB (ctx context.Context , uri ParsedURI , ddl [] string ) error {
7676 client , err := database .NewDatabaseAdminClient (ctx )
7777 if err != nil {
7878 return err
7979 }
8080 defer client .Close ()
81- _ , err = client .GetDatabase (ctx , & databasepb.GetDatabaseRequest {Name : uri .Full })
82- if err != nil && spanner .ErrCode (err ) == codes .NotFound {
83- op , err := client .CreateDatabase (ctx , & databasepb.CreateDatabaseRequest {
84- Parent : uri .InstancePrefix ,
85- CreateStatement : `CREATE DATABASE ` + uri .Database ,
86- ExtraStatements : []string {},
87- })
88- if err != nil {
81+ if ddl == nil {
82+ _ , err = client .GetDatabase (ctx , & databasepb.GetDatabaseRequest {Name : uri .Full })
83+ if err != nil && spanner .ErrCode (err ) != codes .NotFound {
8984 return err
9085 }
91- _ , err = op .Wait (ctx )
86+ if err == nil {
87+ return nil
88+ }
89+ }
90+ op , err := client .CreateDatabase (ctx , & databasepb.CreateDatabaseRequest {
91+ Parent : uri .InstancePrefix ,
92+ CreateStatement : `CREATE DATABASE ` + uri .Database ,
93+ ExtraStatements : ddl ,
94+ })
95+ if err != nil {
9296 return err
9397 }
98+ _ , err = op .Wait (ctx )
9499 return err
95100}
96101
@@ -128,31 +133,37 @@ func getMigrateInstance(uri string) (*migrate.Migrate, error) {
128133}
129134
130135func NewTransientDB (t * testing.T ) (* spanner.Client , context.Context ) {
131- setupSpannerEmulator (t )
132- uri , err := ParseURI ("projects/my-project/instances/test-instance/databases/" +
133- fmt .Sprintf ("db%v" , time .Now ().UnixNano ()))
134- if err != nil {
135- t .Fatal (err )
136- }
136+ uri := "projects/my-project/instances/test-instance/databases/" +
137+ fmt .Sprintf ("db%v" , time .Now ().UnixNano ())
138+ NewTestDB (t , uri , nil )
137139 ctx := t .Context ()
138- err = CreateSpannerInstance (ctx , uri )
140+ client , err := spanner . NewClient (ctx , uri )
139141 if err != nil {
140142 t .Fatal (err )
141143 }
142- err = CreateSpannerDB (ctx , uri )
144+ t .Cleanup (client .Close )
145+ err = RunMigrations (uri )
143146 if err != nil {
144147 t .Fatal (err )
145148 }
146- client , err := spanner .NewClient (ctx , uri .Full )
149+ return client , ctx
150+ }
151+
152+ func NewTestDB (t * testing.T , uri string , ddl []string ) {
153+ setupSpannerEmulator (t )
154+ // Don't bother destroying instances/databases.
155+ // We create isolated per-test databases, and the emulator is all in-memory.
156+ // So when the emulator is killed with the test binary, everything is gone.
157+ parsedURI , err := ParseURI (uri )
147158 if err != nil {
148159 t .Fatal (err )
149160 }
150- t .Cleanup (client .Close )
151- err = RunMigrations (uri .Full )
152- if err != nil {
153- t .Fatal (err )
161+ if err := CreateSpannerInstance (t .Context (), parsedURI ); err != nil {
162+ t .Fatalf ("failed CreateSpannerInstance: %v" , err )
163+ }
164+ if err := CreateSpannerDB (t .Context (), parsedURI , ddl ); err != nil {
165+ t .Fatalf ("failed CreateSpannerDB: %v" , err )
154166 }
155- return client , ctx
156167}
157168
158169var (
0 commit comments