From ebd326b2d5bc7871d0df0238d81cd1be8e88d800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?= Date: Mon, 9 Dec 2024 17:09:16 +0100 Subject: [PATCH] test: enable more tests on the Emulator (#3535) Multiple tests were skipped on the Emulator, because the features that are covered by these tests were originally not supported on the Emulator. These features are now available on the Emulator, and the tests can be enabled. --- .../it/ITAsyncTransactionRetryTest.java | 6 - .../cloud/spanner/it/ITBatchReadTest.java | 62 +++---- .../google/cloud/spanner/it/ITDMLTest.java | 27 +-- .../cloud/spanner/it/ITDatabaseTest.java | 3 - .../cloud/spanner/it/ITDmlReturningTest.java | 28 ++- .../cloud/spanner/it/ITFloat32Test.java | 4 - .../it/ITForeignKeyDeleteCascadeTest.java | 174 ++++++++---------- .../cloud/spanner/it/ITJsonWriteReadTest.java | 26 +-- .../cloud/spanner/it/ITLargeReadTest.java | 41 ++--- .../cloud/spanner/it/ITPgJsonbTest.java | 38 ++-- .../cloud/spanner/it/ITPgNumericTest.java | 48 ++--- 11 files changed, 175 insertions(+), 282 deletions(-) diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITAsyncTransactionRetryTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITAsyncTransactionRetryTest.java index fa44ad6f5d9..744d7042df4 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITAsyncTransactionRetryTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITAsyncTransactionRetryTest.java @@ -17,10 +17,8 @@ package com.google.cloud.spanner.connection.it; import static com.google.cloud.spanner.SpannerApiFutures.get; -import static com.google.cloud.spanner.testing.EmulatorSpannerHelper.isUsingEmulator; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.fail; -import static org.junit.Assume.assumeFalse; import com.google.api.core.ApiFuture; import com.google.api.core.SettableApiFuture; @@ -580,7 +578,6 @@ public void testAbortWithResultSetFullyConsumed() { @Test public void testAbortWithConcurrentInsert() { - assumeFalse("concurrent transactions are not supported on the emulator", isUsingEmulator()); AbortInterceptor interceptor = new AbortInterceptor(0); try (ITConnection connection = createConnection(interceptor, new CountTransactionRetryListener())) { @@ -632,7 +629,6 @@ public void testAbortWithConcurrentInsert() { @Test public void testAbortWithConcurrentDelete() { - assumeFalse("concurrent transactions are not supported on the emulator", isUsingEmulator()); AbortInterceptor interceptor = new AbortInterceptor(0); // first insert two test records try (ITConnection connection = createConnection()) { @@ -686,7 +682,6 @@ public void testAbortWithConcurrentDelete() { @Test public void testAbortWithConcurrentUpdate() { - assumeFalse("concurrent transactions are not supported on the emulator", isUsingEmulator()); AbortInterceptor interceptor = new AbortInterceptor(0); // first insert two test records try (ITConnection connection = createConnection()) { @@ -746,7 +741,6 @@ public void testAbortWithConcurrentUpdate() { */ @Test public void testAbortWithUnseenConcurrentInsert() throws InterruptedException { - assumeFalse("concurrent transactions are not supported on the emulator", isUsingEmulator()); AbortInterceptor interceptor = new AbortInterceptor(0); try (ITConnection connection = createConnection(interceptor, new CountTransactionRetryListener())) { diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITBatchReadTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITBatchReadTest.java index 6598a3dca76..f028fbc2b15 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITBatchReadTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITBatchReadTest.java @@ -19,11 +19,9 @@ import static com.google.cloud.spanner.connection.ITAbstractSpannerTest.extractConnectionUrl; import static com.google.cloud.spanner.connection.ITAbstractSpannerTest.getKeyFile; import static com.google.cloud.spanner.connection.ITAbstractSpannerTest.hasValidKeyFile; -import static com.google.cloud.spanner.testing.EmulatorSpannerHelper.isUsingEmulator; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.junit.Assume.assumeFalse; import com.google.cloud.ByteArray; import com.google.cloud.Timestamp; @@ -96,10 +94,7 @@ public class ITBatchReadTest { public static List data() { List params = new ArrayList<>(); params.add(new DialectTestParameter(Dialect.GOOGLE_STANDARD_SQL)); - // PG dialect tests are not supported by the emulator - if (!isUsingEmulator()) { - params.add(new DialectTestParameter(Dialect.POSTGRESQL)); - } + params.add(new DialectTestParameter(Dialect.POSTGRESQL)); return params; } @@ -135,30 +130,28 @@ public static void setUpDatabase() throws Exception { List databaseClients = new ArrayList<>(); databaseClients.add(env.getTestHelper().getDatabaseClient(googleStandardDatabase)); - if (!isUsingEmulator()) { - postgreSQLDatabase = - env.getTestHelper().createTestDatabase(Dialect.POSTGRESQL, Collections.emptyList()); - env.getTestHelper() - .getClient() - .getDatabaseAdminClient() - .updateDatabaseDdl( - env.getTestHelper().getInstanceId().getInstance(), - postgreSQLDatabase.getId().getDatabase(), - ImmutableList.of( - "CREATE TABLE " - + TABLE_NAME - + " (" - + " Key bigint not null primary key," - + " Data bytea," - + " Fingerprint bigint," - + " Size bigint" - + ")", - "CREATE INDEX " + INDEX_NAME + " ON " + TABLE_NAME + "(Fingerprint)"), - null) - .get(); - postgreSQLBatchClient = env.getTestHelper().getBatchClient(postgreSQLDatabase); - databaseClients.add(env.getTestHelper().getDatabaseClient(postgreSQLDatabase)); - } + postgreSQLDatabase = + env.getTestHelper().createTestDatabase(Dialect.POSTGRESQL, Collections.emptyList()); + env.getTestHelper() + .getClient() + .getDatabaseAdminClient() + .updateDatabaseDdl( + env.getTestHelper().getInstanceId().getInstance(), + postgreSQLDatabase.getId().getDatabase(), + ImmutableList.of( + "CREATE TABLE " + + TABLE_NAME + + " (" + + " Key bigint not null primary key," + + " Data bytea," + + " Fingerprint bigint," + + " Size bigint" + + ")", + "CREATE INDEX " + INDEX_NAME + " ON " + TABLE_NAME + "(Fingerprint)"), + null) + .get(); + postgreSQLBatchClient = env.getTestHelper().getBatchClient(postgreSQLDatabase); + databaseClients.add(env.getTestHelper().getDatabaseClient(postgreSQLDatabase)); List rows = manyRows(); numRows = rows.size(); @@ -210,9 +203,6 @@ private Database getDatabase() { @Test public void read() { - assumeFalse( - "PostgreSQL does not support the PartitionRead RPC", dialect.dialect == Dialect.POSTGRESQL); - BitSet seenRows = new BitSet(numRows); TimestampBound bound = getRandomBound(); PartitionOptions partitionParams = getRandomPartitionOptions(); @@ -229,9 +219,6 @@ public void read() { @Test public void readUsingIndex() { - assumeFalse( - "PostgreSQL does not support the PartitionRead RPC", dialect.dialect == Dialect.POSTGRESQL); - TimestampBound bound = getRandomBound(); PartitionOptions partitionParams = getRandomPartitionOptions(); batchTxn = getBatchClient().batchReadOnlyTransaction(bound); @@ -258,8 +245,6 @@ public void readUsingIndex() { @Test public void dataBoostRead() { - assumeFalse("Emulator does not support data boost read", isUsingEmulator()); - BitSet seenRows = new BitSet(numRows); TimestampBound bound = getRandomBound(); PartitionOptions partitionParams = getRandomPartitionOptions(); @@ -312,7 +297,6 @@ private PartitionOptions getRandomPartitionOptions() { @Test public void dataBoostQuery() { - assumeFalse("Emulator does not support data boost query", isUsingEmulator()); BitSet seenRows = new BitSet(numRows); TimestampBound bound = getRandomBound(); PartitionOptions partitionParams = getRandomPartitionOptions(); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITDMLTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITDMLTest.java index 5ea30912103..ab3c8e24a8c 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITDMLTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITDMLTest.java @@ -16,14 +16,12 @@ package com.google.cloud.spanner.it; -import static com.google.cloud.spanner.testing.EmulatorSpannerHelper.isUsingEmulator; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import static org.junit.Assume.assumeFalse; import com.google.cloud.spanner.AbortedException; import com.google.cloud.spanner.Database; @@ -90,15 +88,13 @@ public static void setUpDatabase() { + " V INT64," + ") PRIMARY KEY (K)"); googleStandardSQLClient = env.getTestHelper().getDatabaseClient(googleStandardSQLDatabase); - if (!isUsingEmulator()) { - Database postgreSQLDatabase = - env.getTestHelper() - .createTestDatabase( - Dialect.POSTGRESQL, - Arrays.asList( - "CREATE TABLE T (" + " K VARCHAR PRIMARY KEY," + " V BIGINT" + ")")); - postgreSQLClient = env.getTestHelper().getDatabaseClient(postgreSQLDatabase); - } + Database postgreSQLDatabase = + env.getTestHelper() + .createTestDatabase( + Dialect.POSTGRESQL, + Arrays.asList( + "CREATE TABLE T (" + " K VARCHAR PRIMARY KEY," + " V BIGINT" + ")")); + postgreSQLClient = env.getTestHelper().getDatabaseClient(postgreSQLDatabase); } @AfterClass @@ -122,10 +118,7 @@ public void increaseTestIdAndDeleteTestData() { public static List data() { List params = new ArrayList<>(); params.add(new DialectTestParameter(Dialect.GOOGLE_STANDARD_SQL)); - // "PG dialect tests are not supported by the emulator" - if (!isUsingEmulator()) { - params.add(new DialectTestParameter(Dialect.POSTGRESQL)); - } + params.add(new DialectTestParameter(Dialect.POSTGRESQL)); return params; } @@ -389,10 +382,6 @@ public void standardDMLWithExecuteSQL() { @Test public void testUntypedNullValues() { - assumeFalse( - "Spanner PostgreSQL does not yet support untyped null values", - dialect.dialect == Dialect.POSTGRESQL); - DatabaseClient client = getClient(dialect.dialect); String sql; if (dialect.dialect == Dialect.POSTGRESQL) { diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITDatabaseTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITDatabaseTest.java index f9230b8836b..b9813d512fd 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITDatabaseTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITDatabaseTest.java @@ -20,7 +20,6 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; -import static org.junit.Assume.assumeFalse; import com.google.api.client.util.ExponentialBackOff; import com.google.api.gax.longrunning.OperationFuture; @@ -182,8 +181,6 @@ public void instanceNotFound() { @Test public void testNumericPrimaryKey() { - assumeFalse("Emulator does not support numeric primary keys", isUsingEmulator()); - final String table = "NumericTable"; // Creates table with numeric primary key diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITDmlReturningTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITDmlReturningTest.java index 8cb465e4c84..f54365ba84d 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITDmlReturningTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITDmlReturningTest.java @@ -42,7 +42,6 @@ import com.google.cloud.spanner.TransactionRunner; import com.google.cloud.spanner.TransactionRunner.TransactionCallable; import com.google.cloud.spanner.connection.ConnectionOptions; -import com.google.cloud.spanner.testing.EmulatorSpannerHelper; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -75,8 +74,6 @@ public final class ITDmlReturningTest { @BeforeClass public static void setUpDatabase() { - assumeFalse( - "DML Returning is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); Database googleStandardSQLDatabase = env.getTestHelper() .createTestDatabase( @@ -85,18 +82,16 @@ public static void setUpDatabase() { + " V INT64," + ") PRIMARY KEY (K)"); googleStandardSQLClient = env.getTestHelper().getDatabaseClient(googleStandardSQLDatabase); - if (!isUsingEmulator()) { - Database postgreSQLDatabase = - env.getTestHelper() - .createTestDatabase( - Dialect.POSTGRESQL, - Collections.singletonList( - "CREATE TABLE T (" - + " \"K\" VARCHAR PRIMARY KEY," - + " \"V\" BIGINT" - + ")")); - postgreSQLClient = env.getTestHelper().getDatabaseClient(postgreSQLDatabase); - } + Database postgreSQLDatabase = + env.getTestHelper() + .createTestDatabase( + Dialect.POSTGRESQL, + Collections.singletonList( + "CREATE TABLE T (" + + " \"K\" VARCHAR PRIMARY KEY," + + " \"V\" BIGINT" + + ")")); + postgreSQLClient = env.getTestHelper().getDatabaseClient(postgreSQLDatabase); } @AfterClass @@ -222,6 +217,9 @@ private void executeUpdateAsync(long expectedCount, final String... stmts) { @Test public void dmlReturningWithExecutePartitionedUpdate() { + assumeFalse( + "The emulator does not dis-allow THEN RETURN statements for PDML", isUsingEmulator()); + SpannerException e = assertThrows( SpannerException.class, diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITFloat32Test.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITFloat32Test.java index 393c2db8755..1536912f686 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITFloat32Test.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITFloat32Test.java @@ -16,13 +16,11 @@ package com.google.cloud.spanner.it; -import static com.google.cloud.spanner.testing.EmulatorSpannerHelper.isUsingEmulator; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; -import static org.junit.Assume.assumeFalse; import com.google.cloud.Timestamp; import com.google.cloud.spanner.Database; @@ -93,8 +91,6 @@ public static List data() { @BeforeClass public static void setUpDatabase() throws ExecutionException, InterruptedException, TimeoutException { - assumeFalse("Emulator does not support FLOAT32 yet", isUsingEmulator()); - Database googleStandardSQLDatabase = env.getTestHelper().createTestDatabase(GOOGLE_STANDARD_SQL_SCHEMA); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITForeignKeyDeleteCascadeTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITForeignKeyDeleteCascadeTest.java index fc7c860267a..448aab85114 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITForeignKeyDeleteCascadeTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITForeignKeyDeleteCascadeTest.java @@ -15,11 +15,11 @@ */ package com.google.cloud.spanner.it; +import static com.google.cloud.spanner.testing.EmulatorSpannerHelper.isUsingEmulator; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; -import static org.junit.Assume.assumeFalse; import com.google.cloud.spanner.Database; import com.google.cloud.spanner.DatabaseAdminClient; @@ -33,7 +33,6 @@ import com.google.cloud.spanner.ResultSet; import com.google.cloud.spanner.SpannerException; import com.google.cloud.spanner.Statement; -import com.google.cloud.spanner.testing.EmulatorSpannerHelper; import com.google.common.collect.ImmutableList; import java.util.ArrayList; import java.util.Arrays; @@ -68,46 +67,44 @@ public static List data() { private static Database GOOGLE_STANDARD_SQL_DATABASE; private static Database POSTGRESQL_DATABASE; - private static List dbs = new ArrayList<>(); + private static final List dbs = new ArrayList<>(); @Parameterized.Parameter(0) public DialectTestParameter dialect; @BeforeClass public static void setUpDatabase() { - if (!EmulatorSpannerHelper.isUsingEmulator()) { - GOOGLE_STANDARD_SQL_DATABASE = - env.getTestHelper() - .createTestDatabase( - ImmutableList.of( - "CREATE TABLE Singer (\n" - + " singer_id INT64 NOT NULL,\n" - + " first_name STRING(1024),\n" - + ") PRIMARY KEY(singer_id)\n", - "CREATE TABLE Concert (\n" - + " venue_id INT64 NOT NULL,\n" - + " singer_id INT64 NOT NULL,\n" - + " CONSTRAINT Fk_Concert_Singer FOREIGN KEY (singer_id) REFERENCES Singer (singer_id) ON DELETE CASCADE" - + ") PRIMARY KEY(venue_id, singer_id)")); - POSTGRESQL_DATABASE = - env.getTestHelper() - .createTestDatabase( - Dialect.POSTGRESQL, - ImmutableList.of( - "CREATE TABLE Singer (\n" - + " singer_id BIGINT PRIMARY KEY,\n" - + " first_name VARCHAR\n" - + ")", - "CREATE TABLE Concert (\n" - + " venue_id BIGINT NOT NULL,\n" - + " singer_id BIGINT NOT NULL,\n" - + " PRIMARY KEY (venue_id, singer_id),\n" - + " CONSTRAINT Fk_Concert_Singer FOREIGN KEY (singer_id) REFERENCES Singer (singer_id) ON DELETE CASCADE\n" - + " )")); - - dbs.add(GOOGLE_STANDARD_SQL_DATABASE); - dbs.add(POSTGRESQL_DATABASE); - } + GOOGLE_STANDARD_SQL_DATABASE = + env.getTestHelper() + .createTestDatabase( + ImmutableList.of( + "CREATE TABLE Singer (\n" + + " singer_id INT64 NOT NULL,\n" + + " first_name STRING(1024),\n" + + ") PRIMARY KEY(singer_id)\n", + "CREATE TABLE Concert (\n" + + " venue_id INT64 NOT NULL,\n" + + " singer_id INT64 NOT NULL,\n" + + " CONSTRAINT Fk_Concert_Singer FOREIGN KEY (singer_id) REFERENCES Singer (singer_id) ON DELETE CASCADE\n" + + ") PRIMARY KEY(venue_id, singer_id)")); + POSTGRESQL_DATABASE = + env.getTestHelper() + .createTestDatabase( + Dialect.POSTGRESQL, + ImmutableList.of( + "CREATE TABLE Singer (\n" + + " singer_id BIGINT PRIMARY KEY,\n" + + " first_name VARCHAR\n" + + ")", + "CREATE TABLE Concert (\n" + + " venue_id BIGINT NOT NULL,\n" + + " singer_id BIGINT NOT NULL,\n" + + " PRIMARY KEY (venue_id, singer_id),\n" + + " CONSTRAINT \"Fk_Concert_Singer\" FOREIGN KEY (singer_id) REFERENCES Singer (singer_id) ON DELETE CASCADE\n" + + " )")); + + dbs.add(GOOGLE_STANDARD_SQL_DATABASE); + dbs.add(POSTGRESQL_DATABASE); } @AfterClass @@ -120,10 +117,6 @@ public static void tearDown() { @Test public void testForeignKeyDeleteCascadeConstraints_withCreateDDLStatements() { - assumeFalse( - "Emulator does not yet support foreign key delete cascade", - EmulatorSpannerHelper.isUsingEmulator()); - final DatabaseClient databaseClient = getCreatedDatabaseClient(); try (final ResultSet rs = databaseClient @@ -133,17 +126,17 @@ public void testForeignKeyDeleteCascadeConstraints_withCreateDDLStatements() { "SELECT DELETE_RULE\n" + "FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS\n" + "WHERE CONSTRAINT_NAME ='Fk_Concert_Singer'"))) { - while (rs.next()) { - assertEquals(rs.getString(DELETE_RULE_COLUMN_NAME), "CASCADE"); + assertTrue(rs.next()); + // TODO: Enable for the emulator when it returns the correct value for DELETE_RULE. + if (!isUsingEmulator()) { + assertEquals("CASCADE", rs.getString(0)); } + assertFalse(rs.next()); } } @Test public void testForeignKeyDeleteCascadeConstraints_withAlterDDLStatements() throws Exception { - assumeFalse( - "Emulator does not yet support foreign key delete cascade", - EmulatorSpannerHelper.isUsingEmulator()); // Creating new tables within this test to ensure we don't pollute tables used by other tests in // this class. List createStatements; @@ -160,7 +153,7 @@ public void testForeignKeyDeleteCascadeConstraints_withAlterDDLStatements() thro + " PRIMARY KEY (venue_id, singer_id)\n" + " )", "ALTER TABLE ConcertV2 " - + "ADD CONSTRAINT Fk_Concert_Singer_V2 FOREIGN KEY(singer_id) REFERENCES Singer(singer_id) " + + "ADD CONSTRAINT \"Fk_Concert_Singer_V2\" FOREIGN KEY(singer_id) REFERENCES Singer(singer_id) " + "ON DELETE CASCADE"); } else { createStatements = @@ -181,7 +174,7 @@ public void testForeignKeyDeleteCascadeConstraints_withAlterDDLStatements() thro env.getTestHelper().createTestDatabase(dialect.dialect, createStatements); dbs.add(createdDatabase); - final DatabaseClient databaseClient = getCreatedDatabaseClient(); + final DatabaseClient databaseClient = env.getTestHelper().getDatabaseClient(createdDatabase); try (final ResultSet rs = databaseClient @@ -190,10 +183,13 @@ public void testForeignKeyDeleteCascadeConstraints_withAlterDDLStatements() thro Statement.of( "SELECT DELETE_RULE\n" + "FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS\n" - + "WHERE CONSTRAINT_NAME ='Fk_Concert_Singer'"))) { - while (rs.next()) { - assertEquals(rs.getString(DELETE_RULE_COLUMN_NAME), "CASCADE"); + + "WHERE CONSTRAINT_NAME ='Fk_Concert_Singer_V2'"))) { + assertTrue(rs.next()); + // TODO: Enable when the emulator returns the correct value for this column. + if (!isUsingEmulator()) { + assertEquals("CASCADE", rs.getString(0)); } + assertFalse(rs.next()); } // remove the foreign key delete cascade constraint @@ -215,19 +211,15 @@ public void testForeignKeyDeleteCascadeConstraints_withAlterDDLStatements() thro Statement.of( "SELECT DELETE_RULE\n" + "FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS\n" - + "WHERE CONSTRAINT_NAME ='Fk_Concert_Singer_V2'"))) { - while (rs.next()) { - assertEquals(rs.getString(DELETE_RULE_COLUMN_NAME), "NO ACTION"); - } + + "WHERE LOWER(CONSTRAINT_NAME) ='fk_concert_singer_v2'"))) { + assertTrue(rs.next()); + assertEquals("NO ACTION", rs.getString(0)); + assertFalse(rs.next()); } } @Test public void testForeignKeyDeleteCascadeConstraints_verifyValidInsertions() { - assumeFalse( - "Emulator does not yet support foreign key delete cascade", - EmulatorSpannerHelper.isUsingEmulator()); - final DatabaseClient databaseClient = getCreatedDatabaseClient(); final String singerInsertStatement = "INSERT INTO Singer (singer_id, first_name) VALUES (" + generateQueryParameters(2) + ")"; @@ -289,10 +281,6 @@ public void testForeignKeyDeleteCascadeConstraints_verifyValidInsertions() { @Test public void testForeignKeyDeleteCascadeConstraints_verifyInvalidInsertions() { - assumeFalse( - "Emulator does not yet support foreign key delete cascade", - EmulatorSpannerHelper.isUsingEmulator()); - final DatabaseClient databaseClient = getCreatedDatabaseClient(); // unsuccessful inserts into referencing tables when foreign key is not inserted into referenced @@ -319,16 +307,12 @@ public void testForeignKeyDeleteCascadeConstraints_verifyInvalidInsertions() { transaction.executeUpdate(concertInsertStatementWithInvalidValues); return null; })); - assertEquals(ex.getErrorCode(), ErrorCode.FAILED_PRECONDITION); - assertTrue(ex.getMessage().contains("Cannot find referenced values")); + assertEquals(ErrorCode.FAILED_PRECONDITION, ex.getErrorCode()); + assertTrue(ex.getMessage(), ex.getMessage().contains("Cannot find referenced")); } @Test public void testForeignKeyDeleteCascadeConstraints_forDeletions() { - assumeFalse( - "Emulator does not yet support foreign key delete cascade", - EmulatorSpannerHelper.isUsingEmulator()); - final DatabaseClient databaseClient = getCreatedDatabaseClient(); final String singerInsertStatement = @@ -396,10 +380,6 @@ public void testForeignKeyDeleteCascadeConstraints_forDeletions() { @Test public void testForeignKeyDeleteCascadeConstraints_forMutations_onConflictDueToParentTable() { - assumeFalse( - "Emulator does not yet support foreign key delete cascade", - EmulatorSpannerHelper.isUsingEmulator()); - final DatabaseClient databaseClient = getCreatedDatabaseClient(); // inserting and deleting the referenced key within the same mutation are considered @@ -423,15 +403,11 @@ public void testForeignKeyDeleteCascadeConstraints_forMutations_onConflictDueToP Mutation.delete("Singer", Key.of(4L)))); return null; })); - assertEquals(ex.getErrorCode(), ErrorCode.FAILED_PRECONDITION); + assertEquals(ErrorCode.FAILED_PRECONDITION, ex.getErrorCode()); } @Test public void testForeignKeyDeleteCascadeConstraints_forMutations_onConflictsDueToChildTable() { - assumeFalse( - "Emulator does not yet support foreign key delete cascade", - EmulatorSpannerHelper.isUsingEmulator()); - final DatabaseClient databaseClient = getCreatedDatabaseClient(); // referencing a foreign key in child table and deleting the referenced key in parent table @@ -454,25 +430,24 @@ public void testForeignKeyDeleteCascadeConstraints_forMutations_onConflictsDueTo transaction.executeUpdate(singerInsertStatementWithValues); return null; }); - SpannerException ex = - assertThrows( - SpannerException.class, - () -> - databaseClient - .readWriteTransaction() - .run( - transaction -> { - transaction.buffer( - Arrays.asList( - Mutation.newInsertBuilder("Concert") - .set("first_name") - .to(5L) - .set("singer_id") - .to(5L) - .build(), - Mutation.delete("Singer", Key.of(5L)))); - return null; - })); + assertThrows( + SpannerException.class, + () -> + databaseClient + .readWriteTransaction() + .run( + transaction -> { + transaction.buffer( + Arrays.asList( + Mutation.newInsertBuilder("Concert") + .set("first_name") + .to(5L) + .set("singer_id") + .to(5L) + .build(), + Mutation.delete("Singer", Key.of(5L)))); + return null; + })); } private DatabaseAdminClient getDatabaseAdminClient() { @@ -481,16 +456,13 @@ private DatabaseAdminClient getDatabaseAdminClient() { private DatabaseClient getCreatedDatabaseClient() { if (dialect.dialect == Dialect.POSTGRESQL) { - return env.getTestHelper().getDatabaseClient(this.POSTGRESQL_DATABASE); + return env.getTestHelper().getDatabaseClient(POSTGRESQL_DATABASE); } - return env.getTestHelper().getDatabaseClient(this.GOOGLE_STANDARD_SQL_DATABASE); + return env.getTestHelper().getDatabaseClient(GOOGLE_STANDARD_SQL_DATABASE); } /** * Returns '@p1, @p2, ..., @pNumParams' for GoogleSQL and $1, $2, ..., $NumParams' for PostgreSQL - * - * @param numParams - * @return */ private String generateQueryParameters(final int numParams) { final List params; diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITJsonWriteReadTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITJsonWriteReadTest.java index c6f72349f0b..e355eaa07a3 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITJsonWriteReadTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITJsonWriteReadTest.java @@ -18,7 +18,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThrows; -import static org.junit.Assume.assumeFalse; import com.google.cloud.spanner.Database; import com.google.cloud.spanner.DatabaseClient; @@ -30,7 +29,6 @@ import com.google.cloud.spanner.SpannerException; import com.google.cloud.spanner.Statement; import com.google.cloud.spanner.Value; -import com.google.cloud.spanner.testing.EmulatorSpannerHelper; import com.google.cloud.spanner.testing.RemoteSpannerHelper; import com.google.common.io.Resources; import java.io.File; @@ -68,23 +66,19 @@ public class ITJsonWriteReadTest { @BeforeClass public static void beforeClass() { final RemoteSpannerHelper testHelper = env.getTestHelper(); - if (!EmulatorSpannerHelper.isUsingEmulator()) { - final Database database = - testHelper.createTestDatabase( - "CREATE TABLE " - + TABLE_NAME - + "(" - + "Id INT64 NOT NULL," - + "json JSON" - + ") PRIMARY KEY (Id)"); - databaseClient = testHelper.getDatabaseClient(database); - } + final Database database = + testHelper.createTestDatabase( + "CREATE TABLE " + + TABLE_NAME + + "(" + + "Id INT64 NOT NULL," + + "json JSON" + + ") PRIMARY KEY (Id)"); + databaseClient = testHelper.getDatabaseClient(database); } @Test public void testWriteValidJsonValues() throws IOException { - assumeFalse("Emulator does not yet support JSON", EmulatorSpannerHelper.isUsingEmulator()); - List resources = getJsonFilePaths(RESOURCES_DIR + File.separator + VALID_JSON_DIR); long id = 0L; @@ -116,8 +110,6 @@ public void testWriteValidJsonValues() throws IOException { @Test public void testWriteAndReadInvalidJsonValues() throws IOException { - assumeFalse("Emulator does not yet support JSON", EmulatorSpannerHelper.isUsingEmulator()); - List resources = getJsonFilePaths(RESOURCES_DIR + File.separator + INVALID_JSON_DIR); AtomicLong id = new AtomicLong(100); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITLargeReadTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITLargeReadTest.java index b60505c873a..83d505e2124 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITLargeReadTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITLargeReadTest.java @@ -16,7 +16,6 @@ package com.google.cloud.spanner.it; -import static com.google.cloud.spanner.testing.EmulatorSpannerHelper.isUsingEmulator; import static com.google.common.truth.Truth.assertThat; import com.google.cloud.ByteArray; @@ -31,6 +30,7 @@ import com.google.cloud.spanner.ResultSet; import com.google.cloud.spanner.Statement; import com.google.cloud.spanner.connection.ConnectionOptions; +import com.google.common.collect.ImmutableList; import com.google.common.hash.HashFunction; import com.google.common.hash.Hashing; import java.util.ArrayList; @@ -88,20 +88,18 @@ public static void setUpDatabase() { + " Size INT64," + ") PRIMARY KEY (Key)"); googleStandardSQLClient = env.getTestHelper().getDatabaseClient(googleStandardSQLDatabase); - if (!isUsingEmulator()) { - Database postgreSQLDatabase = - env.getTestHelper() - .createTestDatabase( - Dialect.POSTGRESQL, - Arrays.asList( - "CREATE TABLE TestTable (" - + " Key BIGINT PRIMARY KEY," - + " Data BYTEA," - + " Fingerprint BIGINT," - + " Size BIGINT" - + ")")); - postgreSQLClient = env.getTestHelper().getDatabaseClient(postgreSQLDatabase); - } + Database postgreSQLDatabase = + env.getTestHelper() + .createTestDatabase( + Dialect.POSTGRESQL, + ImmutableList.of( + "CREATE TABLE TestTable (" + + " Key BIGINT PRIMARY KEY," + + " Data BYTEA," + + " Fingerprint BIGINT," + + " Size BIGINT" + + ")")); + postgreSQLClient = env.getTestHelper().getDatabaseClient(postgreSQLDatabase); hasher = Hashing.goodFastHash(64); List mutations = new ArrayList<>(); @@ -127,17 +125,13 @@ public static void setUpDatabase() { i++; if (totalSize >= WRITE_BATCH_SIZE) { googleStandardSQLClient.write(mutations); - if (!isUsingEmulator()) { - postgreSQLClient.write(mutations); - } + postgreSQLClient.write(mutations); mutations.clear(); totalSize = 0; } } googleStandardSQLClient.write(mutations); - if (!isUsingEmulator()) { - postgreSQLClient.write(mutations); - } + postgreSQLClient.write(mutations); } @AfterClass @@ -149,10 +143,7 @@ public static void teardown() { public static List data() { List params = new ArrayList<>(); params.add(new DialectTestParameter(Dialect.GOOGLE_STANDARD_SQL)); - // "PG dialect tests are not supported by the emulator" - if (!isUsingEmulator()) { - params.add(new DialectTestParameter(Dialect.POSTGRESQL)); - } + params.add(new DialectTestParameter(Dialect.POSTGRESQL)); return params; } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITPgJsonbTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITPgJsonbTest.java index 634f7919658..275fbe6545f 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITPgJsonbTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITPgJsonbTest.java @@ -16,11 +16,11 @@ package com.google.cloud.spanner.it; +import static com.google.cloud.spanner.testing.EmulatorSpannerHelper.isUsingEmulator; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; -import static org.junit.Assume.assumeFalse; import com.google.cloud.spanner.Database; import com.google.cloud.spanner.DatabaseAdminClient; @@ -36,7 +36,6 @@ import com.google.cloud.spanner.SpannerExceptionFactory; import com.google.cloud.spanner.Statement; import com.google.cloud.spanner.Value; -import com.google.cloud.spanner.testing.EmulatorSpannerHelper; import com.google.cloud.spanner.testing.RemoteSpannerHelper; import com.google.common.collect.ImmutableList; import com.google.protobuf.ListValue; @@ -53,7 +52,6 @@ import org.junit.Before; import org.junit.BeforeClass; import org.junit.ClassRule; -import org.junit.Ignore; import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; @@ -77,8 +75,6 @@ public class ITPgJsonbTest { @BeforeClass public static void beforeClass() throws Exception { - assumeFalse( - "PgJsonb is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); testHelper = env.getTestHelper(); databaseAdminClient = testHelper.getClient().getDatabaseAdminClient(); databasesToDrop = new ArrayList<>(); @@ -97,7 +93,7 @@ public static void beforeClass() throws Exception { } @AfterClass - public static void afterClass() throws Exception { + public static void afterClass() { if (databasesToDrop != null) { for (DatabaseId id : databasesToDrop) { try { @@ -170,11 +166,19 @@ public void testPgJsonbInSecondaryIndex() { SpannerException spannerException = SpannerExceptionFactory.asSpannerException(executionException.getCause()); assertEquals(ErrorCode.FAILED_PRECONDITION, spannerException.getErrorCode()); - assertTrue( - spannerException.getMessage(), - spannerException - .getMessage() - .contains("Index idx_jsonb is defined on a column of unsupported type PG.JSONB.")); + if (isUsingEmulator()) { + assertTrue( + spannerException.getMessage(), + spannerException + .getMessage() + .contains("Cannot reference PG.JSONB col1 in the creation of index idx_jsonb.")); + } else { + assertTrue( + spannerException.getMessage(), + spannerException + .getMessage() + .contains("Index idx_jsonb is defined on a column of unsupported type PG.JSONB.")); + } } private static final String JSON_VALUE_1 = "{\"color\":\"red\",\"value\":\"#f00\"}"; @@ -189,8 +193,6 @@ public void testPgJsonbInSecondaryIndex() { @Test public void testLiteralPgJsonb() { - assumeFalse( - "PgJsonb is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); databaseClient .readWriteTransaction() .run( @@ -223,8 +225,6 @@ public void testLiteralPgJsonb() { @Test public void testPgJsonbParameter() { - assumeFalse( - "PgJsonb is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); databaseClient .readWriteTransaction() .run( @@ -275,12 +275,8 @@ private ListValue getJsonListValue(List jsonList) { .build(); } - @Ignore("Untyped jsonb parameters are not yet supported") @Test public void testPgJsonbUntypedParameter() { - assumeFalse( - "PgJsonb is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); - // Verify that we can use Jsonb as an untyped parameter. This is especially important for // PGAdapter and the JDBC driver, as these will often use untyped parameters. databaseClient @@ -362,8 +358,6 @@ public void testPgJsonbUntypedParameter() { @Test public void testMutationsWithPgJsonbAsString() { - assumeFalse( - "PgJsonb is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); databaseClient .readWriteTransaction() .run( @@ -418,8 +412,6 @@ public void testMutationsWithPgJsonbAsString() { @Test public void testMutationsWithPgJsonbAsValue() { - assumeFalse( - "PgJsonb is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); databaseClient .readWriteTransaction() .run( diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITPgNumericTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITPgNumericTest.java index bacb4718da0..76025b07175 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITPgNumericTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITPgNumericTest.java @@ -18,7 +18,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.junit.Assume.assumeFalse; import com.google.cloud.spanner.Database; import com.google.cloud.spanner.DatabaseAdminClient; @@ -31,7 +30,6 @@ import com.google.cloud.spanner.ResultSet; import com.google.cloud.spanner.Statement; import com.google.cloud.spanner.Value; -import com.google.cloud.spanner.testing.EmulatorSpannerHelper; import com.google.cloud.spanner.testing.RemoteSpannerHelper; import com.google.common.collect.ImmutableList; import java.math.BigDecimal; @@ -67,8 +65,6 @@ public class ITPgNumericTest { @BeforeClass public static void beforeClass() throws Exception { - assumeFalse( - "PgNumeric is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); testHelper = env.getTestHelper(); databaseAdminClient = testHelper.getClient().getDatabaseAdminClient(); databasesToDrop = new ArrayList<>(); @@ -116,8 +112,6 @@ public void setUp() throws Exception { @Test public void testLiteralPgNumeric() { - assumeFalse( - "PgNumeric is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); databaseClient .readWriteTransaction() .run( @@ -134,7 +128,9 @@ public void testLiteralPgNumeric() { }); try (ResultSet resultSet = - databaseClient.singleUse().executeQuery(Statement.of("SELECT * FROM " + tableName))) { + databaseClient + .singleUse() + .executeQuery(Statement.of("SELECT * FROM " + tableName + " ORDER BY id"))) { resultSet.next(); assertEquals("1.23", resultSet.getString("col1")); @@ -151,8 +147,6 @@ public void testLiteralPgNumeric() { @Test public void testParameterizedWithPgNumericAsValue() { - assumeFalse( - "PgNumeric is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); databaseClient .readWriteTransaction() .run( @@ -176,7 +170,9 @@ public void testParameterizedWithPgNumericAsValue() { }); try (ResultSet resultSet = - databaseClient.singleUse().executeQuery(Statement.of("SELECT * FROM " + tableName))) { + databaseClient + .singleUse() + .executeQuery(Statement.of("SELECT * FROM " + tableName + " ORDER BY id"))) { resultSet.next(); assertEquals("1.23", resultSet.getString("col1")); @@ -193,8 +189,6 @@ public void testParameterizedWithPgNumericAsValue() { @Test public void testParameterizedWithPgNumericAsDouble() { - assumeFalse( - "PgNumeric is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); databaseClient .readWriteTransaction() .run( @@ -218,7 +212,9 @@ public void testParameterizedWithPgNumericAsDouble() { }); try (ResultSet resultSet = - databaseClient.singleUse().executeQuery(Statement.of("SELECT * FROM " + tableName))) { + databaseClient + .singleUse() + .executeQuery(Statement.of("SELECT * FROM " + tableName + " ORDER BY id"))) { resultSet.next(); assertEquals("1.23", resultSet.getString("col1")); @@ -235,8 +231,6 @@ public void testParameterizedWithPgNumericAsDouble() { @Test public void testParameterizedWithPgNumericAsInt() { - assumeFalse( - "PgNumeric is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); databaseClient .readWriteTransaction() .run( @@ -260,8 +254,6 @@ public void testParameterizedWithPgNumericAsInt() { @Test public void testParameterizedWithPgNumericAsLong() { - assumeFalse( - "PgNumeric is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); databaseClient .readWriteTransaction() .run( @@ -285,8 +277,6 @@ public void testParameterizedWithPgNumericAsLong() { @Test public void testMutationsWithPgNumericAsString() { - assumeFalse( - "PgNumeric is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); databaseClient .readWriteTransaction() .run( @@ -315,7 +305,9 @@ public void testMutationsWithPgNumericAsString() { }); try (ResultSet resultSet = - databaseClient.singleUse().executeQuery(Statement.of("SELECT * FROM " + tableName))) { + databaseClient + .singleUse() + .executeQuery(Statement.of("SELECT * FROM " + tableName + " ORDER BY id"))) { resultSet.next(); assertEquals("1.23", resultSet.getString("col1")); @@ -332,8 +324,6 @@ public void testMutationsWithPgNumericAsString() { @Test public void testMutationsWithPgNumericAsInt() { - assumeFalse( - "PgNumeric is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); databaseClient .readWriteTransaction() .run( @@ -360,8 +350,6 @@ public void testMutationsWithPgNumericAsInt() { @Test public void testMutationsWithPgNumericAsLong() { - assumeFalse( - "PgNumeric is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); databaseClient .readWriteTransaction() .run( @@ -388,8 +376,6 @@ public void testMutationsWithPgNumericAsLong() { @Test public void testMutationsWithPgNumericAsBigDecimal() { - assumeFalse( - "PgNumeric is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); databaseClient .readWriteTransaction() .run( @@ -412,7 +398,9 @@ public void testMutationsWithPgNumericAsBigDecimal() { }); try (ResultSet resultSet = - databaseClient.singleUse().executeQuery(Statement.of("SELECT * FROM " + tableName))) { + databaseClient + .singleUse() + .executeQuery(Statement.of("SELECT * FROM " + tableName + " ORDER BY id"))) { resultSet.next(); assertEquals("1.23", resultSet.getString("col1")); @@ -425,8 +413,6 @@ public void testMutationsWithPgNumericAsBigDecimal() { @Test public void testMutationsWithPgNumericAsValue() { - assumeFalse( - "PgNumeric is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); databaseClient .readWriteTransaction() .run( @@ -455,7 +441,9 @@ public void testMutationsWithPgNumericAsValue() { }); try (ResultSet resultSet = - databaseClient.singleUse().executeQuery(Statement.of("SELECT * FROM " + tableName))) { + databaseClient + .singleUse() + .executeQuery(Statement.of("SELECT * FROM " + tableName + " ORDER BY id"))) { resultSet.next(); assertEquals("1.23", resultSet.getString("col1"));