abdullah alamoudi has uploaded a new change for review.
https://asterix-gerrit.ics.uci.edu/2235
Change subject: [NO ISSUE][TEST] Store a query output for subsequent test calls
......................................................................
[NO ISSUE][TEST] Store a query output for subsequent test calls
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
- With this change, the test framework allow for a query to store
its output for access by subsequent calls. The change also allow
for a query to validate its output against a previous query.
Change-Id: Iab329fbdf4def5b46686a61c9399520ae71518c4
---
M
asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
A
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/validate-expected/validate-expected.1.store.sqlpp
A
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/validate-expected/validate-expected.2.validate.sqlpp
M asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
4 files changed, 95 insertions(+), 31 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb
refs/changes/35/2235/1
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 bb3316d..7754ab5 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
@@ -30,8 +30,6 @@
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringWriter;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
import java.net.Inet4Address;
import java.net.InetSocketAddress;
import java.net.URI;
@@ -70,7 +68,6 @@
import org.apache.asterix.testframework.xml.TestCase.CompilationUnit;
import org.apache.asterix.testframework.xml.TestCase.CompilationUnit.Parameter;
import org.apache.asterix.testframework.xml.TestGroup;
-import org.apache.avro.generic.GenericData;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.output.ByteArrayOutputStream;
@@ -110,13 +107,13 @@
// see
//
https://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers/417184
private static final long MAX_URL_LENGTH = 2000l;
- private static final Pattern JAVA_BLOCK_COMMENT_PATTERN =
Pattern.compile("/\\*.*\\*/",
- Pattern.MULTILINE | Pattern.DOTALL);
- private static final Pattern JAVA_SHELL_SQL_LINE_COMMENT_PATTERN =
Pattern.compile("^(//|#|--).*$",
- Pattern.MULTILINE);
+ private static final Pattern JAVA_BLOCK_COMMENT_PATTERN =
+ Pattern.compile("/\\*.*\\*/", Pattern.MULTILINE | Pattern.DOTALL);
+ private static final Pattern JAVA_SHELL_SQL_LINE_COMMENT_PATTERN =
+ Pattern.compile("^(//|#|--).*$", Pattern.MULTILINE);
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_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 HANDLE_VARIABLE_PATTERN =
Pattern.compile("handlevariable=(\\w+)");
private static final Pattern VARIABLE_REF_PATTERN =
Pattern.compile("\\$(\\w+)");
@@ -187,10 +184,10 @@
public void runScriptAndCompareWithResult(File scriptFile, PrintWriter
print, File expectedFile, File actualFile,
ComparisonEnum compare) throws Exception {
System.err.println("Expected results file: " +
expectedFile.toString());
- BufferedReader readerExpected = new BufferedReader(
- new InputStreamReader(new FileInputStream(expectedFile),
"UTF-8"));
- BufferedReader readerActual = new BufferedReader(
- new InputStreamReader(new FileInputStream(actualFile),
"UTF-8"));
+ BufferedReader readerExpected =
+ new BufferedReader(new InputStreamReader(new
FileInputStream(expectedFile), "UTF-8"));
+ BufferedReader readerActual =
+ new BufferedReader(new InputStreamReader(new
FileInputStream(actualFile), "UTF-8"));
boolean regex = false;
try {
if (ComparisonEnum.BINARY.equals(compare)) {
@@ -373,10 +370,10 @@
public void runScriptAndCompareWithResultRegex(File scriptFile, File
expectedFile, File actualFile)
throws Exception {
String lineExpected, lineActual;
- try (BufferedReader readerExpected = new BufferedReader(
- new InputStreamReader(new FileInputStream(expectedFile),
"UTF-8"));
- BufferedReader readerActual = new BufferedReader(
- new InputStreamReader(new FileInputStream(actualFile),
"UTF-8"))) {
+ try (BufferedReader readerExpected =
+ new BufferedReader(new InputStreamReader(new
FileInputStream(expectedFile), "UTF-8"));
+ BufferedReader readerActual =
+ new BufferedReader(new InputStreamReader(new
FileInputStream(actualFile), "UTF-8"))) {
StringBuilder actual = new StringBuilder();
while ((lineActual = readerActual.readLine()) != null) {
actual.append(lineActual).append('\n');
@@ -716,8 +713,8 @@
// Insert and Delete statements are executed here
public void executeUpdate(String str, URI uri) throws Exception {
// Create a method instance.
- HttpUriRequest request = RequestBuilder.post(uri).setEntity(new
StringEntity(str, StandardCharsets.UTF_8))
- .build();
+ HttpUriRequest request =
+ RequestBuilder.post(uri).setEntity(new StringEntity(str,
StandardCharsets.UTF_8)).build();
// Execute the method.
executeAndCheckHttpRequest(request);
@@ -727,10 +724,10 @@
public InputStream executeAnyAQLAsync(String statement, boolean defer,
OutputFormat fmt, URI uri,
Map<String, Object> variableCtx) throws Exception {
// Create a method instance.
- HttpUriRequest request = RequestBuilder.post(uri)
- .addParameter("mode", defer ? "asynchronous-deferred" :
"asynchronous")
- .setEntity(new StringEntity(statement,
StandardCharsets.UTF_8)).setHeader("Accept", fmt.mimeType())
- .build();
+ HttpUriRequest request =
+ RequestBuilder.post(uri).addParameter("mode", defer ?
"asynchronous-deferred" : "asynchronous")
+ .setEntity(new StringEntity(statement,
StandardCharsets.UTF_8))
+ .setHeader("Accept", fmt.mimeType()).build();
String handleVar = getHandleVariable(statement);
@@ -756,8 +753,8 @@
// create function statement
public void executeDDL(String str, URI uri) throws Exception {
// Create a method instance.
- HttpUriRequest request = RequestBuilder.post(uri).setEntity(new
StringEntity(str, StandardCharsets.UTF_8))
- .build();
+ HttpUriRequest request =
+ RequestBuilder.post(uri).setEntity(new StringEntity(str,
StandardCharsets.UTF_8)).build();
// Execute the method.
executeAndCheckHttpRequest(request);
@@ -767,8 +764,8 @@
// and returns the contents as a string
// This string is later passed to REST API for execution.
public String readTestFile(File testFile) throws Exception {
- BufferedReader reader = new BufferedReader(
- new InputStreamReader(new FileInputStream(testFile),
StandardCharsets.UTF_8));
+ BufferedReader reader =
+ new BufferedReader(new InputStreamReader(new
FileInputStream(testFile), StandardCharsets.UTF_8));
String line;
StringBuilder stringBuilder = new StringBuilder();
String ls = System.getProperty("line.separator");
@@ -798,8 +795,8 @@
private static String getProcessOutput(Process p) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
- Future<Integer> future = Executors.newSingleThreadExecutor()
- .submit(() -> IOUtils.copy(p.getInputStream(), new
OutputStream() {
+ Future<Integer> future =
+ Executors.newSingleThreadExecutor().submit(() ->
IOUtils.copy(p.getInputStream(), new OutputStream() {
@Override
public void write(int b) throws IOException {
baos.write(b);
@@ -889,6 +886,24 @@
:
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 "store":
+ // This is a query that returns the expected output of a
subsequent query
+ actualResultFile = new File(actualPath,
testCaseCtx.getTestCase().getFilePath() + File.separatorChar
+ + cUnit.getName() + '.' + ctx.getSeqNum() + ".adm");
+ executeQuery(OutputFormat.forCompilationUnit(cUnit),
statement, variableCtx, ctx.getType(), testFile,
+ null, actualResultFile, queryCount,
expectedResultFileCtxs.size(), cUnit.getParameter(),
+ ComparisonEnum.TEXT);
+ variableCtx.put("expected", actualResultFile);
+ break;
+ case "validate":
+ // This is a query that returns the expected output of a
subsequent query
+ expectedResultFile = (File) variableCtx.remove("expected");
+ actualResultFile = new File(actualPath,
testCaseCtx.getTestCase().getFilePath() + File.separatorChar
+ + cUnit.getName() + '.' + ctx.getSeqNum() + ".adm");
executeQuery(OutputFormat.forCompilationUnit(cUnit),
statement, variableCtx, ctx.getType(), testFile,
expectedResultFile, actualResultFile, queryCount,
expectedResultFileCtxs.size(),
cUnit.getParameter(), ComparisonEnum.TEXT);
@@ -1187,6 +1202,10 @@
}
writeOutputToFile(actualResultFile, resultStream);
if (expectedResultFile == null) {
+ if (reqType.equals("store")) {
+ queryCount.increment();
+ return;
+ }
Assert.fail("no result file for " + testFile.toString() + ";
queryCount: " + queryCount
+ ", filectxs.size: " + numResultFiles);
}
@@ -1550,8 +1569,7 @@
}
if (!toBeDropped.isEmpty()) {
badtestcases.add(testCase);
- LOGGER.warn(
- "Last test left some garbage. Dropping dataverses: " +
StringUtils.join(toBeDropped, ','));
+ LOGGER.warn("Last test left some garbage. Dropping dataverses:
" + StringUtils.join(toBeDropped, ','));
StringBuilder dropStatement = new StringBuilder();
for (String dv : toBeDropped) {
dropStatement.append("drop dataverse ");
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/validate-expected/validate-expected.1.store.sqlpp
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/validate-expected/validate-expected.1.store.sqlpp
new file mode 100644
index 0000000..fd9e62e
--- /dev/null
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/validate-expected/validate-expected.1.store.sqlpp
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+
+select * from `Metadata`.`Index`;
+
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/validate-expected/validate-expected.2.validate.sqlpp
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/validate-expected/validate-expected.2.validate.sqlpp
new file mode 100644
index 0000000..f435127
--- /dev/null
+++
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/validate-expected/validate-expected.2.validate.sqlpp
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+select * from `Metadata`.`Index`;
\ No newline at end of file
diff --git
a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
index 9ce7eb3..3e82249 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -3445,6 +3445,11 @@
</test-group>
<test-group name="misc">
<test-case FilePath="misc">
+ <compilation-unit name="validate-expected">
+ <output-dir compare="Text">validate-expected</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="misc">
<compilation-unit name="dataset-resources">
<output-dir compare="Text">dataset-resources</output-dir>
</compilation-unit>
--
To view, visit https://asterix-gerrit.ics.uci.edu/2235
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Iab329fbdf4def5b46686a61c9399520ae71518c4
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: abdullah alamoudi <[email protected]>