This is an automated email from the ASF dual-hosted git repository. leonard pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/flink.git
commit 722e638924bb2c925af6fc9e3cf17cf0d3046538 Author: Jiabao Sun <[email protected]> AuthorDate: Tue Sep 12 14:39:33 2023 +0800 [FLINK-33023][table-planner][JUnit5 Migration] Module: flink-table-planner/planner/utils (TableTestBase) --- .../planner/utils/InternalConfigOptionsTest.java | 28 +++--- .../flink/table/planner/utils/TableTestBase.scala | 100 ++++++++++++--------- 2 files changed, 71 insertions(+), 57 deletions(-) diff --git a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/utils/InternalConfigOptionsTest.java b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/utils/InternalConfigOptionsTest.java index 8d1c182d3ea..bb30acf1228 100644 --- a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/utils/InternalConfigOptionsTest.java +++ b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/utils/InternalConfigOptionsTest.java @@ -24,12 +24,14 @@ import org.apache.flink.table.api.TableConfig; import org.apache.flink.table.api.TableEnvironment; import org.apache.flink.table.planner.delegation.PlannerBase; import org.apache.flink.table.planner.plan.nodes.exec.ExecNodeGraph; +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.apache.calcite.rel.RelNode; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.TestTemplate; +import org.junit.jupiter.api.extension.ExtendWith; import java.util.Arrays; import java.util.Collection; @@ -40,21 +42,21 @@ import static org.apache.flink.table.planner.utils.JavaScalaConversionUtil.toSca import static org.assertj.core.api.Assertions.assertThat; /** Tests for {@link InternalConfigOptions}. */ -@RunWith(Parameterized.class) -public class InternalConfigOptionsTest extends TableTestBase { +@ExtendWith(ParameterizedTestExtension.class) +class InternalConfigOptionsTest extends TableTestBase { private TableEnvironment tEnv; private PlannerBase planner; - @Parameterized.Parameters(name = "plannerMode = {0}") - public static Collection<String> parameters() { + @Parameters(name = "plannerMode = {0}") + private static Collection<String> parameters() { return Arrays.asList("STREAMING", "BATCH"); } - @Parameterized.Parameter public String plannerMode; + @Parameter private String plannerMode; - @Before - public void setUp() { + @BeforeEach + void setUp() { if (plannerMode.equals("STREAMING")) { StreamTableTestUtil util = streamTestUtil(TableConfig.getDefault()); tEnv = util.getTableEnv(); @@ -66,8 +68,8 @@ public class InternalConfigOptionsTest extends TableTestBase { } } - @Test - public void testTranslateExecNodeGraphWithInternalTemporalConf() { + @TestTemplate + void testTranslateExecNodeGraphWithInternalTemporalConf() { Table table = tEnv.sqlQuery("SELECT LOCALTIME, LOCALTIMESTAMP, CURRENT_TIME, CURRENT_TIMESTAMP"); RelNode relNode = planner.optimize(TableTestUtil.toRelNode(table)); diff --git a/flink-table/flink-table-planner/src/test/scala/org/apache/flink/table/planner/utils/TableTestBase.scala b/flink-table/flink-table-planner/src/test/scala/org/apache/flink/table/planner/utils/TableTestBase.scala index 7fc23d8281f..d8920bc62c0 100644 --- a/flink-table/flink-table-planner/src/test/scala/org/apache/flink/table/planner/utils/TableTestBase.scala +++ b/flink-table/flink-table-planner/src/test/scala/org/apache/flink/table/planner/utils/TableTestBase.scala @@ -22,7 +22,6 @@ import org.apache.flink.api.common.typeinfo.{AtomicType, TypeInformation} import org.apache.flink.api.java.typeutils.{PojoTypeInfo, RowTypeInfo, TupleTypeInfo} import org.apache.flink.api.scala.typeutils.CaseClassTypeInfo import org.apache.flink.configuration.BatchExecutionOptions -import org.apache.flink.core.testutils.FlinkMatchers.containsMessage import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.core.JsonParseException import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.databind.JsonNode import org.apache.flink.streaming.api.{environment, TimeCharacteristic} @@ -67,6 +66,7 @@ import org.apache.flink.table.sources.{StreamTableSource, TableSource} import org.apache.flink.table.types.logical.LogicalType import org.apache.flink.table.types.utils.TypeConversions import org.apache.flink.table.typeutils.FieldInfoUtils +import org.apache.flink.testutils.junit.extensions.parameterized.ParameterizedTestExtension import org.apache.flink.types.Row import org.apache.flink.util.{FlinkUserCodeClassLoaders, MutableURLClassLoader} import org.apache.flink.util.jackson.JacksonMapperFactory @@ -79,35 +79,27 @@ import org.apache.calcite.avatica.util.TimeUnit import org.apache.calcite.rel.RelNode import org.apache.calcite.sql.{SqlExplainLevel, SqlIntervalQualifier} import org.apache.calcite.sql.parser.SqlParserPos -import org.junit.Assert.{assertEquals, assertThat, assertTrue, fail} -import org.junit.Rule -import org.junit.rules.{ExpectedException, TemporaryFolder, TestName} +import org.assertj.core.api.Assertions.{assertThat, assertThatExceptionOfType, fail} +import org.junit.jupiter.api.Assertions.{assertEquals, assertTrue} +import org.junit.jupiter.api.extension.{BeforeEachCallback, ExtendWith, ExtensionContext, RegisterExtension} +import org.junit.jupiter.api.io.TempDir +import org.junit.platform.commons.support.AnnotationSupport import java.io.{File, IOException} import java.net.URL -import java.nio.file.{Files, Paths} +import java.nio.file.{Files, Path, Paths} import java.time.Duration import java.util.Collections /** Test base for testing Table API / SQL plans. */ abstract class TableTestBase { - // used for accurate exception information checking. - val expectedException: ExpectedException = ExpectedException.none() - // used for get test case method name + @RegisterExtension val testName: TestName = new TestName - val _tempFolder = new TemporaryFolder - - @Rule - def tempFolder: TemporaryFolder = _tempFolder - - @Rule - def thrown: ExpectedException = expectedException - - @Rule - def name: TestName = testName + @TempDir + var tempFolder: Path = _ def streamTestUtil(tableConfig: TableConfig = TableConfig.getDefault): StreamTableTestUtil = StreamTableTestUtil(this, tableConfig = tableConfig) @@ -127,9 +119,36 @@ abstract class TableTestBase { val expectedString = FlinkRelOptUtil.toString(TableTestUtil.toRelNode(expected)) val actualString = FlinkRelOptUtil.toString(TableTestUtil.toRelNode(actual)) assertEquals( - "Logical plans do not match", LogicalPlanFormatUtils.formatTempTableId(expectedString), - LogicalPlanFormatUtils.formatTempTableId(actualString)) + LogicalPlanFormatUtils.formatTempTableId(actualString), + "Logical plans do not match") + } +} + +class TestName extends BeforeEachCallback { + + private val bracketsRegex = """\[.*\]""".r + + private var methodName: String = _ + + def getMethodName: String = methodName + + override def beforeEach(context: ExtensionContext): Unit = { + if (hasParameterizedTestExtension(context)) { + val displayName = context.getDisplayName match { + case bracketsRegex(_*) => context.getDisplayName + case _ => s"[${context.getDisplayName}]" + } + methodName = s"${context.getTestMethod.get().getName}$displayName" + } else { + methodName = context.getTestMethod.get().getName + } + } + + private def hasParameterizedTestExtension(context: ExtensionContext): Boolean = { + Option(AnnotationSupport.findAnnotation(context.getTestClass, classOf[ExtendWith]).orElse(null)) + .map(_.value) + .exists(_.contains(classOf[ParameterizedTestExtension])) } } @@ -622,7 +641,7 @@ abstract class TableTestUtilBase(test: TableTestBase, isStreamingMode: Boolean) val optimizedPlan = getOptimizedRelPlan(Array(optimizedRel), Array.empty, withRowType = false) val result = notExpected.forall(!optimizedPlan.contains(_)) val message = s"\nactual plan:\n$optimizedPlan\nnot expected:\n${notExpected.mkString(", ")}" - assertTrue(message, result) + assertTrue(result, message) } /** @@ -752,14 +771,9 @@ abstract class TableTestUtilBase(test: TableTestBase, isStreamingMode: Boolean) sql: String, message: String, clazz: Class[_ <: Throwable] = classOf[ValidationException]): Unit = { - try { - verifyExplain(sql) - fail(s"Expected a $clazz, but no exception is thrown.") - } catch { - case e: Throwable => - assertTrue(clazz.isAssignableFrom(e.getClass)) - assertThat(e, containsMessage(message)) - } + assertThatExceptionOfType(clazz) + .isThrownBy(() => verifyExplain(sql)) + .withMessageContaining(message) } /** @@ -841,22 +855,20 @@ abstract class TableTestUtilBase(test: TableTestBase, isStreamingMode: Boolean) fail(s"$testMethodFileName regenerated.") } else { val expected = String.join("\n", Files.readAllLines(path)) - assertEquals( - TableTestUtil.replaceExecNodeId(TableTestUtil.getPrettyJson(expected)), - TableTestUtil.replaceExecNodeId(TableTestUtil.getPrettyJson(jsonPlanWithoutFlinkVersion)) - ) + assertThat( + TableTestUtil.replaceExecNodeId(TableTestUtil.getPrettyJson(jsonPlanWithoutFlinkVersion))) + .isEqualTo(TableTestUtil.replaceExecNodeId(TableTestUtil.getPrettyJson(expected))) // check json serde round trip as well val expectedWithFlinkVersion = JsonTestUtils.writeToString( JsonTestUtils .setFlinkVersion(JsonTestUtils.readFromString(expected), FlinkVersion.current())) - assertEquals( - TableTestUtil.replaceExecNodeId(TableTestUtil.getFormattedJson(expectedWithFlinkVersion)), + assertThat( TableTestUtil.replaceExecNodeId( - TableTestUtil.getFormattedJson( - getPlanner - .loadPlan(PlanReference.fromJsonString(expectedWithFlinkVersion)) - .asJsonString())) - ) + TableTestUtil.getFormattedJson(getPlanner + .loadPlan(PlanReference.fromJsonString(expectedWithFlinkVersion)) + .asJsonString()))) + .isEqualTo( + TableTestUtil.replaceExecNodeId(TableTestUtil.getFormattedJson(expectedWithFlinkVersion))) } } @@ -1127,16 +1139,16 @@ abstract class TableTestUtilBase(test: TableTestBase, isStreamingMode: Boolean) def assertEqualsOrExpand(tag: String, actual: String, expand: Boolean = true): Unit = { val expected = s"$${$tag}" if (!expand) { - diffRepository.assertEquals(test.name.getMethodName, tag, expected, actual) + diffRepository.assertEquals(test.testName.getMethodName, tag, expected, actual) return } - val expanded = diffRepository.expand(test.name.getMethodName, tag, expected) + val expanded = diffRepository.expand(test.testName.getMethodName, tag, expected) if (expanded != null && !expanded.equals(expected)) { // expected does exist, check result - diffRepository.assertEquals(test.name.getMethodName, tag, expected, actual) + diffRepository.assertEquals(test.testName.getMethodName, tag, expected, actual) } else { // expected does not exist, update - diffRepository.expand(test.name.getMethodName, tag, actual) + diffRepository.expand(test.testName.getMethodName, tag, actual) } } }
