package cmu.testprograms;
import java.io.File;
import java.util.Iterator;
import org.junit.Test;
import org.prevayler.Prevayler;
import org.prevayler.PrevaylerFactory;
import org.prevayler.demos.demo1.NumberKeeper;
import org.prevayler.demos.demo1.PrimeCalculator;
import org.prevayler.foundation.monitor.Log4jMonitor;
import org.prevayler.foundation.monitor.NullMonitor;
import org.prevayler.foundation.monitor.SimpleMonitor;
import org.prevayler.foundation.serialization.JavaSerializer;
import org.prevayler.foundation.serialization.XStreamSerializer;
import org.prevayler.implementation.clock.BrokenClock;
import org.prevayler.implementation.clock.MachineClock;
import org.prevayler.implementation.clock.PausableClock;
import org.prevayler.tutorial.AddTask;
import org.prevayler.tutorial.RemoveTask;
import org.prevayler.tutorial.Task;
import org.prevayler.tutorial.TaskList;
import gov.nasa.jpf.annotation.Conditional;
public class PrevaylerTest extends ATestExample {
private static String NUMBER_KEEPER = "NumberKeeper";
@Conditional
public static boolean USE_LOG4J_MONITOR = false;
@Conditional
public static boolean USE_NULL_MONITOR = false;
@Conditional
public static boolean USE_BROKEN_CLOCK = false;
@Conditional
public static boolean USE_PAUSABLE_CLOCK = false;
// @Conditional // TODO not working for tutorialTest()
public static boolean USE_XSTREAM = true;
@Conditional
public static boolean USE_TRANSIENT_MODE = false;
@Conditional
public static boolean USE_JOURNAL_DISK_SYNC = false;
@Conditional
public static boolean FILE_AGE_THREASHOLD = true;
// @Conditional // TODO not working
static boolean FILE_SIZE_THREASHOLD = true;
// @Conditional // TODO not working
static boolean USE_XSTREAM_JOURNAL = true;
// @Conditional // TODO not working
static boolean USE_FILTERING = false;
@Test
public void runNumberKeeper() throws Exception {
// clean up
deleteDirectory("NumberKeeper");
if (verifyNoPropertyViolation(config)) {
// delete old counts
String folderName = clearTempFolder(NUMBER_KEEPER);
final NumberKeeper numberKeeper = new NumberKeeper();
// final Prevayler prevayler =
// PrevaylerFactory.createPrevayler(numberKeeper, folderName);
PrevaylerFactory factory = new PrevaylerFactory();
factory.configurePrevalentSystem(numberKeeper);
factory.configurePrevalenceDirectory(folderName);
configureFactory(factory);
Prevayler prevayler = factory.create();
final PrimeCalculator primeCalculator = new PrimeCalculator(
prevayler);
System.out.println("Run the first time");
primeCalculator.start();
System.out.println(prevayler.clock().time());
assertEquals(
"result of first run was false: "
+ numberKeeper.lastNumber(), 997,
numberKeeper.lastNumber());
System.out.println();
System.out.println("Run the second time");
primeCalculator.start();
System.out.println(prevayler.clock().time());
assertEquals(
"result of second run was false: "
+ numberKeeper.lastNumber(), 1997,
numberKeeper.lastNumber());
}
}
private String clearTempFolder(String folderName) {
File tempFolder = new File(folderName);
boolean cleared = true;
if (tempFolder.exists()) {
for (final File file : tempFolder.listFiles()) {
if (!file.delete()) {
cleared = false;
break;
}
}
if (!cleared) {
tempFolder = new File(folderName + "_MAP");// some reader/writer
// seems not to be
// closed
if (tempFolder.exists()) {
for (final File file2 : tempFolder.listFiles()) {
if (!file2.delete()) {
throw new RuntimeException("cannot delete file:"
+ file2);
}
}
}
}
}
return tempFolder.getName();
}
@Override
protected String getClassPath() {
return "lib/prevayler/Prevayler.jar;lib/prevayler/prevayler-factory-2.5.jar;lib/prevayler/prevayler-core-2.5.jar;lib/prevayler/commons-jxpath-1.3.jar;lib/prevayler/prevayler-log4j-2.7-SNAPSHOT.jar;lib/prevayler/prevayler-xstream-2.7-SNAPSHOT.jar;lib/prevayler/log4j-1.2.15.jar;lib/prevayler/xstream-1.4.7.jar;lib/prevayler/kxml2-2.3.0.jar";
}
@Override
protected String getModelFile() {
return "";
}
@Test
public void scalabilityTest() {
// clean up
deleteDirectory("QueryTest");
if (verifyNoPropertyViolation(config)) {
org.prevayler.demos.scalability.Main.main(null);
}
}
@Test
public void jxpathTest() {
// clean up
deleteDirectory("demoJXPath");
if (verifyNoPropertyViolation(config)) {
String[] args1 = new String[]{"proj", "100", "learn JXPath"};
String[] args2 = new String[]{"task", "50", "read docs",
"09/21/02 2:00 PM", "09/21/02 3:00 PM", "100"};
String[] args3 = new String[]{"task", "51", "write code",
"09/21/02 3:00 PM", "09/21/02 4:00 PM", "100"};
String[] args4 = new String[]{"task", "52", "veg out",
"09/21/02 4:00 PM", "09/21/02 5:00 PM", "100"};
String[] args5 = new String[]{"list", "projects"};
String[] args6 = new String[]{"list", "projects/tasks"};
String[] args7 = new String[]{"list",
"projects/tasks[name='read docs']"};
org.prevayler.demos.jxpath.Main.main(args1);
org.prevayler.demos.jxpath.Main.main(args2);
org.prevayler.demos.jxpath.Main.main(args3);
org.prevayler.demos.jxpath.Main.main(args4);
org.prevayler.demos.jxpath.Main.main(args5);
org.prevayler.demos.jxpath.Main.main(args6);
org.prevayler.demos.jxpath.Main.main(args7);
}
}
@Test
public void tutorialTest() throws Exception {
System.out.println(USE_XSTREAM_JOURNAL);
// clean up
deleteDirectory("Tutorial");
if (verifyNoPropertyViolation(config)) {
String folderName = clearTempFolder("Tutorial");
// org.prevayler.tutorial.Main.main(folderName);
// START SNIPPET: creating
// Create a new prevayler. /tasklist-base is the tx-journal
// directory.
// Prevayler prevayler = PrevaylerFactory.createPrevayler(new
// TaskList(), folderName);
PrevaylerFactory factory = new PrevaylerFactory();
factory.configurePrevalentSystem(new TaskList());
factory.configurePrevalenceDirectory(folderName);
configureFactory(factory);
Prevayler prevayler = factory.create();
TaskList list = (TaskList) prevayler.prevalentSystem();
// END SNIPPET: creating
System.out
.println("Tasks: " + list.getTasks().size() + ", adding ");
// START SNIPPET: adding
Task dishes = (Task) prevayler.execute(new AddTask("do the dishes",
Task.MAX_PRIORITY));
Task dog = (Task) prevayler.execute(new AddTask("walk the dog",
Task.MED_PRIORITY));
Task laundry = (Task) prevayler.execute(new AddTask(
"do the laundry", Task.MIN_PRIORITY));
// END SNIPPET: adding
// START SNIPPET: iterating
for (Iterator<?> i = list.getTasks().iterator(); i.hasNext();) {
Task t = (Task) i.next();
System.out.println("Task: " + t.getDescription() + ", "
+ t.getPriority());
}
// END SNIPPET: iterating
System.out.println("Tasks: " + list.getTasks().size()
+ ", removing...");
System.out.println("Before removing...");
// START SNIPPET: removing
prevayler.execute(new RemoveTask(dishes));
prevayler.execute(new RemoveTask(dog));
prevayler.execute(new RemoveTask(laundry));
// END SNIPPET: removing
System.out.println("After removing...");
System.out.println("Tasks: " + list.getTasks().size());
// START SNIPPET: snapshotting
prevayler.takeSnapshot();
// END SNIPPET: snapshotting
}
}
public void configureFactory(PrevaylerFactory factory) {
if (USE_LOG4J_MONITOR) {
factory.configureMonitor(new Log4jMonitor());
} else if (USE_NULL_MONITOR) {
factory.configureMonitor(new NullMonitor());
} else {
factory.configureMonitor(new SimpleMonitor());
}
if (USE_BROKEN_CLOCK) {
factory.configureClock(new BrokenClock());
} else if (USE_PAUSABLE_CLOCK) {
factory.configureClock(new PausableClock(new MachineClock()));
} else {
factory.configureClock(new MachineClock());
}
if (USE_XSTREAM) {
factory.configureSnapshotSerializer(new XStreamSerializer());
} else {
factory.configureSnapshotSerializer(new JavaSerializer());
}
factory.configureTransactionFiltering(USE_FILTERING);
factory.configureTransientMode(USE_TRANSIENT_MODE);
factory.configureJournalDiskSync(USE_JOURNAL_DISK_SYNC);
if (FILE_AGE_THREASHOLD) {
factory.configureJournalFileAgeThreshold(100);
}
if (FILE_SIZE_THREASHOLD) {
factory.configureJournalFileSizeThreshold(100);
}
if (USE_XSTREAM_JOURNAL) {
factory.configureJournalSerializer(new XStreamSerializer());
} else {
factory.configureJournalSerializer(new JavaSerializer());
}
}
void deleteDirectory(String name){
File dir = new File(name);
if (dir.exists() && dir.isDirectory()) {
File[] list = dir.listFiles();
assert list != null;
for (File file : list) {
if (file.isDirectory()) {
deleteDirectory(file.getAbsolutePath());
}
else {
file.delete();
}
}
}
}
@Override
protected String getModelFolder() {
return "";
}
}