blob: 1c27f9c121e8baa28dbcf0c038aaab916cd67727 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.core.tests.internal.watson;
import java.io.*;
import org.eclipse.core.internal.watson.*;
import org.eclipse.core.runtime.IPath;
public abstract class ElementTreeSerializationTest extends WatsonTest implements IPathConstants {
protected ElementTree fTree;
String root = System.getProperty("java.io.tmpdir");
protected File tempFile = new File(root + "/temp/TestFlattening");
class WriterThread implements Runnable {
DataOutputStream fDataOutputStream;
ElementTreeWriter fWriter;
public void setStream(DataOutputStream stream) {
fDataOutputStream = stream;
}
public void setWriter(ElementTreeWriter writer) {
fWriter = writer;
}
@Override
public void run() {
try {
doWrite(fWriter, fDataOutputStream);
} catch (IOException e) {
assertTrue("Error writing delta", false);
e.printStackTrace();
}
}
}
class ReaderThread implements Runnable {
DataInputStream fDataInputStream;
ElementTreeReader fReader;
Object fRefried;
public void setStream(DataInputStream stream) {
fDataInputStream = stream;
}
public void setReader(ElementTreeReader reader) {
fReader = reader;
}
public Object getReconstitutedObject() {
return fRefried;
}
@Override
public void run() {
try {
fRefried = doRead(fReader, fDataInputStream);
} catch (IOException e) {
assertTrue("Error reading delta", false);
e.printStackTrace();
}
}
}
WriterThread writerThread = new WriterThread();
ReaderThread readerThread = new ReaderThread();
/**
* The subtree to write
*/
protected IPath fSubtreePath;
/**
* The depth of the tree to write.
*/
protected int fDepth;
public ElementTreeSerializationTest() {
super(null);
}
/**
* ElementTreeSerializationTests constructor comment.
* @param name java.lang.String
*/
public ElementTreeSerializationTest(String name) {
super(name);
}
/**
* Performs exhaustive tests for all subtrees and all depths
*/
protected void doExhaustiveTests() {
IPath[] paths = TestUtil.getTreePaths();
int[] depths = getTreeDepths();
for (IPath path : paths) {
for (int depth : depths) {
doTest(path, depth);
}
}
}
/**
* Write a flattened element tree to a file and read it back.
*/
public Object doFileTest() {
IElementInfoFlattener fac = getFlattener();
Object newTree = null;
ElementTreeWriter writer = new ElementTreeWriter(fac);
ElementTreeReader reader = new ElementTreeReader(fac);
FileOutputStream fos = null;
FileInputStream fis = null;
DataOutputStream dos = null;
DataInputStream dis = null;
/* Write the element tree. */
try {
File dir = tempFile.getParentFile();
dir.mkdirs();
fos = new FileOutputStream(tempFile);
dos = new DataOutputStream(fos);
} catch (IOException e) {
e.printStackTrace();
assertTrue("Unable to open ouput file", false);
}
try {
doWrite(writer, dos);
} catch (IOException e) {
e.printStackTrace();
assertTrue("Error writing tree to file", false);
} finally {
try {
dos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
assertTrue("Unable to close output file!", false);
}
}
/* Read the element tree. */
try {
fis = new FileInputStream(tempFile);
dis = new DataInputStream(fis);
} catch (IOException e) {
e.printStackTrace();
assertTrue("Unable to open input file", false);
}
try {
newTree = doRead(reader, dis);
} catch (IOException e) {
e.printStackTrace();
assertTrue("Error reading tree from file", false);
} finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
assertTrue("Unable to close input file!", false);
}
}
return newTree;
}
/** Pipe a flattened element tree from writer to reader threads.
*/
public Object doPipeTest() {
IElementInfoFlattener fac = getFlattener();
Object refried = null;
ElementTreeWriter w = new ElementTreeWriter(fac);
ElementTreeReader r = new ElementTreeReader(fac);
PipedOutputStream pout;
PipedInputStream pin;
DataOutputStream oos;
DataInputStream ois;
/* Pipe the element tree from writer to reader threads. */
try {
pout = new PipedOutputStream();
pin = new PipedInputStream(pout);
oos = new DataOutputStream(pout); //new FileOutputStream(FILE_NAME));
ois = new DataInputStream(pin);
writerThread.setStream(oos);
readerThread.setStream(ois);
writerThread.setWriter(w);
readerThread.setReader(r);
Thread thread1 = new Thread(writerThread);
Thread thread2 = new Thread(readerThread);
thread1.start();
thread2.start();
while (thread2.isAlive()) {
try {
thread2.join();
} catch (InterruptedException excp) {
}
}
refried = readerThread.getReconstitutedObject();
ois.close();
oos.close();
} catch (IOException e) {
e.printStackTrace();
assertTrue("Unable to open stream:", false);
}
return refried;
}
/**
* Performs the serialization activity for this test
*/
public abstract Object doRead(ElementTreeReader reader, DataInputStream input) throws IOException;
/**
* Runs a test for this class at a certain depth and path
*/
public abstract void doTest(IPath path, int depth);
/**
* Performs the serialization activity for this test
*/
public abstract void doWrite(ElementTreeWriter writer, DataOutputStream output) throws IOException;
/**
* Tests the reading and writing of element deltas
*/
public IElementInfoFlattener getFlattener() {
return new IElementInfoFlattener() {
@Override
public void writeElement(IPath path, Object data, DataOutput output) throws IOException {
if (data == null) {
output.writeUTF("null");
} else {
output.writeUTF((String) data);
}
}
@Override
public Object readElement(IPath path, DataInput input) throws IOException {
String data = input.readUTF();
if ("null".equals(data)) {
return null;
} else {
return data;
}
}
};
}
/**
* Returns all the different possible depth values for this tree.
* To be conservative, it is okay if some of the returned depths
* are not possible.
*/
protected int[] getTreeDepths() {
return new int[] {-1, 0, 1, 2, 3, 4};
}
@Override
protected void setUp() throws Exception {
fTree = TestUtil.createTestElementTree();
/* default subtree we are interested in */
fSubtreePath = solution;
/* default depth is the whole tree */
fDepth = ElementTreeWriter.D_INFINITE;
}
/**
*
*/
@Override
protected void tearDown() throws Exception {
//ElementTree tests don't use the CoreTest infrastructure
tempFile.delete();
}
}