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 ;
@@ -69,9 +72,28 @@ public static void setUp() throws Exception {
6972 spanner = options .getService ();
7073 dbClient = spanner .getDatabaseAdminClient ();
7174 dbId = DatabaseId .of (options .getProjectId (), instanceId , databaseId );
72- dbClient .dropDatabase (dbId .getInstanceId ().getInstance (), dbId .getDatabase ());
73- dbClient .dropDatabase (
74- dbId .getInstanceId ().getInstance (), SpannerSample .createRestoredSampleDbId (dbId ));
75+ // Delete stale test databases that have been created earlier by this test, but not deleted.
76+ deleteStaleTestDatabases (instanceId , baseDbId );
77+ }
78+
79+ static void deleteStaleTestDatabases (String instanceId , String baseDbId ) {
80+ Timestamp now = Timestamp .now ();
81+ Pattern samplePattern = getTestDbIdPattern (baseDbId );
82+ Pattern restoredPattern = getTestDbIdPattern ("restored" );
83+ for (Database db : dbClient .listDatabases (instanceId ).iterateAll ()) {
84+ if (TimeUnit .HOURS .convert (now .getSeconds () - db .getCreateTime ().getSeconds (),
85+ TimeUnit .SECONDS ) > 24 ) {
86+ if (db .getId ().getDatabase ().length () >= DBID_LENGTH ) {
87+ if (samplePattern .matcher (toComparableId (baseDbId , db .getId ().getDatabase ())).matches ()) {
88+ db .drop ();
89+ }
90+ if (restoredPattern .matcher (toComparableId ("restored" , db .getId ().getDatabase ()))
91+ .matches ()) {
92+ db .drop ();
93+ }
94+ }
95+ }
96+ }
7597 }
7698
7799 @ AfterClass
@@ -399,8 +421,21 @@ public void run() {
399421 private static int countOccurrences (String input , String search ) {
400422 return input .split (search ).length - 1 ;
401423 }
424+
425+ private static String toComparableId (String baseId , String existingId ) {
426+ String zeroUuid = "00000000-0000-0000-0000-0000-00000000" ;
427+ int shouldBeLength = (baseId + "-" + zeroUuid ).length ();
428+ int missingLength = shouldBeLength - existingId .length ();
429+ return existingId + zeroUuid .substring (zeroUuid .length () - missingLength );
430+ }
402431
403- private static String formatForTest (String name ) {
404- return name + "-" + UUID .randomUUID ().toString ().substring (0 , 20 );
432+ private static Pattern getTestDbIdPattern (String baseDbId ) {
433+ return Pattern .compile (
434+ 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}" ,
435+ Pattern .CASE_INSENSITIVE );
436+ }
437+
438+ static String formatForTest (String name ) {
439+ return name + "-" + UUID .randomUUID ().toString ().substring (0 , DBID_LENGTH );
405440 }
406- }
441+ }
0 commit comments