From ed0665c71abbce57a28cb79531783145eccab1fb Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Thu, 6 Aug 2020 10:49:47 +0200 Subject: [PATCH] fix: fixes sample tests - add missing dependencies for tracing sample - create test instance when none is set - id may not end with a hyphen - restored DB id must also not end with a hyphen - use formatted name for quick start test - fix build errors - updates async example to use java.util.List instead of ImmutableList --- samples/install-without-bom/pom.xml | 57 +++++++++ samples/snapshot/pom.xml | 57 +++++++++ samples/snippets/pom.xml | 57 ++++++++- .../spanner/AsyncQueryToListAsyncExample.java | 5 +- .../spanner/CreateInstanceExample.java | 56 ++++----- .../com/example/spanner/SpannerSample.java | 3 + .../example/spanner/QuickstartSampleIT.java | 50 ++++++-- .../com/example/spanner/SpannerSampleIT.java | 109 +++++++++++------- 8 files changed, 314 insertions(+), 80 deletions(-) diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index d4cca25d3c..4744333966 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -21,6 +21,9 @@ 1.8 1.8 UTF-8 + 0.26.0 + 1.1.0 + 1.100.1 @@ -32,6 +35,60 @@ 2.0.1 + + + io.opencensus + opencensus-api + ${opencensus.version} + + + io.opencensus + opencensus-impl + ${opencensus.version} + runtime + + + io.opencensus + opencensus-contrib-zpages + ${opencensus.version} + + + io.opencensus + opencensus-exporter-trace-stackdriver + ${opencensus.version} + + + com.google.cloud + google-cloud-trace + + + + + io.opencensus + opencensus-exporter-stats-stackdriver + ${opencensus.version} + + + com.google.cloud + google-cloud-monitoring + + + + + io.opencensus + opencensus-contrib-grpc-metrics + ${opencensus.version} + + + com.google.cloud + google-cloud-trace + ${trace.version} + + + com.google.cloud + google-cloud-monitoring + ${cloudmonitoring.version} + junit diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 0bce44187e..8b6362d311 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -21,6 +21,9 @@ 1.8 1.8 UTF-8 + 0.26.0 + 1.1.0 + 1.100.1 @@ -31,6 +34,60 @@ 2.0.3-SNAPSHOT + + + io.opencensus + opencensus-api + ${opencensus.version} + + + io.opencensus + opencensus-impl + ${opencensus.version} + runtime + + + io.opencensus + opencensus-contrib-zpages + ${opencensus.version} + + + io.opencensus + opencensus-exporter-trace-stackdriver + ${opencensus.version} + + + com.google.cloud + google-cloud-trace + + + + + io.opencensus + opencensus-exporter-stats-stackdriver + ${opencensus.version} + + + com.google.cloud + google-cloud-monitoring + + + + + io.opencensus + opencensus-contrib-grpc-metrics + ${opencensus.version} + + + com.google.cloud + google-cloud-trace + ${trace.version} + + + com.google.cloud + google-cloud-monitoring + ${cloudmonitoring.version} + junit diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml index bb111adc0e..b717da4d08 100644 --- a/samples/snippets/pom.xml +++ b/samples/snippets/pom.xml @@ -21,6 +21,7 @@ 1.8 1.8 UTF-8 + 0.26.0 @@ -43,7 +44,61 @@ google-cloud-spanner - + + + io.opencensus + opencensus-api + ${opencensus.version} + + + io.opencensus + opencensus-impl + ${opencensus.version} + runtime + + + io.opencensus + opencensus-contrib-zpages + ${opencensus.version} + + + io.opencensus + opencensus-exporter-trace-stackdriver + ${opencensus.version} + + + com.google.cloud + google-cloud-trace + + + + + io.opencensus + opencensus-exporter-stats-stackdriver + ${opencensus.version} + + + com.google.cloud + google-cloud-monitoring + + + + + io.opencensus + opencensus-contrib-grpc-metrics + ${opencensus.version} + + + + com.google.cloud + google-cloud-trace + + + + com.google.cloud + google-cloud-monitoring + + junit junit diff --git a/samples/snippets/src/main/java/com/example/spanner/AsyncQueryToListAsyncExample.java b/samples/snippets/src/main/java/com/example/spanner/AsyncQueryToListAsyncExample.java index 78397d62fe..76b3a12352 100644 --- a/samples/snippets/src/main/java/com/example/spanner/AsyncQueryToListAsyncExample.java +++ b/samples/snippets/src/main/java/com/example/spanner/AsyncQueryToListAsyncExample.java @@ -17,6 +17,7 @@ package com.example.spanner; // [START spanner_async_query_to_list] + import com.google.api.core.ApiFuture; import com.google.cloud.spanner.AsyncResultSet; import com.google.cloud.spanner.DatabaseClient; @@ -24,7 +25,7 @@ import com.google.cloud.spanner.Spanner; import com.google.cloud.spanner.SpannerOptions; import com.google.cloud.spanner.Statement; -import com.google.common.collect.ImmutableList; +import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -62,7 +63,7 @@ static void asyncQueryToList() throws InterruptedException, ExecutionException, static void asyncQueryToList(DatabaseClient client) throws InterruptedException, ExecutionException, TimeoutException { ExecutorService executor = Executors.newSingleThreadExecutor(); - ApiFuture> albums; + ApiFuture> albums; try (AsyncResultSet resultSet = client .singleUse() diff --git a/samples/snippets/src/main/java/com/example/spanner/CreateInstanceExample.java b/samples/snippets/src/main/java/com/example/spanner/CreateInstanceExample.java index fe7e6ec424..a455ac6f19 100644 --- a/samples/snippets/src/main/java/com/example/spanner/CreateInstanceExample.java +++ b/samples/snippets/src/main/java/com/example/spanner/CreateInstanceExample.java @@ -16,7 +16,7 @@ package com.example.spanner; -//[START spanner_create_instance] +// [START spanner_create_instance] import com.google.api.gax.longrunning.OperationFuture; import com.google.cloud.spanner.Instance; import com.google.cloud.spanner.InstanceAdminClient; @@ -38,34 +38,36 @@ static void createInstance() { } static void createInstance(String projectId, String instanceId) { - Spanner spanner = SpannerOptions.newBuilder().setProjectId(projectId).build().getService(); - InstanceAdminClient instanceAdminClient = spanner.getInstanceAdminClient(); + try (Spanner spanner = + SpannerOptions.newBuilder().setProjectId(projectId).build().getService()) { + InstanceAdminClient instanceAdminClient = spanner.getInstanceAdminClient(); - // Set Instance configuration. - String configId = "regional-us-central1"; - int nodeCount = 2; - String displayName = "Descriptive name"; + // Set Instance configuration. + String configId = "regional-us-central1"; + int nodeCount = 2; + String displayName = "Descriptive name"; - // Create an InstanceInfo object that will be used to create the instance. - InstanceInfo instanceInfo = - InstanceInfo.newBuilder(InstanceId.of(projectId, instanceId)) - .setInstanceConfigId(InstanceConfigId.of(projectId, configId)) - .setNodeCount(nodeCount) - .setDisplayName(displayName) - .build(); - OperationFuture operation = - instanceAdminClient.createInstance(instanceInfo); - try { - // Wait for the createInstance operation to finish. - Instance instance = operation.get(); - System.out.printf("Instance %s was successfully created%n", instance.getId()); - } catch (ExecutionException e) { - System.out.printf( - "Error: Creating instance %s failed with error message %s%n", - instanceInfo.getId(), e.getMessage()); - } catch (InterruptedException e) { - System.out.println("Error: Waiting for createInstance operation to finish was interrupted"); + // Create an InstanceInfo object that will be used to create the instance. + InstanceInfo instanceInfo = + InstanceInfo.newBuilder(InstanceId.of(projectId, instanceId)) + .setInstanceConfigId(InstanceConfigId.of(projectId, configId)) + .setNodeCount(nodeCount) + .setDisplayName(displayName) + .build(); + OperationFuture operation = + instanceAdminClient.createInstance(instanceInfo); + try { + // Wait for the createInstance operation to finish. + Instance instance = operation.get(); + System.out.printf("Instance %s was successfully created%n", instance.getId()); + } catch (ExecutionException e) { + System.out.printf( + "Error: Creating instance %s failed with error message %s%n", + instanceInfo.getId(), e.getMessage()); + } catch (InterruptedException e) { + System.out.println("Error: Waiting for createInstance operation to finish was interrupted"); + } } } } -//[END spanner_create_instance] +// [END spanner_create_instance] diff --git a/samples/snippets/src/main/java/com/example/spanner/SpannerSample.java b/samples/snippets/src/main/java/com/example/spanner/SpannerSample.java index 0c4e0a28b8..ed2922aa16 100644 --- a/samples/snippets/src/main/java/com/example/spanner/SpannerSample.java +++ b/samples/snippets/src/main/java/com/example/spanner/SpannerSample.java @@ -177,6 +177,9 @@ static String createRestoredSampleDbId(DatabaseId database) { if (restoredDbId.length() > 30) { restoredDbId = restoredDbId.substring(0, 30); } + if (restoredDbId.endsWith("-")) { + restoredDbId = restoredDbId.substring(0, restoredDbId.length() - 1); + } return restoredDbId; } diff --git a/samples/snippets/src/test/java/com/example/spanner/QuickstartSampleIT.java b/samples/snippets/src/test/java/com/example/spanner/QuickstartSampleIT.java index 707018d71c..a032fb469b 100644 --- a/samples/snippets/src/test/java/com/example/spanner/QuickstartSampleIT.java +++ b/samples/snippets/src/test/java/com/example/spanner/QuickstartSampleIT.java @@ -18,29 +18,59 @@ import static com.google.common.truth.Truth.assertThat; +import com.google.cloud.spanner.InstanceAdminClient; +import com.google.cloud.spanner.InstanceConfig; +import com.google.cloud.spanner.InstanceId; +import com.google.cloud.spanner.InstanceInfo; +import com.google.cloud.spanner.Spanner; +import com.google.cloud.spanner.SpannerException; +import com.google.cloud.spanner.SpannerOptions; +import com.google.common.collect.ImmutableList; import java.io.ByteArrayOutputStream; import java.io.PrintStream; +import java.util.concurrent.ExecutionException; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; -/** - * Tests for quickstart sample. - */ +/** Tests for quickstart sample. */ @RunWith(JUnit4.class) -@SuppressWarnings("checkstyle:abbreviationaswordinname") public class QuickstartSampleIT { + private boolean ownedInstance = false; private String instanceId = System.getProperty("spanner.test.instance"); - // This database needs to exist for test to pass. - private String dbId = System.getProperty("spanner.quickstart.database"); + private String dbId = + System.getProperty("spanner.quickstart.database", SpannerSampleIT.formatForTest("sample")); private ByteArrayOutputStream bout; private PrintStream stdOut = System.out; private PrintStream out; @Before - public void setUp() { + public void setUp() throws SpannerException, InterruptedException, ExecutionException { + if (instanceId == null) { + instanceId = SpannerSampleIT.formatForTest("quick"); + SpannerOptions options = SpannerOptions.newBuilder().build(); + try (Spanner spanner = options.getService()) { + InstanceAdminClient instanceAdmin = spanner.getInstanceAdminClient(); + // Get first available instance config and create an instance. + InstanceConfig config = instanceAdmin.listInstanceConfigs().iterateAll().iterator().next(); + instanceAdmin + .createInstance( + InstanceInfo.newBuilder(InstanceId.of(options.getProjectId(), instanceId)) + .setDisplayName("samples-test") + .setInstanceConfigId(config.getId()) + .setNodeCount(1) + .build()) + .get(); + ownedInstance = true; + // Create a test database. + spanner + .getDatabaseAdminClient() + .createDatabase(instanceId, dbId, ImmutableList.of()) + .get(); + } + } bout = new ByteArrayOutputStream(); out = new PrintStream(bout); System.setOut(out); @@ -49,6 +79,12 @@ public void setUp() { @After public void tearDown() { System.setOut(stdOut); + if (ownedInstance) { + SpannerOptions options = SpannerOptions.newBuilder().build(); + try (Spanner spanner = options.getService()) { + spanner.getInstanceAdminClient().deleteInstance(instanceId); + } + } } @Test diff --git a/samples/snippets/src/test/java/com/example/spanner/SpannerSampleIT.java b/samples/snippets/src/test/java/com/example/spanner/SpannerSampleIT.java index 21a307fe42..a889ab97b2 100644 --- a/samples/snippets/src/test/java/com/example/spanner/SpannerSampleIT.java +++ b/samples/snippets/src/test/java/com/example/spanner/SpannerSampleIT.java @@ -18,11 +18,15 @@ import static com.google.common.truth.Truth.assertThat; +import com.google.cloud.spanner.Backup; import com.google.cloud.spanner.BackupId; import com.google.cloud.spanner.DatabaseAdminClient; import com.google.cloud.spanner.DatabaseId; import com.google.cloud.spanner.ErrorCode; +import com.google.cloud.spanner.InstanceAdminClient; +import com.google.cloud.spanner.InstanceConfig; import com.google.cloud.spanner.InstanceId; +import com.google.cloud.spanner.InstanceInfo; import com.google.cloud.spanner.Spanner; import com.google.cloud.spanner.SpannerException; import com.google.cloud.spanner.SpannerOptions; @@ -42,12 +46,11 @@ /** Unit tests for {@code SpannerSample} */ @RunWith(JUnit4.class) -@SuppressWarnings("checkstyle:abbreviationaswordinname") public class SpannerSampleIT { - // The instance needs to exist for tests to pass. - private static final String instanceId = System.getProperty("spanner.test.instance"); + private static boolean ownedInstance = false; + private static String instanceId = System.getProperty("spanner.test.instance"); private static final String databaseId = - formatForTest(System.getProperty("spanner.sample.database")); + formatForTest(System.getProperty("spanner.sample.database", "my-sample")); static Spanner spanner; static DatabaseId dbId; static DatabaseAdminClient dbClient; @@ -67,6 +70,22 @@ private String runSample(String command) throws Exception { public static void setUp() throws Exception { SpannerOptions options = SpannerOptions.newBuilder().build(); spanner = options.getService(); + if (instanceId == null) { + instanceId = formatForTest("samples"); + InstanceAdminClient instanceAdmin = spanner.getInstanceAdminClient(); + // Get first available instance config and create an instance. + InstanceConfig config = instanceAdmin.listInstanceConfigs().iterateAll().iterator().next(); + instanceAdmin + .createInstance( + InstanceInfo.newBuilder(InstanceId.of(options.getProjectId(), instanceId)) + .setDisplayName("samples-test") + .setInstanceConfigId(config.getId()) + .setNodeCount(1) + .build()) + .get(); + ownedInstance = true; + } + dbClient = spanner.getDatabaseAdminClient(); dbId = DatabaseId.of(options.getProjectId(), instanceId, databaseId); dbClient.dropDatabase(dbId.getInstanceId().getInstance(), dbId.getDatabase()); @@ -76,9 +95,16 @@ public static void setUp() throws Exception { @AfterClass public static void tearDown() throws Exception { - dbClient.dropDatabase(dbId.getInstanceId().getInstance(), dbId.getDatabase()); - dbClient.dropDatabase( - dbId.getInstanceId().getInstance(), SpannerSample.createRestoredSampleDbId(dbId)); + if (ownedInstance) { + for (Backup backup : dbClient.listBackups(instanceId).iterateAll()) { + dbClient.deleteBackup(instanceId, backup.getId().getBackup()); + } + spanner.getInstanceAdminClient().deleteInstance(instanceId); + } else { + dbClient.dropDatabase(dbId.getInstanceId().getInstance(), dbId.getDatabase()); + dbClient.dropDatabase( + dbId.getInstanceId().getInstance(), SpannerSample.createRestoredSampleDbId(dbId)); + } } @Test @@ -259,36 +285,34 @@ public void testSample() throws Exception { String backupName = String.format( - "%s_%02d", - dbId.getDatabase(), LocalDate.now().get(ChronoField.ALIGNED_WEEK_OF_YEAR)); + "%s_%02d", dbId.getDatabase(), LocalDate.now().get(ChronoField.ALIGNED_WEEK_OF_YEAR)); BackupId backupId = BackupId.of(dbId.getInstanceId(), backupName); out = runSample("createbackup"); assertThat(out).contains("Created backup [" + backupId + "]"); out = runSample("cancelcreatebackup"); - assertThat(out).contains( - "Backup operation for [" + backupId + "_cancel] successfully cancelled"); + assertThat(out) + .contains("Backup operation for [" + backupId + "_cancel] successfully cancelled"); out = runSample("listbackupoperations"); - assertThat(out).contains( - String.format( - "Backup %s on database %s pending:", - backupId.getName(), - dbId.getName())); + assertThat(out) + .contains( + String.format("Backup %s on database %s pending:", backupId.getName(), dbId.getName())); out = runSample("listbackups"); assertThat(out).contains("All backups:"); - assertThat(out).contains( - String.format("All backups with backup name containing \"%s\":", backupId.getBackup())); - assertThat(out).contains(String.format( - "All backups for databases with a name containing \"%s\":", - dbId.getDatabase())); - assertThat(out).contains( - String.format("All backups that expire before")); + assertThat(out) + .contains( + String.format("All backups with backup name containing \"%s\":", backupId.getBackup())); + assertThat(out) + .contains( + String.format( + "All backups for databases with a name containing \"%s\":", dbId.getDatabase())); + assertThat(out).contains(String.format("All backups that expire before")); assertThat(out).contains("All backups with size greater than 100 bytes:"); - assertThat(out).containsMatch( - Pattern.compile("All databases created after (.+) and that are ready:")); + assertThat(out) + .containsMatch(Pattern.compile("All databases created after (.+) and that are ready:")); assertThat(out).contains("All backups, listed using pagination:"); // All the above tests should include the created backup exactly once, i.e. exactly 7 times. assertThat(countOccurrences(out, backupId.getName())).isEqualTo(7); @@ -300,12 +324,9 @@ public void testSample() throws Exception { while (true) { try { out = runSample("restorebackup"); - assertThat(out).contains( - "Restored database [" - + dbId.getName() - + "] from [" - + backupId.getName() - + "]"); + assertThat(out) + .contains( + "Restored database [" + dbId.getName() + "] from [" + backupId.getName() + "]"); break; } catch (SpannerException e) { if (e.getErrorCode() == ErrorCode.FAILED_PRECONDITION @@ -315,7 +336,7 @@ public void testSample() throws Exception { if (restoreAttempts == 10) { System.out.println( "Restore operation failed 10 times because of other pending restores. " - + "Giving up restore."); + + "Giving up restore."); break; } Uninterruptibles.sleepUninterruptibly(60L, TimeUnit.SECONDS); @@ -326,17 +347,15 @@ public void testSample() throws Exception { } out = runSample("listdatabaseoperations"); - assertThat(out).contains( - String.format( - "Database %s restored from backup", - DatabaseId.of( - dbId.getInstanceId(), - SpannerSample.createRestoredSampleDbId(dbId)) - .getName())); + assertThat(out) + .contains( + String.format( + "Database %s restored from backup", + DatabaseId.of(dbId.getInstanceId(), SpannerSample.createRestoredSampleDbId(dbId)) + .getName())); out = runSample("updatebackup"); - assertThat(out).contains( - String.format("Updated backup [" + backupId + "]")); + assertThat(out).contains(String.format("Updated backup [" + backupId + "]")); // Drop the restored database before we try to delete the backup. // Otherwise the delete backup operation might fail as the backup is still in use by @@ -385,7 +404,11 @@ private static int countOccurrences(String input, String search) { return input.split(search).length - 1; } - private static String formatForTest(String name) { - return name + "-" + UUID.randomUUID().toString().substring(0, 20); + static String formatForTest(String name) { + String res = name + "-" + UUID.randomUUID().toString().substring(0, 20); + if (res.endsWith("-")) { + res = res.substring(0, res.length() - 1); + } + return res; } }