abdullah alamoudi has submitted this change and it was merged. Change subject: Refactor TestExecutor ......................................................................
Refactor TestExecutor Change-Id: I0c586ad12f059eaf29c4031ccdcff10d0fb46aa0 Reviewed-on: https://asterix-gerrit.ics.uci.edu/1705 Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu> BAD: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Reviewed-by: abdullah alamoudi <bamou...@gmail.com> --- M asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java 1 file changed, 154 insertions(+), 132 deletions(-) Approvals: abdullah alamoudi: Looks good to me, approved Jenkins: Verified; No violations found; Verified Objections: Jenkins: Violations found diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java index f992e68..f1e6aca 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java @@ -102,8 +102,7 @@ private static final Pattern REGEX_LINES_PATTERN = Pattern.compile("^(-)?/(.*)/([im]*)$"); private static final Pattern POLL_TIMEOUT_PATTERN = Pattern.compile("polltimeoutsecs=(\\d+)(\\D|$)", Pattern.MULTILINE); - private static final Pattern POLL_DELAY_PATTERN = - Pattern.compile("polldelaysecs=(\\d+)(\\D|$)", Pattern.MULTILINE); + private static final Pattern POLL_DELAY_PATTERN = Pattern.compile("polldelaysecs=(\\d+)(\\D|$)", Pattern.MULTILINE); private static final Pattern HANDLE_VARIABLE_PATTERN = Pattern.compile("handlevariable=(\\w+)"); private static final Pattern VARIABLE_REF_PATTERN = Pattern.compile("\\$(\\w+)"); @@ -151,8 +150,7 @@ } public void runScriptAndCompareWithResult(File scriptFile, PrintWriter print, File expectedFile, File actualFile, - ComparisonEnum compare) - throws Exception { + ComparisonEnum compare) throws Exception { System.err.println("Expected results file: " + expectedFile.toString()); BufferedReader readerExpected = new BufferedReader(new InputStreamReader(new FileInputStream(expectedFile), "UTF-8")); @@ -774,9 +772,7 @@ if (ctx.getFile().getName().endsWith("aql")) { executeDDL(statement, getEndpoint(Servlets.AQL_DDL)); } else { - InputStream resultStream = executeQueryService(statement, getEndpoint(Servlets.QUERY_SERVICE), - OutputFormat.CLEAN_JSON); - ResultExtractor.extract(resultStream); + executeSqlppUpdateOrDdl(statement, OutputFormat.CLEAN_JSON); } break; case "update": @@ -787,48 +783,13 @@ if (ctx.getFile().getName().endsWith("aql")) { executeUpdate(statement, getEndpoint(Servlets.AQL_UPDATE)); } else { - InputStream resultStream = executeQueryService(statement, getEndpoint(Servlets.QUERY_SERVICE), - OutputFormat.forCompilationUnit(cUnit)); - ResultExtractor.extract(resultStream); + executeSqlppUpdateOrDdl(statement, OutputFormat.forCompilationUnit(cUnit)); } break; case "pollget": case "pollquery": - // polltimeoutsecs=nnn, polldelaysecs=nnn - int timeoutSecs = getTimeoutSecs(statement); - int retryDelaySecs = getRetryDelaySecs(statement); - long startTime = System.currentTimeMillis(); - long limitTime = startTime + TimeUnit.SECONDS.toMillis(timeoutSecs); - ctx.setType(ctx.getType().substring("poll".length())); - boolean expectedException = false; - Exception finalException; - LOGGER.fine("polling for up to " + timeoutSecs + " seconds w/ " + retryDelaySecs + " second(s) delay"); - while (true) { - try { - executeTestFile(testCaseCtx, ctx, variableCtx, statement, isDmlRecoveryTest, pb, cUnit, - queryCount, expectedResultFileCtxs, testFile, actualPath); - finalException = null; - break; - } catch (Exception e) { - if (isExpected(e, cUnit)) { - expectedException = true; - finalException = e; - break; - } - if ((System.currentTimeMillis() > limitTime)) { - finalException = e; - break; - } - LOGGER.fine("sleeping " + retryDelaySecs + " second(s) before polling again"); - Thread.sleep(TimeUnit.SECONDS.toMillis(retryDelaySecs)); - } - } - if (expectedException) { - throw finalException; - } else if (finalException != null){ - throw new Exception("Poll limit (" + timeoutSecs + "s) exceeded without obtaining expected result", - finalException); - } + poll(testCaseCtx, ctx, variableCtx, statement, isDmlRecoveryTest, pb, cUnit, queryCount, + expectedResultFileCtxs, testFile, actualPath); break; case "query": case "async": @@ -840,65 +801,19 @@ executeScript(pb, pb.environment().get("SCRIPT_HOME") + File.separator + "dml_recovery" + File.separator + "stop_and_start.sh"); } - InputStream resultStream = null; - OutputFormat fmt = OutputFormat.forCompilationUnit(cUnit); - final String reqType = ctx.getType(); - final List<CompilationUnit.Parameter> params = cUnit.getParameter(); - if (ctx.getFile().getName().endsWith("aql")) { - if (reqType.equalsIgnoreCase("query")) { - resultStream = executeQuery(statement, fmt, getEndpoint(Servlets.AQL_QUERY), params); - } else { - final URI endpoint = getEndpoint(Servlets.AQL); - if (reqType.equalsIgnoreCase("async")) { - resultStream = executeAnyAQLAsync(statement, false, fmt, endpoint, variableCtx); - } else if (reqType.equalsIgnoreCase("deferred")) { - resultStream = executeAnyAQLAsync(statement, true, fmt, endpoint, variableCtx); - } - Assert.assertNotNull("no handle for " + reqType + " test " + testFile.toString(), - resultStream); - } - } else { - String delivery = DELIVERY_IMMEDIATE; - if (reqType.equalsIgnoreCase("async")) { - delivery = DELIVERY_ASYNC; - } else if (reqType.equalsIgnoreCase("deferred")) { - delivery = DELIVERY_DEFERRED; - } - final URI uri = getEndpoint(Servlets.QUERY_SERVICE); - if (DELIVERY_IMMEDIATE.equals(delivery)) { - resultStream = executeQueryService(statement, fmt, uri, params, true, true); - resultStream = ResultExtractor.extract(resultStream); - } else { - String handleVar = getHandleVariable(statement); - resultStream = - executeQueryService(statement, fmt, uri, upsertParam(params, "mode", delivery), true); - String handle = ResultExtractor.extractHandle(resultStream); - Assert.assertNotNull("no handle for " + reqType + " test " + testFile.toString(), handleVar); - variableCtx.put(handleVar, handle); - } - } - if (queryCount.intValue() >= expectedResultFileCtxs.size()) { - Assert.fail("no result file for " + testFile.toString() + "; queryCount: " + queryCount - + ", filectxs.size: " + expectedResultFileCtxs.size()); - } - expectedResultFile = expectedResultFileCtxs.get(queryCount.intValue()).getFile(); - - File actualResultFile = - testCaseCtx.getActualResultFile(cUnit, expectedResultFile, new File(actualPath)); - writeOutputToFile(actualResultFile, resultStream); - - runScriptAndCompareWithResult(testFile, new PrintWriter(System.err), expectedResultFile, - actualResultFile, ComparisonEnum.TEXT); - queryCount.increment(); - - // Deletes the matched result file. - actualResultFile.getParentFile().delete(); + expectedResultFile = (queryCount.intValue() >= expectedResultFileCtxs.size()) ? null + : expectedResultFileCtxs.get(queryCount.intValue()).getFile(); + File actualResultFile = expectedResultFile == null ? null + : testCaseCtx.getActualResultFile(cUnit, expectedResultFile, new File(actualPath)); + executeQuery(OutputFormat.forCompilationUnit(cUnit), statement, variableCtx, ctx.getType(), testFile, + expectedResultFile, actualResultFile, queryCount, expectedResultFileCtxs.size(), + cUnit.getParameter(), ComparisonEnum.TEXT); break; case "mgx": executeManagixCommand(stripLineComments(statement).trim()); break; case "txnqbc": // qbc represents query before crash - resultStream = executeQuery(statement, OutputFormat.forCompilationUnit(cUnit), + InputStream resultStream = executeQuery(statement, OutputFormat.forCompilationUnit(cUnit), getEndpoint(Servlets.AQL_QUERY), cUnit.getParameter()); qbcFile = getTestCaseQueryBeforeCrashFile(actualPath, testCaseCtx, cUnit); writeOutputToFile(qbcFile, resultStream); @@ -979,33 +894,13 @@ break; case "get": case "post": - fmt = OutputFormat.forCompilationUnit(cUnit); - String handleVar = getHandleVariable(statement); - final String trimmedPathAndQuery = stripLineComments(stripJavaComments(statement)).trim(); - final String variablesReplaced = replaceVarRef(trimmedPathAndQuery, variableCtx); - if ("http".equals(ctx.extension())) { - resultStream = executeHttp(ctx.getType(), variablesReplaced, fmt); - } else if ("uri".equals(ctx.extension())) { - resultStream = executeURI(ctx.getType(), URI.create(variablesReplaced), fmt); - } else { - throw new IllegalArgumentException( - "Unexpected format for method " + ctx.getType() + ": " + ctx.extension()); - } - if (handleVar != null) { - String handle = ResultExtractor.extractHandle(resultStream); - if (handle != null) { - variableCtx.put(handleVar, handle); - } else { - throw new Exception("no handle for test " + testFile.toString()); - } - } else { - expectedResultFile = expectedResultFileCtxs.get(queryCount.intValue()).getFile(); - actualResultFile = testCaseCtx.getActualResultFile(cUnit, expectedResultFile, new File(actualPath)); - writeOutputToFile(actualResultFile, resultStream); - runScriptAndCompareWithResult(testFile, new PrintWriter(System.err), expectedResultFile, - actualResultFile, cUnit.getOutputDir().getCompare()); - } - queryCount.increment(); + expectedResultFile = (queryCount.intValue() >= expectedResultFileCtxs.size()) ? null + : expectedResultFileCtxs.get(queryCount.intValue()).getFile(); + actualResultFile = expectedResultFile == null ? null + : testCaseCtx.getActualResultFile(cUnit, expectedResultFile, new File(actualPath)); + executeHttpRequest(OutputFormat.forCompilationUnit(cUnit), statement, variableCtx, ctx.getType(), + testFile, expectedResultFile, actualResultFile, queryCount, expectedResultFileCtxs.size(), + ctx.extension(), cUnit.getOutputDir().getCompare()); break; case "server": // (start <test server name> <port> // [<arg1>][<arg2>][<arg3>]...|stop (<port>|all)) @@ -1098,6 +993,134 @@ } } + private void executeHttpRequest(OutputFormat fmt, String statement, Map<String, Object> variableCtx, String reqType, + File testFile, File expectedResultFile, File actualResultFile, MutableInt queryCount, int numResultFiles, + String extension, ComparisonEnum compare) throws Exception { + String handleVar = getHandleVariable(statement); + final String trimmedPathAndQuery = stripLineComments(stripJavaComments(statement)).trim(); + final String variablesReplaced = replaceVarRef(trimmedPathAndQuery, variableCtx); + InputStream resultStream; + if ("http".equals(extension)) { + resultStream = executeHttp(reqType, variablesReplaced, fmt); + } else if ("uri".equals(extension)) { + resultStream = executeURI(reqType, URI.create(variablesReplaced), fmt); + } else { + throw new IllegalArgumentException("Unexpected format for method " + reqType + ": " + extension); + } + if (handleVar != null) { + String handle = ResultExtractor.extractHandle(resultStream); + if (handle != null) { + variableCtx.put(handleVar, handle); + } else { + throw new Exception("no handle for test " + testFile.toString()); + } + } else { + if (expectedResultFile == null) { + Assert.fail("no result file for " + testFile.toString() + "; queryCount: " + queryCount + + ", filectxs.size: " + numResultFiles); + } + writeOutputToFile(actualResultFile, resultStream); + runScriptAndCompareWithResult(testFile, new PrintWriter(System.err), expectedResultFile, actualResultFile, + compare); + } + queryCount.increment(); + } + + public void executeQuery(OutputFormat fmt, String statement, Map<String, Object> variableCtx, String reqType, + File testFile, File expectedResultFile, File actualResultFile, MutableInt queryCount, int numResultFiles, + List<CompilationUnit.Parameter> params, ComparisonEnum compare) throws Exception { + InputStream resultStream = null; + if (testFile.getName().endsWith("aql")) { + if (reqType.equalsIgnoreCase("query")) { + resultStream = executeQuery(statement, fmt, getEndpoint(Servlets.AQL_QUERY), params); + } else { + final URI endpoint = getEndpoint(Servlets.AQL); + if (reqType.equalsIgnoreCase("async")) { + resultStream = executeAnyAQLAsync(statement, false, fmt, endpoint, variableCtx); + } else if (reqType.equalsIgnoreCase("deferred")) { + resultStream = executeAnyAQLAsync(statement, true, fmt, endpoint, variableCtx); + } + Assert.assertNotNull("no handle for " + reqType + " test " + testFile.toString(), resultStream); + } + } else { + String delivery = DELIVERY_IMMEDIATE; + if (reqType.equalsIgnoreCase("async")) { + delivery = DELIVERY_ASYNC; + } else if (reqType.equalsIgnoreCase("deferred")) { + delivery = DELIVERY_DEFERRED; + } + final URI uri = getEndpoint(Servlets.QUERY_SERVICE); + if (DELIVERY_IMMEDIATE.equals(delivery)) { + resultStream = executeQueryService(statement, fmt, uri, params, true, true); + resultStream = ResultExtractor.extract(resultStream); + } else { + String handleVar = getHandleVariable(statement); + resultStream = executeQueryService(statement, fmt, uri, upsertParam(params, "mode", delivery), true); + String handle = ResultExtractor.extractHandle(resultStream); + Assert.assertNotNull("no handle for " + reqType + " test " + testFile.toString(), handleVar); + variableCtx.put(handleVar, handle); + } + } + writeOutputToFile(actualResultFile, resultStream); + if (expectedResultFile == null) { + Assert.fail("no result file for " + testFile.toString() + "; queryCount: " + queryCount + + ", filectxs.size: " + numResultFiles); + } + + runScriptAndCompareWithResult(testFile, new PrintWriter(System.err), expectedResultFile, actualResultFile, + compare); + queryCount.increment(); + + // Deletes the matched result file. + actualResultFile.getParentFile().delete(); + } + + private void poll(TestCaseContext testCaseCtx, TestFileContext ctx, Map<String, Object> variableCtx, + String statement, boolean isDmlRecoveryTest, ProcessBuilder pb, CompilationUnit cUnit, + MutableInt queryCount, List<TestFileContext> expectedResultFileCtxs, File testFile, String actualPath) + throws Exception { + // polltimeoutsecs=nnn, polldelaysecs=nnn + int timeoutSecs = getTimeoutSecs(statement); + int retryDelaySecs = getRetryDelaySecs(statement); + long startTime = System.currentTimeMillis(); + long limitTime = startTime + TimeUnit.SECONDS.toMillis(timeoutSecs); + ctx.setType(ctx.getType().substring("poll".length())); + boolean expectedException = false; + Exception finalException; + LOGGER.fine("polling for up to " + timeoutSecs + " seconds w/ " + retryDelaySecs + " second(s) delay"); + while (true) { + try { + executeTestFile(testCaseCtx, ctx, variableCtx, statement, isDmlRecoveryTest, pb, cUnit, queryCount, + expectedResultFileCtxs, testFile, actualPath); + finalException = null; + break; + } catch (Exception e) { + if (isExpected(e, cUnit)) { + expectedException = true; + finalException = e; + break; + } + if ((System.currentTimeMillis() > limitTime)) { + finalException = e; + break; + } + LOGGER.fine("sleeping " + retryDelaySecs + " second(s) before polling again"); + Thread.sleep(TimeUnit.SECONDS.toMillis(retryDelaySecs)); + } + } + if (expectedException) { + throw finalException; + } else if (finalException != null) { + throw new Exception("Poll limit (" + timeoutSecs + "s) exceeded without obtaining expected result", + finalException); + } + } + + public InputStream executeSqlppUpdateOrDdl(String statement, OutputFormat outputFormat) throws Exception { + InputStream resultStream = executeQueryService(statement, getEndpoint(Servlets.QUERY_SERVICE), outputFormat); + return ResultExtractor.extract(resultStream); + } + protected static boolean isExpected(Exception e, CompilationUnit cUnit) { final List<String> expErrors = cUnit.getExpectedError(); for (String exp : expErrors) { @@ -1108,7 +1131,7 @@ return false; } - protected int getTimeoutSecs(String statement) { + public static int getTimeoutSecs(String statement) { final Matcher timeoutMatcher = POLL_TIMEOUT_PATTERN.matcher(statement); if (timeoutMatcher.find()) { return Integer.parseInt(timeoutMatcher.group(1)); @@ -1117,7 +1140,7 @@ } } - protected static int getRetryDelaySecs(String statement) { + public static int getRetryDelaySecs(String statement) { final Matcher retryDelayMatcher = POLL_DELAY_PATTERN.matcher(statement); return retryDelayMatcher.find() ? Integer.parseInt(retryDelayMatcher.group(1)) : 1; } @@ -1253,8 +1276,8 @@ private static File getTestCaseQueryBeforeCrashFile(String actualPath, TestCaseContext testCaseCtx, CompilationUnit cUnit) { return new File( - actualPath + File.separator + testCaseCtx.getTestCase().getFilePath().replace(File.separator, "_") - + "_" + cUnit.getName() + "_qbc.adm"); + actualPath + File.separator + testCaseCtx.getTestCase().getFilePath().replace(File.separator, "_") + "_" + + cUnit.getName() + "_qbc.adm"); } protected URI getEndpoint(String servlet) throws URISyntaxException { @@ -1277,8 +1300,7 @@ getEndpoint(Servlets.QUERY_SERVICE), OutputFormat.CLEAN_JSON); String out = IOUtils.toString(resultStream); ObjectMapper om = new ObjectMapper(); - om.setConfig( - om.getDeserializationConfig().with(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT)); + om.setConfig(om.getDeserializationConfig().with(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT)); JsonNode result; try { result = om.readValue(out, ObjectNode.class).get("results"); -- To view, visit https://asterix-gerrit.ics.uci.edu/1705 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: merged Gerrit-Change-Id: I0c586ad12f059eaf29c4031ccdcff10d0fb46aa0 Gerrit-PatchSet: 7 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: abdullah alamoudi <bamou...@gmail.com> Gerrit-Reviewer: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Gerrit-Reviewer: Michael Blow <mb...@apache.org> Gerrit-Reviewer: Till Westmann <ti...@apache.org> Gerrit-Reviewer: abdullah alamoudi <bamou...@gmail.com>