1818
1919import static com .google .common .truth .Truth .assertThat ;
2020
21+ import com .google .cloud .Timestamp ;
2122import com .google .cloud .spanner .BackupId ;
23+ import com .google .cloud .spanner .Database ;
2224import com .google .cloud .spanner .DatabaseAdminClient ;
2325import com .google .cloud .spanner .DatabaseId ;
2426import com .google .cloud .spanner .ErrorCode ;
4446@ RunWith (JUnit4 .class )
4547@ SuppressWarnings ("checkstyle:abbreviationaswordinname" )
4648public class SpannerSampleIT {
49+ private static final int DBID_LENGTH = 20 ;
4750 // The instance needs to exist for tests to pass.
4851 private static final String instanceId = System .getProperty ("spanner.test.instance" );
49- private static final String databaseId =
50- formatForTest (System . getProperty ( "spanner.sample.database" ) );
52+ private static final String baseDbId = System . getProperty ( "spanner.sample.database" );
53+ private static final String databaseId = formatForTest (baseDbId );
5154 static Spanner spanner ;
5255 static DatabaseId dbId ;
5356 static DatabaseAdminClient dbClient ;
@@ -70,9 +73,28 @@ public static void setUp() throws Exception {
7073 spanner = options .getService ();
7174 dbClient = spanner .getDatabaseAdminClient ();
7275 dbId = DatabaseId .of (options .getProjectId (), instanceId , databaseId );
73- dbClient .dropDatabase (dbId .getInstanceId ().getInstance (), dbId .getDatabase ());
74- dbClient .dropDatabase (
75- dbId .getInstanceId ().getInstance (), SpannerSample .createRestoredSampleDbId (dbId ));
76+ // Delete stale test databases that have been created earlier by this test, but not deleted.
77+ deleteStaleTestDatabases (instanceId , baseDbId );
78+ }
79+
80+ static void deleteStaleTestDatabases (String instanceId , String baseDbId ) {
81+ Timestamp now = Timestamp .now ();
82+ Pattern samplePattern = getTestDbIdPattern (baseDbId );
83+ Pattern restoredPattern = getTestDbIdPattern ("restored" );
84+ for (Database db : dbClient .listDatabases (instanceId ).iterateAll ()) {
85+ if (TimeUnit .HOURS .convert (now .getSeconds () - db .getCreateTime ().getSeconds (),
86+ TimeUnit .SECONDS ) > 24 ) {
87+ if (db .getId ().getDatabase ().length () >= DBID_LENGTH ) {
88+ if (samplePattern .matcher (toComparableId (baseDbId , db .getId ().getDatabase ())).matches ()) {
89+ db .drop ();
90+ }
91+ if (restoredPattern .matcher (toComparableId ("restored" , db .getId ().getDatabase ()))
92+ .matches ()) {
93+ db .drop ();
94+ }
95+ }
96+ }
97+ }
7698 }
7799
78100 @ AfterClass
@@ -400,8 +422,21 @@ public void run() {
400422 private static int countOccurrences (String input , String search ) {
401423 return input .split (search ).length - 1 ;
402424 }
425+
426+ private static String toComparableId (String baseId , String existingId ) {
427+ String zeroUuid = "00000000-0000-0000-0000-0000-00000000" ;
428+ int shouldBeLength = (baseId + "-" + zeroUuid ).length ();
429+ int missingLength = shouldBeLength - existingId .length ();
430+ return existingId + zeroUuid .substring (zeroUuid .length () - missingLength );
431+ }
403432
404- private static String formatForTest (String name ) {
405- return name + "-" + UUID .randomUUID ().toString ().substring (0 , 20 );
433+ private static Pattern getTestDbIdPattern (String baseDbId ) {
434+ return Pattern .compile (
435+ baseDbId + "-[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{8}" ,
436+ Pattern .CASE_INSENSITIVE );
437+ }
438+
439+ static String formatForTest (String name ) {
440+ return name + "-" + UUID .randomUUID ().toString ().substring (0 , DBID_LENGTH );
406441 }
407442}
0 commit comments