/**
* Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT
* All rights reserved. Use is subject to license terms. See LICENSE.TXT
*/
package org.diirt.datasource.integration;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.diirt.datasource.PVReader;
import org.diirt.datasource.PVReaderConfiguration;
import org.diirt.datasource.PVWriter;
import org.diirt.datasource.PVWriterConfiguration;
import java.time.Duration;
import static org.diirt.vtype.ValueFactory.*;
/**
*
* @author carcassi
*/
public abstract class TestPhase {
private final Map<String, PVWriter<?>> pvWriters = new ConcurrentHashMap<>();
private final Map<String, PVReader<?>> pvReaders = new ConcurrentHashMap<>();
private final Log phaseLog = new Log();
private int debugLevel;
public String getName() {
return getClass().getSimpleName();
}
protected <T> TestPhase addReader(PVReaderConfiguration<T> reader, Duration maxRate) {
PVReader<T> pvReader = reader.readListener(phaseLog.createReadListener()).maxRate(maxRate);
pvReaders.put(pvReader.getName(), pvReader);
if (getDebugLevel() >= 2) {
System.out.println("Adding reader '" + pvReader.getName() + "'");
}
return this;
}
protected <T> TestPhase addWriter(String name, PVWriterConfiguration<T> writer) {
PVWriter<T> pvWriter = writer.writeListener(phaseLog.<T>createWriteListener(name)).async();
if (pvWriters.containsKey(name)) {
throw new IllegalArgumentException("Writer called " + name + " already exists");
}
pvWriters.put(name, pvWriter);
if (getDebugLevel() >= 2) {
System.out.println("Adding writer '" + name + "'");
}
return this;
}
protected void write(String name, Object obj) {
if (getDebugLevel() >= 2) {
System.out.println("Writing '" + obj + "' to '" + name + "'");
}
@SuppressWarnings("unchecked")
PVWriter<Object> pvWriter = (PVWriter<Object>) pvWriters.get(name);
pvWriter.write(obj);
}
protected void waitFor(String name, String value, int msTimeout) {
if (getDebugLevel() >= 2) {
System.out.println("Waiting for '" + value + "' on '" + name + "'");
}
PVReaderValueCondition cond = new PVReaderValueCondition(VTypeMatchMask.VALUE, newVString(value, alarmNone(), timeNow()));
@SuppressWarnings("unchecked")
PVReader<Object> pvReader = (PVReader<Object>) pvReaders.get(name);
boolean conditionMet = cond.waitOn(pvReader, msTimeout);
if (!conditionMet) {
throw new RuntimeException("Waiting failed on " + name + " value " + value);
}
}
protected Object valueFor(String name) {
@SuppressWarnings("unchecked")
PVReader<Object> pvReader = (PVReader<Object>) pvReaders.get(name);
return pvReader.getValue();
}
protected void pause(long ms) {
if (getDebugLevel() >= 3) {
System.out.println("Pause " + ms + " ms");
}
try {
Thread.sleep(ms);
} catch (InterruptedException ex) {
Logger.getLogger(TestPhase.class.getName()).log(Level.SEVERE, null, ex);
Thread.currentThread().interrupt();
}
}
private void closeAll() {
for (PVReader<?> pvReader : pvReaders.values()) {
pvReader.close();
}
}
public abstract void run() throws Exception;
public abstract void verify(Log log);
public void execute() {
try {
System.out.println("Starting " + getName());
run();
} catch (Exception ex) {
Logger.getLogger(TestPhase.class.getName()).log(Level.SEVERE, null, ex);
}
boolean verifyFailed = false;
closeAll();
try {
verify(phaseLog);
System.out.println("Run " + phaseLog.getTestCount() + " tests");
} catch (Exception ex) {
System.out.println("Verify failed:");
ex.printStackTrace(System.out);
verifyFailed = true;
}
if (!phaseLog.isCorrect() || verifyFailed) {
System.out.println("Errors:");
for (String error : phaseLog.getErrors()) {
System.out.println(error);
}
System.out.println("Log:");
phaseLog.print(System.out);
}
}
public int getDebugLevel() {
return debugLevel;
}
public void setDebugLevel(int debugLevel) {
if (debugLevel < 0 || debugLevel > 4) {
throw new IllegalArgumentException("Debug level can only be 0, 1 or 2");
}
this.debugLevel = debugLevel;
}
}