Skip to content

Commit

Permalink
try solving flaky tests
Browse files Browse the repository at this point in the history
  • Loading branch information
vga91 committed Nov 28, 2022
1 parent c22043b commit cecdc3c
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 18 deletions.
15 changes: 4 additions & 11 deletions core/src/test/java/apoc/cypher/CypherTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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
Expand Down
2 changes: 1 addition & 1 deletion core/src/test/java/apoc/periodic/PeriodicTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}

Expand Down
20 changes: 14 additions & 6 deletions test-utils/src/main/java/apoc/util/TransactionTestUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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());
}
Expand All @@ -27,11 +31,11 @@ public static void checkTerminationGuard(GraphDatabaseService db, long timeout,
}

public static void checkTerminationGuard(GraphDatabaseService db, String query, Map<String, Object> params) {
checkTerminationGuard(db, 10L, query, params);
checkTerminationGuard(db, DEF_TIMEOUT, query, params);
}

public static void checkTerminationGuard(GraphDatabaseService db, long timeout, String query, Map<String, Object> 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)) {
Expand All @@ -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")
Expand All @@ -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];
Expand All @@ -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();
Expand Down

0 comments on commit cecdc3c

Please sign in to comment.