diff --git a/CHANGELOG b/CHANGELOG index 52dc31f2b..554e9cf0f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +2.1.8: + - (MichaelA-ops) Fix bug where order of transformer tests is incorrect. 2.1.7: - (cmeiklejohn) Fix bug where UX incorrectly displayed HTTP errors as warnings. - (cmeiklejohn) Remove HTTP transformer fault support due to incompatibility with HTTP chunking. diff --git a/build.gradle b/build.gradle index 744cc9cf0..68aff516d 100644 --- a/build.gradle +++ b/build.gradle @@ -239,7 +239,7 @@ javadoc { group = "cloud.filibuster" archivesBaseName = "instrumentation" -version = "2.1.7" +version = "2.1.8" java { withJavadocJar() diff --git a/src/main/java/cloud/filibuster/junit/server/core/FilibusterCore.java b/src/main/java/cloud/filibuster/junit/server/core/FilibusterCore.java index 8bec83bc2..73c034231 100644 --- a/src/main/java/cloud/filibuster/junit/server/core/FilibusterCore.java +++ b/src/main/java/cloud/filibuster/junit/server/core/FilibusterCore.java @@ -309,7 +309,7 @@ public synchronized JSONObject beginInvocation(JSONObject payload) { setNextAccumulator(newFaultObject.getJSONObject("transformer_fault"), transformationResult.getNextAccumulator()); generateAndSetTransformerValue(newFaultObject.getJSONObject("transformer_fault")); - createAndScheduleAbstractTestExecution(filibusterConfiguration, distributedExecutionIndex, newFaultObject); + createAndScheduleAbstractTestExecution(filibusterConfiguration, distributedExecutionIndex, newFaultObject, /* isScheduledByTransformer= */true); } logger.info("[FILIBUSTER-CORE]: beginInvocation, injecting faults using transformer_fault: " + transformerFaultObject.toString(4)); @@ -469,7 +469,7 @@ private void generateByzantineAndTransformerFaults(JSONObject payload, Distribut initialAccumulator ); generateAndSetTransformerValue(handledTransformer.getJSONObject("transformer_fault")); - createAndScheduleAbstractTestExecution(filibusterConfiguration, distributedExecutionIndex, new JSONObject(handledTransformer.toMap())); + createAndScheduleAbstractTestExecution(filibusterConfiguration, distributedExecutionIndex, new JSONObject(handledTransformer.toMap()), /* isScheduledByTransformer= */false); } catch (Throwable e) { logger.warning("[FILIBUSTER-CORE]: generateByzantineAndTransformerFaults, an exception occurred in generateByzantineAndTransformerFaults: " + e); throw new FilibusterFaultInjectionException("[FILIBUSTER-CORE]: generateByzantineAndTransformerFaults: ", e); @@ -481,7 +481,7 @@ private void generateByzantineAndTransformerFaults(JSONObject payload, Distribut List byzantineFaultObjects = filibusterAnalysisConfiguration.getByzantineFaultObjects(); for (JSONObject faultObject : byzantineFaultObjects) { - createAndScheduleAbstractTestExecution(filibusterConfiguration, distributedExecutionIndex, faultObject); + createAndScheduleAbstractTestExecution(filibusterConfiguration, distributedExecutionIndex, faultObject, /* isScheduledByTransformer= */false); } } } @@ -655,14 +655,14 @@ public synchronized void teardownsCompleted(int currentIteration) { // Don't add to explored queue if it's already there. numberOfAbstractExecutionsExecuted++; - exploredTestExecutions.addTestExecution(currentAbstractTestExecution); + exploredTestExecutions.addTestExecution(currentAbstractTestExecution, /* isScheduledByTransformer= */false); } else { logger.severe("[FILIBUSTER-CORE]: teardownsCompleted called, currentAbstractTestExecution already exists in the explored queue, this could indicate a problem in Filibuster."); } } if (!exploredTestExecutions.containsTestExecution(currentConcreteTestExecution)) { - exploredTestExecutions.addTestExecution(currentConcreteTestExecution); + exploredTestExecutions.addTestExecution(currentConcreteTestExecution, /* isScheduledByTransformer= */false); } numberOfConcreteExecutionsExecuted++; @@ -1093,7 +1093,7 @@ private void generateFaultsUsingSpecificAnalysisConfiguration( } if (matcher.find()) { - createAndScheduleAbstractTestExecution(filibusterConfiguration, distributedExecutionIndex, faultObject); + createAndScheduleAbstractTestExecution(filibusterConfiguration, distributedExecutionIndex, faultObject, /* isScheduledByTransformer= */false); } } @@ -1103,7 +1103,7 @@ private void generateFaultsUsingSpecificAnalysisConfiguration( for (JSONObject faultObject : exceptionFaultObjects) { // If we shouldn't execute this, skip it. if (filibusterFaultInjectionFilter.shouldInjectFault(methodName)) { - createAndScheduleAbstractTestExecution(filibusterConfiguration, distributedExecutionIndex, faultObject); + createAndScheduleAbstractTestExecution(filibusterConfiguration, distributedExecutionIndex, faultObject, /* isScheduledByTransformer= */false); } } @@ -1124,7 +1124,7 @@ private void generateFaultsUsingSpecificAnalysisConfiguration( HashMap faultTypeMap = (HashMap) obj; JSONObject faultTypeObject = new JSONObject(); faultTypeObject.put("failure_metadata", faultTypeMap); - createAndScheduleAbstractTestExecution(filibusterConfiguration, distributedExecutionIndex, faultTypeObject); + createAndScheduleAbstractTestExecution(filibusterConfiguration, distributedExecutionIndex, faultTypeObject, /* isScheduledByTransformer= */false); } } } @@ -1209,7 +1209,8 @@ private void generateFaultsUsingAnalysisConfiguration( private void createAndScheduleAbstractTestExecution( FilibusterConfiguration filibusterConfiguration, DistributedExecutionIndex distributedExecutionIndex, - JSONObject faultObject) { + JSONObject faultObject, + boolean isScheduledByTransformer) { logger.info("[FILIBUSTER-CORE]: createAndScheduleAbstractTestExecution called."); if (currentConcreteTestExecution != null) { @@ -1223,14 +1224,14 @@ private void createAndScheduleAbstractTestExecution( if (!abstractIsExploredExecution && !abstractIsScheduledExecution && !abstractIsCurrentExecution) { if (filibusterConfiguration.getSuppressCombinations()) { if (!(abstractTestExecution.getFaultsToInjectSize() > 1)) { - unexploredTestExecutions.addTestExecution(abstractTestExecution); + unexploredTestExecutions.addTestExecution(abstractTestExecution, isScheduledByTransformer); logger.info("[FILIBUSTER-CORE]: createAndScheduleAbstractTestExecution, adding new execution to the queue."); } else { logger.info("[FILIBUSTER-CORE]: createAndScheduleAbstractTestExecution, not scheduling test execution because it contains > 1 fault."); } } else { logger.info("[FILIBUSTER-CORE]: createAndScheduleAbstractTestExecution, adding new execution to the queue."); - unexploredTestExecutions.addTestExecution(abstractTestExecution); + unexploredTestExecutions.addTestExecution(abstractTestExecution, isScheduledByTransformer); } } } diff --git a/src/main/java/cloud/filibuster/junit/server/core/TestExecutionCollection.java b/src/main/java/cloud/filibuster/junit/server/core/TestExecutionCollection.java index 27107806c..984cd5130 100644 --- a/src/main/java/cloud/filibuster/junit/server/core/TestExecutionCollection.java +++ b/src/main/java/cloud/filibuster/junit/server/core/TestExecutionCollection.java @@ -13,5 +13,5 @@ public interface TestExecutionCollection { int size(); - void addTestExecution(T testExecution); + void addTestExecution(T testExecution, boolean isScheduledByTransformer); } diff --git a/src/main/java/cloud/filibuster/junit/server/core/TestExecutionQueue.java b/src/main/java/cloud/filibuster/junit/server/core/TestExecutionQueue.java index da6b6b5a1..1e570658c 100644 --- a/src/main/java/cloud/filibuster/junit/server/core/TestExecutionQueue.java +++ b/src/main/java/cloud/filibuster/junit/server/core/TestExecutionQueue.java @@ -27,7 +27,11 @@ public T removeAndReturnNextTestExecution() { } @Override - public void addTestExecution(T testExecution) { - this.add(testExecution); + public void addTestExecution(T testExecution, boolean isScheduledByTransformer) { + if (isScheduledByTransformer) { + this.addFirst(testExecution); + } else { + this.add(testExecution); + } } } diff --git a/src/main/java/cloud/filibuster/junit/server/core/TestExecutionStack.java b/src/main/java/cloud/filibuster/junit/server/core/TestExecutionStack.java index c1960ab8a..7c9ea4cb0 100644 --- a/src/main/java/cloud/filibuster/junit/server/core/TestExecutionStack.java +++ b/src/main/java/cloud/filibuster/junit/server/core/TestExecutionStack.java @@ -27,7 +27,11 @@ public T removeAndReturnNextTestExecution() { } @Override - public void addTestExecution(T testExecution) { - this.addFirst(testExecution); + public void addTestExecution(T testExecution, boolean isScheduledByTransformer) { + if (isScheduledByTransformer) { + this.addLast(testExecution); + } else { + this.addFirst(testExecution); + } } } diff --git a/src/test/java/cloud/filibuster/functional/database/postgresql/JUnitCockroachDBTransformerTest.java b/src/test/java/cloud/filibuster/functional/database/postgresql/JUnitCockroachDBTransformerTest.java index 0b0d1ca52..8f05ba7ce 100644 --- a/src/test/java/cloud/filibuster/functional/database/postgresql/JUnitCockroachDBTransformerTest.java +++ b/src/test/java/cloud/filibuster/functional/database/postgresql/JUnitCockroachDBTransformerTest.java @@ -13,13 +13,13 @@ import org.junit.jupiter.api.TestMethodOrder; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import static cloud.filibuster.junit.assertions.protocols.GenericAssertions.wasFaultInjected; -import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -59,8 +59,8 @@ public void testCockroachConnection() { assertEquals(initBalance2, cockroachDAO.getAccountBalance(id2)); // Assert that the correct account IDs are returned for the given balances - assertArrayEquals(new String[]{id1.toString()}, cockroachDAO.getAccountIdByBalance(initBalance1)); - assertArrayEquals(new String[]{id2.toString()}, cockroachDAO.getAccountIdByBalance(initBalance2)); + assertEquals(Collections.singletonList(id1.toString()), cockroachDAO.getAccountIdByBalance(initBalance1)); + assertEquals(Collections.singletonList(id2.toString()), cockroachDAO.getAccountIdByBalance(initBalance2)); // Remove all accounts from DB cockroachDAO.deleteAllAccounts(); diff --git a/src/test/java/cloud/filibuster/functional/database/postgresql/JUnitPostgresTransformerTest.java b/src/test/java/cloud/filibuster/functional/database/postgresql/JUnitPostgresTransformerTest.java index ffabb1a64..993bfc353 100644 --- a/src/test/java/cloud/filibuster/functional/database/postgresql/JUnitPostgresTransformerTest.java +++ b/src/test/java/cloud/filibuster/functional/database/postgresql/JUnitPostgresTransformerTest.java @@ -13,13 +13,13 @@ import org.junit.jupiter.api.TestMethodOrder; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import static cloud.filibuster.junit.assertions.protocols.GenericAssertions.wasFaultInjected; -import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -59,8 +59,8 @@ public void testCockroachConnection() { assertEquals(initBalance2, postgresDAO.getAccountBalance(id2)); // Assert that the correct account IDs are returned for the given balances - assertArrayEquals(new String[]{id1.toString()}, postgresDAO.getAccountIdByBalance(initBalance1)); - assertArrayEquals(new String[]{id2.toString()}, postgresDAO.getAccountIdByBalance(initBalance2)); + assertEquals(Collections.singletonList(id1.toString()), postgresDAO.getAccountIdByBalance(initBalance1)); + assertEquals(Collections.singletonList(id2.toString()), postgresDAO.getAccountIdByBalance(initBalance2)); // Remove all accounts from DB postgresDAO.deleteAllAccounts(); diff --git a/src/test/java/cloud/filibuster/integration/examples/armeria/grpc/test_services/postgresql/BasicDAO.java b/src/test/java/cloud/filibuster/integration/examples/armeria/grpc/test_services/postgresql/BasicDAO.java index 0ab4acd85..5e07a87d5 100644 --- a/src/test/java/cloud/filibuster/integration/examples/armeria/grpc/test_services/postgresql/BasicDAO.java +++ b/src/test/java/cloud/filibuster/integration/examples/armeria/grpc/test_services/postgresql/BasicDAO.java @@ -307,22 +307,21 @@ public int getAccountBalance(UUID id) { * * @return balance (int) */ - public String[] getAccountIdByBalance(int balance) { - List id = new ArrayList<>(); + public List getAccountIdByBalance(int balance) { + List ids = new ArrayList<>(); try (Connection connection = this.getConnection()) { ResultSet res = connection.createStatement() .executeQuery(String.format("SELECT id FROM accounts WHERE balance = '%d'", balance)); while (res.next()) { - id.add(res.getString("id")); + ids.add(res.getString("id")); } } catch (SQLException e) { logger.log(Level.INFO, String.format("BasicDAO.getAccountIdByBalance ERROR: { state => %s, cause => %s, message => %s }\n", e.getSQLState(), e.getCause(), e.getMessage())); } - return id.toArray(new String[0]); + return ids; } - }