[NO ISSUE][TEST] Improve extensibility of test framework

Change-Id: Ibaa9722cbc46a2eced6295fa6b896f38fa3c9e50
Reviewed-on: https://asterix-gerrit.ics.uci.edu/2753
Sonar-Qube: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Contrib: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Till Westmann <tillw@apache.org>
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 3c51775..5aff17f 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,7 +30,6 @@
 import java.io.PrintStream;
 import java.io.PrintWriter;
 import java.io.StringWriter;
-import java.math.BigDecimal;
 import java.net.Inet4Address;
 import java.net.InetSocketAddress;
 import java.net.Socket;
@@ -97,8 +96,6 @@
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
-
-import com.fasterxml.jackson.databind.util.RawValue;
 import org.junit.Assert;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -107,6 +104,7 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.fasterxml.jackson.databind.util.RawValue;
 
 public class TestExecutor {
 
@@ -1909,8 +1907,9 @@
         }
     }
 
-    abstract static class TestLoop extends Exception {
+    public abstract static class TestLoop extends Exception {
 
+        private static final long serialVersionUID = 1L;
         private final String target;
 
         TestLoop(String target) {
@@ -1920,6 +1919,7 @@
         static TestLoop createLoop(String target, final int count) {
             LOGGER.info("Starting loop '" + count + " times back to '" + target + "'...");
             return new TestLoop(target) {
+                private static final long serialVersionUID = 1L;
                 int remainingLoops = count;
 
                 @Override
@@ -1935,6 +1935,7 @@
         static TestLoop createLoop(String target, long duration, TimeUnit unit) {
             LOGGER.info("Starting loop for " + unit.toSeconds(duration) + "s back to '" + target + "'...");
             return new TestLoop(target) {
+                private static final long serialVersionUID = 1L;
                 long endTime = unit.toMillis(duration) + System.currentTimeMillis();
 
                 @Override
diff --git a/asterixdb/asterix-test-framework/src/main/java/org/apache/asterix/testframework/context/TestCaseContext.java b/asterixdb/asterix-test-framework/src/main/java/org/apache/asterix/testframework/context/TestCaseContext.java
index 4735c67..4357f14 100644
--- a/asterixdb/asterix-test-framework/src/main/java/org/apache/asterix/testframework/context/TestCaseContext.java
+++ b/asterixdb/asterix-test-framework/src/main/java/org/apache/asterix/testframework/context/TestCaseContext.java
@@ -22,7 +22,9 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.regex.Pattern;
 
 import org.apache.asterix.testframework.template.TemplateHelper;
@@ -105,6 +107,7 @@
     private TestGroup[] testGroups;
 
     private TestCase testCase;
+    private Map<String, Object> kv;
 
     public TestCaseContext(File tsRoot, TestSuite testSuite, TestGroup[] testGroups, TestCase testCase) {
         this.tsRoot = tsRoot;
@@ -133,6 +136,18 @@
         return testCase.getRepeat().intValue();
     }
 
+    public void put(String key, Object object) {
+        if (kv == null) {
+            kv = new HashMap<>();
+        }
+        kv.put(key, object);
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T> T get(String key) {
+        return (T) kv.get(key);
+    }
+
     public List<TestFileContext> getFilesInDir(String basePath, String dirName, boolean withType) {
         List<TestFileContext> testFileCtxs = new ArrayList<>();
 
diff --git a/asterixdb/asterix-test-framework/src/main/java/org/apache/asterix/testframework/context/TestFileContext.java b/asterixdb/asterix-test-framework/src/main/java/org/apache/asterix/testframework/context/TestFileContext.java
index 7a53a9e..3ae6dcd 100644
--- a/asterixdb/asterix-test-framework/src/main/java/org/apache/asterix/testframework/context/TestFileContext.java
+++ b/asterixdb/asterix-test-framework/src/main/java/org/apache/asterix/testframework/context/TestFileContext.java
@@ -67,6 +67,13 @@
         return 0;
     }
 
+    public TestFileContext copy() {
+        TestFileContext copy = new TestFileContext(file);
+        copy.setSeqNum(Integer.toString(seqNum));
+        copy.setType(type);
+        return copy;
+    }
+
     @Override
     public String toString() {
         return String.valueOf(seqNum) + ":" + type + ":" + file;