File tree

2 files changed

+46
-17
lines changed

2 files changed

+46
-17
lines changed
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818

1919
import static com.google.common.truth.Truth.assertThat;
2020

21+
import com.google.cloud.Timestamp;
2122
import com.google.cloud.spanner.BackupId;
23+
import com.google.cloud.spanner.Database;
2224
import com.google.cloud.spanner.DatabaseAdminClient;
2325
import com.google.cloud.spanner.DatabaseId;
2426
import com.google.cloud.spanner.ErrorCode;
@@ -44,10 +46,11 @@
4446
@RunWith(JUnit4.class)
4547
@SuppressWarnings("checkstyle:abbreviationaswordinname")
4648
public 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+
}
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import java.math.BigDecimal;
3535
import java.util.Collections;
3636
import java.util.Iterator;
37-
import java.util.UUID;
3837
import java.util.concurrent.ExecutionException;
3938
import org.junit.AfterClass;
4039
import org.junit.Before;
@@ -49,8 +48,8 @@
4948
public class SpannerStandaloneExamplesIT {
5049
// The instance needs to exist for tests to pass.
5150
private static String instanceId = System.getProperty("spanner.test.instance");
52-
private static String databaseId =
53-
formatForTest(System.getProperty("spanner.sample.database", "mysample"));
51+
private static String baseDatabaseId = System.getProperty("spanner.sample.database", "mysample");
52+
private static String databaseId = SpannerSampleIT.formatForTest(baseDatabaseId);
5453
private static DatabaseId dbId;
5554
private static DatabaseAdminClient dbClient;
5655
private static Spanner spanner;
@@ -78,7 +77,6 @@ public static void createTestDatabase() throws Exception {
7877
}
7978
}
8079
dbId = DatabaseId.of(options.getProjectId(), instanceId, databaseId);
81-
dbClient.dropDatabase(dbId.getInstanceId().getInstance(), dbId.getDatabase());
8280
dbClient
8381
.createDatabase(
8482
instanceId,
@@ -190,8 +188,4 @@ public void queryWithNumericParameter_shouldReturnResults() {
190188
runExample(() -> QueryWithNumericParameterSample.queryWithNumericParameter(client));
191189
assertThat(out).contains("4 35000");
192190
}
193-
194-
static String formatForTest(String name) {
195-
return name + "-" + UUID.randomUUID().toString().substring(0, 20);
196-
}
197-
}
191+
}

0 commit comments

Comments
 (0)