package test.thread.parallelization;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* {@code TestNgRunStateTracker} tracks state information for a TestNG run: suite listener start, suite listener end,
* test listener start, test listener end, method listener start, method execution, and method listener completion.
* {@code TestNgRunStateListener} can be used in conjunction with {@code TestNgRunStateTracker} to log the time and
* thread IDs for each of these events.
*/
public class TestNgRunStateTracker {
private static List<EventLog> eventLogs = new ArrayList<>();
public static void logEvent(EventLog eventLog) {
synchronized(eventLogs) {
eventLogs.add(eventLog);
}
}
//Get all event logs for all suites
public static List<EventLog> getAllEventLogs() {
return eventLogs;
}
//Get all suite level event logs
public static List<EventLog> getAllSuiteLevelEventLogs() {
List<EventLog> suiteEventLogs = new ArrayList<>();
for(EventLog eventLog : eventLogs) {
if(isSuiteLevelEventLog(eventLog)) {
suiteEventLogs.add(eventLog);
}
}
return suiteEventLogs;
}
//Get all suite listener onStart event logs
public static List<EventLog> getAllSuiteListenerStartEventLogs() {
List<EventLog> suiteStartEventLogs = new ArrayList<>();
for(EventLog eventLog : eventLogs) {
if(eventLog.getEvent() == TestNgRunEvent.LISTENER_SUITE_START) {
suiteStartEventLogs.add(eventLog);
}
}
return suiteStartEventLogs;
}
//Get all suite listener onFinish event logs
public static List<EventLog> getAllSuiteListenerFinishEventLogs() {
List<EventLog> suiteFinishEventLogs = new ArrayList<>();
for(EventLog eventLog : eventLogs) {
if(eventLog.getEvent() == TestNgRunEvent.LISTENER_SUITE_FINISH) {
suiteFinishEventLogs.add(eventLog);
}
}
return suiteFinishEventLogs;
}
//Get all suite level event logs associated with the specified suite
public static List<EventLog> getSuiteLevelEventLogsForSuite(String suiteName) {
List<EventLog> suiteEventLogs = new ArrayList<>();
for(EventLog eventLog : eventLogs) {
if(isSuiteLevelEventLog(eventLog) && belongsToSuite(suiteName, eventLog)) {
suiteEventLogs.add(eventLog);
}
}
return suiteEventLogs;
}
//Get all event logs associated with the specified suite
public static List<EventLog> getAllEventLogsForSuite(String suiteName) {
List<EventLog> suiteEventLogs = new ArrayList<>();
for(EventLog eventLog : eventLogs) {
if(belongsToSuite(suiteName, eventLog)) {
suiteEventLogs.add(eventLog);
}
}
return suiteEventLogs;
}
//Get event logs for the specified suite and event
public static List<EventLog> getEventLogsByEventTypeForSuite(String suiteName, TestNgRunEvent event) {
List<EventLog> suiteEventLogs = new ArrayList<>();
for(EventLog eventLog : eventLogs) {
if(eventLog.getEvent() == event && belongsToSuite(suiteName, eventLog)) {
suiteEventLogs.add(eventLog);
}
}
return suiteEventLogs ;
}
//Get the event log for the suite listener's onStart method for the specified suite
public static EventLog getSuiteListenerStartEventLog(String suiteName) {
for(EventLog eventLog : eventLogs) {
if(eventLog.getEvent() == TestNgRunEvent.LISTENER_SUITE_START && belongsToSuite(suiteName, eventLog)) {
return eventLog;
}
}
return null;
}
//Get the event log for the suite listener's onStart method for the specified suite
public static EventLog getSuiteListenerFinishEventLog(String suiteName) {
for(EventLog eventLog : eventLogs) {
if(eventLog.getEvent() == TestNgRunEvent.LISTENER_SUITE_FINISH && belongsToSuite(suiteName, eventLog)) {
return eventLog;
}
}
return null;
}
//Get the timestamp for the suite listener's onStart method for the specified suite
public static Long getSuiteListenerStartTimestamp(String suiteName) {
EventLog eventLog = getSuiteListenerStartEventLog(suiteName);
return eventLog == null ? null : eventLog.getTimeOfEvent();
}
//Get the timestamp for suite listener's onFinish method for the specified suite
public static Long getSuiteListenerFinishTimestamp(String suiteName) {
EventLog eventLog = getSuiteListenerFinishEventLog(suiteName);
return eventLog == null ? null : eventLog.getTimeOfEvent();
}
//Get the threadId for suite listener's onStart method for the specified suite
public static Long getSuiteListenerStartThreadId(String suiteName) {
EventLog eventLog = getSuiteListenerStartEventLog(suiteName);
return eventLog == null ? null : eventLog.getThreadId();
}
//Get the threadId for suite listener's onFinish method for the specified suite
public static Long getSuiteListenerFinishThreadId(String suiteName) {
EventLog eventLog = getSuiteListenerFinishEventLog(suiteName);
return eventLog == null ? null : eventLog.getThreadId();
}
//Get all test level event logs
public static List<EventLog> getAllTestLevelEventLogs() {
List<EventLog> testEventLogs = new ArrayList<>();
for(EventLog eventLog : eventLogs) {
if(isTestLevelEventLog(eventLog)) {
testEventLogs.add(eventLog);
}
}
return testEventLogs;
}
//Get all suite and test level event logs
public static List<EventLog> getAllSuiteAndTestLevelEventLogs() {
List<EventLog> testEventLogs = new ArrayList<>();
for(EventLog eventLog : eventLogs) {
if(isSuiteLevelEventLog(eventLog) || isTestLevelEventLog(eventLog)) {
testEventLogs.add(eventLog);
}
}
return testEventLogs;
}
//Get all test level event logs for the specified suite
public static List<EventLog> getTestLevelEventLogsForSuite(String suiteName) {
List<EventLog> testEventLogs = new ArrayList<>();
for(EventLog eventLog : eventLogs) {
if(isTestLevelEventLog(eventLog) && belongsToSuite(suiteName, eventLog)) {
testEventLogs.add(eventLog);
}
}
return testEventLogs;
}
//Get all suite and test level event logs for the specified suite
public static List<EventLog> getSuiteAndTestLevelEventLogsForSuite(String suiteName) {
List<EventLog> testEventLogs = new ArrayList<>();
for(EventLog eventLog : eventLogs) {
if((isSuiteLevelEventLog(eventLog) || isTestLevelEventLog(eventLog)) &&
belongsToSuite(suiteName, eventLog)) {
testEventLogs.add(eventLog);
}
}
return testEventLogs;
}
//Get all the test listener onStart event logs for the specified suite
public static List<EventLog> getTestListenerStartEventLogsForSuite(String suiteName) {
List<EventLog> testStartEventLogs = new ArrayList<>();
for(EventLog eventLog : eventLogs) {
if(eventLog.getEvent() == TestNgRunEvent.LISTENER_TEST_START && belongsToSuite(suiteName, eventLog)) {
testStartEventLogs.add(eventLog);
}
}
return testStartEventLogs;
}
//Get all the test listener onFinish event logs for the specified suite
public static List<EventLog> getTestListenerFinishEventLogsForSuite(String suiteName) {
List<EventLog> testFinishEventLogs = new ArrayList<>();
for(EventLog eventLog : eventLogs) {
if(eventLog.getEvent() == TestNgRunEvent.LISTENER_TEST_FINISH && belongsToSuite(suiteName, eventLog)) {
testFinishEventLogs.add(eventLog);
}
}
return testFinishEventLogs;
}
//Get all test level event logs for with the specified test
public static List<EventLog> getTestLevelEventLogsForTest(String suiteName, String testName) {
List<EventLog> testEventLogs = new ArrayList<>();
for(EventLog eventLog : eventLogs) {
if(isTestLevelEventLog(eventLog) && belongsToTest(suiteName, testName, eventLog)) {
testEventLogs.add(eventLog);
}
}
return testEventLogs;
}
//Get all event logs associated with the specified test
public static List<EventLog> getAllEventLogsForTest(String suiteName, String testName) {
List<EventLog> testEventLogs = new ArrayList<>();
for(EventLog eventLog : eventLogs) {
if(belongsToTest(suiteName, testName, eventLog)) {
testEventLogs.add(eventLog);
}
}
return testEventLogs;
}
//Get event logs for the specified test and event
public static List<EventLog> getEventLogsByEventTypeForTest(String suiteName, String testName, TestNgRunEvent
event) {
List<EventLog> testEventLogs = new ArrayList<>();
for(EventLog eventLog : eventLogs) {
if(eventLog.getEvent() == event && belongsToTest(suiteName, testName, eventLog)) {
testEventLogs.add(eventLog);
}
}
return testEventLogs ;
}
//Get event log for test listener's onStart method for the specified test
public static EventLog getTestListenerStartEventLog(String suiteName, String testName) {
for(EventLog eventLog : eventLogs) {
if(eventLog.getEvent() == TestNgRunEvent.LISTENER_TEST_START &&
belongsToTest(suiteName, testName, eventLog)) {
return eventLog;
}
}
return null;
}
//Get event log for test listener's onFinish method for the specified test
public static EventLog getTestListenerFinishEventLog(String suiteName, String testName) {
for(EventLog eventLog : eventLogs) {
if(eventLog.getEvent() == TestNgRunEvent.LISTENER_TEST_FINISH &&
belongsToTest(suiteName, testName, eventLog)) {
return eventLog;
}
}
return null;
}
//Get the timestamp for test listener's onStart method for the specified test
public static Long getTestListenerStartTimestamp(String suiteName, String testName) {
EventLog eventLog = getTestListenerStartEventLog(suiteName, testName);
return eventLog == null ? null : eventLog.getTimeOfEvent();
}
//Get the timestamp for test listener's onFinish method for the specified test
public static Long getTestListenerFinishTimestamp(String suiteName, String testName) {
EventLog eventLog = getTestListenerFinishEventLog(suiteName, testName);
return eventLog == null ? null : eventLog.getTimeOfEvent();
}
//Get the threadId for test listener's onStart method for the specified test
public static Long getTestListenerStartThreadId(String suiteName, String testName) {
EventLog eventLog = getTestListenerStartEventLog(suiteName, testName);
return eventLog == null ? null : eventLog.getThreadId();
}
//Get the threadId for test listener's onFinish method for the specified test
public static Long getTestListenerFinishThreadId(String suiteName, String testName) {
EventLog eventLog = getTestListenerFinishEventLog(suiteName, testName);
return eventLog == null ? null : eventLog.getThreadId();
}
//Get all test method level event logs
public static List<EventLog> getAllTestMethodLevelEventLogs() {
List<EventLog> testMethodEventLogs = new ArrayList<>();
for(EventLog eventLog : eventLogs) {
if(isTestMethodLevelEventLog(eventLog)) {
testMethodEventLogs.add(eventLog);
}
}
return testMethodEventLogs;
}
//Get all test method level event logs for the specified suite
public static List<EventLog> getTestMethodLevelEventLogsForSuite(String suiteName) {
List<EventLog> testMethodEventLogs = new ArrayList<>();
for(EventLog eventLog : eventLogs) {
if(isTestMethodLevelEventLog(eventLog) && belongsToSuite(suiteName, eventLog)) {
testMethodEventLogs.add(eventLog);
}
}
return testMethodEventLogs;
}
//Get all test method level event logs for the specified test
public static List<EventLog> getTestMethodLevelEventLogsForTest(String suiteName, String testName) {
List<EventLog> testMethodEventLogs = new ArrayList<>();
for(EventLog eventLog : eventLogs) {
if(isTestMethodLevelEventLog(eventLog) && belongsToTest(suiteName, testName, eventLog)) {
testMethodEventLogs.add(eventLog);
}
}
return testMethodEventLogs;
}
//Get the test method listener onTestStart event logs for the specified suite and test
public static List<EventLog> getTestMethodListenerStartEventLogsForTest(String suiteName, String testName) {
List<EventLog> testMethodStartEventLogs = new ArrayList<>();
for(EventLog eventLog : eventLogs) {
if(eventLog.getEvent() == TestNgRunEvent.LISTENER_TEST_METHOD_START && belongsToTest(suiteName, testName,
eventLog)) {
testMethodStartEventLogs.add(eventLog);
}
}
return testMethodStartEventLogs;
}
//Get the test method listener onTestSuccess event logs for the specified suite and test
public static List<EventLog> getTestMethodListenerPassEventLogsForTest(String suiteName, String testName) {
List<EventLog> testMethodPassEventLogs = new ArrayList<>();
for(EventLog eventLog : eventLogs) {
if(eventLog.getEvent() == TestNgRunEvent.LISTENER_TEST_METHOD_PASS && belongsToTest(suiteName, testName,
eventLog)) {
testMethodPassEventLogs.add(eventLog);
}
}
return testMethodPassEventLogs;
}
//Get the test method execution event logs for the specified suite and test
public static List<EventLog> getTestMethodExecutionEventLogsForTest(String suiteName, String testName) {
List<EventLog> testMethodExecuteEventLogs = new ArrayList<>();
for(EventLog eventLog : eventLogs) {
if(eventLog.getEvent() == TestNgRunEvent.TEST_METHOD_EXECUTION && belongsToTest(suiteName, testName,
eventLog)) {
testMethodExecuteEventLogs.add(eventLog);
}
}
return testMethodExecuteEventLogs;
}
//Get the test method level event logs for the test methods from the specified suite, test and test class, separated
//out in a map where the keys are the class instances on which the methods were run.
public static Multimap<Object, EventLog> getTestMethodEventLogsForClass(String suiteName, String testName,
String className) {
Multimap<Object,EventLog> testMethodEventLogs = ArrayListMultimap.create();
for(EventLog eventLog : eventLogs) {
if(isTestMethodLevelEventLog(eventLog) && belongsToClass(suiteName, testName, className, eventLog)) {
testMethodEventLogs.put(eventLog.getData(EventInfo.CLASS_INSTANCE), eventLog);
}
}
return testMethodEventLogs;
}
//Get the test method level event logs for the test method from the specified suite, test and test class, separated
//out in a map where the keys are the class instances on which the method was run.
public static Multimap<Object, EventLog> getTestMethodEventLogsForMethod(String suiteName, String testName, String
className, String methodName) {
Multimap<Object,EventLog> testMethodEventLogs = ArrayListMultimap.create();
for(EventLog eventLog : eventLogs) {
if(belongsToMethod(suiteName, testName, className, methodName, eventLog)) {
testMethodEventLogs.put(eventLog.getData(EventInfo.CLASS_INSTANCE), eventLog);
}
}
return testMethodEventLogs;
}
//Get the test method event logs of the specified type for the specified test class from the specified suite and
//test in a multimap where the keys are the class instances for the test class
public static Multimap<Object, EventLog> getTestMethodEventLogsByEventTypeForClass(String suiteName, String
testName, String className, TestNgRunEvent event) {
Multimap<Object,EventLog> testMethodEventLogs = ArrayListMultimap.create();
for(EventLog eventLog : eventLogs) {
if(eventLog.getEvent() == event && belongsToClass(suiteName, testName, className, eventLog)) {
testMethodEventLogs.put(eventLog.getData(EventInfo.CLASS_INSTANCE), eventLog);
}
}
return testMethodEventLogs ;
}
//Get the test method level event logs for the test method from the specified suite, test, test class, and event
//separated out in a map where the keys are the class instances on which the method was run.
public static Map<Object, EventLog> getTestMethodEventLogsByEventTypeForMethod(String suiteName, String testName,
String className, String methodName, TestNgRunEvent event) {
Map<Object,EventLog> testMethodEventLogs = new HashMap<>();
for(EventLog eventLog : eventLogs) {
if(eventLog.getEvent() == event && belongsToMethod(suiteName, testName, className, methodName, eventLog)) {
testMethodEventLogs.put(eventLog.getData(EventInfo.CLASS_INSTANCE), eventLog);
}
}
return testMethodEventLogs ;
}
//Get the event logs for test method listener's onTestStart method for the specified test method from the
//specified suite, test and test class as a map where the keys are the test class instances on which the method was
//run
public static Map<Object,EventLog> getTestMethodListenerStartEventLogsForMethod(String suiteName, String testName,
String className, String methodName) {
return getTestMethodEventLogsByEventTypeForMethod(suiteName, testName, className, methodName,
TestNgRunEvent.LISTENER_TEST_METHOD_START);
}
//Get the event logs for test method listener's onTestSuccess method for the specified test method from the
//specified suite, test and test class as a map where the keys are the test class instances on which the method was
//run
public static Map<Object,EventLog> getTestMethodListenerPassEventLogsForMethod(String suiteName, String testName,
String className, String methodName) {
Map<Object, EventLog> testMethodEventLogs = new HashMap<>();
for(EventLog eventLog : eventLogs) {
if(belongsToMethod(suiteName, testName, className, methodName, eventLog) &&
eventLog.getEvent() == TestNgRunEvent.LISTENER_TEST_METHOD_PASS) {
testMethodEventLogs.put(eventLog.getData(EventInfo.CLASS_INSTANCE), eventLog);
}
}
return testMethodEventLogs;
}
//Get the event logs for test method listener's onTestFailure method for the specified test method from the
//specified suite, test and test class as a map where the keys are the test class instances on which the method was
//run
public static Map<Object,EventLog> getTestMethodListenerFailEventLogsForMethod(String suiteName, String testName,
String className, String methodName) {
Map<Object, EventLog> testMethodEventLogs = new HashMap<>();
for(EventLog eventLog : eventLogs) {
if(belongsToMethod(suiteName, testName, className, methodName, eventLog) &&
eventLog.getEvent() == TestNgRunEvent.LISTENER_TEST_METHOD_FAIL) {
testMethodEventLogs.put(eventLog.getData(EventInfo.CLASS_INSTANCE), eventLog);
}
}
return testMethodEventLogs;
}
//Get the event logs for test method listener's onTestFailedButWithinSuccessPercentage method for the specified
//test method from the specified suite, test and test class as a map where the keys are the test class instances on
//which the method was run
public static Map<Object,EventLog> getTestMethodListenerFailWithinSuccessPercentageEventLogsForMethod(String
suiteName, String testName, String className, String methodName) {
Map<Object, EventLog> testMethodEventLogs = new HashMap<>();
for(EventLog eventLog : eventLogs) {
if(belongsToMethod(suiteName, testName, className, methodName, eventLog) &&
eventLog.getEvent() == TestNgRunEvent.LISTENER_TEST_METHOD_FAIL_PERCENTAGE) {
testMethodEventLogs.put(eventLog.getData(EventInfo.CLASS_INSTANCE), eventLog);
}
}
return testMethodEventLogs;
}
//Get the event logs for test method listener's nTestSkipped method for the specified test method from the
//specified suite, test and test class as a map where the keys are the test class instances on
//which the method was run
public static Map<Object,EventLog> getTestMethodListenerSkippedEventLogsForMethod(String suiteName, String
testName, String className, String methodName) {
Map<Object, EventLog> testMethodEventLogs = new HashMap<>();
for(EventLog eventLog : eventLogs) {
if(belongsToMethod(suiteName, testName, className, methodName, eventLog) &&
eventLog.getEvent() == TestNgRunEvent.LISTENER_TEST_METHOD_SKIPPED) {
testMethodEventLogs.put(eventLog.getData(EventInfo.CLASS_INSTANCE), eventLog);
}
}
return testMethodEventLogs;
}
//Get the event logs for execution of the test method's body for the specified test method from the
//specified suite, test and test class as a map where the keys are the test class instances on
//which the method was run
public static Map<Object,EventLog> getTestMethodExecutionEventLogsForMethod(String suiteName, String
testName, String className, String methodName) {
Map<Object, EventLog> testMethodEventLogs = new HashMap<>();
for(EventLog eventLog : eventLogs) {
if(belongsToMethod(suiteName, testName, className, methodName, eventLog) &&
eventLog.getEvent() == TestNgRunEvent.TEST_METHOD_EXECUTION) {
testMethodEventLogs.put(eventLog.getData(EventInfo.CLASS_INSTANCE), eventLog);
}
}
return testMethodEventLogs;
}
//Get the timestamps for test method listener's onTestStart method for the specified test method from the specified
//suite, test and test class separated out in a map where the keys are the class instances on which the method was
// run.
public static Map<Object, Long> getTestMethodListenerStartTimestamps(String suiteName, String testName, String
className, String methodName) {
Map<Object,Long> testMethodEventTimes = new HashMap<>();
Map<Object,EventLog> testMethodEventLogs = getTestMethodListenerStartEventLogsForMethod(suiteName, testName,
className, methodName);
for(Object instance : testMethodEventLogs.keySet()) {
testMethodEventTimes.put(instance, testMethodEventLogs.get(instance).getTimeOfEvent());
}
return testMethodEventTimes;
}
//Get the timestamps for test listener's onTestSuccess method for the specified test method from the specified
//suite, test and test class separated out in a map where the keys are the class instances on which the method was
//run.
public static Map<Object, Long> getTestMethodListenerPassTimestamps(String suiteName, String testName, String
className, String methodName) {
Map<Object,Long> testMethodEventTimes = new HashMap<>();
Map<Object,EventLog> testMethodEventLogs = getTestMethodListenerPassEventLogsForMethod(suiteName, testName,
className, methodName);
for(Object instance : testMethodEventLogs.keySet()) {
testMethodEventTimes.put(instance, testMethodEventLogs.get(instance).getTimeOfEvent());
}
return testMethodEventTimes;
}
//Get the timestamps for test listener's onTestFailure method for the specified test method from the specified
//suite, test and test class separated out in a map where the keys are the class instances on which the method was
//run.
public static Map<Object, Long> getTestMethodListenerFailTimestamps(String suiteName, String testName, String
className, String methodName) {
Map<Object,Long> testMethodEventTimes = new HashMap<>();
Map<Object,EventLog> testMethodEventLogs = getTestMethodListenerFailEventLogsForMethod(suiteName, testName,
className, methodName);
for(Object instance : testMethodEventLogs.keySet()) {
testMethodEventTimes.put(instance, testMethodEventLogs.get(instance).getTimeOfEvent());
}
return testMethodEventTimes;
}
//Get the timestamps for test listener's onTestFailedButWithinSuccessPercentage method for the specified test method
//from the specified suite, test and test class separated out in a map where the keys are the class instances on
//which the method was run.
public static Map<Object, Long> getTestMethodListenerFailWithinSuccessPercentageTimestamps(String suiteName, String
testName, String className, String methodName) {
Map<Object,Long> testMethodEventTimes = new HashMap<>();
Map<Object,EventLog> testMethodEventLogs =
getTestMethodListenerFailWithinSuccessPercentageEventLogsForMethod(suiteName, testName, className,
methodName);
for(Object instance : testMethodEventLogs.keySet()) {
testMethodEventTimes.put(instance, testMethodEventLogs.get(instance).getTimeOfEvent());
}
return testMethodEventTimes;
}
//Get the timestamps for test method listener onTestSkipped event logs for the specified test method from the
//specified suite, test and test class.
public static Map<Object, Long> getTestMethodListenerSkipTimestamps(String suiteName, String testName, String
className, String methodName) {
Map<Object,Long> testMethodEventTimes = new HashMap<>();
Map<Object,EventLog> testMethodEventLogs = getTestMethodListenerSkippedEventLogsForMethod(suiteName, testName,
className, methodName);
for(Object instance : testMethodEventLogs.keySet()) {
testMethodEventTimes.put(instance, testMethodEventLogs.get(instance).getTimeOfEvent());
}
return testMethodEventTimes;
}
//Get the timestamps for execution of the test method's body for the specified test method from the specified
//suite, test and test class separated out in a map where the keys are the class instances on which the method was
//run.
public static Map<Object, Long> getTestMethodExecutionTimestamps(String suiteName, String testName, String
className, String methodName) {
Map<Object,Long> testMethodEventTimes = new HashMap<>();
Map<Object,EventLog> testMethodEventLogs = getTestMethodExecutionEventLogsForMethod(suiteName, testName,
className, methodName);
for(Object instance : testMethodEventLogs.keySet()) {
testMethodEventTimes.put(instance, testMethodEventLogs.get(instance).getTimeOfEvent());
}
return testMethodEventTimes;
}
//Get the thread IDs for test method listener's onTestStart method for the specified test method from the specified
//suite, test and test class separated out in a map where the keys are the class instances on which the method was
//run.
public static Map<Object, Long> getTestMethodListenerStartThreadIds(String suiteName, String testName,
String className, String methodName) {
Map<Object,Long> testMethodEventThreadIds = new HashMap<>();
Map<Object,EventLog> testMethodEventLogs = getTestMethodListenerStartEventLogsForMethod(suiteName, testName,
className, methodName);
for(Object instance : testMethodEventLogs.keySet()) {
testMethodEventThreadIds.put(instance, testMethodEventLogs.get(instance).getThreadId());
}
return testMethodEventThreadIds;
}
//Get the thread IDs for test listener's onTestSuccess method for the specified test method from the specified
//suite, test and test class separated out in a map where the keys are the class instances on which the method was
//run.
public static Map<Object, Long> getTestMethodListenerPassThreadIds(String suiteName, String testName, String
className, String methodName) {
Map<Object,Long> testMethodEventThreadIds = new HashMap<>();
Map<Object,EventLog> testMethodEventLogs = getTestMethodListenerPassEventLogsForMethod(suiteName, testName,
className, methodName);
for(Object instance : testMethodEventLogs.keySet()) {
testMethodEventThreadIds.put(instance, testMethodEventLogs.get(instance).getThreadId());
}
return testMethodEventThreadIds;
}
//Get the thread IDs for test listener's onTestFailure method for the specified test method from the specified
//suite, test and test class separated out in a map where the keys are the class instances on which the method was
//run.
public static Map<Object, Long> getTestMethodListenerFailThreadIds(String suiteName, String testName, String
className, String methodName) {
Map<Object,Long> testMethodEventThreadIds = new HashMap<>();
Map<Object,EventLog> testMethodEventLogs = getTestMethodListenerFailEventLogsForMethod(suiteName, testName,
className, methodName);
for(Object instance : testMethodEventLogs.keySet()) {
testMethodEventThreadIds.put(instance, testMethodEventLogs.get(instance).getThreadId());
}
return testMethodEventThreadIds;
}
//Get the thread IDs for test listener's onTestFailedButWithinSuccessPercentage method for the specified test
//method from the specified suite, test and test class separated out in a map where the keys are the class
//instances on which the method was run.
public static Map<Object, Long> getTestMethodListenerFailWithSuccessPercentageThreadIds(String suiteName, String
testName, String className, String methodName) {
Map<Object,Long> testMethodEventThreadIds = new HashMap<>();
Map<Object,EventLog> testMethodEventLogs =
getTestMethodListenerFailWithinSuccessPercentageEventLogsForMethod(suiteName, testName, className,
methodName);
for(Object instance : testMethodEventLogs.keySet()) {
testMethodEventThreadIds.put(instance, testMethodEventLogs.get(instance).getThreadId());
}
return testMethodEventThreadIds;
}
//Get the thread IDs for test listener's onTestSkipped method for the specified test method from the specified
//suite, test and test class separated out in a map where the keys are the class instances on which the method was
//run.
public static Map<Object, Long> getTestMethodListenerSkipThreadIds(String suiteName, String testName, String
className, String methodName) {
Map<Object,Long> testMethodEventThreadIds = new HashMap<>();
Map<Object,EventLog> testMethodEventLogs = getTestMethodListenerSkippedEventLogsForMethod(suiteName, testName,
className, methodName);
for(Object instance : testMethodEventLogs.keySet()) {
testMethodEventThreadIds.put(instance, testMethodEventLogs.get(instance).getThreadId());
}
return testMethodEventThreadIds;
}
//Get the thread IDs for execution of the test method's body for the specified test method from the specified
//suite, test and test class separated out in a map where the keys are the class instances on which the method was
//run.
public static Map<Object, Long> getTestMethodExecutionThreadIds(String suiteName, String testName, String
className, String methodName) {
Map<Object,Long> testMethodEventThreadIds = new HashMap<>();
Map<Object,EventLog> testMethodEventLogs = getTestMethodExecutionEventLogsForMethod(suiteName, testName,
className, methodName);
for(Object instance : testMethodEventLogs.keySet()) {
testMethodEventThreadIds.put(instance, testMethodEventLogs.get(instance).getThreadId());
}
return testMethodEventThreadIds;
}
public static void reset() {
eventLogs = new ArrayList<>();
}
private static boolean isSuiteLevelEventLog(EventLog eventLog) {
return eventLog.getEvent() == TestNgRunEvent.LISTENER_SUITE_START ||
eventLog.getEvent() == TestNgRunEvent.LISTENER_SUITE_FINISH;
}
private static boolean isTestLevelEventLog(EventLog eventLog) {
return eventLog.getEvent() == TestNgRunEvent.LISTENER_TEST_START ||
eventLog.getEvent() == TestNgRunEvent.LISTENER_TEST_FINISH;
}
private static boolean isTestMethodLevelEventLog(EventLog eventLog) {
return eventLog.getEvent() == TestNgRunEvent.LISTENER_TEST_METHOD_START ||
eventLog.getEvent() == TestNgRunEvent.LISTENER_TEST_METHOD_PASS ||
eventLog.getEvent() == TestNgRunEvent.LISTENER_TEST_METHOD_FAIL ||
eventLog.getEvent() == TestNgRunEvent.LISTENER_TEST_METHOD_FAIL_PERCENTAGE ||
eventLog.getEvent() == TestNgRunEvent.LISTENER_TEST_METHOD_SKIPPED ||
eventLog.getEvent() == TestNgRunEvent.TEST_METHOD_EXECUTION;
}
private static boolean belongsToSuite(String suiteName, EventLog eventLog) {
return suiteName.equals(eventLog.getData(EventInfo.SUITE_NAME));
}
private static boolean belongsToTest(String suiteName, String testName, EventLog eventLog) {
return suiteName.equals(eventLog.getData(EventInfo.SUITE_NAME)) &&
testName.equals(eventLog.getData(EventInfo.TEST_NAME));
}
private static boolean belongsToClass(String suiteName, String testName, String className, EventLog eventLog) {
return suiteName.equals(eventLog.getData(EventInfo.SUITE_NAME)) &&
testName.equals(eventLog.getData(EventInfo.TEST_NAME)) &&
className.equals(eventLog.getData(EventInfo.CLASS_NAME));
}
private static boolean belongsToMethod(String suiteName, String testName, String className, String methodName,
EventLog eventLog) {
return suiteName.equals(eventLog.getData(EventInfo.SUITE_NAME)) &&
testName.equals(eventLog.getData(EventInfo.TEST_NAME)) &&
className.equals(eventLog.getData(EventInfo.CLASS_NAME)) &&
methodName.equals(eventLog.getData(EventInfo.METHOD_NAME));
}
public enum TestNgRunEvent {
LISTENER_SUITE_START,
LISTENER_SUITE_FINISH,
LISTENER_TEST_START,
LISTENER_TEST_FINISH,
LISTENER_TEST_METHOD_START,
TEST_METHOD_EXECUTION,
LISTENER_TEST_METHOD_PASS,
LISTENER_TEST_METHOD_FAIL,
LISTENER_TEST_METHOD_FAIL_PERCENTAGE,
LISTENER_TEST_METHOD_SKIPPED,
}
public enum EventInfo {
SUITE_NAME,
TEST_NAME,
CLASS_NAME,
METHOD_NAME,
CLASS_INSTANCE,
DATA_PROVIDER_PARAM
}
public static class EventLog {
private TestNgRunEvent event;
private long timeOfEvent;
private long threadId;
private Thread thread;
private Map<EventInfo, Object> data = new HashMap<>();
public void setEvent(TestNgRunEvent event) {
this.event = event;
}
public TestNgRunEvent getEvent() {
return event;
}
public void setTimeOfEvent(long timeOfEvent) {
this.timeOfEvent = timeOfEvent;
}
public long getTimeOfEvent() {
return timeOfEvent;
}
public void setThread(Thread thread) {
this.thread = thread;
this.threadId = thread.getId();
}
public long getThreadId() {
return threadId;
}
public void addData(EventInfo key, Object value) {
data.put(key, value);
}
public Object getData(EventInfo key) {
return data.get(key);
}
private Thread getThread() {
return thread;
}
public static EventLogBuilder builder() {
return new EventLogBuilder();
}
@Override
public String toString() {
return "EventLog{" +
"event=" + event +
", timeOfEvent=" + timeOfEvent +
", threadId=" + threadId +
", data=" + data +
'}';
}
}
public static class EventLogBuilder {
private EventLog eventLog = new EventLog();
public EventLogBuilder setEvent(TestNgRunEvent event) {
eventLog.setEvent(event);
return this;
}
public EventLogBuilder setTimeOfEvent(long timeOfEvent) {
eventLog.setTimeOfEvent(timeOfEvent);
return this;
}
public EventLogBuilder setThread(Thread thread) {
eventLog.setThread(thread);
return this;
}
public EventLogBuilder addData(EventInfo key, Object value) {
eventLog.addData(key, value);
return this;
}
public EventLog build() {
return eventLog;
}
}
}