You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2020/09/30 16:56:38 UTC

[isis] branch master updated: ISIS-2033: regressiontesting: improved transactional boundary tests

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 28bb0f2  ISIS-2033: regressiontesting: improved transactional boundary tests
28bb0f2 is described below

commit 28bb0f252d391a99f0714805a90fce1912310794
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Sep 30 18:56:23 2020 +0200

    ISIS-2033: regressiontesting: improved transactional boundary tests
---
 .../managed/ActionInteractionHead.java             |  26 ++++
 .../transaction/ChangedObjectsService.java         |   1 -
 .../commons/InteractionBoundaryProbe.java          | 113 +++++++++++++++
 .../InteractionTestAbstract.java                   |   4 +-
 .../entitychangemetrics/ChangedObjectsTest.java    | 153 +++++++++++++++++++++
 .../testdomain/interact/ActionInteractionTest.java |   1 +
 .../testdomain/interact/NewParameterModelTest.java |   1 +
 .../testdomain/interact/PropertyBindingTest.java   |   1 +
 .../interact/PropertyInteractionTest.java          |   1 +
 .../interact/ScalarParamNegotiationTest.java       |   1 +
 .../transactions/TransactionScopeListenerTest.java |  49 ++-----
 11 files changed, 307 insertions(+), 44 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteractionHead.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteractionHead.java
index 01b0655..ba406ad 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteractionHead.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteractionHead.java
@@ -18,9 +18,14 @@
  */
 package org.apache.isis.core.metamodel.interactions.managed;
 
+import java.util.List;
 import java.util.Objects;
 
+import javax.annotation.Nullable;
+
 import org.apache.isis.commons.collections.Can;
+import org.apache.isis.commons.internal.assertions._Assert;
+import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.core.metamodel.interactions.InteractionHead;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
@@ -66,6 +71,27 @@ implements HasMetaModel<ObjectAction> {
         .collect(Can.toCan());
     }
     
+    /**  
+     * Immutable tuple of ManagedObjects, wrapping the passed in argument pojos.
+     * Nulls are allowed as arguments, but the list size must match the expected parameter count.
+     * <p>
+     * The size of the tuple corresponds to the number of parameters.
+     * @param pojoArgList - argument pojos
+     */
+    public Can<ManagedObject> getPopulatedParameterValues(@Nullable List<Object> pojoArgList) {
+        
+        val params = getMetaModel().getParameters();
+        
+        _Assert.assertEquals(params.size(), _NullSafe.size(pojoArgList));
+        
+        if(params.isEmpty()) {
+            return Can.empty();
+        }
+        
+        return params.zipMap(pojoArgList, (objectActionParameter, argPojo)->
+            ManagedObject.of(objectActionParameter.getSpecification(), argPojo));
+    }
+    
     public ParameterNegotiationModel model(
             @NonNull Can<ManagedObject> paramValues) {
         return ParameterNegotiationModel.of(this, paramValues);
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/transaction/ChangedObjectsService.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/transaction/ChangedObjectsService.java
index f401612..ee657bc 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/transaction/ChangedObjectsService.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/transaction/ChangedObjectsService.java
@@ -30,7 +30,6 @@ import org.springframework.context.annotation.Primary;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
-import org.apache.isis.applib.annotation.IsisInteractionScope;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.annotation.PublishingChangeKind;
 import org.apache.isis.applib.services.HasUniqueId;
diff --git a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/commons/InteractionBoundaryProbe.java b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/commons/InteractionBoundaryProbe.java
new file mode 100644
index 0000000..2d20f0e
--- /dev/null
+++ b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/commons/InteractionBoundaryProbe.java
@@ -0,0 +1,113 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.testdomain.commons;
+
+import java.util.function.Supplier;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.inject.Inject;
+
+import org.junit.jupiter.api.Assertions;
+import org.springframework.stereotype.Component;
+
+import org.apache.isis.applib.annotation.IsisInteractionScope;
+import org.apache.isis.applib.services.TransactionScopeListener;
+import org.apache.isis.testdomain.util.kv.KVStoreForTesting;
+
+import lombok.val;
+
+@Component
+@IsisInteractionScope
+public class InteractionBoundaryProbe implements TransactionScopeListener {
+
+    @Inject private KVStoreForTesting kvStoreForTesting;
+
+    /** INTERACTION BEGIN BOUNDARY */
+    @PostConstruct
+    public void init() {
+        kvStoreForTesting.incrementCounter(InteractionBoundaryProbe.class, "iactnStarted");
+    }
+
+    /** INTERACTION END BOUNDARY */
+    @PreDestroy
+    public void destroy() {
+        kvStoreForTesting.incrementCounter(InteractionBoundaryProbe.class, "iactnEnded");
+    }
+
+    /** TRANSACTION BEGIN BOUNDARY */
+    @Override
+    public void onTransactionStarted() {
+        kvStoreForTesting.incrementCounter(InteractionBoundaryProbe.class, "txStarted");
+    }
+
+    /** TRANSACTION END BOUNDARY */
+    @Override
+    public void onTransactionEnded() {
+        kvStoreForTesting.incrementCounter(InteractionBoundaryProbe.class, "txEnded");
+    }
+    
+    // -- ACCESS TO COUNTERS
+    
+    public static long totalInteractionsStarted(KVStoreForTesting kvStoreForTesting) {
+        return kvStoreForTesting.getCounter(InteractionBoundaryProbe.class, "iactnStarted");
+    }
+    
+    public static long totalInteractionsEnded(KVStoreForTesting kvStoreForTesting) {
+        return kvStoreForTesting.getCounter(InteractionBoundaryProbe.class, "iactnEnded");
+    }
+
+    public static long totalTransactionsStarted(KVStoreForTesting kvStoreForTesting) {
+        return kvStoreForTesting.getCounter(InteractionBoundaryProbe.class, "txStarted");
+    }
+    
+    public static long totalTransactionsEnded(KVStoreForTesting kvStoreForTesting) {
+        return kvStoreForTesting.getCounter(InteractionBoundaryProbe.class, "txEnded");
+    }
+
+    // -- ASSERTIONS
+    
+    public static void assertTransactional(KVStoreForTesting kvStoreForTesting, Runnable runnable) {
+
+        final long txStartCountBefore = totalTransactionsStarted(kvStoreForTesting);
+        final long txEndCountBefore = totalTransactionsEnded(kvStoreForTesting);
+        runnable.run();
+        final long txStartCountAfter = totalTransactionsStarted(kvStoreForTesting);
+        final long txEndCountAfter = totalTransactionsEnded(kvStoreForTesting);
+
+        Assertions.assertEquals(1, txStartCountAfter - txStartCountBefore);
+        Assertions.assertEquals(1, txEndCountAfter - txEndCountBefore);
+    }
+    
+    public static <T> T assertTransactional(KVStoreForTesting kvStoreForTesting, Supplier<T> supplier) {
+
+        final long txStartCountBefore = totalTransactionsStarted(kvStoreForTesting);
+        final long txEndCountBefore = totalTransactionsEnded(kvStoreForTesting);
+        val result = supplier.get();
+        final long txStartCountAfter = totalTransactionsStarted(kvStoreForTesting);
+        final long txEndCountAfter = totalTransactionsEnded(kvStoreForTesting);
+
+        Assertions.assertEquals(1, txStartCountAfter - txStartCountBefore);
+        Assertions.assertEquals(1, txEndCountAfter - txEndCountBefore);
+        
+        return result;
+    }
+    
+
+}
diff --git a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/InteractionTestAbstract.java b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/commons/InteractionTestAbstract.java
similarity index 97%
rename from regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/InteractionTestAbstract.java
rename to regressiontests/stable/src/test/java/org/apache/isis/testdomain/commons/InteractionTestAbstract.java
index 53c2ee6..0b1ee9b 100644
--- a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/InteractionTestAbstract.java
+++ b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/commons/InteractionTestAbstract.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.testdomain.interact;
+package org.apache.isis.testdomain.commons;
 
 import java.util.Collections;
 import java.util.concurrent.atomic.LongAdder;
@@ -42,7 +42,7 @@ import org.apache.isis.testing.integtestsupport.applib.IsisIntegrationTestAbstra
 
 import lombok.val;
 
-abstract class InteractionTestAbstract extends IsisIntegrationTestAbstract {
+public abstract class InteractionTestAbstract extends IsisIntegrationTestAbstract {
     
     @Inject protected ObjectManager objectManager;
     @Inject protected IsisInteractionFactory interactionFactory;
diff --git a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/entitychangemetrics/ChangedObjectsTest.java b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/entitychangemetrics/ChangedObjectsTest.java
new file mode 100644
index 0000000..e0b91e5
--- /dev/null
+++ b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/entitychangemetrics/ChangedObjectsTest.java
@@ -0,0 +1,153 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.testdomain.entitychangemetrics;
+
+import javax.inject.Inject;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.context.TestPropertySource;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.services.factory.FactoryService;
+import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.applib.services.wrapper.WrapperFactory;
+import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.core.config.presets.IsisPresets;
+import org.apache.isis.testdomain.Smoketest;
+import org.apache.isis.testdomain.auditing.Configuration_usingAuditing;
+import org.apache.isis.testdomain.commons.InteractionBoundaryProbe;
+import org.apache.isis.testdomain.commons.InteractionTestAbstract;
+import org.apache.isis.testdomain.conf.Configuration_usingJdo;
+import org.apache.isis.testdomain.jdo.JdoInventoryManager;
+import org.apache.isis.testdomain.jdo.JdoTestDomainPersona;
+import org.apache.isis.testdomain.jdo.entities.JdoBook;
+import org.apache.isis.testdomain.jdo.entities.JdoProduct;
+import org.apache.isis.testdomain.util.kv.KVStoreForTesting;
+import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
+
+import static org.apache.isis.testdomain.commons.InteractionBoundaryProbe.assertTransactional;
+
+import lombok.val;
+
+@Smoketest
+@SpringBootTest(
+        classes = {
+                Configuration_usingJdo.class,
+                Configuration_usingAuditing.class,
+                InteractionBoundaryProbe.class
+        }, 
+        properties = {
+                "logging.level.org.apache.isis.testdomain.util.rest.KVStoreForTesting=DEBUG"
+        })
+@TestPropertySource({
+    IsisPresets.SilenceWicket
+    ,IsisPresets.UseLog4j2Test
+})
+class ChangedObjectsTest extends InteractionTestAbstract {
+    
+    @Inject private RepositoryService repository;
+    @Inject private FixtureScripts fixtureScripts;
+    @Inject private WrapperFactory wrapper;
+    @Inject private FactoryService factoryService;
+    @Inject private KVStoreForTesting kvStoreForTesting;
+
+    @Configuration
+    public class Config {
+        // so that we get a new ApplicationContext.
+    }
+
+    @BeforeEach
+    void setUp() {
+
+        // cleanup
+        fixtureScripts.runPersona(JdoTestDomainPersona.PurgeAll);
+        
+        // given
+        fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book);
+
+    }
+    
+    @Test
+    void wrapperInvocation_shouldSpawnSingleTransaction() {
+        
+        // given
+        val inventoryManager = factoryService.create(JdoInventoryManager.class);
+        
+        // spawns its own transactional boundary (check)
+        val book = assertTransactional(kvStoreForTesting, this::getBookSample);
+        
+        // spawns its own transactional boundary (check)
+        val product = assertTransactional(kvStoreForTesting, 
+                ()->wrapper.wrap(inventoryManager).updateProductPrice(book, 12.));
+        
+        assertEquals(12., product.getPrice(), 1E-3);
+    }
+
+    @Test 
+    void actionInteraction_shouldSpawnSingleTransaction() {
+
+        val managedAction = startActionInteractionOn(
+                JdoInventoryManager.class, 
+                "updateProductPrice", 
+                Where.OBJECT_FORMS)
+                .getManagedAction().get(); // should not throw  
+
+        assertFalse(managedAction.checkVisibility().isPresent()); // is visible
+        assertFalse(managedAction.checkUsability().isPresent()); // can invoke
+        
+        // spawns its own transactional boundary (check)
+        val book = assertTransactional(
+                kvStoreForTesting, 
+                this::getBookSample);
+        
+        val args = managedAction.getInteractionHead()
+                .getPopulatedParameterValues(_Lists.of(book, 12.));
+        
+        // spawns its own transactional boundary (check) 
+        val either = assertTransactional(kvStoreForTesting, ()->managedAction.invoke(args));
+        
+        assertTrue(either.isLeft());
+        
+        val product = (JdoProduct)either.leftIfAny().getPojo();
+        
+        assertEquals(12., product.getPrice(), 1E-3);
+        
+    }
+    
+    // -- HELPER
+    
+    private JdoBook getBookSample() {
+        val books = repository.allInstances(JdoBook.class);
+        assertEquals(1, books.size());
+        val book = books.listIterator().next();
+        return book;
+    }
+
+
+}
+
+
+
diff --git a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/ActionInteractionTest.java b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/ActionInteractionTest.java
index 4b5232f..b311eda 100644
--- a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/ActionInteractionTest.java
+++ b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/ActionInteractionTest.java
@@ -31,6 +31,7 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.config.presets.IsisPresets;
 import org.apache.isis.testdomain.Smoketest;
+import org.apache.isis.testdomain.commons.InteractionTestAbstract;
 import org.apache.isis.testdomain.conf.Configuration_headless;
 import org.apache.isis.testdomain.model.interaction.Configuration_usingInteractionDomain;
 import org.apache.isis.testdomain.model.interaction.DemoEnum;
diff --git a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/NewParameterModelTest.java b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/NewParameterModelTest.java
index 5e23827..d0767a5 100644
--- a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/NewParameterModelTest.java
+++ b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/NewParameterModelTest.java
@@ -35,6 +35,7 @@ import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.testdomain.Smoketest;
+import org.apache.isis.testdomain.commons.InteractionTestAbstract;
 import org.apache.isis.testdomain.conf.Configuration_headless;
 import org.apache.isis.testdomain.model.interaction.Configuration_usingInteractionDomain;
 import org.apache.isis.testdomain.model.interaction.InteractionDemo_biArgEnabled;
diff --git a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/PropertyBindingTest.java b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/PropertyBindingTest.java
index 7e9c13d..24a00cd 100644
--- a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/PropertyBindingTest.java
+++ b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/PropertyBindingTest.java
@@ -14,6 +14,7 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.config.presets.IsisPresets;
 import org.apache.isis.core.metamodel.interactions.managed.PropertyNegotiationModel;
 import org.apache.isis.testdomain.Smoketest;
+import org.apache.isis.testdomain.commons.InteractionTestAbstract;
 import org.apache.isis.testdomain.conf.Configuration_headless;
 import org.apache.isis.testdomain.model.interaction.Configuration_usingInteractionDomain;
 import org.apache.isis.testdomain.model.interaction.InteractionDemo;
diff --git a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/PropertyInteractionTest.java b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/PropertyInteractionTest.java
index 32fd7ac..0136070 100644
--- a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/PropertyInteractionTest.java
+++ b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/PropertyInteractionTest.java
@@ -32,6 +32,7 @@ import org.apache.isis.core.config.presets.IsisPresets;
 import org.apache.isis.core.metamodel.facets.objectvalue.labelat.LabelAtFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.multiline.MultiLineFacet;
 import org.apache.isis.testdomain.Smoketest;
+import org.apache.isis.testdomain.commons.InteractionTestAbstract;
 import org.apache.isis.testdomain.conf.Configuration_headless;
 import org.apache.isis.testdomain.model.interaction.Configuration_usingInteractionDomain;
 import org.apache.isis.testdomain.model.interaction.InteractionDemo;
diff --git a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/ScalarParamNegotiationTest.java b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/ScalarParamNegotiationTest.java
index bd9c5e1..bd5613b 100644
--- a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/ScalarParamNegotiationTest.java
+++ b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/interact/ScalarParamNegotiationTest.java
@@ -31,6 +31,7 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.config.presets.IsisPresets;
 import org.apache.isis.core.metamodel.interactions.managed.ParameterNegotiationModel;
 import org.apache.isis.testdomain.Smoketest;
+import org.apache.isis.testdomain.commons.InteractionTestAbstract;
 import org.apache.isis.testdomain.conf.Configuration_headless;
 import org.apache.isis.testdomain.model.interaction.Configuration_usingInteractionDomain;
 import org.apache.isis.testdomain.model.interaction.InteractionDemo;
diff --git a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/TransactionScopeListenerTest.java b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/TransactionScopeListenerTest.java
index 73eddb9..cf652a0 100644
--- a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/TransactionScopeListenerTest.java
+++ b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/transactions/TransactionScopeListenerTest.java
@@ -18,25 +18,21 @@
  */
 package org.apache.isis.testdomain.transactions;
 
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.stereotype.Service;
 import org.springframework.test.context.TestPropertySource;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-import org.apache.isis.applib.annotation.IsisInteractionScope;
-import org.apache.isis.applib.services.TransactionScopeListener;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.core.config.presets.IsisPresets;
 import org.apache.isis.core.runtime.iactn.IsisInteractionFactory;
 import org.apache.isis.testdomain.Smoketest;
+import org.apache.isis.testdomain.commons.InteractionBoundaryProbe;
 import org.apache.isis.testdomain.conf.Configuration_usingJdo;
 import org.apache.isis.testdomain.jdo.JdoTestDomainPersona;
 import org.apache.isis.testdomain.jdo.entities.JdoBook;
@@ -47,7 +43,7 @@ import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
 @SpringBootTest(
         classes = { 
                 Configuration_usingJdo.class,
-                TransactionScopeListenerTest.IsisInteractionScopedProbe.class
+                InteractionBoundaryProbe.class
         })
 @TestPropertySource(IsisPresets.UseLog4j2Test)
 /**
@@ -62,37 +58,14 @@ class TransactionScopeListenerTest {
     @Inject private KVStoreForTesting kvStoreForTesting;
     
     /* Expectations:
-     * 1. for each IsisInteractionScope there should be a new IsisInteractionScopedProbe instance
-     * 2. for each Transaction the current IsisInteractionScopedProbe should get notified
+     * 1. for each IsisInteractionScope there should be a new InteractionBoundaryProbe instance
+     * 2. for each Transaction the current InteractionBoundaryProbe should get notified
      * 
      * first we have 1 IsisInteractionScope with 1 expected Transaction during 'setUp'
      * then we have 1 IsisInteractionScope with 3 expected Transactions within the test method
      *  
      */
     
-    @Service
-    @IsisInteractionScope
-    public static class IsisInteractionScopedProbe implements TransactionScopeListener {
-
-        @Inject private KVStoreForTesting kvStoreForTesting;
-        
-        @PostConstruct
-        public void init() {
-            kvStoreForTesting.incrementCounter(IsisInteractionScopedProbe.class, "init");
-        }
-        
-        @PreDestroy
-        public void destroy() {
-            kvStoreForTesting.incrementCounter(IsisInteractionScopedProbe.class, "destroy");
-        }
-        
-        @Override
-        public void onTransactionEnded() {
-            kvStoreForTesting.incrementCounter(IsisInteractionScopedProbe.class, "tx");
-        }
-        
-    }
-    
     @BeforeEach
     void setUp() {
         
@@ -104,7 +77,6 @@ class TransactionScopeListenerTest {
             
         });
         
-        
     }
     
     @Test
@@ -130,17 +102,12 @@ class TransactionScopeListenerTest {
             
         });
         
-        long totalTransactions = kvStoreForTesting.getCounter(IsisInteractionScopedProbe.class, "tx");
-        long totalSessionScopesInitialized = kvStoreForTesting.getCounter(IsisInteractionScopedProbe.class, "init");
-        long totalSessionScopesDestroyed = kvStoreForTesting.getCounter(IsisInteractionScopedProbe.class, "destroy");
-        
-        assertEquals(4, totalTransactions);
-        assertEquals(2, totalSessionScopesInitialized);
-        assertEquals(2, totalSessionScopesDestroyed);
+        assertEquals(2, InteractionBoundaryProbe.totalInteractionsStarted(kvStoreForTesting));
+        assertEquals(2, InteractionBoundaryProbe.totalInteractionsEnded(kvStoreForTesting));
+        assertEquals(4, InteractionBoundaryProbe.totalTransactionsStarted(kvStoreForTesting));
+        assertEquals(4, InteractionBoundaryProbe.totalTransactionsEnded(kvStoreForTesting));
 
     }
     
 
-    
-
 }