From cecdc3c44012bb241457c32a75681f0fc749ba3d Mon Sep 17 00:00:00 2001 From: Giuseppe Villani Date: Mon, 28 Nov 2022 11:05:08 +0100 Subject: [PATCH] try solving flaky tests --- .../src/test/java/apoc/cypher/CypherTest.java | 15 ++++---------- .../test/java/apoc/periodic/PeriodicTest.java | 2 +- .../java/apoc/util/TransactionTestUtil.java | 20 +++++++++++++------ 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/core/src/test/java/apoc/cypher/CypherTest.java b/core/src/test/java/apoc/cypher/CypherTest.java index 3f7c96a88..9636e3424 100644 --- a/core/src/test/java/apoc/cypher/CypherTest.java +++ b/core/src/test/java/apoc/cypher/CypherTest.java @@ -172,7 +172,7 @@ public void testRunTimeboxedWithTerminationInnerTransaction() { final String innerLongQuery = "CALL apoc.util.sleep(10999) RETURN 0"; final String query = "CALL apoc.cypher.runTimeboxed($innerQuery, null, 99999)"; - terminateTransactionAsync(db, innerLongQuery); + terminateTransactionAsync(db, 10L, innerLongQuery); // assert query terminated (RETURN 0) TestUtil.testCall(db, query, @@ -183,19 +183,12 @@ public void testRunTimeboxedWithTerminationInnerTransaction() { } @Test - public void testRunAndDoItWithTermination() { + public void testRunAndDoItUnwindSleepWithTermination() { final String queryRun = "CALL apoc.cypher.run('unwind range (0, 99) as id CALL apoc.util.sleep(2000) return 0', {})"; checkTerminationGuard(db, queryRun); - - final String queryDoIt = "CALL apoc.cypher.run('unwind range (0, 99) as id CALL apoc.util.sleep(2000) return 0', {})"; - checkTerminationGuard(db, queryDoIt); - - final String queryRunLongSleep = "CALL apoc.cypher.run('CALL apoc.util.sleep(20000) return 0', {})"; - checkTerminationGuard(db, queryRunLongSleep); - final String queryDoItLongSleep = "CALL apoc.cypher.doIt('CALL apoc.util.sleep(20000) return 0', {})"; - checkTerminationGuard(db, queryDoItLongSleep); - + final String queryDoIt = "CALL apoc.cypher.doIt('unwind range (0, 99) as id CALL apoc.util.sleep(2000) return 0', {})"; + checkTerminationGuard(db, queryDoIt); } @Test diff --git a/core/src/test/java/apoc/periodic/PeriodicTest.java b/core/src/test/java/apoc/periodic/PeriodicTest.java index 7bf0981c6..33248f683 100644 --- a/core/src/test/java/apoc/periodic/PeriodicTest.java +++ b/core/src/test/java/apoc/periodic/PeriodicTest.java @@ -249,7 +249,7 @@ public void testWithTerminationInnerTransaction() { assertEquals(0L, actual); }); fail("Should have terminated"); - } catch (TransactionStatusFailureException e) { + } catch (Exception e) { assertEquals("Unable to complete transaction.: Explicitly terminated by the user.", e.getMessage()); } diff --git a/test-utils/src/main/java/apoc/util/TransactionTestUtil.java b/test-utils/src/main/java/apoc/util/TransactionTestUtil.java index 9e65d21b3..aa65ba39b 100644 --- a/test-utils/src/main/java/apoc/util/TransactionTestUtil.java +++ b/test-utils/src/main/java/apoc/util/TransactionTestUtil.java @@ -9,6 +9,9 @@ import java.util.concurrent.TimeUnit; import static apoc.util.MapUtil.map; +import static apoc.util.TestUtil.testCall; +import static apoc.util.TestUtil.testCallCount; +import static apoc.util.TestUtil.testResult; import static java.util.Collections.emptyMap; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -17,7 +20,8 @@ public class TransactionTestUtil { public static final String TRANSACTION_LIST = "SHOW TRANSACTIONS"; - + private static final long DEF_TIMEOUT = 10L; + public static void checkTerminationGuard(GraphDatabaseService db, String query) { checkTerminationGuard(db, query, emptyMap()); } @@ -27,11 +31,11 @@ public static void checkTerminationGuard(GraphDatabaseService db, long timeout, } public static void checkTerminationGuard(GraphDatabaseService db, String query, Map params) { - checkTerminationGuard(db, 10L, query, params); + checkTerminationGuard(db, DEF_TIMEOUT, query, params); } public static void checkTerminationGuard(GraphDatabaseService db, long timeout, String query, Map params) { - terminateTransactionAsync(db, query); + terminateTransactionAsync(db, timeout, query); // check that the procedure/function fails with TransactionFailureException when transaction is terminated try(Transaction transaction = db.beginTx(timeout, TimeUnit.SECONDS)) { @@ -50,7 +54,7 @@ public static void checkTerminationGuard(GraphDatabaseService db, long timeout, public static void checkTransactionNotInList(GraphDatabaseService db, String query) { // checking for query cancellation from transaction list command - TestUtil.testResult(db, TRANSACTION_LIST, + testResult(db, TRANSACTION_LIST, map("query", query), result -> { final boolean currentQuery = result.columnAs("currentQuery") @@ -61,6 +65,10 @@ public static void checkTransactionNotInList(GraphDatabaseService db, String que } public static void terminateTransactionAsync(GraphDatabaseService db, String query) { + terminateTransactionAsync(db, DEF_TIMEOUT, query); + } + + public static void terminateTransactionAsync(GraphDatabaseService db, long timeout, String query) { new Thread(() -> { // waiting for apoc query to cancel when it is found final String[] transactionId = new String[1]; @@ -76,9 +84,9 @@ public static void terminateTransactionAsync(GraphDatabaseService db, String que } transactionId[0] = msgIterator.next(); return transactionId[0] != null; - }), (value) -> value, 5L, TimeUnit.SECONDS); + }), (value) -> value, timeout, TimeUnit.SECONDS); - TestUtil.testCall(db, "TERMINATE TRANSACTION $transactionId", + testCall(db, "TERMINATE TRANSACTION $transactionId", map("transactionId", transactionId[0]), result -> assertEquals("Transaction terminated.", result.get("message"))); }).start();