/**
* Copyright (c) 2009-2011, The HATS Consortium. All rights reserved.
* This file is licensed under the terms of the Modified BSD License.
*/
package abs.backend.java.absunit;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import abs.backend.java.absunit.TestStatus.Status;
import abs.backend.java.lib.types.ABSValue;
import abs.backend.java.observing.TaskStackFrameView;
import abs.backend.java.observing.TaskView;
public class TestModel {
private List<TaskView> ok = new LinkedList<TaskView>();
private List<TaskView> failedAssertion = new LinkedList<TaskView>();
private List<TaskView> error = new LinkedList<TaskView>();
private List<TaskView> deadlocked = new LinkedList<TaskView>();
private final HashMap<Integer, LinkedList<TestStatus>> activeTests = new HashMap<Integer, LinkedList<TestStatus>>();
private final LinkedList<TestStatus> finishedTests = new LinkedList<TestStatus>();
private TestModelListener listener;
public void testStarted(TaskView task) {
final String testMethod;
final String className;
final List<ABSValue> testMethodArguments;
final LinkedList<ABSValue> arguments = new LinkedList<ABSValue>();
if (task.getStack().hasFrames()) {
final TaskStackFrameView currentF = task.getStack().getCurrentFrame();
testMethod = currentF.getMethod().getName();
className = currentF.getMethod().getClassView().getName();
for (String parameterName : currentF.getVariableNames()) {
arguments.add(currentF.getValue(parameterName));
}
} else {
testMethod = task.getMethodName();
className = task.getTarget().getClassName();
arguments.addAll(task.getArgs());
}
if (!task.getStack().hasFrames()) {
System.out.println("Not yet started " + testMethod + " for task " + task.getID());
} else {
System.out.println("Test " + task.getStack().getCurrentFrame().getMethod() + " task: " + task.getID());
}
final TestStatus newTest = new TestStatus(task.getID(), testMethod, className,
arguments,
task.getStack().getFrames(), TestStatus.Status.ACTIVE);
push(newTest);
System.out.println("Test started: " + task.getMethodName() + " : " + testMethod);
informListenersTestStarted(newTest);
}
private TestStatus peek(int taskID) {
synchronized (activeTests) {
LinkedList<TestStatus> testsOfTask = activeTests.get(taskID);
if (testsOfTask == null || testsOfTask.size() == 0) {
return null;
}
return testsOfTask.getLast();
}
}
private TestStatus pop(int taskID) {
synchronized (activeTests) {
LinkedList<TestStatus> testsOfTask = activeTests.get(taskID);
if (testsOfTask == null || testsOfTask.size() == 0) {
return null;
}
System.out.println("Remove" + testsOfTask.getLast().getTaskID());
return testsOfTask.removeLast();
}
}
private void push(TestStatus ts) {
synchronized (activeTests) {
LinkedList<TestStatus> testsOfTask = activeTests.get(ts.getTaskID());
if (testsOfTask == null) {
testsOfTask = new LinkedList<TestStatus>();
activeTests.put(ts.getTaskID(), testsOfTask);
}
testsOfTask.addLast(ts);
}
}
private void informListenersTestStarted(TestStatus newTest) {
if (listener != null) {
listener.testStarted(newTest);
}
}
private void informListenersSystemFinished() {
if (listener != null) {
listener.systemFinished();
}
}
public synchronized void testFinished(TaskView task) {
System.out.println("Test " + task.getID() + " finished: " + task.hasException());
final TestStatus status = pop(task.getID());
if (task.hasException()) {
if (task.getException().isAssertion()) {
failedAssertion.add(task);
status.setStatus(Status.FAILED);
} else {
error.add(task);
status.setStatus(Status.ERROR);
}
status.setException(task.getException());
} else if (task.isDeadlocked()) {
deadlocked.add(task);
status.setStatus(Status.DEADLOCKED);
} else {
ok.add(task);
status.setStatus(Status.OK);
}
finishedTests.addLast(status);
informListenersTestFinished(status);
}
private void informListenersTestFinished(TestStatus finishedTest) {
if (listener != null) {
listener.testFinished(finishedTest);
}
}
public int sizeAll() {
return active() + sizeFinished();
}
public int sizeFinished() {
return finishedTests.size();
}
public int active() {
int result = 0;
synchronized (activeTests) {
for (LinkedList<TestStatus> ts : activeTests.values()) {
result += ts != null ? ts.size() : 0;
}
}
return result;
}
public List<TestStatus> getAllFinishedTests() {
return Collections.unmodifiableList(finishedTests);
}
public void addTestModelListener(TestModelListener modelListener) {
this.listener = modelListener;
}
public int successful() {
return ok.size();
}
public int failed() {
return failedAssertion.size();
}
public int error() {
return error.size();
}
public int deadlocked() {
return deadlocked.size();
}
public void finished() {
informListenersSystemFinished();
}
public void taskStep(TaskView task, String fileName, int line) {
TestStatus status = peek(task.getID());
int depth = task.getStack().getFrames() == null ? 0 : task.getStack().getFrames().size();
if (status != null && status.depth() == depth) {
status.updatePos(fileName, line);
}
}
}