This is an automated email from the ASF dual-hosted git repository. asf-gitbox-commits pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit 18d55895b89e8f0600c6101712e238787f34c22c Author: Andrus Adamchik <[email protected]> AuthorDate: Thu May 14 10:40:24 2026 -0400 tests cleanup - unwinding DI intercepting query telemetry at the DataNode level, no subclassing of DataDomain --- .../org/apache/cayenne/access/UnitTestDomain.java | 61 ------------------- .../cayenne/access/UnitTestDomainQueryAction.java | 60 ------------------- .../org/apache/cayenne/unit/CayenneTestEnvIT.java | 69 ++++++++++++++++++++++ .../org/apache/cayenne/unit/CayenneTestsEnv.java | 4 +- .../unit/RuntimeCaseDataDomainProvider.java | 6 -- .../org/apache/cayenne/unit/RuntimeTelemetry.java | 22 ++++--- ...eCaseDataNode.java => CayenneTestDataNode.java} | 15 ++++- ...actory.java => CayenneTestDataNodeFactory.java} | 6 +- 8 files changed, 100 insertions(+), 143 deletions(-) diff --git a/cayenne/src/test/java/org/apache/cayenne/access/UnitTestDomain.java b/cayenne/src/test/java/org/apache/cayenne/access/UnitTestDomain.java deleted file mode 100644 index 5f5ce1474..000000000 --- a/cayenne/src/test/java/org/apache/cayenne/access/UnitTestDomain.java +++ /dev/null @@ -1,61 +0,0 @@ -/***************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - ****************************************************************/ - -package org.apache.cayenne.access; - -import org.apache.cayenne.ObjectContext; -import org.apache.cayenne.QueryResponse; -import org.apache.cayenne.query.Query; -import org.junit.jupiter.api.Assertions; -import org.opentest4j.AssertionFailedError; - -import java.util.Collection; - -public class UnitTestDomain extends DataDomain { - - private boolean blockingQueries; - - public UnitTestDomain(String name) { - super(name); - } - - public void setBlockingQueries(boolean blockingQueries) { - this.blockingQueries = blockingQueries; - } - - @Override - QueryResponse onQueryNoFilters(ObjectContext originatingContext, Query query) { - return new UnitTestDomainQueryAction(originatingContext, this, query).execute(); - } - - @Override - public void performQueries( - Collection<? extends Query> queries, - OperationObserver callback) { - checkQueryAllowed(queries); - super.performQueries(queries, callback); - } - - public void checkQueryAllowed(Collection<? extends Query> queries) - throws AssertionFailedError { - if (blockingQueries) { - Assertions.fail("Query is unexpected: " + queries); - } - } -} diff --git a/cayenne/src/test/java/org/apache/cayenne/access/UnitTestDomainQueryAction.java b/cayenne/src/test/java/org/apache/cayenne/access/UnitTestDomainQueryAction.java deleted file mode 100644 index 2c50c923c..000000000 --- a/cayenne/src/test/java/org/apache/cayenne/access/UnitTestDomainQueryAction.java +++ /dev/null @@ -1,60 +0,0 @@ -/***************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - ****************************************************************/ - -package org.apache.cayenne.access; - -import java.util.Collection; -import java.util.Collections; - -import org.opentest4j.AssertionFailedError; - -import org.apache.cayenne.ObjectContext; -import org.apache.cayenne.QueryResponse; -import org.apache.cayenne.query.Query; - -/** - * A DataDomainQueryAction that can be configured to block queries that are not run from - * cache. - */ -public class UnitTestDomainQueryAction extends DataDomainQueryAction { - - public UnitTestDomainQueryAction(ObjectContext context, UnitTestDomain domain, - Query query) { - super(context, domain, query); - } - - /** - * Exposing super as a public method. - */ - @Override - public QueryResponse execute() { - return super.execute(); - } - - @Override - void runQueryInTransaction() { - checkQueryAllowed(Collections.singleton(query)); - super.runQueryInTransaction(); - } - - protected void checkQueryAllowed(Collection<? extends Query> queries) - throws AssertionFailedError { - ((UnitTestDomain) domain).checkQueryAllowed(queries); - } -} diff --git a/cayenne/src/test/java/org/apache/cayenne/unit/CayenneTestEnvIT.java b/cayenne/src/test/java/org/apache/cayenne/unit/CayenneTestEnvIT.java new file mode 100644 index 000000000..72c177d18 --- /dev/null +++ b/cayenne/src/test/java/org/apache/cayenne/unit/CayenneTestEnvIT.java @@ -0,0 +1,69 @@ +/***************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ****************************************************************/ +package org.apache.cayenne.unit; + +import org.apache.cayenne.query.ObjectSelect; +import org.apache.cayenne.test.jdbc.TableHelper; +import org.apache.cayenne.testdo.testmap.Artist; +import org.apache.cayenne.unit.runtime.CayenneProjects; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.opentest4j.AssertionFailedError; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** + * Self-test for CayenneTestsEnv + */ +public class CayenneTestEnvIT { + + @RegisterExtension + static final CayenneTestsEnv env = CayenneTestsEnv.forProject(CayenneProjects.TESTMAP_PROJECT); + + private TableHelper tArtist; + + @BeforeEach + public void setUp() { + tArtist = env.table("ARTIST", "ARTIST_ID", "ARTIST_NAME"); + } + + @Test + public void blockingQueries_failsOnUncachedSelect() throws Exception { + tArtist.insert(1, "a1"); + + assertThrows(AssertionFailedError.class, + () -> env.runWithQueriesBlocked( + () -> ObjectSelect.query(Artist.class).select(env.context()))); + } + + @Test + public void blockingQueries_resetsAfterTaskThrows() throws Exception { + tArtist.insert(1, "a1"); + + assertThrows(RuntimeException.class, + () -> env.runWithQueriesBlocked(() -> { + throw new RuntimeException("boom"); + })); + + // flag must have been cleared by the finally block in RuntimeTelemetry + assertDoesNotThrow(() -> ObjectSelect.query(Artist.class).select(env.context())); + } +} diff --git a/cayenne/src/test/java/org/apache/cayenne/unit/CayenneTestsEnv.java b/cayenne/src/test/java/org/apache/cayenne/unit/CayenneTestsEnv.java index 1dce598ec..0d9fcc0cb 100644 --- a/cayenne/src/test/java/org/apache/cayenne/unit/CayenneTestsEnv.java +++ b/cayenne/src/test/java/org/apache/cayenne/unit/CayenneTestsEnv.java @@ -42,7 +42,7 @@ import org.apache.cayenne.unit.dba.UnitDbAdapter; import org.apache.cayenne.unit.runtime.AllTestsSchemaManager; import org.apache.cayenne.unit.runtime.DbCleaner; import org.apache.cayenne.unit.runtime.FlavoredDbHelper; -import org.apache.cayenne.unit.runtime.RuntimeCaseDataNodeFactory; +import org.apache.cayenne.unit.runtime.CayenneTestDataNodeFactory; import org.apache.cayenne.unit.runtime.RuntimeCaseDataSourceFactory; import org.apache.cayenne.unit.runtime.RuntimeCaseModule; import org.apache.cayenne.unit.util.SQLTemplateCustomizer; @@ -265,7 +265,7 @@ public class CayenneTestsEnv implements BeforeEachCallback, AfterEachCallback { binder.bind(DbAdapter.class).toProviderInstance(() -> INJECTOR.getInstance(DbAdapter.class)); binder.bind(DataDomain.class).toProviderInstance(new RuntimeCaseDataDomainProvider(unitDbAdapter)); - binder.bind(DataNodeFactory.class).to(RuntimeCaseDataNodeFactory.class); + binder.bind(DataNodeFactory.class).to(CayenneTestDataNodeFactory.class); binder.bind(UnitDbAdapter.class).toInstance(unitDbAdapter); binder.bind(RuntimeCaseDataSourceFactory.class).toInstance(DATA_SOURCE_FACTORY); diff --git a/cayenne/src/test/java/org/apache/cayenne/unit/RuntimeCaseDataDomainProvider.java b/cayenne/src/test/java/org/apache/cayenne/unit/RuntimeCaseDataDomainProvider.java index b56ff33a5..be85adf71 100644 --- a/cayenne/src/test/java/org/apache/cayenne/unit/RuntimeCaseDataDomainProvider.java +++ b/cayenne/src/test/java/org/apache/cayenne/unit/RuntimeCaseDataDomainProvider.java @@ -20,7 +20,6 @@ package org.apache.cayenne.unit; import org.apache.cayenne.access.DataDomain; import org.apache.cayenne.access.DataNode; -import org.apache.cayenne.access.UnitTestDomain; import org.apache.cayenne.configuration.DataNodeDescriptor; import org.apache.cayenne.configuration.runtime.DataDomainProvider; import org.apache.cayenne.configuration.runtime.DataNodeFactory; @@ -38,11 +37,6 @@ class RuntimeCaseDataDomainProvider extends DataDomainProvider { // super fields are initialized via injection } - @Override - protected DataDomain createDataDomain(String name) { - return new UnitTestDomain(name); - } - @Override protected DataDomain createAndInitDataDomain() throws Exception { diff --git a/cayenne/src/test/java/org/apache/cayenne/unit/RuntimeTelemetry.java b/cayenne/src/test/java/org/apache/cayenne/unit/RuntimeTelemetry.java index 26ade9896..2f94d02fa 100644 --- a/cayenne/src/test/java/org/apache/cayenne/unit/RuntimeTelemetry.java +++ b/cayenne/src/test/java/org/apache/cayenne/unit/RuntimeTelemetry.java @@ -18,27 +18,27 @@ ****************************************************************/ package org.apache.cayenne.unit; -import org.apache.cayenne.access.DataDomain; -import org.apache.cayenne.access.UnitTestDomain; +import org.apache.cayenne.access.DataNode; import org.apache.cayenne.runtime.CayenneRuntime; -import org.apache.cayenne.unit.runtime.RuntimeCaseDataNode; +import org.apache.cayenne.unit.runtime.CayenneTestDataNode; + +import java.util.Collection; class RuntimeTelemetry { public static void runWithQueriesBlocked(CayenneRuntime runtime, Runnable task) { - UnitTestDomain channel = (UnitTestDomain) runtime.getChannel(); - channel.setBlockingQueries(true); + Collection<DataNode> nodes = runtime.getDataDomain().getDataNodes(); + setBlockingQueries(nodes, true); try { task.run(); } finally { - channel.setBlockingQueries(false); + setBlockingQueries(nodes, false); } } public static int runWithQueryCounter(CayenneRuntime runtime, Runnable task) { - DataDomain channel = (DataDomain) runtime.getChannel(); - RuntimeCaseDataNode node = (RuntimeCaseDataNode) channel.getDataNodes().iterator().next(); + CayenneTestDataNode node = (CayenneTestDataNode) runtime.getDataDomain().getDataNodes().iterator().next(); int start = node.getQueriesCount(); int end; @@ -49,4 +49,10 @@ class RuntimeTelemetry { } return end - start; } + + private static void setBlockingQueries(Collection<DataNode> nodes, boolean blocking) { + for (DataNode node : nodes) { + ((CayenneTestDataNode) node).setBlockingQueries(blocking); + } + } } diff --git a/cayenne/src/test/java/org/apache/cayenne/unit/runtime/RuntimeCaseDataNode.java b/cayenne/src/test/java/org/apache/cayenne/unit/runtime/CayenneTestDataNode.java similarity index 76% rename from cayenne/src/test/java/org/apache/cayenne/unit/runtime/RuntimeCaseDataNode.java rename to cayenne/src/test/java/org/apache/cayenne/unit/runtime/CayenneTestDataNode.java index c00dac3b5..29e7f1956 100644 --- a/cayenne/src/test/java/org/apache/cayenne/unit/runtime/RuntimeCaseDataNode.java +++ b/cayenne/src/test/java/org/apache/cayenne/unit/runtime/CayenneTestDataNode.java @@ -21,20 +21,25 @@ package org.apache.cayenne.unit.runtime; import org.apache.cayenne.access.DataNode; import org.apache.cayenne.access.OperationObserver; import org.apache.cayenne.query.Query; +import org.junit.jupiter.api.Assertions; import java.util.Collection; import java.util.concurrent.atomic.AtomicInteger; -public class RuntimeCaseDataNode extends DataNode { +public class CayenneTestDataNode extends DataNode { - AtomicInteger queryCounter = new AtomicInteger(); + private final AtomicInteger queryCounter = new AtomicInteger(); + private volatile boolean blockingQueries; - public RuntimeCaseDataNode(String name) { + public CayenneTestDataNode(String name) { super(name); } @Override public void performQueries(Collection<? extends Query> queries, OperationObserver callback) { + if (blockingQueries) { + Assertions.fail("Query is unexpected: " + queries); + } super.performQueries(queries, callback); queryCounter.addAndGet(queries.size()); } @@ -42,4 +47,8 @@ public class RuntimeCaseDataNode extends DataNode { public int getQueriesCount() { return queryCounter.get(); } + + public void setBlockingQueries(boolean blockingQueries) { + this.blockingQueries = blockingQueries; + } } diff --git a/cayenne/src/test/java/org/apache/cayenne/unit/runtime/RuntimeCaseDataNodeFactory.java b/cayenne/src/test/java/org/apache/cayenne/unit/runtime/CayenneTestDataNodeFactory.java similarity index 94% rename from cayenne/src/test/java/org/apache/cayenne/unit/runtime/RuntimeCaseDataNodeFactory.java rename to cayenne/src/test/java/org/apache/cayenne/unit/runtime/CayenneTestDataNodeFactory.java index 21d0a0065..321ffc3a2 100644 --- a/cayenne/src/test/java/org/apache/cayenne/unit/runtime/RuntimeCaseDataNodeFactory.java +++ b/cayenne/src/test/java/org/apache/cayenne/unit/runtime/CayenneTestDataNodeFactory.java @@ -30,7 +30,7 @@ import org.apache.cayenne.dba.DbAdapter; import org.apache.cayenne.di.Inject; import org.apache.cayenne.log.JdbcEventLogger; -public class RuntimeCaseDataNodeFactory implements DataNodeFactory { +public class CayenneTestDataNodeFactory implements DataNodeFactory { @Inject private JdbcEventLogger jdbcEventLogger; @@ -54,8 +54,8 @@ public class RuntimeCaseDataNodeFactory implements DataNodeFactory { protected SQLTemplateProcessor sqlTemplateProcessor; @Override - public DataNode createDataNode(DataNodeDescriptor nodeDescriptor) throws Exception { - DataNode dataNode = new RuntimeCaseDataNode(nodeDescriptor.getName()); + public DataNode createDataNode(DataNodeDescriptor nodeDescriptor) { + DataNode dataNode = new CayenneTestDataNode(nodeDescriptor.getName()); dataNode.setJdbcEventLogger(jdbcEventLogger); dataNode.setRowReaderFactory(rowReaderFactory);
