From ab4184dbe315e5cddfd781a92eff12e06c8eeebc Mon Sep 17 00:00:00 2001 From: hongdongdong Date: Thu, 13 Jan 2022 11:39:18 +0800 Subject: [PATCH] [KYUUBI #1740] Use testcontainers scalatest in trino module ### _Why are the changes needed?_ Use testcontainers scalatest instead testcontainers ### _How was this patch tested?_ - [X] Add some test cases that check the changes thoroughly including negative and positive cases if possible - [ ] Add screenshots for manual tests if appropriate - [X] [Run test](https://kyuubi.readthedocs.io/en/latest/develop_tools/testing.html#running-tests) locally before make a pull request Closes #1741 from hddong/use-testcontainers-scala-trino. Closes #1740 3a12747f [hongdongdong] [KYUUBI #1740] Use testcontainers scalatest in trino module Authored-by: hongdongdong Signed-off-by: Cheng Pan --- externals/kyuubi-trino-engine/pom.xml | 9 ++-- .../engine/trino/TrinoContextSuite.scala | 14 ++--- .../engine/trino/TrinoStatementSuite.scala | 53 ++++++++++--------- .../trino/WithTrinoContainerServer.scala | 27 +++++----- pom.xml | 10 ++-- 5 files changed, 58 insertions(+), 55 deletions(-) diff --git a/externals/kyuubi-trino-engine/pom.xml b/externals/kyuubi-trino-engine/pom.xml index 07042da5d..f4cafe035 100644 --- a/externals/kyuubi-trino-engine/pom.xml +++ b/externals/kyuubi-trino-engine/pom.xml @@ -65,15 +65,14 @@ - org.testcontainers - testcontainers + com.dimafeng + testcontainers-scala-scalatest_${scala.binary.version} test - - org.testcontainers - trino + com.dimafeng + testcontainers-scala-trino_${scala.binary.version} test diff --git a/externals/kyuubi-trino-engine/src/test/scala/org/apache/kyuubi/engine/trino/TrinoContextSuite.scala b/externals/kyuubi-trino-engine/src/test/scala/org/apache/kyuubi/engine/trino/TrinoContextSuite.scala index 5b195ba49..dd9f6c545 100644 --- a/externals/kyuubi-trino-engine/src/test/scala/org/apache/kyuubi/engine/trino/TrinoContextSuite.scala +++ b/externals/kyuubi-trino-engine/src/test/scala/org/apache/kyuubi/engine/trino/TrinoContextSuite.scala @@ -20,13 +20,13 @@ package org.apache.kyuubi.engine.trino class TrinoContextSuite extends WithTrinoContainerServer { test("set current schema") { - val trinoContext = TrinoContext(httpClient, session) + withTrinoContainer { trinoContext => + val trinoStatement = TrinoStatement(trinoContext, kyuubiConf, "select 1") + assert("tiny" === trinoStatement.getCurrentDatabase) - val trinoStatement = TrinoStatement(trinoContext, kyuubiConf, "select 1") - assert("tiny" === trinoStatement.getCurrentDatabase) - - trinoContext.setCurrentSchema("sf1") - val trinoStatement2 = TrinoStatement(trinoContext, kyuubiConf, "select 1") - assert("sf1" === trinoStatement2.getCurrentDatabase) + trinoContext.setCurrentSchema("sf1") + val trinoStatement2 = TrinoStatement(trinoContext, kyuubiConf, "select 1") + assert("sf1" === trinoStatement2.getCurrentDatabase) + } } } diff --git a/externals/kyuubi-trino-engine/src/test/scala/org/apache/kyuubi/engine/trino/TrinoStatementSuite.scala b/externals/kyuubi-trino-engine/src/test/scala/org/apache/kyuubi/engine/trino/TrinoStatementSuite.scala index 137b12657..1076a0cc1 100644 --- a/externals/kyuubi-trino-engine/src/test/scala/org/apache/kyuubi/engine/trino/TrinoStatementSuite.scala +++ b/externals/kyuubi-trino-engine/src/test/scala/org/apache/kyuubi/engine/trino/TrinoStatementSuite.scala @@ -22,42 +22,47 @@ import org.apache.kyuubi.KyuubiSQLException class TrinoStatementSuite extends WithTrinoContainerServer { test("test query") { - val trinoStatement = TrinoStatement(TrinoContext(httpClient, session), kyuubiConf, "select 1") - val schema = trinoStatement.getColumns - val resultSet = trinoStatement.execute() + withTrinoContainer { trinoContext => + val trinoStatement = TrinoStatement(trinoContext, kyuubiConf, "select 1") + val schema = trinoStatement.getColumns + val resultSet = trinoStatement.execute() - assert(schema.size === 1) - assert(schema(0).getName === "_col0") + assert(schema.size === 1) + assert(schema(0).getName === "_col0") - assert(resultSet.toIterator.hasNext) - assert(resultSet.toIterator.next() === List(1)) + assert(resultSet.toIterator.hasNext) + assert(resultSet.toIterator.next() === List(1)) - val trinoStatement2 = - TrinoStatement(TrinoContext(httpClient, session), kyuubiConf, "show schemas") - val schema2 = trinoStatement2.getColumns - val resultSet2 = trinoStatement2.execute() + val trinoStatement2 = TrinoStatement(trinoContext, kyuubiConf, "show schemas") + val schema2 = trinoStatement2.getColumns + val resultSet2 = trinoStatement2.execute() - assert(schema2.size === 1) - assert(resultSet2.toIterator.hasNext) + assert(schema2.size === 1) + assert(resultSet2.toIterator.hasNext) + } } test("test update session") { - val trinoStatement = TrinoStatement(TrinoContext(httpClient, session), kyuubiConf, "select 1") - val schema2 = trinoStatement.getColumns + withTrinoContainer { trinoContext => + val trinoStatement = TrinoStatement(trinoContext, kyuubiConf, "select 1") + val schema2 = trinoStatement.getColumns - assert(schema2.size === 1) - assert(schema2(0).getName === "_col0") - assert(this.schema === trinoStatement.getCurrentDatabase) + assert(schema2.size === 1) + assert(schema2(0).getName === "_col0") + assert(this.schema === trinoStatement.getCurrentDatabase) - val trinoStatement2 = TrinoStatement(TrinoContext(httpClient, session), kyuubiConf, "use sf1") - trinoStatement2.execute() + val trinoStatement2 = TrinoStatement(trinoContext, kyuubiConf, "use sf1") + trinoStatement2.execute() - assert("sf1" === trinoStatement2.getCurrentDatabase) + assert("sf1" === trinoStatement2.getCurrentDatabase) + } } test("test exception") { - val trinoStatement = TrinoStatement(TrinoContext(httpClient, session), kyuubiConf, "use kyuubi") - val e1 = intercept[KyuubiSQLException](trinoStatement.execute()) - assert(e1.getMessage.contains("Schema does not exist: tpch.kyuubi")) + withTrinoContainer { trinoContext => + val trinoStatement = TrinoStatement(trinoContext, kyuubiConf, "use kyuubi") + val e1 = intercept[KyuubiSQLException](trinoStatement.execute()) + assert(e1.getMessage.contains("Schema does not exist: tpch.kyuubi")) + } } } diff --git a/externals/kyuubi-trino-engine/src/test/scala/org/apache/kyuubi/engine/trino/WithTrinoContainerServer.scala b/externals/kyuubi-trino-engine/src/test/scala/org/apache/kyuubi/engine/trino/WithTrinoContainerServer.scala index 6b751549e..f72164b42 100644 --- a/externals/kyuubi-trino-engine/src/test/scala/org/apache/kyuubi/engine/trino/WithTrinoContainerServer.scala +++ b/externals/kyuubi-trino-engine/src/test/scala/org/apache/kyuubi/engine/trino/WithTrinoContainerServer.scala @@ -25,39 +25,38 @@ import java.util.concurrent.TimeUnit import scala.collection.JavaConverters._ +import com.dimafeng.testcontainers.TrinoContainer +import com.dimafeng.testcontainers.scalatest.TestContainerForAll import io.airlift.units.Duration import io.trino.client.ClientSelectedRole import io.trino.client.ClientSession import okhttp3.OkHttpClient -import org.testcontainers.containers.TrinoContainer +import org.testcontainers.utility.DockerImageName import org.apache.kyuubi.KyuubiFunSuite import org.apache.kyuubi.config.KyuubiConf -trait WithTrinoContainerServer extends KyuubiFunSuite { +trait WithTrinoContainerServer extends KyuubiFunSuite with TestContainerForAll { final val IMAGE_VERSION = 363 final val DOCKER_IMAGE_NAME = s"trinodb/trino:${IMAGE_VERSION}" - val trino = new TrinoContainer(DOCKER_IMAGE_NAME) + override val containerDef = TrinoContainer.Def(DockerImageName.parse(DOCKER_IMAGE_NAME)) + val kyuubiConf: KyuubiConf = KyuubiConf() protected val catalog = "tpch" protected val schema = "tiny" - override def beforeAll(): Unit = { - trino.start() - super.beforeAll() + def withTrinoContainer(tc: TrinoContext => Unit): Unit = { + withContainers { trinoContainer => + val connectionUrl = trinoContainer.jdbcUrl.replace("jdbc:trino", "http") + val trinoContext = TrinoContext(httpClient, session(connectionUrl)) + tc(trinoContext) + } } - override def afterAll(): Unit = { - trino.stop() - super.afterAll() - } - - lazy val connectionUrl = trino.getJdbcUrl.replace("jdbc:trino", "http") - - lazy val session = new ClientSession( + protected def session(connectionUrl: String): ClientSession = new ClientSession( URI.create(connectionUrl), "kyuubi_test", Optional.empty(), diff --git a/pom.xml b/pom.xml index 9c1a7488c..c3437c07d 100644 --- a/pom.xml +++ b/pom.xml @@ -137,7 +137,7 @@ false 2.1.11 4.1.3 - 1.16.2 + 0.39.12 363 3.4.14 @@ -455,14 +455,14 @@ - org.testcontainers - testcontainers + com.dimafeng + testcontainers-scala-scalatest_${scala.binary.version} ${testcontainers.version} - org.testcontainers - trino + com.dimafeng + testcontainers-scala-trino_${scala.binary.version} ${testcontainers.version}