Repository: authorjapps/zerocode
Pull request #414 (2020-07-14 09:22:48)

Zcode sonatype release branch
# <Feature Title>

PR Branch
**_#ADD LINK TO THE PR BRANCH_**

## Motivation and Context

## Checklist:

* [ ] Unit tests added

* [ ] Integration tests added

* [ ] Test names are meaningful

* [ ] Feature manually tested

* [ ] Branch build passed

* [ ] No 'package.*' in the imports

* [ ] Relevant Wiki page updated with clear instruction for the end user
  * [ ] Not applicable. This was only a refactor change, no functional or behaviour changes were introduced

* [ ] Http test added to `http-testing` module(if applicable) ?
  * [ ] Not applicable. The changes did not affect HTTP automation flow

* [ ] Kafka test added to `kafka-testing` module(if applicable) ?
  * [ ] Not applicable. The changes did not affect Kafka automation flow



Patch:
diff --git a/README.md b/README.md
index ecc43349..d256d652 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,5 @@
-### Zerocode stands in solidarity with every family and community affected by #COVID19([Click here for FAQs and Quick Health Tips](https://github.com/authorjapps/zerocode/wiki/COVID19-FAQ)). We are grateful to medical professionals everywhere for their service, and we wish health and safety to all.
+# ![Zerocode Logo](https://user-images.githubusercontent.com/12598420/86005149-287ee480-ba0c-11ea-91a0-d0811f15be75.png)
 
-<img width="954" alt="covid small" src="https://user-images.githubusercontent.com/12598420/78008268-5eda9400-7337-11ea-926b-ebb2380a2f5c.png">
-
-
-<img width="135"  height="120" alt="Zerocode" src="https://user-images.githubusercontent.com/12598420/51964581-e5a78e80-245e-11e9-9400-72c4c02ac555.png"> Zerocode
-===
 Automated API testing has never been so easy
 
 
@@ -18,8 +13,7 @@ Automated API testing has never been so easy
 **Issue Discussions:** [Slack](https://join.slack.com/t/zerocode-workspace/shared_invite/enQtNzYxMDAwNTQ3MjY1LTA2YmJjODJhNzQ4ZjBiYTQwZDBmZmNkNmExYjA3ZDk2OGFiZWFmNWJlNGRkOTdiMDQ4ZmQyNzcyNzVjNWQ4ODQ) <br/> 
 **Mailing List:** [Mailing List](https://groups.google.com/forum/#!forum/zerocode-automation) <br/>
 **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0) <br/>
-**Gitter IM:** [Gitter](https://gitter.im/zerocode-testing/help-and-usage) <br/>
-
+**LinkedIn:** [Zerocode](https://www.linkedin.com/company/49160481)
 
 Zerocode makes it easy to create and maintain automated tests with absolute minimum overhead for [REST](https://github.com/authorjapps/zerocode/wiki/User-journey:-Create,-Update-and-GET-Employee-Details),[SOAP](https://github.com/authorjapps/zerocode/blob/master/README.md#soap-method-invocation-example-with-xml-input), [Kafka Real Time Data Streams](https://github.com/authorjapps/zerocode/wiki/Kafka-Testing-Introduction) and much more. It has the best of best ideas and practices from the community to keep it super simple, and the adoption is rapidly growing among the developer/tester community.
 
diff --git a/core/pom.xml b/core/pom.xml
index 5a77f387..3058f5d3 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -4,7 +4,7 @@
     <parent>
         <artifactId>zerocode-tdd-parent</artifactId>
         <groupId>org.jsmart</groupId>
-        <version>1.3.23-SNAPSHOT</version>
+        <version>1.3.24-SNAPSHOT</version>
     </parent>
 
     <artifactId>zerocode-tdd</artifactId>
diff --git a/core/src/main/java/org/jsmart/zerocode/core/constants/ZeroCodeReportConstants.java b/core/src/main/java/org/jsmart/zerocode/core/constants/ZeroCodeReportConstants.java
index 7451e811..f812ff6e 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/constants/ZeroCodeReportConstants.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/constants/ZeroCodeReportConstants.java
@@ -9,8 +9,10 @@ public interface ZeroCodeReportConstants {
     String TARGET_FULL_REPORT_CSV_FILE_NAME = "zerocode-junit-granular-report.csv";
     String TARGET_FILE_NAME = "target/zerocode-junit-interactive-fuzzy-search.html";
     String HIGH_CHART_HTML_FILE_NAME = "zerocode_results_chart";
-    String AUTHOR_MARKER = "@@";
-    String ANONYMOUS_AUTHOR = "Anonymous";
+    String AUTHOR_MARKER_OLD = "@@"; //Deprecated
+    String AUTHOR_MARKER_NEW = "@";
+    String CATEGORY_MARKER = "#";
+    String ANONYMOUS_CAT = "Anonymous";
     String REPORT_TITLE_DEFAULT = "Zerocode Test Report";
     String REPORT_DISPLAY_NAME_DEFAULT = "Zerocode Interactive Report";
     String DEFAULT_REGRESSION_CATEGORY = "Regression";
diff --git a/core/src/main/java/org/jsmart/zerocode/core/engine/tokens/ZeroCodeValueTokens.java b/core/src/main/java/org/jsmart/zerocode/core/engine/tokens/ZeroCodeValueTokens.java
index e6cd25d1..d6bc2fb0 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/engine/tokens/ZeroCodeValueTokens.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/engine/tokens/ZeroCodeValueTokens.java
@@ -12,6 +12,7 @@ public class ZeroCodeValueTokens {
     public static final String JSON_PAYLOAD_FILE = "JSON.FILE:";
     public static final String PREFIX_ASU = "ASU";
     public static final String XML_FILE = "XML.FILE:";
+    public static final String GQL_FILE = "GQL.FILE:";
     public static final String RANDOM_UU_ID = "RANDOM.UUID";
     public static final String RANDOM_UU_ID_FIXED = "RANDOM.UUID.FIXED";
     public static final String RECORD_DUMP = "RECORD.DUMP:";
@@ -38,6 +39,7 @@ public class ZeroCodeValueTokens {
                 LOCALDATETIME_NOW,
                 SYSTEM_PROPERTY,
                 XML_FILE,
+                GQL_FILE,
                 RANDOM_UU_ID,
                 RECORD_DUMP,
                 ABS_PATH,
diff --git a/core/src/main/java/org/jsmart/zerocode/core/kafka/receive/KafkaReceiver.java b/core/src/main/java/org/jsmart/zerocode/core/kafka/receive/KafkaReceiver.java
index 4967a87a..4df520b8 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/kafka/receive/KafkaReceiver.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/kafka/receive/KafkaReceiver.java
@@ -67,20 +67,16 @@ public class KafkaReceiver {
             LOGGER.info("polling records  - noOfTimeOuts reached : " + noOfTimeOuts);
 
             final ConsumerRecords records = consumer.poll(ofMillis(getPollTime(effectiveLocal)));
+            noOfTimeOuts++;
 
             if (records.count() == 0) {
-                noOfTimeOuts++;
-                if (noOfTimeOuts > getMaxTimeOuts(effectiveLocal)) {
+                if (noOfTimeOuts >= getMaxTimeOuts(effectiveLocal)) {
                     break;
                 } else {
                     continue;
                 }
             } else {
-                LOGGER.info("Got {} records after {} timeouts\n", records.count(), noOfTimeOuts);
-                // -----------------------------------
-                // reset after it fetched some records
-                // -----------------------------------
-                noOfTimeOuts = 0;
+                LOGGER.info("Received {} records after {} timeouts\n", records.count(), noOfTimeOuts);
             }
 
             if (records != null) {
@@ -105,6 +101,10 @@ public class KafkaReceiver {
             }
 
             handleCommitSyncAsync(consumer, consumerCommonConfigs, effectiveLocal);
+
+            if (noOfTimeOuts >= getMaxTimeOuts(effectiveLocal)) {
+                break;
+            }
         }
 
         consumer.close();
diff --git a/core/src/main/java/org/jsmart/zerocode/core/logbuilder/ZerocodeCorrelationshipLogger.java b/core/src/main/java/org/jsmart/zerocode/core/logbuilder/ZerocodeCorrelationshipLogger.java
index bc15a865..974ab29f 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/logbuilder/ZerocodeCorrelationshipLogger.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/logbuilder/ZerocodeCorrelationshipLogger.java
@@ -139,7 +139,7 @@ public class ZerocodeCorrelationshipLogger {
         buildResponseDelay();
 
         String customLog = responseLogBuilder.getCustomLog();
-        logger.info(format("%s %s \n*Response delay:%s milli-secs \n%s \n%s \n-done-\n",
+        logger.warn(format("%s %s \n*Response delay:%s milli-secs \n%s \n%s \n-done-\n",
                 requestLogBuilder.toString(),
                 responseLogBuilder.toString(),
                 responseDelay,
diff --git a/core/src/main/java/org/jsmart/zerocode/core/report/ZeroCodeReportGeneratorImpl.java b/core/src/main/java/org/jsmart/zerocode/core/report/ZeroCodeReportGeneratorImpl.java
index bd5b6668..7724e730 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/report/ZeroCodeReportGeneratorImpl.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/report/ZeroCodeReportGeneratorImpl.java
@@ -36,9 +36,11 @@ import java.util.stream.Collectors;
 import static java.util.Collections.emptyList;
 import static java.util.Optional.ofNullable;
 import static org.apache.commons.lang.StringUtils.substringBetween;
+import static org.jsmart.zerocode.core.constants.ZeroCodeReportConstants.AUTHOR_MARKER_NEW;
+import static org.jsmart.zerocode.core.constants.ZeroCodeReportConstants.CATEGORY_MARKER;
 import static org.jsmart.zerocode.core.domain.builders.ExtentReportsFactory.getReportName;
-import static org.jsmart.zerocode.core.constants.ZeroCodeReportConstants.ANONYMOUS_AUTHOR;
-import static org.jsmart.zerocode.core.constants.ZeroCodeReportConstants.AUTHOR_MARKER;
+import static org.jsmart.zerocode.core.constants.ZeroCodeReportConstants.ANONYMOUS_CAT;
+import static org.jsmart.zerocode.core.constants.ZeroCodeReportConstants.AUTHOR_MARKER_OLD;
 import static org.jsmart.zerocode.core.constants.ZeroCodeReportConstants.DEFAULT_REGRESSION_CATEGORY;
 import static org.jsmart.zerocode.core.constants.ZeroCodeReportConstants.HIGH_CHART_HTML_FILE_NAME;
 import static org.jsmart.zerocode.core.constants.ZeroCodeReportConstants.LINK_LABEL_NAME;
@@ -85,12 +87,13 @@ public class ZeroCodeReportGeneratorImpl implements ZeroCodeReportGenerator {
      * Gets unique steps from a scenario. In case of retries, the steps have same correlation id and if
      * one of the retries is successful, we include it in the result(not the one which failed).
      * In a normal case(without retry), both PASS and FAIL will be included as usual.
+     *
      * @param steps
      * @return
      */
-     List<ZeroCodeReportStep> getUniqueSteps(List<ZeroCodeReportStep> steps){
-        Map<String,ZeroCodeReportStep> result = new HashMap<>();
-        steps.forEach(step->{
+    List<ZeroCodeReportStep> getUniqueSteps(List<ZeroCodeReportStep> steps) {
+        Map<String, ZeroCodeReportStep> result = new HashMap<>();
+        steps.forEach(step -> {
             result.merge(step.getCorrelationId(), step,
                     (s1, s2) -> RESULT_PASS.equals(s1.getResult()) ? s1 : s2);
         });
@@ -112,7 +115,8 @@ public class ZeroCodeReportGeneratorImpl implements ZeroCodeReportGenerator {
 
             thisReport.getResults().forEach(thisScenario -> {
                 ExtentTest test = extentReports.createTest(thisScenario.getScenarioName());
-                test.assignCategory(DEFAULT_REGRESSION_CATEGORY);
+                test.assignCategory(DEFAULT_REGRESSION_CATEGORY); //Super set
+                test.assignCategory(optionalCategory(thisScenario.getScenarioName())); //Sub sets
 
                 test.assignAuthor(optionalAuthor(thisScenario.getScenarioName()));
                 List<ZeroCodeReportStep> thisScenarioUniqueSteps = getUniqueSteps(thisScenario.getSteps());
@@ -160,23 +164,41 @@ public class ZeroCodeReportGeneratorImpl implements ZeroCodeReportGenerator {
         }
     }
 
+    /**
+     * @param scenarioName String containing a name of an author
+     * @return author of the test scenario
+     */
     protected String optionalAuthor(String scenarioName) {
-        String authorName = substringBetween(scenarioName, AUTHOR_MARKER, AUTHOR_MARKER);
+        String authorName = deriveName(scenarioName, AUTHOR_MARKER_OLD);
+        authorName = ANONYMOUS_CAT.equals(authorName) ? deriveName(scenarioName, AUTHOR_MARKER_NEW) : authorName;
+        return authorName;
+    }
+
+    /**
+     * @param scenarioName String containing hash tags of a category
+     * @return category of the test scenario
+     */
+    protected String optionalCategory(String scenarioName) {
+        return deriveName(scenarioName, CATEGORY_MARKER);
+    }
+
+    private String deriveName(String scenarioName, String marker) {
+        String authorName = substringBetween(scenarioName, marker, marker);
 
         if (authorName == null) {
-            authorName = substringBetween(scenarioName, AUTHOR_MARKER, ",");
+            authorName = substringBetween(scenarioName, marker, ",");
         }
 
         if (authorName == null) {
-            authorName = substringBetween(scenarioName, AUTHOR_MARKER, " ");
+            authorName = substringBetween(scenarioName, marker, " ");
         }
 
         if (authorName == null) {
-            authorName = scenarioName.substring(scenarioName.lastIndexOf(AUTHOR_MARKER) + AUTHOR_MARKER.length());
+            authorName = scenarioName.substring(scenarioName.lastIndexOf(marker) + marker.length());
         }
 
-        if (scenarioName.lastIndexOf(AUTHOR_MARKER) == -1 || StringUtils.isEmpty(authorName)) {
-            authorName = ANONYMOUS_AUTHOR;
+        if (scenarioName.lastIndexOf(marker) == -1 || StringUtils.isEmpty(authorName)) {
+            authorName = ANONYMOUS_CAT;
         }
 
         return authorName;
@@ -184,7 +206,7 @@ public class ZeroCodeReportGeneratorImpl implements ZeroCodeReportGenerator {
 
     protected String onlyScenarioName(String scenarioName) {
 
-        int index = scenarioName.indexOf(AUTHOR_MARKER);
+        int index = scenarioName.indexOf(AUTHOR_MARKER_OLD);
         if (index == -1) {
             return scenarioName;
         } else {
diff --git a/core/src/main/java/org/jsmart/zerocode/core/runner/StepNotificationHandler.java b/core/src/main/java/org/jsmart/zerocode/core/runner/StepNotificationHandler.java
index 7c0b4893..9eabccec 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/runner/StepNotificationHandler.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/runner/StepNotificationHandler.java
@@ -44,7 +44,7 @@ public class StepNotificationHandler {
                     String scenarioName,
                     String stepName,
                     Exception stepException) {
-        LOGGER.info(String.format("Exception occurred while executing Scenario:[%s], --> Step:[%s], Details: %s",
+        LOGGER.error(String.format("Exception occurred while executing Scenario:[%s], --> Step:[%s], Details: %s",
                         scenarioName, stepName, stepException));
         notifier.fireTestFailure(new Failure(description, stepException));
         
diff --git a/core/src/main/java/org/jsmart/zerocode/core/runner/ZeroCodeMultiStepsScenarioRunnerImpl.java b/core/src/main/java/org/jsmart/zerocode/core/runner/ZeroCodeMultiStepsScenarioRunnerImpl.java
index 7f841810..cc40764c 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/runner/ZeroCodeMultiStepsScenarioRunnerImpl.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/runner/ZeroCodeMultiStepsScenarioRunnerImpl.java
@@ -327,7 +327,7 @@ public class ZeroCodeMultiStepsScenarioRunnerImpl implements ZeroCodeMultiStepsS
             } catch (Exception ex) {
 
                 ex.printStackTrace();
-                LOGGER.info("###Exception while executing a step in the zerocode dsl.");
+                LOGGER.error("###Exception while executing a step in the zerocode dsl.");
 
                 // logging exception message
                 final LocalDateTime responseTimeStampEx = LocalDateTime.now();
diff --git a/core/src/main/java/org/jsmart/zerocode/core/runner/ZeroCodePackageRunner.java b/core/src/main/java/org/jsmart/zerocode/core/runner/ZeroCodePackageRunner.java
index 46d70bf2..81ea2f3b 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/runner/ZeroCodePackageRunner.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/runner/ZeroCodePackageRunner.java
@@ -27,7 +27,7 @@ import org.jsmart.zerocode.core.kafka.client.ZerocodeCustomKafkaClient;
 import org.jsmart.zerocode.core.report.ZeroCodeReportGenerator;
 import org.jsmart.zerocode.core.utils.SmartUtils;
 import org.junit.runner.Description;
-import org.junit.runner.Result;
+import org.junit.runner.notification.RunListener;
 import org.junit.runner.notification.RunNotifier;
 import org.junit.runners.ParentRunner;
 import org.junit.runners.model.InitializationError;
@@ -39,6 +39,7 @@ import static java.lang.System.getProperty;
 import static org.jsmart.zerocode.core.constants.ZeroCodeReportConstants.CHARTS_AND_CSV;
 import static org.jsmart.zerocode.core.constants.ZeroCodeReportConstants.ZEROCODE_JUNIT;
 import static org.jsmart.zerocode.core.utils.RunnerUtils.getEnvSpecificConfigFile;
+import static org.jsmart.zerocode.core.utils.RunnerUtils.handleTestCompleted;
 
 public class ZeroCodePackageRunner extends ParentRunner<ScenarioSpec> {
     private static final Logger LOGGER = LoggerFactory.getLogger(ZeroCodePackageRunner.class);
@@ -138,7 +139,7 @@ public class ZeroCodePackageRunner extends ParentRunner<ScenarioSpec> {
 
     @Override
     public void run(RunNotifier notifier) {
-        ZeroCodeTestReportListener reportListener = new ZeroCodeTestReportListener(smartUtils.getMapper(), getInjectedReportGenerator());
+        RunListener reportListener = createReportListener();
         notifier.addListener(reportListener);
 
         LOGGER.info("System property " + ZEROCODE_JUNIT + "=" + getProperty(ZEROCODE_JUNIT));
@@ -151,6 +152,11 @@ public class ZeroCodePackageRunner extends ParentRunner<ScenarioSpec> {
         handleNoRunListenerReport(reportListener);
     }
 
+    protected RunListener createReportListener() {
+        return getMainModuleInjector().getInstance(ZeroCodeTestReportListener.class);
+    }
+
+
     /**
      * Runs the test corresponding to {@code child}, which can be assumed to be
      * an element of the list returned by {@link ParentRunner#getChildren()}.
@@ -225,15 +231,23 @@ public class ZeroCodePackageRunner extends ParentRunner<ScenarioSpec> {
     }
 
     public Class<? extends BasicKafkaClient> createCustomKafkaClientOrDefault() {
-        final UseKafkaClient kafkaClientAnnotated = testClass.getAnnotation(UseKafkaClient.class);
+        final UseKafkaClient kafkaClientAnnotated = getUseKafkaClient();
         return kafkaClientAnnotated != null ? kafkaClientAnnotated.value() : ZerocodeCustomKafkaClient.class;
     }
 
     public Class<? extends BasicHttpClient> createCustomHttpClientOrDefault() {
-        final UseHttpClient httpClientAnnotated = testClass.getAnnotation(UseHttpClient.class);
+        final UseHttpClient httpClientAnnotated = getUseHttpClient();
         return httpClientAnnotated != null ? httpClientAnnotated.value() : SslTrustHttpClient.class;
     }
 
+    public UseHttpClient getUseHttpClient() {
+        return testClass.getAnnotation(UseHttpClient.class);
+    }
+
+    public UseKafkaClient getUseKafkaClient() {
+        return testClass.getAnnotation(UseKafkaClient.class);
+    }
+
     private ZeroCodeMultiStepsScenarioRunner getInjectedMultiStepsRunner() {
         zeroCodeMultiStepsScenarioRunner = getMainModuleInjector().getInstance(ZeroCodeMultiStepsScenarioRunner.class);
         return zeroCodeMultiStepsScenarioRunner;
@@ -243,22 +257,8 @@ public class ZeroCodePackageRunner extends ParentRunner<ScenarioSpec> {
         return getMainModuleInjector().getInstance(ZeroCodeReportGenerator.class);
     }
 
-    private void handleNoRunListenerReport(ZeroCodeTestReportListener reportListener) {
-        if (CHARTS_AND_CSV.equals(getProperty(ZEROCODE_JUNIT))) {
-            /**
-             * Gradle does not support JUnit RunListener. Hence Zerocode gracefully handled this
-             * upon request from Gradle users. But this is not limited to Gradle, anywhere you
-             * want to bypass the JUnit RunListener, you can achieve this way.
-             * See README for details.
-             *
-             * There are number of tickets opened for this, but not yet fixed.
-             * - https://discuss.gradle.org/t/testrunfinished-not-run-in-junit-integration/14644
-             * - https://github.com/gradle/gradle/issues/842
-             * - many more related tickets.
-             */
-            LOGGER.debug("Bypassed JUnit RunListener [as configured by the build tool] to generate useful reports...");
-            reportListener.testRunFinished(new Result());
-        }
+    private void handleNoRunListenerReport(RunListener reportListener) {
+        handleTestCompleted(reportListener, LOGGER);
     }
 
     private List<String> readTestScenarioFiles() {
diff --git a/core/src/main/java/org/jsmart/zerocode/core/runner/ZeroCodeUnitRunner.java b/core/src/main/java/org/jsmart/zerocode/core/runner/ZeroCodeUnitRunner.java
index a51432aa..2fe2e4f0 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/runner/ZeroCodeUnitRunner.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/runner/ZeroCodeUnitRunner.java
@@ -31,7 +31,6 @@ import org.jsmart.zerocode.core.utils.SmartUtils;
 import org.junit.internal.AssumptionViolatedException;
 import org.junit.internal.runners.model.EachTestNotifier;
 import org.junit.runner.Description;
-import org.junit.runner.Result;
 import org.junit.runner.notification.Failure;
 import org.junit.runner.notification.RunListener;
 import org.junit.runner.notification.RunNotifier;
@@ -47,6 +46,7 @@ import static org.jsmart.zerocode.core.constants.ZeroCodeReportConstants.CHARTS_
 import static org.jsmart.zerocode.core.constants.ZeroCodeReportConstants.ZEROCODE_JUNIT;
 import static org.jsmart.zerocode.core.domain.builders.ZeroCodeExecReportBuilder.newInstance;
 import static org.jsmart.zerocode.core.utils.RunnerUtils.getEnvSpecificConfigFile;
+import static org.jsmart.zerocode.core.utils.RunnerUtils.handleTestCompleted;
 
 public class ZeroCodeUnitRunner extends BlockJUnit4ClassRunner {
     private static final Logger LOGGER = LoggerFactory.getLogger(ZeroCodeUnitRunner.class);
@@ -171,7 +171,7 @@ public class ZeroCodeUnitRunner extends BlockJUnit4ClassRunner {
     }
 
     public Class<? extends BasicKafkaClient> createCustomKafkaClientOrDefault() {
-        final UseKafkaClient kafkaClientAnnotated = testClass.getAnnotation(UseKafkaClient.class);
+        final UseKafkaClient kafkaClientAnnotated = getUseKafkaClient();
         return kafkaClientAnnotated != null ? kafkaClientAnnotated.value() : ZerocodeCustomKafkaClient.class;
     }
 
@@ -184,6 +184,10 @@ public class ZeroCodeUnitRunner extends BlockJUnit4ClassRunner {
         return testClass.getAnnotation(UseHttpClient.class);
     }
 
+    public UseKafkaClient getUseKafkaClient() {
+        return testClass.getAnnotation(UseKafkaClient.class);
+    }
+
     /**
      * Override this for Junit custom lister handling.
      * End User experience can be enhanced via this
@@ -342,26 +346,7 @@ public class ZeroCodeUnitRunner extends BlockJUnit4ClassRunner {
     }
 
     protected void handleNoRunListenerReport(RunListener reportListener) {
-        if (CHARTS_AND_CSV.equals(getProperty(ZEROCODE_JUNIT))) {
-            /**
-             * Gradle does not support JUnit RunListener. Hence Zerocode gracefully handled this
-             * upon request from Gradle users. But this is not limited to Gradle, anywhere you
-             * want to bypass the JUnit RunListener, you can achieve this way.
-             * See README for details.
-             *
-             * There are number of tickets opened for this, but not yet fixed.
-             * - https://discuss.gradle.org/t/testrunfinished-not-run-in-junit-integration/14644
-             * - https://github.com/gradle/gradle/issues/842
-             * - many more related tickets.
-             */
-            LOGGER.debug("Bypassed JUnit RunListener [as configured by the build tool] to generate useful reports...");
-            try {
-                reportListener.testRunFinished(new Result());
-            } catch (Exception e) {
-                LOGGER.error("### Exception occurred while handling non-maven(e.g. Gradle) report generation => " + e);
-                throw new RuntimeException(e);
-            }
-        }
+        handleTestCompleted(reportListener, LOGGER);
     }
 
     private JsonTestCase evalScenarioToJsonTestCase(Scenario scenario) {
diff --git a/core/src/main/java/org/jsmart/zerocode/core/runner/parallel/ZeroCodeMultiLoadRunner.java b/core/src/main/java/org/jsmart/zerocode/core/runner/parallel/ZeroCodeMultiLoadRunner.java
index 5acbbb01..ac6d3651 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/runner/parallel/ZeroCodeMultiLoadRunner.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/runner/parallel/ZeroCodeMultiLoadRunner.java
@@ -21,6 +21,7 @@ import static org.junit.runner.Description.createTestDescription;
 public class ZeroCodeMultiLoadRunner extends ParentRunner<TestMapping[]> {
     private static final Logger LOGGER = LoggerFactory.getLogger(ZeroCodeMultiLoadRunner.class);
     public static final String LOAD_LABEL = "<<Multi-Load>>";
+    public static boolean scenariosPrinted;
 
     private final Class<?> testClass;
     private LoadProcessor loadProcessor;
@@ -31,7 +32,15 @@ public class ZeroCodeMultiLoadRunner extends ParentRunner<TestMapping[]> {
         super(testClass);
         this.testClass = testClass;
         this.loadPropertiesFile = validateAndGetLoadPropertiesFile();
-        loadProcessor = new LoadProcessor(loadPropertiesFile);
+        loadProcessor = createLoadProcessor();
+    }
+
+    public LoadProcessor createLoadProcessor() {
+        return new LoadProcessor(loadPropertiesFile);
+    }
+
+    public String getLoadPropertiesFile() {
+        return loadPropertiesFile;
     }
 
     @Override
@@ -51,7 +60,7 @@ public class ZeroCodeMultiLoadRunner extends ParentRunner<TestMapping[]> {
     @Override
     protected Description describeChild(TestMapping[] childArrayElement) {
         String multiLoadLabel = createMultiLoadLabel(childArrayElement);
-        System.out.println("### label = " + multiLoadLabel + "\n");
+        printMultiScenarios(multiLoadLabel);
         this.testDescription = createTestDescription(testClass, LOAD_LABEL + multiLoadLabel);
         return testDescription;
     }
@@ -121,4 +130,11 @@ public class ZeroCodeMultiLoadRunner extends ParentRunner<TestMapping[]> {
                         + "." + thisChild.testMethod())
                 .collect(Collectors.joining(",")) + "\n";
     }
+
+    private void printMultiScenarios(String multiLoadLabel) {
+        if(!scenariosPrinted){
+            System.out.println("### Scenarios = " + multiLoadLabel + "\n");
+            scenariosPrinted = true;
+        }
+    }
 }
diff --git a/core/src/main/java/org/jsmart/zerocode/core/utils/RunnerUtils.java b/core/src/main/java/org/jsmart/zerocode/core/utils/RunnerUtils.java
index 2ade125e..2e94a66b 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/utils/RunnerUtils.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/utils/RunnerUtils.java
@@ -1,23 +1,21 @@
 package org.jsmart.zerocode.core.utils;
 
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import org.apache.commons.lang.StringUtils;
 import org.jsmart.zerocode.core.domain.EnvProperty;
 import org.jsmart.zerocode.core.domain.Parameterized;
 import org.jsmart.zerocode.core.domain.Step;
 import org.jsmart.zerocode.core.domain.TestMapping;
-import org.jsmart.zerocode.core.domain.UseHttpClient;
-import org.jsmart.zerocode.core.domain.UseKafkaClient;
-import org.jsmart.zerocode.core.httpclient.BasicHttpClient;
-import org.jsmart.zerocode.core.httpclient.ssl.SslTrustHttpClient;
-import org.jsmart.zerocode.core.kafka.client.BasicKafkaClient;
-import org.jsmart.zerocode.core.kafka.client.ZerocodeCustomKafkaClient;
+import org.junit.runner.Result;
+import org.junit.runner.notification.RunListener;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
+import static java.lang.System.getProperty;
+import static org.jsmart.zerocode.core.constants.ZeroCodeReportConstants.CHARTS_AND_CSV;
+import static org.jsmart.zerocode.core.constants.ZeroCodeReportConstants.ZEROCODE_JUNIT;
 import static org.jsmart.zerocode.core.utils.SmartUtils.getEnvPropertyValue;
 import static org.jsmart.zerocode.core.utils.TokenUtils.getTestCaseTokens;
 
@@ -134,4 +132,26 @@ public class RunnerUtils {
                 (csvSource != null ? csvSource.size() : 0);
     }
 
+    public static void handleTestCompleted(RunListener reportListener, Logger logger) {
+        if (CHARTS_AND_CSV.equals(getProperty(ZEROCODE_JUNIT))) {
+            /**
+             * Gradle does not support JUnit RunListener. Hence Zerocode gracefully handled this
+             * upon request from Gradle users. But this is not limited to Gradle, anywhere you
+             * want to bypass the JUnit RunListener, you can achieve this way.
+             * See README for details.
+             *
+             * There are number of tickets opened for this, but not yet fixed.
+             * - https://discuss.gradle.org/t/testrunfinished-not-run-in-junit-integration/14644
+             * - https://github.com/gradle/gradle/issues/842
+             * - many more related tickets.
+             */
+            logger.debug("Bypassed JUnit RunListener [as configured by the build tool] to generate useful reports...");
+            try {
+                reportListener.testRunFinished(new Result());
+            } catch (Exception e) {
+                logger.error("### Exception occurred while handling non-maven(e.g. Gradle) report generation => " + e);
+                throw new RuntimeException(e);
+            }
+        }
+    }
 }
diff --git a/core/src/main/java/org/jsmart/zerocode/core/utils/TokenUtils.java b/core/src/main/java/org/jsmart/zerocode/core/utils/TokenUtils.java
index 24496910..1c263878 100644
--- a/core/src/main/java/org/jsmart/zerocode/core/utils/TokenUtils.java
+++ b/core/src/main/java/org/jsmart/zerocode/core/utils/TokenUtils.java
@@ -17,6 +17,7 @@ import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic;
 import static org.apache.commons.lang.RandomStringUtils.randomAlphanumeric;
 import static org.apache.commons.lang.StringEscapeUtils.escapeJava;
 import static org.jsmart.zerocode.core.engine.tokens.ZeroCodeValueTokens.ABS_PATH;
+import static org.jsmart.zerocode.core.engine.tokens.ZeroCodeValueTokens.GQL_FILE;
 import static org.jsmart.zerocode.core.engine.tokens.ZeroCodeValueTokens.LOCALDATETIME_NOW;
 import static org.jsmart.zerocode.core.engine.tokens.ZeroCodeValueTokens.LOCALDATE_TODAY;
 import static org.jsmart.zerocode.core.engine.tokens.ZeroCodeValueTokens.RANDOM_NUMBER;
@@ -101,6 +102,12 @@ public class TokenUtils {
                             // Used escapeJava, do not use escapeXml as it replaces
                             // with GT LT etc ie what exactly you don't want
                             paramaMap.put(runTimeToken, escapeJava(xmlString));
+                        } else if (runTimeToken.startsWith(GQL_FILE)) {
+                            String gqlFileResource = runTimeToken.substring(GQL_FILE.length());
+                            final String gqlString = getXmlContent(gqlFileResource);
+                            // Used escapeJava, do not use escapeXml as it replaces
+                            // with GT LT etc ie what exactly you don't want
+                            paramaMap.put(runTimeToken, escapeJava(gqlString));
 
                         } else if (runTimeToken.startsWith(RANDOM_UU_ID)) {
                             if(runTimeToken.equals(RANDOM_UU_ID_FIXED)){
diff --git a/pom.xml b/pom.xml
index f287c62d..e2ff4a0b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -9,7 +9,7 @@
 
     <artifactId>zerocode-tdd-parent</artifactId>
     <groupId>org.jsmart</groupId>
-    <version>1.3.23-SNAPSHOT</version>
+    <version>1.3.24-SNAPSHOT</version>
 
     <packaging>pom</packaging>
     <name>ZeroCode TDD Parent</name>
diff --git a/zerocode-maven-archetype/pom.xml b/zerocode-maven-archetype/pom.xml
index 4c013e3f..0cf89521 100644
--- a/zerocode-maven-archetype/pom.xml
+++ b/zerocode-maven-archetype/pom.xml
@@ -4,7 +4,7 @@
     <parent>
         <groupId>org.jsmart</groupId>
         <artifactId>zerocode-tdd-parent</artifactId>
-        <version>1.3.23-SNAPSHOT</version>
+        <version>1.3.24-SNAPSHOT</version>
     </parent>
     <artifactId>zerocode-maven-archetype</artifactId>
 


Test patch:
diff --git a/core/src/test/java/org/jsmart/zerocode/core/report/ZeroCodeReportGeneratorImplTest.java b/core/src/test/java/org/jsmart/zerocode/core/report/ZeroCodeReportGeneratorImplTest.java
index 469272bc..20a16c65 100644
--- a/core/src/test/java/org/jsmart/zerocode/core/report/ZeroCodeReportGeneratorImplTest.java
+++ b/core/src/test/java/org/jsmart/zerocode/core/report/ZeroCodeReportGeneratorImplTest.java
@@ -56,10 +56,12 @@ public class ZeroCodeReportGeneratorImplTest {
 
     }
 
+
     @Test
     public void testAuthorJiraStyle() throws Exception {
         String author;
 
+        // OLD - Deprecated
         author = zeroCodeReportGenerator.optionalAuthor("PayPal One touch payment @@Peter@@");
         assertThat(author, is("Peter"));
 
@@ -83,6 +85,60 @@ public class ZeroCodeReportGeneratorImplTest {
 
     }
 
+    @Test
+    public void testAuthorJiraStyle_new() throws Exception {
+        String author;
+
+        author = zeroCodeReportGenerator.optionalAuthor("PayPal One touch payment @Peter@");
+        assertThat(author, is("Peter"));
+
+        author = zeroCodeReportGenerator.optionalAuthor("PayPal One touch @payment @Peter@");
+        assertThat(author, is("payment "));
+
+        author = zeroCodeReportGenerator.optionalAuthor("PayPal One touch payment @Peter Gibson@");
+        assertThat(author, is("Peter Gibson"));
+
+        author = zeroCodeReportGenerator.optionalAuthor("PayPal One touch payment @Peter Gibson");
+        assertThat(author, is("Peter"));
+
+        author = zeroCodeReportGenerator.optionalAuthor("PayPal One touch payment @Peter");
+        assertThat(author, is("Peter"));
+
+        author = zeroCodeReportGenerator.optionalAuthor("@Peter, PayPal One touch payment ");
+        assertThat(author, is("Peter"));
+
+        author = zeroCodeReportGenerator.optionalAuthor("PayPal One touch payment");
+        assertThat(author, is("Anonymous"));
+
+    }
+
+    @Test
+    public void testCategoryHashTag() throws Exception {
+        String author;
+
+        author = zeroCodeReportGenerator.optionalCategory("PayPal One touch payment #Smoke#");
+        assertThat(author, is("Smoke"));
+
+        author = zeroCodeReportGenerator.optionalCategory("PayPal One touch #Smoke #PDC#");
+        assertThat(author, is("Smoke "));
+
+        author = zeroCodeReportGenerator.optionalCategory("PayPal One touch payment #SIT Smoke#");
+        assertThat(author, is("SIT Smoke"));
+
+        author = zeroCodeReportGenerator.optionalCategory("PayPal One touch payment #PDC Gibson");
+        assertThat(author, is("PDC"));
+
+        author = zeroCodeReportGenerator.optionalCategory("PayPal One touch payment #PDC");
+        assertThat(author, is("PDC"));
+
+        author = zeroCodeReportGenerator.optionalCategory("#PDC, PayPal One touch payment ");
+        assertThat(author, is("PDC"));
+
+        author = zeroCodeReportGenerator.optionalCategory("PayPal One touch payment");
+        assertThat(author, is("Anonymous"));
+
+    }
+
     @Test
     public void testGettingUniqueStepsForMultipleRetries(){
         List<ZeroCodeReportStep> steps = new ArrayList<ZeroCodeReportStep>(){
diff --git a/core/src/test/java/org/jsmart/zerocode/github/TestGitHubApi.java b/core/src/test/java/org/jsmart/zerocode/github/TestGitHubApi.java
index c6830593..611c58ab 100644
--- a/core/src/test/java/org/jsmart/zerocode/github/TestGitHubApi.java
+++ b/core/src/test/java/org/jsmart/zerocode/github/TestGitHubApi.java
@@ -11,7 +11,7 @@ import org.junit.runner.RunWith;
 @RunWith(ZeroCodeUnitRunner.class)
 public class TestGitHubApi {
 
-    @Ignore("Locally passes, but fails in Travis CI due to rate limiting issue of GitHub")
+    //@Ignore("Locally passes, but fails in Travis CI due to rate limiting issue of GitHub")
     @Test
     @JsonTestCase("load_test_files/github_get_api_sample_test.json")
     public void testGitHubApi_get() throws Exception {
diff --git a/core/src/test/resources/integration_test_files/soap/soap_request_xml_from_external_xml_file.json b/core/src/test/resources/integration_test_files/soap/soap_request_xml_from_external_xml_file.json
index d55b298e..28489cc8 100644
--- a/core/src/test/resources/integration_test_files/soap/soap_request_xml_from_external_xml_file.json
+++ b/core/src/test/resources/integration_test_files/soap/soap_request_xml_from_external_xml_file.json
@@ -10,7 +10,8 @@
                     "Content-Type": "text/xml; charset=utf-8",
                     "SOAPAction": "http://www.webserviceX.NET/ConversionRate"
                 },
-                "body": "${XML.FILE:16_soap/xml_files/soap_request.xml}"
+                "body": "${XML.FILE:integration_test_files/soap/xml_files/soap_request.xml}"
+                //"body": "${GQL.FILE:integration_test_files/soap/xml_files/soap_request.xml}" //both works
             },
             "assertions": {
                 "status": 200,
diff --git a/core/src/test/resources/soap_host.properties b/core/src/test/resources/soap_host.properties
index 8eda7690..f91a3f1e 100755
--- a/core/src/test/resources/soap_host.properties
+++ b/core/src/test/resources/soap_host.properties
@@ -10,4 +10,6 @@ report.spike.chart.enabled=true
 
 # This is false by default, it runs even if this property is not present here
 # If you do not want the html-searchable-report, then set this flag to true
-interactive.html.report.disabled=true
\ No newline at end of file
+interactive.html.report.disabled=true
+
+http.max.timeout.milliseconds=2000
\ No newline at end of file
diff --git a/http-testing/pom.xml b/http-testing/pom.xml
index 5be651db..93fa187c 100644
--- a/http-testing/pom.xml
+++ b/http-testing/pom.xml
@@ -4,7 +4,7 @@
     <parent>
         <artifactId>zerocode-tdd-parent</artifactId>
         <groupId>org.jsmart</groupId>
-        <version>1.3.23-SNAPSHOT</version>
+        <version>1.3.24-SNAPSHOT</version>
     </parent>
 
     <groupId>org.jsmart</groupId>
diff --git a/junit5-testing/pom.xml b/junit5-testing/pom.xml
index f1fe6906..42fffeb7 100644
--- a/junit5-testing/pom.xml
+++ b/junit5-testing/pom.xml
@@ -4,7 +4,7 @@
     <parent>
         <artifactId>zerocode-tdd-parent</artifactId>
         <groupId>org.jsmart</groupId>
-        <version>1.3.23-SNAPSHOT</version>
+        <version>1.3.24-SNAPSHOT</version>
     </parent>
 
     <artifactId>zerocode-tdd-jupiter</artifactId>
diff --git a/kafka-testing/pom.xml b/kafka-testing/pom.xml
index 080cbb6e..f11df4d7 100644
--- a/kafka-testing/pom.xml
+++ b/kafka-testing/pom.xml
@@ -4,7 +4,7 @@
 	<parent>
 		<artifactId>zerocode-tdd-parent</artifactId>
 		<groupId>org.jsmart</groupId>
-		<version>1.3.23-SNAPSHOT</version>
+		<version>1.3.24-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>kafka-testing</artifactId>
diff --git a/kafka-testing/src/test/java/org/jsmart/zerocode/integration/tests/kafka/consume/intercept/KafkaIntegrationBddTest.java b/kafka-testing/src/test/java/org/jsmart/zerocode/integration/tests/kafka/consume/intercept/KafkaIntegrationBddTest.java
new file mode 100644
index 00000000..fa5ce7fc
--- /dev/null
+++ b/kafka-testing/src/test/java/org/jsmart/zerocode/integration/tests/kafka/consume/intercept/KafkaIntegrationBddTest.java
@@ -0,0 +1,22 @@
+package org.jsmart.zerocode.integration.tests.kafka.consume.intercept;
+
+import org.jsmart.zerocode.core.domain.Scenario;
+import org.jsmart.zerocode.core.domain.TargetEnv;
+import org.jsmart.zerocode.core.runner.ZeroCodeUnitRunner;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@TargetEnv("kafka_servers/intercept/kafka_brokers.properties")
+@RunWith(ZeroCodeUnitRunner.class)
+public class KafkaIntegrationBddTest {
+
+    @Test
+    @Scenario("kafka/consume/e2e_bdd/test_kafka_e2e_integration_msg.yml")
+    public void testKafka_e2eBddJSON() throws Exception {
+    }
+
+    @Test
+    @Scenario("kafka/consume/e2e_bdd/test_kafka_e2e_integration_msg.json")
+    public void testKafka_e2eBddYML() throws Exception {
+    }
+}
diff --git a/kafka-testing/src/test/resources/kafka/consume/e2e_bdd/test_kafka_e2e_integration_msg.json b/kafka-testing/src/test/resources/kafka/consume/e2e_bdd/test_kafka_e2e_integration_msg.json
new file mode 100755
index 00000000..c91ab19f
--- /dev/null
+++ b/kafka-testing/src/test/resources/kafka/consume/e2e_bdd/test_kafka_e2e_integration_msg.json
@@ -0,0 +1,62 @@
+{
+    "scenarioName": "Intercept a RAW message",
+    "steps": [
+        {
+            "name": "load_kafka1",
+            "url": "kafka-topic:order-topic",
+            "operation": "PRODUCE",
+            "request": {
+                "records": [
+                    {
+                        "key": "${RANDOM.NUMBER}",
+                        "value": "Order No. 123"
+                    }
+                ]
+            },
+            "assertions": {
+                "status": "Ok"
+            }
+        },
+        {
+            // Application reads from "order-topic", then
+            // enriches with Card details and sends to "billing-topic".
+            // You can remove this step while testing your actual Kafka Application logic
+            "name": "load_kafka2",
+            "url": "kafka-topic:billing-topic",
+            "operation": "PRODUCE",
+            "request": {
+                "records": [
+                    {
+                        "key": "${RANDOM.NUMBER}",
+                        "value": "Order No. 123, Card No. 456"
+                    }
+                ]
+            },
+            "assertions": {
+                "status": "Ok"
+            }
+        },
+        {
+            "name": "unload_kafka",
+            "url": "kafka-topic:billing-topic",
+            "operation": "CONSUME",
+            "request": {
+                "consumerLocalConfigs": {
+                    // "recordType": "RAW", //Default
+                    // "commitSync": true, //Default
+                    "showRecordsConsumed": true,
+                    "maxNoOfRetryPollsOrTimeouts": 1,
+                    "seek": "billing-topic,0,0"
+                }
+            },
+            "assertions": {
+                "size": 1,
+                "records": [
+                    {
+                        "value": "Order No. 123, Card No. 456"
+                    }
+                ]
+            }
+        }
+    ]
+}
diff --git a/kafka-testing/src/test/resources/kafka/consume/e2e_bdd/test_kafka_e2e_integration_msg.yml b/kafka-testing/src/test/resources/kafka/consume/e2e_bdd/test_kafka_e2e_integration_msg.yml
new file mode 100755
index 00000000..f7a3836d
--- /dev/null
+++ b/kafka-testing/src/test/resources/kafka/consume/e2e_bdd/test_kafka_e2e_integration_msg.yml
@@ -0,0 +1,33 @@
+---
+scenarioName: Intercept a message from Kafka topic
+steps:
+- name: load_kafka1
+  url: kafka-topic:order-topic
+  operation: PRODUCE
+  request:
+    records:
+    - key: "${RANDOM.NUMBER}"
+      value: Order No. 123
+  assertions:
+    status: Ok
+- name: load_kafka2
+  url: kafka-topic:billing-topic
+  operation: PRODUCE
+  request:
+    records:
+    - key: "${RANDOM.NUMBER}"
+      value: Order No. 123, Card No. 456
+  assertions:
+    status: Ok
+- name: unload_kafka
+  url: kafka-topic:billing-topic
+  operation: CONSUME
+  request:
+    consumerLocalConfigs:
+      showRecordsConsumed: true
+      maxNoOfRetryPollsOrTimeouts: 1
+      seek: billing-topic,0,0
+  assertions:
+    size: 1
+    records:
+    - value: Order No. 123, Card No. 456
diff --git a/kafka-testing/src/test/resources/kafka/produce/test_kafka_produce_2_records.json b/kafka-testing/src/test/resources/kafka/produce/test_kafka_produce_2_records.json
index 86ca5d78..cdcd6862 100755
--- a/kafka-testing/src/test/resources/kafka/produce/test_kafka_produce_2_records.json
+++ b/kafka-testing/src/test/resources/kafka/produce/test_kafka_produce_2_records.json
@@ -28,7 +28,7 @@
             "request": {
                 "consumerLocalConfigs": {
                     "showRecordsConsumed": true,
-                    "maxNoOfRetryPollsOrTimeouts": 3
+                    "maxNoOfRetryPollsOrTimeouts": 5
                 }
             },
             "assertions": {
diff --git a/kafka-testing/src/test/resources/kafka_servers/intercept/kafka_brokers.properties b/kafka-testing/src/test/resources/kafka_servers/intercept/kafka_brokers.properties
new file mode 100755
index 00000000..1a33c475
--- /dev/null
+++ b/kafka-testing/src/test/resources/kafka_servers/intercept/kafka_brokers.properties
@@ -0,0 +1,38 @@
+# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+# kafka bootstrap servers comma separated
+# e.g. localhost:9092,host2:9093
+# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+kafka.bootstrap.servers=localhost:9092
+
+kafka.producer.properties=kafka_servers/kafka_producer.properties
+kafka.consumer.properties=kafka_servers/intercept/kafka_intercept_consumer.properties
+
+# --------------------------------------------------------------------
+# Optional local consumer properties common/central to all test cases.
+# These can be overwritten by the tests locally.
+# --------------------------------------------------------------------
+# If this property is set, then the consumer does a commitSync after reading the message(s)
+# Make sure you don't set both commitSync and commitAsync to true
+consumer.commitSync = true
+# If this property is set, then the consumer does a commitAsync after reading the message(s)
+# Make sure you don't set both commitSync and commitAsync to true
+consumer.commitAsync = false
+# All records those were read are dumped to this specified file path
+# This path can be a relative path or an absolute path. If the file
+# does not exist, it creates the file and dumps the records
+consumer.fileDumpTo= target/temp/demo.txt
+# If this property is set to true, all records are shown in the response.
+# When dealing with large number of records, you might not be interested
+# in the individual records, but interested in the recordCount
+# i.e. total number of records consumed
+consumer.showRecordsConsumed=false
+# That means if any record(s) are read, then this counter is reset to 0(zero) and the consumer
+# polls again. So if no records are fetched for a specific poll interval, then the consumer
+# gives a retry retrying until this max number polls/reties reached.
+consumer.maxNoOfRetryPollsOrTimeouts = 5
+# Polling time in milli seconds i.e how long the consumer should poll before
+# the next retry poll
+consumer.pollingTime = 5000
+
+# local producer properties
+producer.key1=value1-testv ycvb
diff --git a/kafka-testing/src/test/resources/kafka_servers/intercept/kafka_intercept_consumer.properties b/kafka-testing/src/test/resources/kafka_servers/intercept/kafka_intercept_consumer.properties
new file mode 100755
index 00000000..45274db7
--- /dev/null
+++ b/kafka-testing/src/test/resources/kafka_servers/intercept/kafka_intercept_consumer.properties
@@ -0,0 +1,27 @@
+# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+#          kafka consumer properties
+# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+group.id=consumerGroup14
+key.deserializer=org.apache.kafka.common.serialization.StringDeserializer
+value.deserializer=org.apache.kafka.common.serialization.StringDeserializer
+max.poll.records=1
+enable.auto.commit=false
+auto.offset.reset=latest
+#max.partition.fetch.bytes=23
+#max.poll.interval.ms=2000
+
+#
+#group.id=None
+#enable.auto.commit=true
+#key.deserializer=org.apache.kafka.common.serialization.LongDeserializer
+#value.deserializer=org.apache.kafka.common.serialization.StringDeserializer
+#
+## fast session timeout makes it more fun to play with failover
+#session.timeout.ms=10000
+#
+## These buffer sizes seem to be needed to avoid consumer switching to
+## a mode where it processes one bufferful every 5 seconds with multiple
+## timeouts along the way.  No idea why this happens.
+#fetch.min.bytes=50000
+#receive.buffer.bytes=262144
+#max.partition.fetch.bytes=2097152
\ No newline at end of file
diff --git a/kafka-testing/src/test/resources/kafka_servers/kafka_test_server.properties b/kafka-testing/src/test/resources/kafka_servers/kafka_test_server.properties
index dfe849c3..79d8ba4c 100755
--- a/kafka-testing/src/test/resources/kafka_servers/kafka_test_server.properties
+++ b/kafka-testing/src/test/resources/kafka_servers/kafka_test_server.properties
@@ -32,7 +32,7 @@ consumer.showRecordsConsumed=false
 consumer.maxNoOfRetryPollsOrTimeouts = 5
 # Polling time in milli seconds i.e how long the consumer should poll before
 # the next retry poll
-consumer.pollingTime = 1000
+consumer.pollingTime = 3000
 
 # local producer properties
 producer.key1=value1-testv ycvb
diff --git a/kafka-testing/src/test/resources/kafka_servers/kafka_test_server_double_key.properties b/kafka-testing/src/test/resources/kafka_servers/kafka_test_server_double_key.properties
index 60fe569d..b7421705 100755
--- a/kafka-testing/src/test/resources/kafka_servers/kafka_test_server_double_key.properties
+++ b/kafka-testing/src/test/resources/kafka_servers/kafka_test_server_double_key.properties
@@ -36,7 +36,7 @@ consumer.showRecordsConsumed=true
 consumer.maxNoOfRetryPollsOrTimeouts = 5
 # Polling time in milli seconds i.e how long the consumer should poll before
 # the next retry poll
-consumer.pollingTime = 1000
+consumer.pollingTime = 3000
 
 # local producer properties
 producer.key1=value1-testv ycvb
diff --git a/kafka-testing/src/test/resources/kafka_servers/kafka_test_server_int_key.properties b/kafka-testing/src/test/resources/kafka_servers/kafka_test_server_int_key.properties
index 0e622968..72ddad78 100755
--- a/kafka-testing/src/test/resources/kafka_servers/kafka_test_server_int_key.properties
+++ b/kafka-testing/src/test/resources/kafka_servers/kafka_test_server_int_key.properties
@@ -36,7 +36,7 @@ consumer.showRecordsConsumed=true
 consumer.maxNoOfRetryPollsOrTimeouts = 5
 # Polling time in milli seconds i.e how long the consumer should poll before
 # the next retry poll
-consumer.pollingTime = 1000
+consumer.pollingTime = 3000
 
 # local producer properties
 producer.key1=value1-testv ycvb