This is an automated email from the ASF dual-hosted git repository. martijnvisser pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/flink-connector-jdbc.git
commit 0246064b1262d6e8889dfdc96a1ea1e6a6a640aa Author: Joao Boto <b...@boto.pro> AuthorDate: Mon Jan 30 10:30:08 2023 +0100 [FLINK-30790] Refactor JdbcDataTypeTest create tests by dialect --- .../flink/connector/jdbc/JdbcDataTypeTest.java | 230 --------------------- .../jdbc/dialect/JdbcDialectTypeTest.java | 135 ++++++++++++ .../jdbc/dialect/mysql/MySqlDialectTypeTest.java | 65 ++++++ .../jdbc/dialect/oracle/OracleDialectTypeTest.java | 60 ++++++ .../dialect/postgres/PostgresDialectTypeTest.java | 65 ++++++ 5 files changed, 325 insertions(+), 230 deletions(-) diff --git a/flink-connector-jdbc/src/test/java/org/apache/flink/connector/jdbc/JdbcDataTypeTest.java b/flink-connector-jdbc/src/test/java/org/apache/flink/connector/jdbc/JdbcDataTypeTest.java deleted file mode 100644 index 75be19a..0000000 --- a/flink-connector-jdbc/src/test/java/org/apache/flink/connector/jdbc/JdbcDataTypeTest.java +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.flink.connector.jdbc; - -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; -import org.apache.flink.testutils.junit.extensions.parameterized.Parameter; -import org.apache.flink.testutils.junit.extensions.parameterized.ParameterizedTestExtension; -import org.apache.flink.testutils.junit.extensions.parameterized.Parameters; - -import org.junit.jupiter.api.TestTemplate; -import org.junit.jupiter.api.extension.ExtendWith; - -import javax.annotation.Nullable; - -import java.util.Arrays; -import java.util.List; - -import static org.apache.flink.core.testutils.FlinkAssertions.anyCauseMatches; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -/** Tests for all DataTypes and Dialects of JDBC connector. */ -@ExtendWith(ParameterizedTestExtension.class) -public class JdbcDataTypeTest { - - private static final String DDL_FORMAT = - "CREATE TABLE T(\n" - + "f0 %s\n" - + ") WITH (\n" - + " 'connector'='jdbc',\n" - + " 'url'='" - + "jdbc:%s:memory:test" - + "',\n" - + " 'table-name'='myTable'\n" - + ")"; - - @Parameters(name = "{0}") - public static List<TestItem> testData() { - return Arrays.asList( - createTestItem("derby", "CHAR"), - createTestItem("derby", "VARCHAR"), - createTestItem("derby", "BOOLEAN"), - createTestItem("derby", "TINYINT"), - createTestItem("derby", "SMALLINT"), - createTestItem("derby", "INTEGER"), - createTestItem("derby", "BIGINT"), - createTestItem("derby", "FLOAT"), - createTestItem("derby", "DOUBLE"), - createTestItem("derby", "DECIMAL(10, 4)"), - createTestItem("derby", "DATE"), - createTestItem("derby", "TIME"), - createTestItem("derby", "TIMESTAMP(3)"), - createTestItem("derby", "TIMESTAMP WITHOUT TIME ZONE"), - createTestItem("derby", "TIMESTAMP(9) WITHOUT TIME ZONE"), - createTestItem("derby", "VARBINARY"), - createTestItem("mysql", "CHAR"), - createTestItem("mysql", "VARCHAR"), - createTestItem("mysql", "BOOLEAN"), - createTestItem("mysql", "TINYINT"), - createTestItem("mysql", "SMALLINT"), - createTestItem("mysql", "INTEGER"), - createTestItem("mysql", "BIGINT"), - createTestItem("mysql", "FLOAT"), - createTestItem("mysql", "DOUBLE"), - createTestItem("mysql", "DECIMAL(10, 4)"), - createTestItem("mysql", "DECIMAL(38, 18)"), - createTestItem("mysql", "DATE"), - createTestItem("mysql", "TIME"), - createTestItem("mysql", "TIMESTAMP(3)"), - createTestItem("mysql", "TIMESTAMP WITHOUT TIME ZONE"), - createTestItem("mysql", "VARBINARY"), - createTestItem("postgresql", "CHAR"), - createTestItem("postgresql", "VARCHAR"), - createTestItem("postgresql", "BOOLEAN"), - createTestItem("postgresql", "TINYINT"), - createTestItem("postgresql", "SMALLINT"), - createTestItem("postgresql", "INTEGER"), - createTestItem("postgresql", "BIGINT"), - createTestItem("postgresql", "FLOAT"), - createTestItem("postgresql", "DOUBLE"), - createTestItem("postgresql", "DECIMAL(10, 4)"), - createTestItem("postgresql", "DECIMAL(38, 18)"), - createTestItem("postgresql", "DATE"), - createTestItem("postgresql", "TIME"), - createTestItem("postgresql", "TIMESTAMP(3)"), - createTestItem("postgresql", "TIMESTAMP WITHOUT TIME ZONE"), - createTestItem("postgresql", "VARBINARY"), - createTestItem("postgresql", "ARRAY<INTEGER>"), - createTestItem("oracle", "CHAR"), - createTestItem("oracle", "VARCHAR"), - createTestItem("oracle", "BOOLEAN"), - createTestItem("oracle", "TINYINT"), - createTestItem("oracle", "SMALLINT"), - createTestItem("oracle", "INTEGER"), - createTestItem("oracle", "BIGINT"), - createTestItem("oracle", "FLOAT"), - createTestItem("oracle", "DOUBLE"), - createTestItem("oracle", "DECIMAL(10, 4)"), - createTestItem("oracle", "DECIMAL(38, 18)"), - createTestItem("oracle", "DATE"), - createTestItem("oracle", "TIME"), - createTestItem("oracle", "TIMESTAMP(3)"), - createTestItem("oracle", "TIMESTAMP WITHOUT TIME ZONE"), - createTestItem("oracle", "VARBINARY"), - - // Unsupported types throws errors. - createTestItem( - "derby", "BINARY", "The Derby dialect doesn't support type: BINARY(1)."), - createTestItem( - "derby", - "VARBINARY(10)", - "The Derby dialect doesn't support type: VARBINARY(10)."), - createTestItem( - "derby", - "TIMESTAMP_LTZ(3)", - "The Derby dialect doesn't support type: TIMESTAMP_LTZ(3)."), - createTestItem( - "derby", - "DECIMAL(38, 18)", - "The precision of field 'f0' is out of the DECIMAL precision range [1, 31] supported by Derby dialect."), - createTestItem( - "mysql", "BINARY", "The MySQL dialect doesn't support type: BINARY(1)."), - createTestItem( - "mysql", - "VARBINARY(10)", - "The MySQL dialect doesn't support type: VARBINARY(10)."), - createTestItem( - "mysql", - "TIMESTAMP(9) WITHOUT TIME ZONE", - "The precision of field 'f0' is out of the TIMESTAMP precision range [0, 6] supported by MySQL dialect."), - createTestItem( - "mysql", - "TIMESTAMP_LTZ(3)", - "The MySQL dialect doesn't support type: TIMESTAMP_LTZ(3)."), - createTestItem( - "postgresql", - "BINARY", - "The PostgreSQL dialect doesn't support type: BINARY(1)."), - createTestItem( - "postgresql", - "VARBINARY(10)", - "The PostgreSQL dialect doesn't support type: VARBINARY(10)."), - createTestItem( - "postgresql", - "TIMESTAMP(9) WITHOUT TIME ZONE", - "The precision of field 'f0' is out of the TIMESTAMP precision range [1, 6] supported by PostgreSQL dialect."), - createTestItem( - "postgresql", "TIMESTAMP_LTZ(3)", "Unsupported type:TIMESTAMP_LTZ(3)"), - createTestItem( - "oracle", "BINARY", "The Oracle dialect doesn't support type: BINARY(1)."), - createTestItem( - "oracle", - "VARBINARY(10)", - "The Oracle dialect doesn't support type: VARBINARY(10).")); - } - - private static TestItem createTestItem(Object... args) { - assertThat(args).hasSizeGreaterThanOrEqualTo(2); - TestItem item = TestItem.fromDialectAndType((String) args[0], (String) args[1]); - if (args.length == 3) { - item.withExpectError((String) args[2]); - } - return item; - } - - @Parameter public TestItem testItem; - - @TestTemplate - void testDataTypeValidate() { - String sqlDDL = String.format(DDL_FORMAT, testItem.dataTypeExpr, testItem.dialect); - - StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); - StreamTableEnvironment tEnv = StreamTableEnvironment.create(env); - - tEnv.executeSql(sqlDDL); - - if (testItem.expectError != null) { - assertThatThrownBy(() -> tEnv.sqlQuery("SELECT * FROM T")) - .satisfies(anyCauseMatches(testItem.expectError)); - } else { - tEnv.sqlQuery("SELECT * FROM T"); - } - } - - // ~ Inner Class - private static class TestItem { - - private final String dialect; - - private final String dataTypeExpr; - - @Nullable private String expectError; - - private TestItem(String dialect, String dataTypeExpr) { - this.dialect = dialect; - this.dataTypeExpr = dataTypeExpr; - } - - static TestItem fromDialectAndType(String dialect, String dataTypeExpr) { - return new TestItem(dialect, dataTypeExpr); - } - - TestItem withExpectError(String expectError) { - this.expectError = expectError; - return this; - } - - @Override - public String toString() { - return String.format("Dialect: %s, DataType: %s", dialect, dataTypeExpr); - } - } -} diff --git a/flink-connector-jdbc/src/test/java/org/apache/flink/connector/jdbc/dialect/JdbcDialectTypeTest.java b/flink-connector-jdbc/src/test/java/org/apache/flink/connector/jdbc/dialect/JdbcDialectTypeTest.java new file mode 100644 index 0000000..de51b73 --- /dev/null +++ b/flink-connector-jdbc/src/test/java/org/apache/flink/connector/jdbc/dialect/JdbcDialectTypeTest.java @@ -0,0 +1,135 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.flink.connector.jdbc.dialect; + +import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; +import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; + +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import javax.annotation.Nullable; + +import java.util.Arrays; +import java.util.List; + +import static org.apache.flink.core.testutils.FlinkAssertions.anyCauseMatches; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +/** Tests for all DataTypes and Dialects of JDBC connector. */ +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public class JdbcDialectTypeTest { + + private static final String DDL_FORMAT = + "CREATE TABLE T (f0 %s)" + + " WITH (" + + " 'connector'='jdbc'," + + " 'url'='jdbc:%s:memory:test'," + + " 'table-name'='myTable'" + + ")"; + + protected String testDialect() { + return "derby"; + } + + protected List<TestItem> testData() { + return Arrays.asList( + createTestItem("CHAR"), + createTestItem("VARCHAR"), + createTestItem("BOOLEAN"), + createTestItem("TINYINT"), + createTestItem("SMALLINT"), + createTestItem("INTEGER"), + createTestItem("BIGINT"), + createTestItem("FLOAT"), + createTestItem("DOUBLE"), + createTestItem("DECIMAL(10, 4)"), + createTestItem("DATE"), + createTestItem("TIME"), + createTestItem("TIMESTAMP(3)"), + createTestItem("TIMESTAMP WITHOUT TIME ZONE"), + createTestItem("TIMESTAMP(9) WITHOUT TIME ZONE"), + createTestItem("VARBINARY"), + + // Not valid data + createTestItem("BINARY", "The Derby dialect doesn't support type: BINARY(1)."), + createTestItem( + "VARBINARY(10)", "The Derby dialect doesn't support type: VARBINARY(10)."), + createTestItem( + "TIMESTAMP_LTZ(3)", + "The Derby dialect doesn't support type: TIMESTAMP_LTZ(3)."), + createTestItem( + "DECIMAL(38, 18)", + "The precision of field 'f0' is out of the DECIMAL precision range [1, 31] supported by Derby dialect.")); + } + + protected TestItem createTestItem(String dataType) { + return TestItem.of(testDialect(), dataType); + } + + protected TestItem createTestItem(String dataType, String expectError) { + return TestItem.of(testDialect(), dataType, expectError); + } + + @ParameterizedTest + @MethodSource("testData") + void testDataTypeValidate(TestItem testItem) { + String sqlDDL = String.format(DDL_FORMAT, testItem.dataTypeExpr, testItem.dialect); + + StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); + StreamTableEnvironment tEnv = StreamTableEnvironment.create(env); + + tEnv.executeSql(sqlDDL); + + if (testItem.expectError != null) { + assertThatThrownBy(() -> tEnv.sqlQuery("SELECT * FROM T")) + .satisfies(anyCauseMatches(testItem.expectError)); + } else { + tEnv.sqlQuery("SELECT * FROM T"); + } + } + + // ~ Inner Class + /** Test item for parameterized test. */ + public static class TestItem { + private final String dialect; + private final String dataTypeExpr; + private final String expectError; + + private TestItem(String dialect, String dataTypeExpr, @Nullable String expectError) { + this.dialect = dialect; + this.dataTypeExpr = dataTypeExpr; + this.expectError = expectError; + } + + static TestItem of(String dialect, String dataTypeExpr) { + return new TestItem(dialect, dataTypeExpr, null); + } + + static TestItem of(String dialect, String dataTypeExpr, String expectError) { + return new TestItem(dialect, dataTypeExpr, expectError); + } + + @Override + public String toString() { + return String.format("Dialect: %s, DataType: %s", dialect, dataTypeExpr); + } + } +} diff --git a/flink-connector-jdbc/src/test/java/org/apache/flink/connector/jdbc/dialect/mysql/MySqlDialectTypeTest.java b/flink-connector-jdbc/src/test/java/org/apache/flink/connector/jdbc/dialect/mysql/MySqlDialectTypeTest.java new file mode 100644 index 0000000..816d0b4 --- /dev/null +++ b/flink-connector-jdbc/src/test/java/org/apache/flink/connector/jdbc/dialect/mysql/MySqlDialectTypeTest.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.flink.connector.jdbc.dialect.mysql; + +import org.apache.flink.connector.jdbc.dialect.JdbcDialectTypeTest; + +import java.util.Arrays; +import java.util.List; + +/** The MySql params for {@link JdbcDialectTypeTest}. */ +public class MySqlDialectTypeTest extends JdbcDialectTypeTest { + + @Override + protected String testDialect() { + return "mysql"; + } + + @Override + protected List<TestItem> testData() { + return Arrays.asList( + createTestItem("CHAR"), + createTestItem("VARCHAR"), + createTestItem("BOOLEAN"), + createTestItem("TINYINT"), + createTestItem("SMALLINT"), + createTestItem("INTEGER"), + createTestItem("BIGINT"), + createTestItem("FLOAT"), + createTestItem("DOUBLE"), + createTestItem("DECIMAL(10, 4)"), + createTestItem("DECIMAL(38, 18)"), + createTestItem("DATE"), + createTestItem("TIME"), + createTestItem("TIMESTAMP(3)"), + createTestItem("TIMESTAMP WITHOUT TIME ZONE"), + createTestItem("VARBINARY"), + + // Not valid data + createTestItem("BINARY", "The MySQL dialect doesn't support type: BINARY(1)."), + createTestItem( + "VARBINARY(10)", "The MySQL dialect doesn't support type: VARBINARY(10)."), + createTestItem( + "TIMESTAMP(9) WITHOUT TIME ZONE", + "The precision of field 'f0' is out of the TIMESTAMP precision range [0, 6] supported by MySQL dialect."), + createTestItem( + "TIMESTAMP_LTZ(3)", + "The MySQL dialect doesn't support type: TIMESTAMP_LTZ(3).")); + } +} diff --git a/flink-connector-jdbc/src/test/java/org/apache/flink/connector/jdbc/dialect/oracle/OracleDialectTypeTest.java b/flink-connector-jdbc/src/test/java/org/apache/flink/connector/jdbc/dialect/oracle/OracleDialectTypeTest.java new file mode 100644 index 0000000..3354212 --- /dev/null +++ b/flink-connector-jdbc/src/test/java/org/apache/flink/connector/jdbc/dialect/oracle/OracleDialectTypeTest.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.flink.connector.jdbc.dialect.oracle; + +import org.apache.flink.connector.jdbc.dialect.JdbcDialectTypeTest; + +import java.util.Arrays; +import java.util.List; + +/** The Oracle params for {@link JdbcDialectTypeTest}. */ +public class OracleDialectTypeTest extends JdbcDialectTypeTest { + + @Override + protected String testDialect() { + return "oracle"; + } + + @Override + protected List<TestItem> testData() { + return Arrays.asList( + createTestItem("CHAR"), + createTestItem("VARCHAR"), + createTestItem("BOOLEAN"), + createTestItem("TINYINT"), + createTestItem("SMALLINT"), + createTestItem("INTEGER"), + createTestItem("BIGINT"), + createTestItem("FLOAT"), + createTestItem("DOUBLE"), + createTestItem("DECIMAL(10, 4)"), + createTestItem("DECIMAL(38, 18)"), + createTestItem("DATE"), + createTestItem("TIME"), + createTestItem("TIMESTAMP(3)"), + createTestItem("TIMESTAMP WITHOUT TIME ZONE"), + createTestItem("VARBINARY"), + + // Not valid data + createTestItem("BINARY", "The Oracle dialect doesn't support type: BINARY(1)."), + createTestItem( + "VARBINARY(10)", + "The Oracle dialect doesn't support type: VARBINARY(10).")); + } +} diff --git a/flink-connector-jdbc/src/test/java/org/apache/flink/connector/jdbc/dialect/postgres/PostgresDialectTypeTest.java b/flink-connector-jdbc/src/test/java/org/apache/flink/connector/jdbc/dialect/postgres/PostgresDialectTypeTest.java new file mode 100644 index 0000000..91d968d --- /dev/null +++ b/flink-connector-jdbc/src/test/java/org/apache/flink/connector/jdbc/dialect/postgres/PostgresDialectTypeTest.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.flink.connector.jdbc.dialect.postgres; + +import org.apache.flink.connector.jdbc.dialect.JdbcDialectTypeTest; + +import java.util.Arrays; +import java.util.List; + +/** The PostgresSql params for {@link JdbcDialectTypeTest}. */ +public class PostgresDialectTypeTest extends JdbcDialectTypeTest { + + @Override + protected String testDialect() { + return "postgresql"; + } + + @Override + protected List<TestItem> testData() { + return Arrays.asList( + createTestItem("CHAR"), + createTestItem("VARCHAR"), + createTestItem("BOOLEAN"), + createTestItem("TINYINT"), + createTestItem("SMALLINT"), + createTestItem("INTEGER"), + createTestItem("BIGINT"), + createTestItem("FLOAT"), + createTestItem("DOUBLE"), + createTestItem("DECIMAL(10, 4)"), + createTestItem("DECIMAL(38, 18)"), + createTestItem("DATE"), + createTestItem("TIME"), + createTestItem("TIMESTAMP(3)"), + createTestItem("TIMESTAMP WITHOUT TIME ZONE"), + createTestItem("VARBINARY"), + createTestItem("ARRAY<INTEGER>"), + + // Not valid data + createTestItem("BINARY", "The PostgreSQL dialect doesn't support type: BINARY(1)."), + createTestItem( + "VARBINARY(10)", + "The PostgreSQL dialect doesn't support type: VARBINARY(10)."), + createTestItem( + "TIMESTAMP(9) WITHOUT TIME ZONE", + "The precision of field 'f0' is out of the TIMESTAMP precision range [1, 6] supported by PostgreSQL dialect."), + createTestItem("TIMESTAMP_LTZ(3)", "Unsupported type:TIMESTAMP_LTZ(3)")); + } +}