diff --git a/core/trino-main/src/main/java/io/trino/testing/LocalQueryRunner.java b/core/trino-main/src/main/java/io/trino/testing/LocalQueryRunner.java index 28294a15f825..9c3d5faa16f7 100644 --- a/core/trino-main/src/main/java/io/trino/testing/LocalQueryRunner.java +++ b/core/trino-main/src/main/java/io/trino/testing/LocalQueryRunner.java @@ -258,6 +258,7 @@ public class LocalQueryRunner private final ColumnPropertyManager columnPropertyManager; private final TablePropertyManager tablePropertyManager; private final MaterializedViewPropertyManager materializedViewPropertyManager; + private final AnalyzePropertyManager analyzePropertyManager; private final PageFunctionCompiler pageFunctionCompiler; private final ExpressionCompiler expressionCompiler; @@ -361,7 +362,7 @@ private LocalQueryRunner( this.columnPropertyManager = new ColumnPropertyManager(); this.tablePropertyManager = new TablePropertyManager(); this.materializedViewPropertyManager = new MaterializedViewPropertyManager(); - AnalyzePropertyManager analyzePropertyManager = new AnalyzePropertyManager(); + this.analyzePropertyManager = new AnalyzePropertyManager(); TableProceduresPropertyManager tableProceduresPropertyManager = new TableProceduresPropertyManager(); this.statementAnalyzerFactory = new StatementAnalyzerFactory( @@ -562,6 +563,26 @@ public Metadata getMetadata() return plannerContext.getMetadata(); } + public TablePropertyManager getTablePropertyManager() + { + return tablePropertyManager; + } + + public ColumnPropertyManager getColumnPropertyManager() + { + return columnPropertyManager; + } + + public MaterializedViewPropertyManager getMaterializedViewPropertyManager() + { + return materializedViewPropertyManager; + } + + public AnalyzePropertyManager getAnalyzePropertyManager() + { + return analyzePropertyManager; + } + @Override public TypeManager getTypeManager() { diff --git a/core/trino-main/src/main/java/io/trino/testing/TestingSession.java b/core/trino-main/src/main/java/io/trino/testing/TestingSession.java index 9b952e6ceda1..b68a13946569 100644 --- a/core/trino-main/src/main/java/io/trino/testing/TestingSession.java +++ b/core/trino-main/src/main/java/io/trino/testing/TestingSession.java @@ -13,28 +13,16 @@ */ package io.trino.testing; -import com.google.common.collect.ImmutableSet; import io.trino.Session; import io.trino.Session.SessionBuilder; -import io.trino.connector.CatalogName; -import io.trino.connector.system.StaticSystemTablesProvider; -import io.trino.connector.system.SystemTablesMetadata; import io.trino.execution.QueryIdGenerator; -import io.trino.metadata.Catalog; -import io.trino.metadata.Catalog.SecurityManagement; import io.trino.metadata.SessionPropertyManager; -import io.trino.spi.connector.Connector; -import io.trino.spi.connector.ConnectorMetadata; -import io.trino.spi.connector.ConnectorTransactionHandle; import io.trino.spi.security.Identity; -import io.trino.spi.transaction.IsolationLevel; import io.trino.spi.type.TimeZoneKey; import io.trino.sql.SqlPath; import java.util.Optional; -import static io.trino.connector.CatalogName.createInformationSchemaCatalogName; -import static io.trino.connector.CatalogName.createSystemTablesCatalogName; import static java.util.Locale.ENGLISH; public final class TestingSession @@ -73,37 +61,4 @@ public static SessionBuilder testSessionBuilder(SessionPropertyManager sessionPr .setRemoteUserAddress("address") .setUserAgent("agent"); } - - public static Catalog createBogusTestingCatalog(String catalogName) - { - CatalogName catalog = new CatalogName(catalogName); - return new Catalog( - catalogName, - catalog, - "test", - createTestSessionConnector(), - SecurityManagement.CONNECTOR, - createInformationSchemaCatalogName(catalog), - createTestSessionConnector(), - createSystemTablesCatalogName(catalog), - createTestSessionConnector()); - } - - private static Connector createTestSessionConnector() - { - return new Connector() - { - @Override - public ConnectorTransactionHandle beginTransaction(IsolationLevel isolationLevel, boolean readOnly, boolean autoCommit) - { - return new ConnectorTransactionHandle() {}; - } - - @Override - public ConnectorMetadata getMetadata(ConnectorTransactionHandle transaction) - { - return new SystemTablesMetadata(new StaticSystemTablesProvider(ImmutableSet.of())); - } - }; - } } diff --git a/core/trino-main/src/test/java/io/trino/connector/MockConnector.java b/core/trino-main/src/test/java/io/trino/connector/MockConnector.java index bcff18b8d5ba..52bb02a4822f 100644 --- a/core/trino-main/src/test/java/io/trino/connector/MockConnector.java +++ b/core/trino-main/src/test/java/io/trino/connector/MockConnector.java @@ -16,6 +16,13 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import io.airlift.slice.Slice; +import io.trino.connector.MockConnectorFactory.ApplyAggregation; +import io.trino.connector.MockConnectorFactory.ApplyFilter; +import io.trino.connector.MockConnectorFactory.ApplyJoin; +import io.trino.connector.MockConnectorFactory.ApplyProjection; +import io.trino.connector.MockConnectorFactory.ApplyTableScanRedirect; +import io.trino.connector.MockConnectorFactory.ApplyTopN; +import io.trino.connector.MockConnectorFactory.ListRoleGrants; import io.trino.spi.HostAddress; import io.trino.spi.Page; import io.trino.spi.connector.AggregateFunction; @@ -28,6 +35,7 @@ import io.trino.spi.connector.ConnectorInsertTableHandle; import io.trino.spi.connector.ConnectorMaterializedViewDefinition; import io.trino.spi.connector.ConnectorMetadata; +import io.trino.spi.connector.ConnectorNodePartitioningProvider; import io.trino.spi.connector.ConnectorOutputMetadata; import io.trino.spi.connector.ConnectorOutputTableHandle; import io.trino.spi.connector.ConnectorPageSink; @@ -122,14 +130,17 @@ public class MockConnector private final BiFunction getTableProperties; private final Supplier> eventListeners; private final MockConnectorFactory.ListRoleGrants roleGrants; + private final Optional partitioningProvider; private final Optional accessControl; private final Function>> data; private final Set procedures; private final boolean allowMissingColumnsOnInsert; private final Supplier>> schemaProperties; private final Supplier>> tableProperties; + private final List> sessionProperties; MockConnector( + List> sessionProperties, Function> listSchemaNames, BiFunction> listTables, Optional>> streamTableColumns, @@ -140,18 +151,19 @@ public class MockConnector BiFunction> refreshMaterializedView, BiFunction getTableHandle, Function> getColumns, - MockConnectorFactory.ApplyProjection applyProjection, - MockConnectorFactory.ApplyAggregation applyAggregation, - MockConnectorFactory.ApplyJoin applyJoin, - MockConnectorFactory.ApplyTopN applyTopN, - MockConnectorFactory.ApplyFilter applyFilter, - MockConnectorFactory.ApplyTableScanRedirect applyTableScanRedirect, + ApplyProjection applyProjection, + ApplyAggregation applyAggregation, + ApplyJoin applyJoin, + ApplyTopN applyTopN, + ApplyFilter applyFilter, + ApplyTableScanRedirect applyTableScanRedirect, BiFunction> redirectTable, BiFunction> getInsertLayout, BiFunction> getNewTableLayout, BiFunction getTableProperties, Supplier> eventListeners, - MockConnectorFactory.ListRoleGrants roleGrants, + ListRoleGrants roleGrants, + Optional partitioningProvider, Optional accessControl, Function>> data, Set procedures, @@ -159,6 +171,7 @@ public class MockConnector Supplier>> schemaProperties, Supplier>> tableProperties) { + this.sessionProperties = ImmutableList.copyOf(requireNonNull(sessionProperties, "sessionProperties is null")); this.listSchemaNames = requireNonNull(listSchemaNames, "listSchemaNames is null"); this.listTables = requireNonNull(listTables, "listTables is null"); this.streamTableColumns = requireNonNull(streamTableColumns, "streamTableColumns is null"); @@ -181,6 +194,7 @@ public class MockConnector this.getTableProperties = requireNonNull(getTableProperties, "getTableProperties is null"); this.eventListeners = requireNonNull(eventListeners, "eventListeners is null"); this.roleGrants = requireNonNull(roleGrants, "roleGrants is null"); + this.partitioningProvider = requireNonNull(partitioningProvider, "partitioningProvider is null"); this.accessControl = requireNonNull(accessControl, "accessControl is null"); this.data = requireNonNull(data, "data is null"); this.procedures = requireNonNull(procedures, "procedures is null"); @@ -189,6 +203,12 @@ public class MockConnector this.tableProperties = requireNonNull(tableProperties, "tableProperties is null"); } + @Override + public List> getSessionProperties() + { + return sessionProperties; + } + @Override public ConnectorTransactionHandle beginTransaction(IsolationLevel isolationLevel, boolean readOnly, boolean autoCommit) { @@ -226,6 +246,12 @@ public ConnectorSplitSource getSplits(ConnectorTransactionHandle transaction, Co }; } + @Override + public ConnectorNodePartitioningProvider getNodePartitioningProvider() + { + return partitioningProvider.orElseThrow(UnsupportedOperationException::new); + } + @Override public Iterable getEventListeners() { diff --git a/core/trino-main/src/test/java/io/trino/connector/MockConnectorFactory.java b/core/trino-main/src/test/java/io/trino/connector/MockConnectorFactory.java index 60ab1c3cf0f4..fadc541689b0 100644 --- a/core/trino-main/src/test/java/io/trino/connector/MockConnectorFactory.java +++ b/core/trino-main/src/test/java/io/trino/connector/MockConnectorFactory.java @@ -26,6 +26,7 @@ import io.trino.spi.connector.ConnectorContext; import io.trino.spi.connector.ConnectorFactory; import io.trino.spi.connector.ConnectorMaterializedViewDefinition; +import io.trino.spi.connector.ConnectorNodePartitioningProvider; import io.trino.spi.connector.ConnectorSession; import io.trino.spi.connector.ConnectorTableHandle; import io.trino.spi.connector.ConnectorTableLayout; @@ -51,6 +52,7 @@ import io.trino.spi.security.ViewExpression; import io.trino.spi.session.PropertyMetadata; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; @@ -71,6 +73,7 @@ public class MockConnectorFactory implements ConnectorFactory { private final String name; + private final List> sessionProperty; private final Function> listSchemaNames; private final BiFunction> listTables; private final Optional>> streamTableColumns; @@ -97,6 +100,7 @@ public class MockConnectorFactory private final boolean allowMissingColumnsOnInsert; private final Supplier>> schemaProperties; private final Supplier>> tableProperties; + private final Optional partitioningProvider; // access control private final ListRoleGrants roleGrants; @@ -104,6 +108,7 @@ public class MockConnectorFactory private MockConnectorFactory( String name, + List> sessionProperty, Function> listSchemaNames, BiFunction> listTables, Optional>> streamTableColumns, @@ -129,11 +134,13 @@ private MockConnectorFactory( Set procedures, Supplier>> schemaProperties, Supplier>> tableProperties, + Optional partitioningProvider, ListRoleGrants roleGrants, Optional accessControl, boolean allowMissingColumnsOnInsert) { - this.name = (name != null) ? name : "mock"; + this.name = requireNonNull(name, "name is null"); + this.sessionProperty = ImmutableList.copyOf(requireNonNull(sessionProperty, "sessionProperty is null")); this.listSchemaNames = requireNonNull(listSchemaNames, "listSchemaNames is null"); this.listTables = requireNonNull(listTables, "listTables is null"); this.streamTableColumns = requireNonNull(streamTableColumns, "streamTableColumns is null"); @@ -157,6 +164,7 @@ private MockConnectorFactory( this.eventListeners = requireNonNull(eventListeners, "eventListeners is null"); this.schemaProperties = requireNonNull(schemaProperties, "schemaProperties is null"); this.tableProperties = requireNonNull(tableProperties, "tableProperties is null"); + this.partitioningProvider = requireNonNull(partitioningProvider, "partitioningProvider is null"); this.roleGrants = requireNonNull(roleGrants, "roleGrants is null"); this.accessControl = requireNonNull(accessControl, "accessControl is null"); this.data = requireNonNull(data, "data is null"); @@ -174,6 +182,7 @@ public String getName() public Connector create(String catalogName, Map config, ConnectorContext context) { return new MockConnector( + sessionProperty, listSchemaNames, listTables, streamTableColumns, @@ -196,6 +205,7 @@ public Connector create(String catalogName, Map config, Connecto getTableProperties, eventListeners, roleGrants, + partitioningProvider, accessControl, data, procedures, @@ -204,6 +214,16 @@ public Connector create(String catalogName, Map config, Connecto tableProperties); } + public static MockConnectorFactory create() + { + return builder().build(); + } + + public static MockConnectorFactory create(String name) + { + return builder().withName(name).build(); + } + public static Builder builder() { return new Builder(); @@ -274,7 +294,8 @@ public interface ListRoleGrants public static final class Builder { - private String name; + private String name = "mock"; + private final List> sessionProperties = new ArrayList<>(); private Function> listSchemaNames = defaultListSchemaNames(); private BiFunction> listTables = defaultListTables(); private Optional>> streamTableColumns = Optional.empty(); @@ -300,6 +321,7 @@ public static final class Builder private Set procedures = ImmutableSet.of(); private Supplier>> schemaProperties = ImmutableList::of; private Supplier>> tableProperties = ImmutableList::of; + private Optional partitioningProvider = Optional.empty(); // access control private boolean provideAccessControl; @@ -310,12 +332,28 @@ public static final class Builder private BiFunction columnMask = (tableName, columnName) -> null; private boolean allowMissingColumnsOnInsert; + private Builder() {} + public Builder withName(String name) { this.name = requireNonNull(name, "name is null"); return this; } + public Builder withSessionProperty(PropertyMetadata sessionProperty) + { + sessionProperties.add(sessionProperty); + return this; + } + + public Builder withSessionProperties(Iterable> sessionProperties) + { + for (PropertyMetadata sessionProperty : sessionProperties) { + withSessionProperty(sessionProperty); + } + return this; + } + public Builder withListSchemaNames(Function> listSchemaNames) { this.listSchemaNames = requireNonNull(listSchemaNames, "listSchemaNames is null"); @@ -458,9 +496,9 @@ public Builder withData(Function>> data) return this; } - public Builder withProcedures(Set procedures) + public Builder withProcedures(Iterable procedures) { - this.procedures = procedures; + this.procedures = ImmutableSet.copyOf(procedures); return this; } @@ -476,6 +514,12 @@ public Builder withTableProperties(Supplier>> tableProp return this; } + public Builder withPartitionProvider(ConnectorNodePartitioningProvider partitioningProvider) + { + this.partitioningProvider = Optional.of(partitioningProvider); + return this; + } + public Builder withListRoleGrants(ListRoleGrants roleGrants) { provideAccessControl = true; @@ -525,6 +569,7 @@ public MockConnectorFactory build() } return new MockConnectorFactory( name, + sessionProperties, listSchemaNames, listTables, streamTableColumns, @@ -550,6 +595,7 @@ public MockConnectorFactory build() procedures, schemaProperties, tableProperties, + partitioningProvider, roleGrants, accessControl, allowMissingColumnsOnInsert); diff --git a/core/trino-main/src/test/java/io/trino/connector/StaticConnectorFactory.java b/core/trino-main/src/test/java/io/trino/connector/StaticConnectorFactory.java new file mode 100644 index 000000000000..501889b744d8 --- /dev/null +++ b/core/trino-main/src/test/java/io/trino/connector/StaticConnectorFactory.java @@ -0,0 +1,47 @@ +/* + * Licensed 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 io.trino.connector; + +import io.trino.spi.connector.Connector; +import io.trino.spi.connector.ConnectorContext; +import io.trino.spi.connector.ConnectorFactory; + +import java.util.Map; + +import static java.util.Objects.requireNonNull; + +public class StaticConnectorFactory + implements ConnectorFactory +{ + private final String name; + private final Connector connector; + + public StaticConnectorFactory(String name, Connector connector) + { + this.name = requireNonNull(name, "name is null"); + this.connector = requireNonNull(connector, "connector is null"); + } + + @Override + public String getName() + { + return name; + } + + @Override + public Connector create(String catalogName, Map config, ConnectorContext context) + { + return connector; + } +} diff --git a/core/trino-main/src/test/java/io/trino/eventlistener/TestConnectorEventListener.java b/core/trino-main/src/test/java/io/trino/eventlistener/TestConnectorEventListener.java index 32b9e4482f10..2de220e59ad6 100644 --- a/core/trino-main/src/test/java/io/trino/eventlistener/TestConnectorEventListener.java +++ b/core/trino-main/src/test/java/io/trino/eventlistener/TestConnectorEventListener.java @@ -48,7 +48,7 @@ public void testConnectorWithEventListener() .build(); queryRunner.createCatalog( "event_listening", - new MockConnectorFactory.Builder() + MockConnectorFactory.builder() .withEventListener(listenerFactory) .build(), ImmutableMap.of()); diff --git a/core/trino-main/src/test/java/io/trino/execution/BaseDataDefinitionTaskTest.java b/core/trino-main/src/test/java/io/trino/execution/BaseDataDefinitionTaskTest.java index 60f1a7783c69..cf5241dcd2a6 100644 --- a/core/trino-main/src/test/java/io/trino/execution/BaseDataDefinitionTaskTest.java +++ b/core/trino-main/src/test/java/io/trino/execution/BaseDataDefinitionTaskTest.java @@ -17,10 +17,9 @@ import com.google.common.collect.ImmutableMap; import io.trino.Session; import io.trino.connector.CatalogName; +import io.trino.connector.MockConnectorFactory; import io.trino.execution.warnings.WarningCollector; import io.trino.metadata.AbstractMockMetadata; -import io.trino.metadata.Catalog; -import io.trino.metadata.CatalogManager; import io.trino.metadata.FunctionInvoker; import io.trino.metadata.MaterializedViewDefinition; import io.trino.metadata.MaterializedViewPropertyManager; @@ -51,8 +50,10 @@ import io.trino.sql.PlannerContext; import io.trino.sql.planner.TestingConnectorTransactionHandle; import io.trino.sql.tree.QualifiedName; +import io.trino.testing.LocalQueryRunner; import io.trino.testing.TestingMetadata.TestingTableHandle; import io.trino.transaction.TransactionManager; +import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -70,6 +71,7 @@ import static com.google.common.base.Verify.verifyNotNull; import static com.google.common.collect.ImmutableMap.toImmutableMap; import static com.google.common.util.concurrent.MoreExecutors.directExecutor; +import static io.trino.SessionTestUtils.TEST_SESSION; import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.StandardErrorCode.ALREADY_EXISTS; import static io.trino.spi.StandardErrorCode.DIVISION_BY_ZERO; @@ -77,9 +79,7 @@ import static io.trino.spi.session.PropertyMetadata.stringProperty; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.sql.planner.TestingPlannerContext.plannerContextBuilder; -import static io.trino.testing.TestingSession.createBogusTestingCatalog; import static io.trino.testing.TestingSession.testSessionBuilder; -import static io.trino.transaction.InMemoryTransactionManager.createTestTransactionManager; import static java.util.Objects.requireNonNull; @Test @@ -94,6 +94,7 @@ public abstract class BaseDataDefinitionTaskTest protected static final String MATERIALIZED_VIEW_PROPERTY_2_NAME = "property2"; protected static final String MATERIALIZED_VIEW_PROPERTY_2_DEFAULT_VALUE = "defaultProperty2Value"; + private LocalQueryRunner queryRunner; protected Session testSession; protected MockMetadata metadata; protected PlannerContext plannerContext; @@ -104,14 +105,14 @@ public abstract class BaseDataDefinitionTaskTest @BeforeMethod public void setUp() { - CatalogManager catalogManager = new CatalogManager(); - transactionManager = createTestTransactionManager(catalogManager); - Catalog testCatalog = createBogusTestingCatalog(CATALOG_NAME); - catalogManager.registerCatalog(testCatalog); + queryRunner = LocalQueryRunner.create(TEST_SESSION); + transactionManager = queryRunner.getTransactionManager(); + queryRunner.createCatalog(CATALOG_NAME, MockConnectorFactory.create("initial"), ImmutableMap.of()); + testSession = testSessionBuilder() .setTransactionId(transactionManager.beginTransaction(false)) .build(); - metadata = new MockMetadata(testCatalog.getConnectorCatalogName()); + metadata = new MockMetadata(new CatalogName(CATALOG_NAME)); plannerContext = plannerContextBuilder().withMetadata(metadata).build(); materializedViewPropertyManager = new MaterializedViewPropertyManager(); materializedViewPropertyManager.addProperties( @@ -122,6 +123,14 @@ public void setUp() queryStateMachine = stateMachine(transactionManager, createTestMetadataManager(), new AllowAllAccessControl(), testSession); } + @AfterMethod + public void tearDown() + { + if (queryRunner != null) { + queryRunner.close(); + } + } + protected static QualifiedObjectName qualifiedObjectName(String objectName) { return new QualifiedObjectName(CATALOG_NAME, SCHEMA, objectName); diff --git a/core/trino-main/src/test/java/io/trino/execution/TestCallTask.java b/core/trino-main/src/test/java/io/trino/execution/TestCallTask.java index e8aae7dc4ba9..4392f8e09811 100644 --- a/core/trino-main/src/test/java/io/trino/execution/TestCallTask.java +++ b/core/trino-main/src/test/java/io/trino/execution/TestCallTask.java @@ -15,11 +15,10 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import io.trino.FeaturesConfig; import io.trino.Session; import io.trino.connector.CatalogName; +import io.trino.connector.MockConnectorFactory; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.CatalogManager; import io.trino.metadata.MetadataManager; import io.trino.metadata.ProcedureRegistry; import io.trino.plugin.base.security.AllowAllSystemAccessControl; @@ -34,6 +33,7 @@ import io.trino.sql.PlannerContext; import io.trino.sql.tree.Call; import io.trino.sql.tree.QualifiedName; +import io.trino.testing.LocalQueryRunner; import io.trino.testing.TestingAccessControlManager; import io.trino.transaction.TransactionManager; import org.testng.annotations.AfterClass; @@ -48,15 +48,13 @@ import java.util.function.Function; import static io.airlift.concurrent.Threads.daemonThreadsNamed; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; +import static io.trino.SessionTestUtils.TEST_SESSION; import static io.trino.spi.block.MethodHandleUtil.methodHandle; import static io.trino.sql.planner.TestingPlannerContext.plannerContextBuilder; import static io.trino.testing.TestingAccessControlManager.TestingPrivilegeType.INSERT_TABLE; import static io.trino.testing.TestingAccessControlManager.privilege; import static io.trino.testing.TestingEventListenerManager.emptyEventListenerManager; -import static io.trino.testing.TestingSession.createBogusTestingCatalog; import static io.trino.testing.TestingSession.testSessionBuilder; -import static io.trino.transaction.InMemoryTransactionManager.createTestTransactionManager; import static java.util.concurrent.Executors.newCachedThreadPool; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -67,16 +65,22 @@ public class TestCallTask private ExecutorService executor; private static boolean invoked; + private LocalQueryRunner queryRunner; @BeforeClass public void init() { + queryRunner = LocalQueryRunner.builder(TEST_SESSION).build(); + queryRunner.createCatalog("test", MockConnectorFactory.create(), ImmutableMap.of()); executor = newCachedThreadPool(daemonThreadsNamed("call-task-test-%s")); } @AfterClass(alwaysRun = true) public void close() { + if (queryRunner != null) { + queryRunner.close(); + } executor.shutdownNow(); executor = null; } @@ -123,8 +127,8 @@ public void testExecuteNoPermissionOnInsert() private void executeCallTask(MethodHandle methodHandle, Function accessControlProvider) { - TransactionManager transactionManager = createTransactionManager(); - MetadataManager metadata = createTestMetadataManager(transactionManager, new FeaturesConfig()); + TransactionManager transactionManager = queryRunner.getTransactionManager(); + MetadataManager metadata = (MetadataManager) queryRunner.getMetadata(); ProcedureRegistry procedureRegistry = createProcedureRegistry( new Procedure( "test", @@ -142,13 +146,6 @@ private void executeCallTask(MethodHandle methodHandle, Function ImmutableList.>builder() + .add(stringProperty("foo", "test materialized view property", DEFAULT_MATERIALIZED_VIEW_FOO_PROPERTY_VALUE, false)) + .add(integerProperty("bar", "test materialized view property", DEFAULT_MATERIALIZED_VIEW_BAR_PROPERTY_VALUE, false)) + .build()) + .build(), + ImmutableMap.of()); + + materializedViewPropertyManager = queryRunner.getMaterializedViewPropertyManager(); + testSession = testSessionBuilder() .setTransactionId(transactionManager.beginTransaction(false)) .build(); - metadata = new MockMetadata(testCatalog.getConnectorCatalogName()); + metadata = new MockMetadata(new CatalogName(CATALOG_NAME)); plannerContext = plannerContextBuilder().withMetadata(metadata).build(); - parser = new SqlParser(); + parser = queryRunner.getSqlParser(); analyzerFactory = new AnalyzerFactory(createTestingStatementAnalyzerFactory(plannerContext, new AllowAllAccessControl(), new TablePropertyManager(), new AnalyzePropertyManager()), new StatementRewrite(ImmutableSet.of())); queryStateMachine = stateMachine(transactionManager, createTestMetadataManager(), new AllowAllAccessControl()); } + @AfterMethod(alwaysRun = true) + public void tearDown() + { + if (queryRunner != null) { + queryRunner.close(); + } + } + @Test public void testCreateMaterializedViewIfNotExists() { diff --git a/core/trino-main/src/test/java/io/trino/execution/TestCreateTableTask.java b/core/trino-main/src/test/java/io/trino/execution/TestCreateTableTask.java index 89e815843cae..0d42724d72ef 100644 --- a/core/trino-main/src/test/java/io/trino/execution/TestCreateTableTask.java +++ b/core/trino-main/src/test/java/io/trino/execution/TestCreateTableTask.java @@ -15,14 +15,14 @@ package io.trino.execution; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import io.trino.FeaturesConfig; import io.trino.Session; import io.trino.connector.CatalogName; +import io.trino.connector.MockConnectorFactory; import io.trino.eventlistener.EventListenerConfig; import io.trino.eventlistener.EventListenerManager; import io.trino.metadata.AbstractMockMetadata; -import io.trino.metadata.Catalog; -import io.trino.metadata.CatalogManager; import io.trino.metadata.ColumnPropertyManager; import io.trino.metadata.QualifiedObjectName; import io.trino.metadata.TableHandle; @@ -46,9 +46,11 @@ import io.trino.sql.tree.QualifiedName; import io.trino.sql.tree.StringLiteral; import io.trino.sql.tree.TableElement; +import io.trino.testing.LocalQueryRunner; import io.trino.testing.TestingAccessControlManager; import io.trino.testing.TestingMetadata.TestingTableHandle; import io.trino.transaction.TransactionManager; +import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -60,6 +62,7 @@ import static com.google.common.collect.Sets.immutableEnumSet; import static io.airlift.concurrent.MoreFutures.getFutureValue; +import static io.trino.SessionTestUtils.TEST_SESSION; import static io.trino.spi.StandardErrorCode.ALREADY_EXISTS; import static io.trino.spi.StandardErrorCode.INVALID_TABLE_PROPERTY; import static io.trino.spi.StandardErrorCode.NOT_SUPPORTED; @@ -77,10 +80,8 @@ import static io.trino.testing.TestingAccessControlManager.TestingPrivilegeType.SELECT_COLUMN; import static io.trino.testing.TestingAccessControlManager.TestingPrivilegeType.SHOW_CREATE_TABLE; import static io.trino.testing.TestingAccessControlManager.privilege; -import static io.trino.testing.TestingSession.createBogusTestingCatalog; import static io.trino.testing.TestingSession.testSessionBuilder; import static io.trino.testing.assertions.TrinoExceptionAssert.assertTrinoExceptionThrownBy; -import static io.trino.transaction.InMemoryTransactionManager.createTestTransactionManager; import static java.util.Collections.emptyList; import static java.util.Collections.emptySet; import static java.util.Locale.ENGLISH; @@ -100,6 +101,7 @@ public class TestCreateTableTask List.of(new ColumnMetadata("a", SMALLINT), new ColumnMetadata("b", BIGINT)), Map.of("baz", "property_value")); + private LocalQueryRunner queryRunner; private Session testSession; private MockMetadata metadata; private PlannerContext plannerContext; @@ -110,25 +112,32 @@ public class TestCreateTableTask @BeforeMethod public void setUp() { - CatalogManager catalogManager = new CatalogManager(); - transactionManager = createTestTransactionManager(catalogManager); - tablePropertyManager = new TablePropertyManager(); - columnPropertyManager = new ColumnPropertyManager(); - Catalog testCatalog = createBogusTestingCatalog(CATALOG_NAME); - catalogManager.registerCatalog(testCatalog); - tablePropertyManager.addProperties( - testCatalog.getConnectorCatalogName(), - ImmutableList.of(stringProperty("baz", "test property", null, false))); - columnPropertyManager.addProperties(testCatalog.getConnectorCatalogName(), ImmutableList.of()); + queryRunner = LocalQueryRunner.create(TEST_SESSION); + transactionManager = queryRunner.getTransactionManager(); + queryRunner.createCatalog( + CATALOG_NAME, + MockConnectorFactory.builder() + .withTableProperties(() -> ImmutableList.of(stringProperty("baz", "test property", null, false))) + .build(), + ImmutableMap.of()); + + tablePropertyManager = queryRunner.getTablePropertyManager(); + columnPropertyManager = queryRunner.getColumnPropertyManager(); testSession = testSessionBuilder() .setTransactionId(transactionManager.beginTransaction(false)) .build(); - metadata = new MockMetadata( - testCatalog.getConnectorCatalogName(), - emptySet()); + metadata = new MockMetadata(new CatalogName(CATALOG_NAME), emptySet()); plannerContext = plannerContextBuilder().withMetadata(metadata).build(); } + @AfterMethod(alwaysRun = true) + public void tearDown() + { + if (queryRunner != null) { + queryRunner.close(); + } + } + @Test public void testCreateTableNotExistsTrue() { diff --git a/core/trino-main/src/test/java/io/trino/execution/TestResetSessionTask.java b/core/trino-main/src/test/java/io/trino/execution/TestResetSessionTask.java index 687431d39b21..bfba3f03f5b4 100644 --- a/core/trino-main/src/test/java/io/trino/execution/TestResetSessionTask.java +++ b/core/trino-main/src/test/java/io/trino/execution/TestResetSessionTask.java @@ -14,19 +14,18 @@ package io.trino.execution; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import io.trino.FeaturesConfig; import io.trino.Session; +import io.trino.connector.MockConnectorFactory; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Catalog; -import io.trino.metadata.CatalogManager; import io.trino.metadata.Metadata; import io.trino.metadata.SessionPropertyManager; import io.trino.security.AccessControl; -import io.trino.security.AllowAllAccessControl; import io.trino.spi.resourcegroups.ResourceGroupId; import io.trino.sql.tree.QualifiedName; import io.trino.sql.tree.ResetSession; +import io.trino.testing.LocalQueryRunner; import io.trino.transaction.TransactionManager; import org.testng.annotations.AfterClass; import org.testng.annotations.Test; @@ -38,18 +37,16 @@ import static io.airlift.concurrent.MoreFutures.getFutureValue; import static io.airlift.concurrent.Threads.daemonThreadsNamed; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; +import static io.trino.SessionTestUtils.TEST_SESSION; import static io.trino.spi.session.PropertyMetadata.stringProperty; -import static io.trino.testing.TestingSession.createBogusTestingCatalog; import static io.trino.testing.TestingSession.testSessionBuilder; -import static io.trino.transaction.InMemoryTransactionManager.createTestTransactionManager; import static java.util.Collections.emptyList; import static java.util.concurrent.Executors.newCachedThreadPool; import static org.testng.Assert.assertEquals; public class TestResetSessionTask { - private static final String CATALOG_NAME = "catalog"; + private static final String CATALOG_NAME = "my_catalog"; private ExecutorService executor = newCachedThreadPool(daemonThreadsNamed(getClass().getSimpleName() + "-%s")); private final TransactionManager transactionManager; private final AccessControl accessControl; @@ -58,26 +55,30 @@ public class TestResetSessionTask public TestResetSessionTask() { - CatalogManager catalogManager = new CatalogManager(); - transactionManager = createTestTransactionManager(catalogManager); - accessControl = new AllowAllAccessControl(); - - metadata = createTestMetadataManager(transactionManager, new FeaturesConfig()); - sessionPropertyManager = new SessionPropertyManager(); + LocalQueryRunner queryRunner = LocalQueryRunner.builder(TEST_SESSION) + .withExtraSystemSessionProperties(ImmutableSet.of(() -> ImmutableList.of( + stringProperty( + "foo", + "test property", + null, + false)))) + .build(); - sessionPropertyManager.addSystemSessionProperty(stringProperty( - "foo", - "test property", - null, - false)); + queryRunner.createCatalog( + CATALOG_NAME, + MockConnectorFactory.builder() + .withSessionProperty(stringProperty( + "baz", + "test property", + null, + false)) + .build(), + ImmutableMap.of()); - Catalog bogusTestingCatalog = createBogusTestingCatalog(CATALOG_NAME); - sessionPropertyManager.addConnectorSessionProperties(bogusTestingCatalog.getConnectorCatalogName(), ImmutableList.of(stringProperty( - "baz", - "test property", - null, - false))); - catalogManager.registerCatalog(bogusTestingCatalog); + transactionManager = queryRunner.getTransactionManager(); + accessControl = queryRunner.getAccessControl(); + metadata = queryRunner.getMetadata(); + sessionPropertyManager = queryRunner.getSessionPropertyManager(); } @AfterClass(alwaysRun = true) @@ -116,6 +117,6 @@ public void test() WarningCollector.NOOP)); Set sessionProperties = stateMachine.getResetSessionProperties(); - assertEquals(sessionProperties, ImmutableSet.of("catalog.baz")); + assertEquals(sessionProperties, ImmutableSet.of(CATALOG_NAME + ".baz")); } } diff --git a/core/trino-main/src/test/java/io/trino/execution/TestSetRoleTask.java b/core/trino-main/src/test/java/io/trino/execution/TestSetRoleTask.java index 4206c5a1b28b..bc7cf01a191b 100644 --- a/core/trino-main/src/test/java/io/trino/execution/TestSetRoleTask.java +++ b/core/trino-main/src/test/java/io/trino/execution/TestSetRoleTask.java @@ -16,31 +16,19 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import io.trino.FeaturesConfig; -import io.trino.connector.CatalogName; import io.trino.connector.MockConnectorFactory; -import io.trino.connector.system.StaticSystemTablesProvider; -import io.trino.connector.system.SystemTablesMetadata; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Catalog; -import io.trino.metadata.Catalog.SecurityManagement; -import io.trino.metadata.CatalogManager; import io.trino.metadata.Metadata; import io.trino.security.AccessControl; -import io.trino.security.AllowAllAccessControl; -import io.trino.spi.connector.Connector; -import io.trino.spi.connector.ConnectorMetadata; -import io.trino.spi.connector.ConnectorTransactionHandle; import io.trino.spi.resourcegroups.ResourceGroupId; import io.trino.spi.security.Identity; import io.trino.spi.security.RoleGrant; import io.trino.spi.security.SelectedRole; import io.trino.spi.security.TrinoPrincipal; -import io.trino.spi.transaction.IsolationLevel; import io.trino.sql.parser.ParsingOptions; import io.trino.sql.parser.SqlParser; import io.trino.sql.tree.SetRole; -import io.trino.testing.TestingConnectorContext; +import io.trino.testing.LocalQueryRunner; import io.trino.transaction.TransactionManager; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; @@ -52,16 +40,13 @@ import java.util.concurrent.ExecutorService; import static io.airlift.concurrent.Threads.daemonThreadsNamed; -import static io.trino.connector.CatalogName.createInformationSchemaCatalogName; -import static io.trino.connector.CatalogName.createSystemTablesCatalogName; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; +import static io.trino.SessionTestUtils.TEST_SESSION; import static io.trino.spi.StandardErrorCode.CATALOG_NOT_FOUND; import static io.trino.spi.StandardErrorCode.NOT_SUPPORTED; import static io.trino.spi.StandardErrorCode.ROLE_NOT_FOUND; import static io.trino.spi.security.PrincipalType.USER; import static io.trino.testing.TestingSession.testSessionBuilder; import static io.trino.testing.assertions.TrinoExceptionAssert.assertTrinoExceptionThrownBy; -import static io.trino.transaction.InMemoryTransactionManager.createTestTransactionManager; import static java.util.concurrent.Executors.newCachedThreadPool; import static org.testng.Assert.assertEquals; @@ -72,6 +57,7 @@ public class TestSetRoleTask private static final String USER_NAME = "user"; private static final String ROLE_NAME = "bar"; + private LocalQueryRunner queryRunner; private TransactionManager transactionManager; private AccessControl accessControl; private Metadata metadata; @@ -81,61 +67,31 @@ public class TestSetRoleTask @BeforeClass public void setUp() { - CatalogManager catalogManager = new CatalogManager(); - transactionManager = createTestTransactionManager(catalogManager); - accessControl = new AllowAllAccessControl(); - - metadata = createTestMetadataManager(transactionManager, new FeaturesConfig()); - + queryRunner = LocalQueryRunner.create(TEST_SESSION); MockConnectorFactory mockConnectorFactory = MockConnectorFactory.builder() .withListRoleGrants((connectorSession, roles, grantees, limit) -> ImmutableSet.of(new RoleGrant(new TrinoPrincipal(USER, USER_NAME), ROLE_NAME, false))) .build(); - Connector testConnector = mockConnectorFactory.create(CATALOG_NAME, ImmutableMap.of(), new TestingConnectorContext()); - CatalogName catalogName = new CatalogName(CATALOG_NAME); - catalogManager.registerCatalog(new Catalog( - CATALOG_NAME, - catalogName, - "test", - testConnector, - SecurityManagement.CONNECTOR, - createInformationSchemaCatalogName(catalogName), - testConnector, - createSystemTablesCatalogName(catalogName), - testConnector)); - - CatalogName systemRoleCatalog = new CatalogName(SYSTEM_ROLE_CATALOG_NAME); - Connector systemRoleConnector = new Connector() - { - @Override - public ConnectorTransactionHandle beginTransaction(IsolationLevel isolationLevel, boolean readOnly, boolean autoCommit) - { - return new ConnectorTransactionHandle() {}; - } - - @Override - public ConnectorMetadata getMetadata(ConnectorTransactionHandle transaction) - { - return new SystemTablesMetadata(new StaticSystemTablesProvider(ImmutableSet.of())); - } - }; - catalogManager.registerCatalog(new Catalog( - SYSTEM_ROLE_CATALOG_NAME, - systemRoleCatalog, - "test", - systemRoleConnector, - SecurityManagement.SYSTEM, - createInformationSchemaCatalogName(systemRoleCatalog), - systemRoleConnector, - createSystemTablesCatalogName(systemRoleCatalog), - systemRoleConnector)); + queryRunner.createCatalog(CATALOG_NAME, mockConnectorFactory, ImmutableMap.of()); + + MockConnectorFactory systemConnectorFactory = MockConnectorFactory.builder() + .withName("system_role_connector") + .build(); + queryRunner.createCatalog(SYSTEM_ROLE_CATALOG_NAME, systemConnectorFactory, ImmutableMap.of()); + transactionManager = queryRunner.getTransactionManager(); + accessControl = queryRunner.getAccessControl(); + metadata = queryRunner.getMetadata(); + parser = queryRunner.getSqlParser(); executor = newCachedThreadPool(daemonThreadsNamed("test-set-role-task-executor-%s")); - parser = new SqlParser(); } @AfterClass(alwaysRun = true) public void tearDown() { + if (queryRunner != null) { + queryRunner.close(); + queryRunner = null; + } executor.shutdownNow(); executor = null; metadata = null; diff --git a/core/trino-main/src/test/java/io/trino/execution/TestSetSessionTask.java b/core/trino-main/src/test/java/io/trino/execution/TestSetSessionTask.java index 6180abee13ee..d8bdef96e8cc 100644 --- a/core/trino-main/src/test/java/io/trino/execution/TestSetSessionTask.java +++ b/core/trino-main/src/test/java/io/trino/execution/TestSetSessionTask.java @@ -15,18 +15,15 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import io.trino.FeaturesConfig; +import com.google.common.collect.ImmutableSet; +import io.trino.connector.MockConnectorFactory; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Catalog; -import io.trino.metadata.CatalogManager; import io.trino.metadata.Metadata; import io.trino.metadata.SessionPropertyManager; import io.trino.metadata.TestingFunctionResolution; import io.trino.security.AccessControl; -import io.trino.security.AllowAllAccessControl; import io.trino.spi.TrinoException; import io.trino.spi.resourcegroups.ResourceGroupId; -import io.trino.spi.session.PropertyMetadata; import io.trino.sql.PlannerContext; import io.trino.sql.tree.Expression; import io.trino.sql.tree.FunctionCall; @@ -35,6 +32,7 @@ import io.trino.sql.tree.QualifiedName; import io.trino.sql.tree.SetSession; import io.trino.sql.tree.StringLiteral; +import io.trino.testing.LocalQueryRunner; import io.trino.transaction.TransactionManager; import org.testng.annotations.AfterClass; import org.testng.annotations.Test; @@ -48,15 +46,11 @@ import static io.airlift.concurrent.MoreFutures.getFutureValue; import static io.airlift.concurrent.Threads.daemonThreadsNamed; import static io.trino.SessionTestUtils.TEST_SESSION; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.StandardErrorCode.INVALID_SESSION_PROPERTY; import static io.trino.spi.session.PropertyMetadata.enumProperty; import static io.trino.spi.session.PropertyMetadata.integerProperty; import static io.trino.spi.session.PropertyMetadata.stringProperty; import static io.trino.spi.type.VarcharType.VARCHAR; -import static io.trino.sql.planner.TestingPlannerContext.plannerContextBuilder; -import static io.trino.testing.TestingSession.createBogusTestingCatalog; -import static io.trino.transaction.InMemoryTransactionManager.createTestTransactionManager; import static java.lang.String.format; import static java.util.Collections.emptyList; import static java.util.concurrent.Executors.newCachedThreadPool; @@ -65,7 +59,7 @@ public class TestSetSessionTask { - private static final String CATALOG_NAME = "foo"; + private static final String CATALOG_NAME = "my_catalog"; private static final String MUST_BE_POSITIVE = "property must be positive"; private enum Size @@ -83,43 +77,43 @@ private enum Size public TestSetSessionTask() { - CatalogManager catalogManager = new CatalogManager(); - transactionManager = createTestTransactionManager(catalogManager); - accessControl = new AllowAllAccessControl(); - - metadata = createTestMetadataManager(transactionManager, new FeaturesConfig()); - plannerContext = plannerContextBuilder().withMetadata(metadata).build(); - sessionPropertyManager = new SessionPropertyManager(); - sessionPropertyManager.addSystemSessionProperty(stringProperty( + LocalQueryRunner queryRunner = LocalQueryRunner.builder(TEST_SESSION) + .withExtraSystemSessionProperties(ImmutableSet.of(() -> ImmutableList.of( + stringProperty( + "foo", + "test property", + null, + false)))) + .build(); + + queryRunner.createCatalog( CATALOG_NAME, - "test property", - null, - false)); - - Catalog bogusTestingCatalog = createBogusTestingCatalog(CATALOG_NAME); - - List> sessionProperties = ImmutableList.of( - stringProperty( - "bar", - "test property", - null, - false), - integerProperty( - "positive_property", - "property that should be positive", - null, - TestSetSessionTask::validatePositive, - false), - enumProperty( - "size_property", - "size enum property", - Size.class, - null, - false)); - - sessionPropertyManager.addConnectorSessionProperties(bogusTestingCatalog.getConnectorCatalogName(), sessionProperties); - - catalogManager.registerCatalog(bogusTestingCatalog); + MockConnectorFactory.builder() + .withSessionProperty(stringProperty( + "bar", + "test property", + null, + false)) + .withSessionProperty(integerProperty( + "positive_property", + "property that should be positive", + null, + TestSetSessionTask::validatePositive, + false)) + .withSessionProperty(enumProperty( + "size_property", + "size enum property", + Size.class, + null, + false)) + .build(), + ImmutableMap.of()); + + transactionManager = queryRunner.getTransactionManager(); + accessControl = queryRunner.getAccessControl(); + metadata = queryRunner.getMetadata(); + plannerContext = queryRunner.getPlannerContext(); + sessionPropertyManager = queryRunner.getSessionPropertyManager(); } private static void validatePositive(Object value) diff --git a/core/trino-main/src/test/java/io/trino/metadata/TestInformationSchemaMetadata.java b/core/trino-main/src/test/java/io/trino/metadata/TestInformationSchemaMetadata.java index d9b90d17ffc2..e91d4d94fd87 100644 --- a/core/trino-main/src/test/java/io/trino/metadata/TestInformationSchemaMetadata.java +++ b/core/trino-main/src/test/java/io/trino/metadata/TestInformationSchemaMetadata.java @@ -18,16 +18,12 @@ import com.google.common.collect.ImmutableSet; import io.airlift.slice.Slice; import io.airlift.slice.Slices; -import io.trino.FeaturesConfig; import io.trino.client.ClientCapabilities; -import io.trino.connector.CatalogName; import io.trino.connector.MockConnectorFactory; import io.trino.connector.informationschema.InformationSchemaColumnHandle; import io.trino.connector.informationschema.InformationSchemaMetadata; import io.trino.connector.informationschema.InformationSchemaTableHandle; -import io.trino.metadata.Catalog.SecurityManagement; import io.trino.spi.connector.ColumnHandle; -import io.trino.spi.connector.Connector; import io.trino.spi.connector.ConnectorMetadata; import io.trino.spi.connector.ConnectorSession; import io.trino.spi.connector.ConnectorTableHandle; @@ -39,7 +35,7 @@ import io.trino.spi.predicate.Domain; import io.trino.spi.predicate.NullableValue; import io.trino.spi.predicate.TupleDomain; -import io.trino.testing.TestingConnectorContext; +import io.trino.testing.LocalQueryRunner; import io.trino.transaction.TransactionId; import io.trino.transaction.TransactionManager; import org.testng.annotations.Test; @@ -49,13 +45,10 @@ import java.util.Set; import static com.google.common.collect.ImmutableSet.toImmutableSet; -import static io.trino.connector.CatalogName.createInformationSchemaCatalogName; -import static io.trino.connector.CatalogName.createSystemTablesCatalogName; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; +import static io.trino.SessionTestUtils.TEST_SESSION; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.VarcharType.VARCHAR; import static io.trino.testing.TestingSession.testSessionBuilder; -import static io.trino.transaction.InMemoryTransactionManager.createTestTransactionManager; import static java.util.Arrays.stream; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; @@ -67,8 +60,9 @@ public class TestInformationSchemaMetadata public TestInformationSchemaMetadata() { - MockConnectorFactory.Builder builder = MockConnectorFactory.builder(); - MockConnectorFactory mockConnectorFactory = builder.withListSchemaNames(connectorSession -> ImmutableList.of("test_schema")) + LocalQueryRunner queryRunner = LocalQueryRunner.create(TEST_SESSION); + MockConnectorFactory mockConnectorFactory = MockConnectorFactory.builder() + .withListSchemaNames(connectorSession -> ImmutableList.of("test_schema")) .withListTables((connectorSession, schemaNameOrNull) -> ImmutableList.of( new SchemaTableName("test_schema", "test_view"), @@ -84,23 +78,11 @@ public TestInformationSchemaMetadata() true); SchemaTableName viewName = new SchemaTableName("test_schema", "test_view"); return ImmutableMap.of(viewName, definition); - }).build(); - Connector testConnector = mockConnectorFactory.create("test", ImmutableMap.of(), new TestingConnectorContext()); - CatalogManager catalogManager = new CatalogManager(); - String catalogName = "test_catalog"; - CatalogName catalog = new CatalogName("test_catalog"); - catalogManager.registerCatalog(new Catalog( - catalogName, - catalog, - "test", - testConnector, - SecurityManagement.CONNECTOR, - createInformationSchemaCatalogName(catalog), - testConnector, - createSystemTablesCatalogName(catalog), - testConnector)); - transactionManager = createTestTransactionManager(catalogManager); - metadata = createTestMetadataManager(transactionManager, new FeaturesConfig()); + }) + .build(); + queryRunner.createCatalog("test_catalog", mockConnectorFactory, ImmutableMap.of()); + transactionManager = queryRunner.getTransactionManager(); + metadata = queryRunner.getMetadata(); } /** @@ -163,7 +145,10 @@ public void testInformationSchemaPredicatePushdownWithoutSchemaPredicate() .map(ConstraintApplicationResult::getHandle) .map(InformationSchemaTableHandle.class::cast) .orElseThrow(AssertionError::new); - assertEquals(tableHandle.getPrefixes(), ImmutableSet.of(new QualifiedTablePrefix("test_catalog", "test_schema", "test_view"))); + // filter blindly applies filter to all visible schemas, so information_schema must be included + assertEquals(tableHandle.getPrefixes(), ImmutableSet.of( + new QualifiedTablePrefix("test_catalog", "test_schema", "test_view"), + new QualifiedTablePrefix("test_catalog", "information_schema", "test_view"))); } @Test @@ -250,7 +235,10 @@ public void testInformationSchemaPredicatePushdownForEmptyNames() .orElseThrow(AssertionError::new); // "" table name is valid schema name, but is (currently) valid for QualifiedTablePrefix - assertEquals(filtered.getPrefixes(), ImmutableSet.of(new QualifiedTablePrefix("test_catalog", "test_schema", ""))); + // filter blindly applies filter to all visible schemas, so information_schema must be included + assertEquals(filtered.getPrefixes(), ImmutableSet.of( + new QualifiedTablePrefix("test_catalog", "test_schema", ""), + new QualifiedTablePrefix("test_catalog", "information_schema", ""))); } /** diff --git a/core/trino-main/src/test/java/io/trino/security/TestAccessControlManager.java b/core/trino-main/src/test/java/io/trino/security/TestAccessControlManager.java index bc1ca0566297..41d77d45b0e5 100644 --- a/core/trino-main/src/test/java/io/trino/security/TestAccessControlManager.java +++ b/core/trino-main/src/test/java/io/trino/security/TestAccessControlManager.java @@ -17,25 +17,18 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import io.trino.connector.CatalogName; -import io.trino.connector.informationschema.InformationSchemaConnector; -import io.trino.connector.system.SystemConnector; +import io.trino.connector.MockConnectorFactory; import io.trino.eventlistener.EventListenerManager; -import io.trino.metadata.Catalog; -import io.trino.metadata.Catalog.SecurityManagement; import io.trino.metadata.CatalogManager; -import io.trino.metadata.InMemoryNodeManager; -import io.trino.metadata.Metadata; import io.trino.metadata.QualifiedObjectName; import io.trino.plugin.base.security.AllowAllAccessControl; import io.trino.plugin.base.security.AllowAllSystemAccessControl; import io.trino.plugin.base.security.DefaultSystemAccessControl; import io.trino.plugin.base.security.ReadOnlySystemAccessControl; -import io.trino.plugin.tpch.TpchConnectorFactory; import io.trino.spi.QueryId; import io.trino.spi.TrinoException; import io.trino.spi.connector.CatalogSchemaName; import io.trino.spi.connector.CatalogSchemaTableName; -import io.trino.spi.connector.Connector; import io.trino.spi.connector.ConnectorAccessControl; import io.trino.spi.connector.ConnectorSecurityContext; import io.trino.spi.connector.SchemaTableName; @@ -48,7 +41,7 @@ import io.trino.spi.security.SystemSecurityContext; import io.trino.spi.security.ViewExpression; import io.trino.spi.type.Type; -import io.trino.testing.TestingConnectorContext; +import io.trino.testing.LocalQueryRunner; import io.trino.testing.TestingEventListenerManager; import io.trino.transaction.TransactionId; import io.trino.transaction.TransactionManager; @@ -63,9 +56,7 @@ import java.util.Optional; import java.util.Set; -import static io.trino.connector.CatalogName.createInformationSchemaCatalogName; -import static io.trino.connector.CatalogName.createSystemTablesCatalogName; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; +import static io.trino.SessionTestUtils.TEST_SESSION; import static io.trino.spi.security.AccessDeniedException.denySelectTable; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.testing.TestingEventListenerManager.emptyEventListenerManager; @@ -174,81 +165,87 @@ public void testNoCatalogAccessControl() @Test public void testDenyCatalogAccessControl() { - CatalogManager catalogManager = new CatalogManager(); - TransactionManager transactionManager = createTestTransactionManager(catalogManager); - AccessControlManager accessControlManager = createAccessControlManager(transactionManager); - - TestSystemAccessControlFactory accessControlFactory = new TestSystemAccessControlFactory("test"); - accessControlManager.addSystemAccessControlFactory(accessControlFactory); - accessControlManager.setSystemAccessControl("test", ImmutableMap.of()); - - CatalogName catalogName = registerBogusConnector(catalogManager, transactionManager, accessControlManager, "catalog"); - accessControlManager.addCatalogAccessControl(catalogName, new DenyConnectorAccessControl()); - - assertThatThrownBy(() -> transaction(transactionManager, accessControlManager) - .execute(transactionId -> { - accessControlManager.checkCanSelectFromColumns(context(transactionId), new QualifiedObjectName("catalog", "schema", "table"), ImmutableSet.of("column")); - })) - .isInstanceOf(TrinoException.class) - .hasMessageMatching("Access Denied: Cannot select from columns \\[column\\] in table or view schema.table"); + try (LocalQueryRunner queryRunner = LocalQueryRunner.create(TEST_SESSION)) { + TransactionManager transactionManager = queryRunner.getTransactionManager(); + AccessControlManager accessControlManager = createAccessControlManager(transactionManager); + + TestSystemAccessControlFactory accessControlFactory = new TestSystemAccessControlFactory("test"); + accessControlManager.addSystemAccessControlFactory(accessControlFactory); + accessControlManager.setSystemAccessControl("test", ImmutableMap.of()); + + queryRunner.createCatalog("catalog", MockConnectorFactory.create(), ImmutableMap.of()); + accessControlManager.addCatalogAccessControl(new CatalogName("catalog"), new DenyConnectorAccessControl()); + + assertThatThrownBy(() -> transaction(transactionManager, accessControlManager) + .execute(transactionId -> { + accessControlManager.checkCanSelectFromColumns(context(transactionId), new QualifiedObjectName("catalog", "schema", "table"), ImmutableSet.of("column")); + })) + .isInstanceOf(TrinoException.class) + .hasMessageMatching("Access Denied: Cannot select from columns \\[column\\] in table or view schema.table"); + } } @Test public void testColumnMaskOrdering() { - CatalogManager catalogManager = new CatalogManager(); - TransactionManager transactionManager = createTestTransactionManager(catalogManager); - AccessControlManager accessControlManager = createAccessControlManager(transactionManager); + try (LocalQueryRunner queryRunner = LocalQueryRunner.create(TEST_SESSION)) { + TransactionManager transactionManager = queryRunner.getTransactionManager(); + AccessControlManager accessControlManager = createAccessControlManager(transactionManager); - accessControlManager.addSystemAccessControlFactory(new SystemAccessControlFactory() - { - @Override - public String getName() + accessControlManager.addSystemAccessControlFactory(new SystemAccessControlFactory() { - return "test"; - } - - @Override - public SystemAccessControl create(Map config) - { - return new SystemAccessControl() + @Override + public String getName() { - @Override - public Optional getColumnMask(SystemSecurityContext context, CatalogSchemaTableName tableName, String column, Type type) - { - return Optional.of(new ViewExpression("user", Optional.empty(), Optional.empty(), "system mask")); - } + return "test"; + } - @Override - public void checkCanSetSystemSessionProperty(SystemSecurityContext context, String propertyName) + @Override + public SystemAccessControl create(Map config) + { + return new SystemAccessControl() { - } - }; - } - }); - accessControlManager.setSystemAccessControl("test", ImmutableMap.of()); - - CatalogName catalogName = registerBogusConnector(catalogManager, transactionManager, accessControlManager, "catalog"); - accessControlManager.addCatalogAccessControl(catalogName, new ConnectorAccessControl() - { - @Override - public Optional getColumnMask(ConnectorSecurityContext context, SchemaTableName tableName, String column, Type type) - { - return Optional.of(new ViewExpression("user", Optional.empty(), Optional.empty(), "connector mask")); - } + @Override + public Optional getColumnMask(SystemSecurityContext context, CatalogSchemaTableName tableName, String column, Type type) + { + return Optional.of(new ViewExpression("user", Optional.empty(), Optional.empty(), "system mask")); + } + + @Override + public void checkCanSetSystemSessionProperty(SystemSecurityContext context, String propertyName) + { + } + }; + } + }); + accessControlManager.setSystemAccessControl("test", ImmutableMap.of()); - @Override - public void checkCanShowCreateTable(ConnectorSecurityContext context, SchemaTableName tableName) + queryRunner.createCatalog("catalog", MockConnectorFactory.create(), ImmutableMap.of()); + accessControlManager.addCatalogAccessControl(new CatalogName("catalog"), new ConnectorAccessControl() { - } - }); + @Override + public Optional getColumnMask(ConnectorSecurityContext context, SchemaTableName tableName, String column, Type type) + { + return Optional.of(new ViewExpression("user", Optional.empty(), Optional.empty(), "connector mask")); + } - transaction(transactionManager, accessControlManager) - .execute(transactionId -> { - List masks = accessControlManager.getColumnMasks(context(transactionId), new QualifiedObjectName("catalog", "schema", "table"), "column", BIGINT); - assertEquals(masks.get(0).getExpression(), "connector mask"); - assertEquals(masks.get(1).getExpression(), "system mask"); - }); + @Override + public void checkCanShowCreateTable(ConnectorSecurityContext context, SchemaTableName tableName) + { + } + }); + + transaction(transactionManager, accessControlManager) + .execute(transactionId -> { + List masks = accessControlManager.getColumnMasks( + context(transactionId), + new QualifiedObjectName("catalog", "schema", "table"), + "column", + BIGINT); + assertEquals(masks.get(0).getExpression(), "connector mask"); + assertEquals(masks.get(1).getExpression(), "system mask"); + }); + } } private static SecurityContext context(TransactionId transactionId) @@ -260,23 +257,27 @@ private static SecurityContext context(TransactionId transactionId) @Test public void testDenySystemAccessControl() { - CatalogManager catalogManager = new CatalogManager(); - TransactionManager transactionManager = createTestTransactionManager(catalogManager); - AccessControlManager accessControlManager = createAccessControlManager(transactionManager); - - TestSystemAccessControlFactory accessControlFactory = new TestSystemAccessControlFactory("test"); - accessControlManager.addSystemAccessControlFactory(accessControlFactory); - accessControlManager.setSystemAccessControl("test", ImmutableMap.of()); - - registerBogusConnector(catalogManager, transactionManager, accessControlManager, "connector"); - accessControlManager.addCatalogAccessControl(new CatalogName("connector"), new DenyConnectorAccessControl()); - - assertThatThrownBy(() -> transaction(transactionManager, accessControlManager) - .execute(transactionId -> { - accessControlManager.checkCanSelectFromColumns(context(transactionId), new QualifiedObjectName("secured_catalog", "schema", "table"), ImmutableSet.of("column")); - })) - .isInstanceOf(TrinoException.class) - .hasMessageMatching("Access Denied: Cannot select from table secured_catalog.schema.table"); + try (LocalQueryRunner queryRunner = LocalQueryRunner.create(TEST_SESSION)) { + TransactionManager transactionManager = queryRunner.getTransactionManager(); + AccessControlManager accessControlManager = createAccessControlManager(transactionManager); + + TestSystemAccessControlFactory accessControlFactory = new TestSystemAccessControlFactory("test"); + accessControlManager.addSystemAccessControlFactory(accessControlFactory); + accessControlManager.setSystemAccessControl("test", ImmutableMap.of()); + + queryRunner.createCatalog("catalog", MockConnectorFactory.create(), ImmutableMap.of()); + accessControlManager.addCatalogAccessControl(new CatalogName("connector"), new DenyConnectorAccessControl()); + + assertThatThrownBy(() -> transaction(transactionManager, accessControlManager) + .execute(transactionId -> { + accessControlManager.checkCanSelectFromColumns( + context(transactionId), + new QualifiedObjectName("secured_catalog", "schema", "table"), + ImmutableSet.of("column")); + })) + .isInstanceOf(TrinoException.class) + .hasMessageMatching("Access Denied: Cannot select from table secured_catalog.schema.table"); + } } @Test @@ -296,32 +297,34 @@ public void testDenyExecuteProcedureBySystem() @Test public void testDenyExecuteProcedureByConnector() { - CatalogManager catalogManager = new CatalogManager(); - TransactionManager transactionManager = createTestTransactionManager(catalogManager); - AccessControlManager accessControlManager = createAccessControlManager(transactionManager); - accessControlManager.setSystemAccessControl("allow-all", ImmutableMap.of()); + try (LocalQueryRunner queryRunner = LocalQueryRunner.create(TEST_SESSION)) { + TransactionManager transactionManager = queryRunner.getTransactionManager(); + AccessControlManager accessControlManager = createAccessControlManager(transactionManager); + accessControlManager.setSystemAccessControl("allow-all", ImmutableMap.of()); - registerBogusConnector(catalogManager, transactionManager, accessControlManager, "connector"); - accessControlManager.addCatalogAccessControl(new CatalogName("connector"), new DenyConnectorAccessControl()); + queryRunner.createCatalog("connector", MockConnectorFactory.create(), ImmutableMap.of()); + accessControlManager.addCatalogAccessControl(new CatalogName("connector"), new DenyConnectorAccessControl()); - assertDenyExecuteProcedure(transactionManager, accessControlManager, "Access Denied: Cannot execute procedure schema.procedure"); + assertDenyExecuteProcedure(transactionManager, accessControlManager, "Access Denied: Cannot execute procedure schema.procedure"); + } } @Test public void testAllowExecuteProcedure() { - CatalogManager catalogManager = new CatalogManager(); - TransactionManager transactionManager = createTestTransactionManager(catalogManager); - AccessControlManager accessControlManager = createAccessControlManager(transactionManager); - accessControlManager.setSystemAccessControl("allow-all", ImmutableMap.of()); - - registerBogusConnector(catalogManager, transactionManager, accessControlManager, "connector"); - accessControlManager.addCatalogAccessControl(new CatalogName("connector"), new AllowAllAccessControl()); - - transaction(transactionManager, accessControlManager) - .execute(transactionId -> { - accessControlManager.checkCanExecuteProcedure(context(transactionId), new QualifiedObjectName("connector", "schema", "procedure")); - }); + try (LocalQueryRunner queryRunner = LocalQueryRunner.create(TEST_SESSION)) { + TransactionManager transactionManager = queryRunner.getTransactionManager(); + AccessControlManager accessControlManager = createAccessControlManager(transactionManager); + accessControlManager.setSystemAccessControl("allow-all", ImmutableMap.of()); + + queryRunner.createCatalog("connector", MockConnectorFactory.create(), ImmutableMap.of()); + accessControlManager.addCatalogAccessControl(new CatalogName("connector"), new AllowAllAccessControl()); + + transaction(transactionManager, accessControlManager) + .execute(transactionId -> { + accessControlManager.checkCanExecuteProcedure(context(transactionId), new QualifiedObjectName("connector", "schema", "procedure")); + }); + } } @Test @@ -372,32 +375,6 @@ private void assertDenyExecuteProcedure(TransactionManager transactionManager, A }); } - private static CatalogName registerBogusConnector(CatalogManager catalogManager, TransactionManager transactionManager, AccessControl accessControl, String catalogName) - { - CatalogName catalog = new CatalogName(catalogName); - TpchConnectorFactory factory = new TpchConnectorFactory(); - Connector connector = factory.create(catalogName, ImmutableMap.of(), new TestingConnectorContext()); - - InMemoryNodeManager nodeManager = new InMemoryNodeManager(); - Metadata metadata = createTestMetadataManager(catalogManager); - CatalogName systemId = createSystemTablesCatalogName(catalog); - catalogManager.registerCatalog(new Catalog( - catalogName, - catalog, - factory.getName(), - connector, - SecurityManagement.CONNECTOR, - createInformationSchemaCatalogName(catalog), - new InformationSchemaConnector(catalogName, nodeManager, metadata, accessControl), - systemId, - new SystemConnector( - nodeManager, - connector.getSystemTables(), - transactionId -> transactionManager.getConnectorTransaction(transactionId, catalog)))); - - return catalog; - } - @Test public void testDenyExecuteFunctionBySystemAccessControl() { diff --git a/core/trino-main/src/test/java/io/trino/sql/analyzer/TestAnalyzer.java b/core/trino-main/src/test/java/io/trino/sql/analyzer/TestAnalyzer.java index 3e91cb4cb855..07006a1cebc7 100644 --- a/core/trino-main/src/test/java/io/trino/sql/analyzer/TestAnalyzer.java +++ b/core/trino-main/src/test/java/io/trino/sql/analyzer/TestAnalyzer.java @@ -17,12 +17,12 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import com.google.common.io.Closer; import io.trino.FeaturesConfig; import io.trino.Session; import io.trino.SystemSessionProperties; -import io.trino.connector.CatalogName; -import io.trino.connector.informationschema.InformationSchemaConnector; -import io.trino.connector.system.SystemConnector; +import io.trino.connector.MockConnectorFactory; +import io.trino.connector.StaticConnectorFactory; import io.trino.execution.DynamicFilterConfig; import io.trino.execution.QueryManagerConfig; import io.trino.execution.TaskManagerConfig; @@ -31,12 +31,7 @@ import io.trino.memory.MemoryManagerConfig; import io.trino.memory.NodeMemoryConfig; import io.trino.metadata.AnalyzePropertyManager; -import io.trino.metadata.Catalog; -import io.trino.metadata.Catalog.SecurityManagement; -import io.trino.metadata.CatalogManager; import io.trino.metadata.ColumnPropertyManager; -import io.trino.metadata.InMemoryNodeManager; -import io.trino.metadata.InternalNodeManager; import io.trino.metadata.MaterializedViewDefinition; import io.trino.metadata.MaterializedViewPropertyManager; import io.trino.metadata.Metadata; @@ -72,12 +67,14 @@ import io.trino.sql.rewrite.ShowQueriesRewrite; import io.trino.sql.rewrite.StatementRewrite; import io.trino.sql.tree.Statement; +import io.trino.testing.LocalQueryRunner; import io.trino.testing.TestingAccessControlManager; import io.trino.testing.TestingMetadata; import io.trino.testing.TestingMetadata.TestingTableHandle; import io.trino.testing.assertions.TrinoExceptionAssert; import io.trino.transaction.TransactionManager; import org.intellij.lang.annotations.Language; +import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -86,9 +83,7 @@ import java.util.function.Consumer; import static com.google.common.collect.Iterables.getOnlyElement; -import static io.trino.connector.CatalogName.createInformationSchemaCatalogName; -import static io.trino.connector.CatalogName.createSystemTablesCatalogName; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; +import static io.trino.SessionTestUtils.TEST_SESSION; import static io.trino.operator.scalar.ApplyFunction.APPLY_FUNCTION; import static io.trino.spi.StandardErrorCode.AMBIGUOUS_NAME; import static io.trino.spi.StandardErrorCode.CATALOG_NOT_FOUND; @@ -173,26 +168,22 @@ import static io.trino.testing.TestingEventListenerManager.emptyEventListenerManager; import static io.trino.testing.TestingSession.testSessionBuilder; import static io.trino.testing.assertions.TrinoExceptionAssert.assertTrinoExceptionThrownBy; -import static io.trino.transaction.InMemoryTransactionManager.createTestTransactionManager; import static io.trino.transaction.TransactionBuilder.transaction; import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.lang.String.format; import static java.util.Collections.emptyList; import static java.util.Collections.emptyMap; import static java.util.Collections.nCopies; +import static java.util.Objects.requireNonNull; import static org.assertj.core.api.Assertions.assertThat; @Test(singleThreaded = true) public class TestAnalyzer { private static final String TPCH_CATALOG = "tpch"; - private static final CatalogName TPCH_CATALOG_NAME = new CatalogName(TPCH_CATALOG); private static final String SECOND_CATALOG = "c2"; - private static final CatalogName SECOND_CATALOG_NAME = new CatalogName(SECOND_CATALOG); private static final String THIRD_CATALOG = "c3"; - private static final CatalogName THIRD_CATALOG_NAME = new CatalogName(THIRD_CATALOG); private static final String CATALOG_FOR_IDENTIFIER_CHAIN_TESTS = "cat"; - private static final CatalogName CATALOG_FOR_IDENTIFIER_CHAIN_TESTS_NAME = new CatalogName(CATALOG_FOR_IDENTIFIER_CHAIN_TESTS); private static final Session SETUP_SESSION = testSessionBuilder() .setCatalog("c1") .setSchema("s1") @@ -208,6 +199,7 @@ public class TestAnalyzer private static final SqlParser SQL_PARSER = new SqlParser(); + private final Closer closer = Closer.create(); private TransactionManager transactionManager; private AccessControl accessControl; private PlannerContext plannerContext; @@ -5304,8 +5296,9 @@ public void testAnalyzeMaterializedViewWithAccessControl() @BeforeClass public void setup() { - CatalogManager catalogManager = new CatalogManager(); - transactionManager = createTestTransactionManager(catalogManager); + LocalQueryRunner queryRunner = LocalQueryRunner.create(TEST_SESSION); + closer.register(queryRunner); + transactionManager = queryRunner.getTransactionManager(); AccessControlManager accessControlManager = new AccessControlManager( transactionManager, @@ -5315,22 +5308,19 @@ public void setup() accessControlManager.setSystemAccessControls(List.of(AllowAllSystemAccessControl.INSTANCE)); this.accessControl = accessControlManager; - Metadata metadata = createTestMetadataManager(transactionManager, new FeaturesConfig()); + Metadata metadata = queryRunner.getMetadata(); metadata.addFunctions(ImmutableList.of(APPLY_FUNCTION)); plannerContext = plannerContextBuilder().withMetadata(metadata).build(); - Catalog tpchTestCatalog = createTestingCatalog(TPCH_CATALOG, TPCH_CATALOG_NAME); - TestingMetadata testingConnectorMetadata = (TestingMetadata) tpchTestCatalog.getConnector(TPCH_CATALOG_NAME).getMetadata(null); - catalogManager.registerCatalog(tpchTestCatalog); + TestingMetadata testingConnectorMetadata = new TestingMetadata(); + TestingConnector connector = new TestingConnector(testingConnectorMetadata); + queryRunner.createCatalog(TPCH_CATALOG, new StaticConnectorFactory("main", connector), ImmutableMap.of()); - tablePropertyManager = new TablePropertyManager(); - tablePropertyManager.addProperties(TPCH_CATALOG_NAME, tpchTestCatalog.getConnector(TPCH_CATALOG_NAME).getTableProperties()); + tablePropertyManager = queryRunner.getTablePropertyManager(); + analyzePropertyManager = queryRunner.getAnalyzePropertyManager(); - analyzePropertyManager = new AnalyzePropertyManager(); - analyzePropertyManager.addProperties(TPCH_CATALOG_NAME, tpchTestCatalog.getConnector(TPCH_CATALOG_NAME).getAnalyzeProperties()); - - catalogManager.registerCatalog(createTestingCatalog(SECOND_CATALOG, SECOND_CATALOG_NAME)); - catalogManager.registerCatalog(createTestingCatalog(THIRD_CATALOG, THIRD_CATALOG_NAME)); + queryRunner.createCatalog(SECOND_CATALOG, MockConnectorFactory.create("second"), ImmutableMap.of()); + queryRunner.createCatalog(THIRD_CATALOG, MockConnectorFactory.create("third"), ImmutableMap.of()); SchemaTableName table1 = new SchemaTableName("s1", "t1"); inSetupTransaction(session -> metadata.createTable(session, TPCH_CATALOG, @@ -5472,7 +5462,7 @@ public void setup() false)); // for identifier chain resolving tests - catalogManager.registerCatalog(createTestingCatalog(CATALOG_FOR_IDENTIFIER_CHAIN_TESTS, CATALOG_FOR_IDENTIFIER_CHAIN_TESTS_NAME)); + queryRunner.createCatalog(CATALOG_FOR_IDENTIFIER_CHAIN_TESTS, new StaticConnectorFactory("chain", new TestingConnector(new TestingMetadata())), ImmutableMap.of()); Type singleFieldRowType = TESTING_TYPE_MANAGER.fromSqlType("row(f1 bigint)"); Type rowType = TESTING_TYPE_MANAGER.fromSqlType("row(f1 bigint, f2 bigint)"); Type nestedRowType = TESTING_TYPE_MANAGER.fromSqlType("row(f1 row(f11 bigint, f12 bigint), f2 boolean)"); @@ -5635,6 +5625,13 @@ public void setup() testingConnectorMetadata.markMaterializedViewIsFresh(freshMaterializedMismatchedColumnType.asSchemaTableName()); } + @AfterClass(alwaysRun = true) + public void tearDown() + throws Exception + { + closer.close(); + } + private void inSetupTransaction(Consumer consumer) { transaction(transactionManager, accessControl) @@ -5701,51 +5698,34 @@ private TrinoExceptionAssert assertFails(Session session, @Language("SQL") Strin return assertTrinoExceptionThrownBy(() -> analyze(session, query, accessControl)); } - private Catalog createTestingCatalog(String catalogName, CatalogName catalog) + private static class TestingConnector + implements Connector { - CatalogName systemId = createSystemTablesCatalogName(catalog); - Connector connector = createTestingConnector(); - InternalNodeManager nodeManager = new InMemoryNodeManager(); - return new Catalog( - catalogName, - catalog, - "test", - connector, - SecurityManagement.CONNECTOR, - createInformationSchemaCatalogName(catalog), - new InformationSchemaConnector(catalogName, nodeManager, plannerContext.getMetadata(), accessControl), - systemId, - new SystemConnector( - nodeManager, - connector.getSystemTables(), - transactionId -> transactionManager.getConnectorTransaction(transactionId, catalog))); - } + private final ConnectorMetadata metadata; - private static Connector createTestingConnector() - { - return new Connector() + public TestingConnector(ConnectorMetadata metadata) + { + this.metadata = requireNonNull(metadata, "metadata is null"); + } + + @Override + public ConnectorTransactionHandle beginTransaction(IsolationLevel isolationLevel, boolean readOnly, boolean autoCommit) + { + return new ConnectorTransactionHandle() {}; + } + + @Override + public ConnectorMetadata getMetadata(ConnectorTransactionHandle transaction) + { + return metadata; + } + + @Override + public List> getAnalyzeProperties() { - private final ConnectorMetadata metadata = new TestingMetadata(); - - @Override - public ConnectorTransactionHandle beginTransaction(IsolationLevel isolationLevel, boolean readOnly, boolean autoCommit) - { - return new ConnectorTransactionHandle() {}; - } - - @Override - public ConnectorMetadata getMetadata(ConnectorTransactionHandle transaction) - { - return metadata; - } - - @Override - public List> getAnalyzeProperties() - { - return ImmutableList.of( - stringProperty("p1", "test string property", "", false), - integerProperty("p2", "test integer property", 0, false)); - } - }; + return ImmutableList.of( + stringProperty("p1", "test string property", "", false), + integerProperty("p2", "test integer property", 0, false)); + } } } diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/TestMaterializedViews.java b/core/trino-main/src/test/java/io/trino/sql/planner/TestMaterializedViews.java index 8f84b24670af..6805e71317ce 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/TestMaterializedViews.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/TestMaterializedViews.java @@ -16,13 +16,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import io.trino.Session; -import io.trino.connector.CatalogName; -import io.trino.connector.informationschema.InformationSchemaConnector; -import io.trino.connector.system.SystemConnector; -import io.trino.metadata.Catalog; -import io.trino.metadata.Catalog.SecurityManagement; -import io.trino.metadata.InMemoryNodeManager; -import io.trino.metadata.InternalNodeManager; +import io.trino.connector.StaticConnectorFactory; import io.trino.metadata.MaterializedViewDefinition; import io.trino.metadata.Metadata; import io.trino.metadata.QualifiedObjectName; @@ -45,8 +39,6 @@ import java.util.Optional; -import static io.trino.connector.CatalogName.createInformationSchemaCatalogName; -import static io.trino.connector.CatalogName.createSystemTablesCatalogName; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.TinyintType.TINYINT; import static io.trino.spi.type.VarcharType.VARCHAR; @@ -70,11 +62,10 @@ protected LocalQueryRunner createLocalQueryRunner() .setSchema(SCHEMA) .setSystemProperty("task_concurrency", "1"); // these tests don't handle exchanges from local parallel - LocalQueryRunner queryRunner = LocalQueryRunner.create(sessionBuilder.build()); + TestingMetadata testingConnectorMetadata = new TestingMetadata(); - Catalog testCatalog = createTestingCatalog(CATALOG, new CatalogName(CATALOG), queryRunner); - queryRunner.getCatalogManager().registerCatalog(testCatalog); - TestingMetadata testingConnectorMetadata = (TestingMetadata) testCatalog.getConnector(new CatalogName(CATALOG)).getMetadata(null); + LocalQueryRunner queryRunner = LocalQueryRunner.create(sessionBuilder.build()); + queryRunner.createCatalog(CATALOG, new StaticConnectorFactory("test", new TestMaterializedViewConnector(testingConnectorMetadata)), ImmutableMap.of()); Metadata metadata = queryRunner.getMetadata(); SchemaTableName testTable = new SchemaTableName(SCHEMA, "test_table"); @@ -209,43 +200,26 @@ public void testMaterializedViewWithCasts() tableScan("storage_table_with_casts", ImmutableMap.of("A", "a", "B", "b"))))); } - private Catalog createTestingCatalog(String catalogName, CatalogName catalog, LocalQueryRunner queryRunner) + private static class TestMaterializedViewConnector + implements Connector { - CatalogName systemId = createSystemTablesCatalogName(catalog); - Connector connector = createTestingConnector(); - InternalNodeManager nodeManager = new InMemoryNodeManager(); - return new Catalog( - catalogName, - catalog, - "test", - connector, - SecurityManagement.CONNECTOR, - createInformationSchemaCatalogName(catalog), - new InformationSchemaConnector(catalogName, nodeManager, queryRunner.getMetadata(), queryRunner.getAccessControl()), - systemId, - new SystemConnector( - nodeManager, - connector.getSystemTables(), - transactionId -> queryRunner.getTransactionManager().getConnectorTransaction(transactionId, catalog))); - } + private final ConnectorMetadata metadata; - private static Connector createTestingConnector() - { - return new Connector() + public TestMaterializedViewConnector(ConnectorMetadata metadata) + { + this.metadata = metadata; + } + + @Override + public ConnectorTransactionHandle beginTransaction(IsolationLevel isolationLevel, boolean readOnly, boolean autoCommit) + { + return new ConnectorTransactionHandle() {}; + } + + @Override + public ConnectorMetadata getMetadata(ConnectorTransactionHandle transaction) { - private final ConnectorMetadata metadata = new TestingMetadata(); - - @Override - public ConnectorTransactionHandle beginTransaction(IsolationLevel isolationLevel, boolean readOnly, boolean autoCommit) - { - return new ConnectorTransactionHandle() {}; - } - - @Override - public ConnectorMetadata getMetadata(ConnectorTransactionHandle transaction) - { - return metadata; - } - }; + return metadata; + } } } diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/TestTableScanNodePartitioning.java b/core/trino-main/src/test/java/io/trino/sql/planner/TestTableScanNodePartitioning.java index 4f92fb282bf7..0f588f202f38 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/TestTableScanNodePartitioning.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/TestTableScanNodePartitioning.java @@ -196,8 +196,7 @@ void assertTableScanPlannedWithoutPartitioning(Session session, String table) public static MockConnectorFactory createMockFactory() { - MockConnectorFactory.Builder builder = MockConnectorFactory.builder(); - builder + return MockConnectorFactory.builder() .withGetColumns(schemaTableName -> ImmutableList.of( new ColumnMetadata(COLUMN_A, BIGINT), new ColumnMetadata(COLUMN_B, VARCHAR))) @@ -227,8 +226,8 @@ public static MockConnectorFactory createMockFactory() ImmutableList.of()); } return new ConnectorTableProperties(); - }); - return builder.build(); + }) + .build(); } public static class TestPartitioningProvider diff --git a/core/trino-main/src/test/java/io/trino/sql/query/TestShowQueries.java b/core/trino-main/src/test/java/io/trino/sql/query/TestShowQueries.java index 8363251802a7..b2326fd675b7 100644 --- a/core/trino-main/src/test/java/io/trino/sql/query/TestShowQueries.java +++ b/core/trino-main/src/test/java/io/trino/sql/query/TestShowQueries.java @@ -15,7 +15,6 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import io.trino.connector.CatalogName; import io.trino.connector.MockConnectorFactory; import io.trino.spi.connector.ColumnMetadata; import io.trino.spi.connector.SchemaTableName; @@ -25,10 +24,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; -import java.util.List; - import static io.trino.spi.type.BigintType.BIGINT; -import static io.trino.testing.TestingSession.createBogusTestingCatalog; import static io.trino.testing.TestingSession.testSessionBuilder; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -68,8 +64,7 @@ public void init() .withListTables((session, schemaName) -> ImmutableList.of(new SchemaTableName("mockSchema", "mockTable"))) .build(), ImmutableMap.of()); - queryRunner.getCatalogManager().registerCatalog(createBogusTestingCatalog("testing_catalog")); - queryRunner.getSessionPropertyManager().addConnectorSessionProperties(new CatalogName("testing_catalog"), List.of()); + queryRunner.createCatalog("testing_catalog", "mock", ImmutableMap.of()); assertions = new QueryAssertions(queryRunner); } diff --git a/core/trino-main/src/test/java/io/trino/transaction/TestTransactionManager.java b/core/trino-main/src/test/java/io/trino/transaction/TestTransactionManager.java index 15032243e11b..ae2421821a81 100644 --- a/core/trino-main/src/test/java/io/trino/transaction/TestTransactionManager.java +++ b/core/trino-main/src/test/java/io/trino/transaction/TestTransactionManager.java @@ -17,19 +17,10 @@ import com.google.common.collect.ImmutableMap; import io.airlift.units.Duration; import io.trino.connector.CatalogName; -import io.trino.connector.informationschema.InformationSchemaConnector; -import io.trino.connector.system.SystemConnector; -import io.trino.metadata.Catalog; -import io.trino.metadata.Catalog.SecurityManagement; import io.trino.metadata.CatalogManager; -import io.trino.metadata.InMemoryNodeManager; -import io.trino.metadata.InternalNodeManager; -import io.trino.metadata.Metadata; import io.trino.plugin.tpch.TpchConnectorFactory; -import io.trino.security.AllowAllAccessControl; -import io.trino.spi.connector.Connector; import io.trino.spi.connector.ConnectorMetadata; -import io.trino.testing.TestingConnectorContext; +import io.trino.testing.LocalQueryRunner; import org.testng.annotations.AfterClass; import org.testng.annotations.Test; @@ -43,7 +34,6 @@ import static io.trino.SessionTestUtils.TEST_SESSION; import static io.trino.connector.CatalogName.createInformationSchemaCatalogName; import static io.trino.connector.CatalogName.createSystemTablesCatalogName; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.StandardErrorCode.TRANSACTION_ALREADY_ABORTED; import static io.trino.testing.assertions.Assert.assertEventually; import static io.trino.testing.assertions.TrinoExceptionAssert.assertTrinoExceptionThrownBy; @@ -71,12 +61,10 @@ public void tearDown() @Test public void testTransactionWorkflow() { - try (IdleCheckExecutor executor = new IdleCheckExecutor()) { - CatalogManager catalogManager = new CatalogManager(); - TransactionManager transactionManager = InMemoryTransactionManager.create(new TransactionManagerConfig(), executor.getExecutor(), catalogManager, finishingExecutor); + try (LocalQueryRunner queryRunner = LocalQueryRunner.create(TEST_SESSION)) { + TransactionManager transactionManager = queryRunner.getTransactionManager(); - Connector c1 = new TpchConnectorFactory().create(CATALOG, ImmutableMap.of(), new TestingConnectorContext()); - registerConnector(catalogManager, transactionManager, CATALOG, CATALOG_NAME, c1); + queryRunner.createCatalog(CATALOG, new TpchConnectorFactory(), ImmutableMap.of()); TransactionId transactionId = transactionManager.beginTransaction(false); @@ -101,12 +89,10 @@ public void testTransactionWorkflow() @Test public void testAbortedTransactionWorkflow() { - try (IdleCheckExecutor executor = new IdleCheckExecutor()) { - CatalogManager catalogManager = new CatalogManager(); - TransactionManager transactionManager = InMemoryTransactionManager.create(new TransactionManagerConfig(), executor.getExecutor(), catalogManager, finishingExecutor); + try (LocalQueryRunner queryRunner = LocalQueryRunner.create(TEST_SESSION)) { + TransactionManager transactionManager = queryRunner.getTransactionManager(); - Connector c1 = new TpchConnectorFactory().create(CATALOG, ImmutableMap.of(), new TestingConnectorContext()); - registerConnector(catalogManager, transactionManager, CATALOG, CATALOG_NAME, c1); + queryRunner.createCatalog(CATALOG, new TpchConnectorFactory(), ImmutableMap.of()); TransactionId transactionId = transactionManager.beginTransaction(false); @@ -131,12 +117,10 @@ public void testAbortedTransactionWorkflow() @Test public void testFailedTransactionWorkflow() { - try (IdleCheckExecutor executor = new IdleCheckExecutor()) { - CatalogManager catalogManager = new CatalogManager(); - TransactionManager transactionManager = InMemoryTransactionManager.create(new TransactionManagerConfig(), executor.getExecutor(), catalogManager, finishingExecutor); + try (LocalQueryRunner queryRunner = LocalQueryRunner.create(TEST_SESSION)) { + TransactionManager transactionManager = queryRunner.getTransactionManager(); - Connector c1 = new TpchConnectorFactory().create(CATALOG, ImmutableMap.of(), new TestingConnectorContext()); - registerConnector(catalogManager, transactionManager, CATALOG, CATALOG_NAME, c1); + queryRunner.createCatalog(CATALOG, new TpchConnectorFactory(), ImmutableMap.of()); TransactionId transactionId = transactionManager.beginTransaction(false); @@ -191,32 +175,6 @@ public void testExpiration() } } - private static void registerConnector( - CatalogManager catalogManager, - TransactionManager transactionManager, - String catalogName, - CatalogName catalog, - Connector connector) - { - CatalogName systemId = createSystemTablesCatalogName(catalog); - InternalNodeManager nodeManager = new InMemoryNodeManager(); - Metadata metadata = createTestMetadataManager(catalogManager); - - catalogManager.registerCatalog(new Catalog( - catalogName, - catalog, - "test", - connector, - SecurityManagement.CONNECTOR, - createInformationSchemaCatalogName(catalog), - new InformationSchemaConnector(catalogName, nodeManager, metadata, new AllowAllAccessControl()), - systemId, - new SystemConnector( - nodeManager, - connector.getSystemTables(), - transactionId -> transactionManager.getConnectorTransaction(transactionId, catalog)))); - } - private static class IdleCheckExecutor implements Closeable { diff --git a/testing/trino-tests/src/test/java/io/trino/execution/TestConnectorEventListener.java b/testing/trino-tests/src/test/java/io/trino/execution/TestConnectorEventListener.java index badf1dc0a9b5..cc5a5701c808 100644 --- a/testing/trino-tests/src/test/java/io/trino/execution/TestConnectorEventListener.java +++ b/testing/trino-tests/src/test/java/io/trino/execution/TestConnectorEventListener.java @@ -53,7 +53,7 @@ public void setUp() @Override public Iterable getConnectorFactories() { - return ImmutableList.of(new MockConnectorFactory.Builder() + return ImmutableList.of(MockConnectorFactory.builder() .withEventListener(new TestingEventListener(generatedEvents)) .build()); } diff --git a/testing/trino-tests/src/test/java/io/trino/tests/TestDistributedEngineOnlyQueries.java b/testing/trino-tests/src/test/java/io/trino/tests/TestDistributedEngineOnlyQueries.java index 54c5da8fce9b..4ee632bfdd6f 100644 --- a/testing/trino-tests/src/test/java/io/trino/tests/TestDistributedEngineOnlyQueries.java +++ b/testing/trino-tests/src/test/java/io/trino/tests/TestDistributedEngineOnlyQueries.java @@ -15,9 +15,8 @@ import com.google.common.collect.ImmutableMap; import io.trino.Session; -import io.trino.metadata.Catalog; -import io.trino.metadata.SessionPropertyManager; -import io.trino.server.testing.TestingTrinoServer; +import io.trino.connector.MockConnectorFactory; +import io.trino.connector.MockConnectorPlugin; import io.trino.testing.DistributedQueryRunner; import io.trino.testing.QueryRunner; import io.trino.tpch.TpchTable; @@ -31,7 +30,6 @@ import static io.trino.FeaturesConfig.JoinDistributionType.BROADCAST; import static io.trino.SystemSessionProperties.ENABLE_DYNAMIC_FILTERING; import static io.trino.plugin.memory.MemoryQueryRunner.createMemoryQueryRunner; -import static io.trino.testing.TestingSession.createBogusTestingCatalog; import static io.trino.testing.assertions.Assert.assertEventually; import static io.trino.testing.sql.TestTable.randomTableSuffix; import static org.assertj.core.api.Assertions.assertThat; @@ -45,31 +43,17 @@ protected QueryRunner createQueryRunner() throws Exception { DistributedQueryRunner queryRunner = createMemoryQueryRunner(ImmutableMap.of(), TpchTable.getTables()); - addTestingCatalog(queryRunner); - return queryRunner; - } - - public static void addTestingCatalog(DistributedQueryRunner queryRunner) - { + queryRunner.getCoordinator().getSessionPropertyManager().addSystemSessionProperties(TEST_SYSTEM_PROPERTIES); try { - for (TestingTrinoServer server : queryRunner.getServers()) { - addTestingCatalog(server); - } + queryRunner.installPlugin(new MockConnectorPlugin(MockConnectorFactory.builder() + .withSessionProperties(TEST_CATALOG_PROPERTIES) + .build())); + queryRunner.createCatalog(TESTING_CATALOG, "mock"); } catch (RuntimeException e) { throw closeAllSuppress(e, queryRunner); } - } - - private static void addTestingCatalog(TestingTrinoServer server) - { - // for testing procedures and session properties - Catalog bogusTestingCatalog = createBogusTestingCatalog(TESTING_CATALOG); - server.getCatalogManager().registerCatalog(bogusTestingCatalog); - - SessionPropertyManager sessionPropertyManager = server.getSessionPropertyManager(); - sessionPropertyManager.addSystemSessionProperties(TEST_SYSTEM_PROPERTIES); - sessionPropertyManager.addConnectorSessionProperties(bogusTestingCatalog.getConnectorCatalogName(), TEST_CATALOG_PROPERTIES); + return queryRunner; } /** diff --git a/testing/trino-tests/src/test/java/io/trino/tests/TestLocalEngineOnlyQueries.java b/testing/trino-tests/src/test/java/io/trino/tests/TestLocalEngineOnlyQueries.java index 320673e9559b..6cb647b91ac1 100644 --- a/testing/trino-tests/src/test/java/io/trino/tests/TestLocalEngineOnlyQueries.java +++ b/testing/trino-tests/src/test/java/io/trino/tests/TestLocalEngineOnlyQueries.java @@ -13,13 +13,13 @@ */ package io.trino.tests; -import io.trino.connector.CatalogName; +import com.google.common.collect.ImmutableMap; +import io.trino.connector.MockConnectorFactory; import io.trino.testing.LocalQueryRunner; import io.trino.testing.QueryRunner; import org.testng.SkipException; import static io.airlift.testing.Closeables.closeAllSuppress; -import static io.trino.testing.TestingSession.createBogusTestingCatalog; public class TestLocalEngineOnlyQueries extends AbstractTestEngineOnlyQueries @@ -31,8 +31,12 @@ protected QueryRunner createQueryRunner() try { // for testing session properties queryRunner.getSessionPropertyManager().addSystemSessionProperties(TEST_SYSTEM_PROPERTIES); - queryRunner.getCatalogManager().registerCatalog(createBogusTestingCatalog(TESTING_CATALOG)); - queryRunner.getSessionPropertyManager().addConnectorSessionProperties(new CatalogName(TESTING_CATALOG), TEST_CATALOG_PROPERTIES); + queryRunner.createCatalog( + TESTING_CATALOG, + MockConnectorFactory.builder() + .withSessionProperties(TEST_CATALOG_PROPERTIES) + .build(), + ImmutableMap.of()); } catch (RuntimeException e) { throw closeAllSuppress(e, queryRunner); diff --git a/testing/trino-tests/src/test/java/io/trino/tests/TestProcedureCall.java b/testing/trino-tests/src/test/java/io/trino/tests/TestProcedureCall.java index 73641c1a0fd8..1f40918b21e5 100644 --- a/testing/trino-tests/src/test/java/io/trino/tests/TestProcedureCall.java +++ b/testing/trino-tests/src/test/java/io/trino/tests/TestProcedureCall.java @@ -14,10 +14,10 @@ package io.trino.tests; import io.trino.Session; -import io.trino.connector.CatalogName; -import io.trino.metadata.ProcedureRegistry; -import io.trino.server.testing.TestingTrinoServer; +import io.trino.connector.MockConnectorFactory; +import io.trino.connector.MockConnectorPlugin; import io.trino.testing.AbstractTestQueryFramework; +import io.trino.testing.DistributedQueryRunner; import io.trino.testing.ProcedureTester; import io.trino.testing.QueryRunner; import io.trino.testing.TestingProcedures; @@ -30,8 +30,6 @@ import java.util.List; import static io.trino.testing.TestingSession.testSessionBuilder; -import static io.trino.tests.AbstractTestEngineOnlyQueries.TESTING_CATALOG; -import static io.trino.tests.TestDistributedEngineOnlyQueries.addTestingCatalog; import static java.lang.String.format; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -42,7 +40,9 @@ public class TestProcedureCall extends AbstractTestQueryFramework { + private static final String TESTING_CATALOG = "testing_catalog"; private static final String PROCEDURE_SCHEMA = "procedure_schema"; + private ProcedureTester tester; private Session session; @@ -56,21 +56,17 @@ protected QueryRunner createQueryRunner() @BeforeClass public void setUp() { - TestingTrinoServer coordinator = getDistributedQueryRunner().getCoordinator(); - tester = coordinator.getProcedureTester(); - - // register procedures in the bogus testing catalog - addTestingCatalog(getDistributedQueryRunner()); - ProcedureRegistry procedureRegistry = coordinator.getProcedureRegistry(); - TestingProcedures procedures = new TestingProcedures(coordinator.getProcedureTester()); - procedureRegistry.addProcedures( - new CatalogName(TESTING_CATALOG), - procedures.getProcedures(PROCEDURE_SCHEMA)); - + DistributedQueryRunner queryRunner = getDistributedQueryRunner(); + tester = queryRunner.getCoordinator().getProcedureTester(); session = testSessionBuilder() .setCatalog(TESTING_CATALOG) .setSchema(PROCEDURE_SCHEMA) .build(); + + queryRunner.installPlugin(new MockConnectorPlugin(MockConnectorFactory.builder() + .withProcedures(new TestingProcedures(tester).getProcedures(PROCEDURE_SCHEMA)) + .build())); + queryRunner.createCatalog(TESTING_CATALOG, "mock"); } @AfterClass(alwaysRun = true)