|
18 | 18 |
|
19 | 19 | import static com.google.common.truth.Truth.assertThat;
|
20 | 20 |
|
| 21 | +import com.google.cloud.Timestamp; |
21 | 22 | import com.google.cloud.spanner.BackupId;
|
| 23 | +import com.google.cloud.spanner.Database; |
22 | 24 | import com.google.cloud.spanner.DatabaseAdminClient;
|
23 | 25 | import com.google.cloud.spanner.DatabaseId;
|
24 | 26 | import com.google.cloud.spanner.ErrorCode;
|
|
44 | 46 | @RunWith(JUnit4.class)
|
45 | 47 | @SuppressWarnings("checkstyle:abbreviationaswordinname")
|
46 | 48 | public class SpannerSampleIT {
|
| 49 | +private static final int DBID_LENGTH = 20; |
47 | 50 | // The instance needs to exist for tests to pass.
|
48 | 51 | 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); |
51 | 54 | static Spanner spanner;
|
52 | 55 | static DatabaseId dbId;
|
53 | 56 | static DatabaseAdminClient dbClient;
|
@@ -69,9 +72,28 @@ public static void setUp() throws Exception {
|
69 | 72 | spanner = options.getService();
|
70 | 73 | dbClient = spanner.getDatabaseAdminClient();
|
71 | 74 | 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 | +} |
75 | 97 | }
|
76 | 98 |
|
77 | 99 | @AfterClass
|
@@ -399,8 +421,21 @@ public void run() {
|
399 | 421 | private static int countOccurrences(String input, String search) {
|
400 | 422 | return input.split(search).length - 1;
|
401 | 423 | }
|
| 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 | +} |
402 | 431 |
|
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); |
405 | 440 | }
|
406 |
| -} |
| 441 | +} |
0 commit comments