package com.tinkerpop.blueprints.util.wrappers.event;
import com.tinkerpop.blueprints.Direction;
import com.tinkerpop.blueprints.Edge;
import com.tinkerpop.blueprints.EdgeTestSuite;
import com.tinkerpop.blueprints.Graph;
import com.tinkerpop.blueprints.GraphTestSuite;
import com.tinkerpop.blueprints.IndexTestSuite;
import com.tinkerpop.blueprints.IndexableGraphTestSuite;
import com.tinkerpop.blueprints.TestSuite;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.blueprints.VertexTestSuite;
import com.tinkerpop.blueprints.impls.GraphTest;
import com.tinkerpop.blueprints.util.io.gml.GMLReaderTestSuite;
import com.tinkerpop.blueprints.util.io.graphml.GraphMLReaderTestSuite;
import com.tinkerpop.blueprints.util.io.graphson.GraphSONReaderTestSuite;
import com.tinkerpop.blueprints.util.wrappers.event.listener.ConsoleGraphChangedListener;
import com.tinkerpop.blueprints.util.wrappers.event.listener.GraphChangedListener;
import com.tinkerpop.blueprints.util.wrappers.event.listener.StubGraphChangedListener;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
public class EventTransactionalGraphTest extends GraphTest {
private StubGraphChangedListener graphChangedListener;
private EventTransactionalGraph<TinkerTransactionalGraph> graph;
public void testVertexTestSuite() throws Exception {
this.stopWatch();
doTestSuite(new VertexTestSuite(this));
printTestPerformance("VertexTestSuite", this.stopWatch());
}
public void testEdgeTestSuite() throws Exception {
this.stopWatch();
doTestSuite(new EdgeTestSuite(this));
printTestPerformance("EdgeTestSuite", this.stopWatch());
}
public void testGraphTestSuite() throws Exception {
this.stopWatch();
doTestSuite(new GraphTestSuite(this));
printTestPerformance("GraphTestSuite", this.stopWatch());
}
public void testIndexableGraphTestSuite() throws Exception {
this.stopWatch();
doTestSuite(new IndexableGraphTestSuite(this));
printTestPerformance("IndexableGraphTestSuite", this.stopWatch());
}
public void testIndexTestSuite() throws Exception {
this.stopWatch();
doTestSuite(new IndexTestSuite(this));
printTestPerformance("IndexTestSuite", this.stopWatch());
}
public void testGMLReaderTestSuite() throws Exception {
this.stopWatch();
doTestSuite(new GMLReaderTestSuite(this));
printTestPerformance("GMLReaderTestSuite", this.stopWatch());
}
public void testGraphSONReaderTestSuite() throws Exception {
this.stopWatch();
doTestSuite(new GraphSONReaderTestSuite(this));
printTestPerformance("GraphSONReaderTestSuite", this.stopWatch());
}
public void testGraphMLReaderTestSuite() throws Exception {
this.stopWatch();
doTestSuite(new GraphMLReaderTestSuite(this));
printTestPerformance("GraphMLReaderTestSuite", this.stopWatch());
}
public Graph generateGraph() {
return generateGraph("");
}
public Graph generateGraph(final String graphDirectoryName) {
return new EventTransactionalIndexableGraph<TinkerTransactionalGraph>(new TinkerTransactionalGraph());
}
public void doTestSuite(final TestSuite testSuite) throws Exception {
for (Method method : testSuite.getClass().getDeclaredMethods()) {
if (method.getName().startsWith("test")) {
System.out.println("Testing " + method.getName() + "...");
method.invoke(testSuite);
}
}
}
@Override
public void setUp() throws Exception {
super.setUp();
graphChangedListener = new StubGraphChangedListener();
graph = new EventTransactionalGraph<TinkerTransactionalGraph>(TinkerTransactionalGraph.createTinkerGraph());
}
public void testWrappedElementUniqueness() {
graph.addListener(new ConsoleGraphChangedListener(graph));
assertEquals(graph.getVertex(1), graph.getVertex(1));
Set<Vertex> set = new HashSet<Vertex>();
set.add(graph.getVertex(2));
set.add(graph.getVertex(2));
assertEquals(set.size(), 1);
assertEquals(graph.getEdge(7).hashCode(), graph.getEdge(7).hashCode());
assertEquals(graph.getEdge(8), graph.getEdge(8));
}
public void testEventedGraph() {
graph.addListener(new ConsoleGraphChangedListener(graph));
assertTrue(graph.getVertices() instanceof EventVertexIterable);
assertTrue(graph.getEdges() instanceof EventEdgeIterable);
assertEquals(count(graph.getVertices()), 6);
assertEquals(count(graph.getEdges()), 6);
graph.removeVertex(graph.getVertex(1));
assertNull(graph.getVertex(1));
graph.removeEdge(graph.getEdge(10));
assertNull(graph.getEdge(10));
graph.shutdown();
}
public void testEventedElement() {
graph.addListener(new ConsoleGraphChangedListener(graph));
for (Vertex vertex : graph.getVertices()) {
assertTrue(vertex instanceof EventVertex);
vertex.setProperty("name", "noname");
assertEquals("noname", vertex.getProperty("name"));
assertTrue(vertex.getEdges(Direction.OUT) instanceof EventEdgeIterable);
assertTrue(vertex.getEdges(Direction.IN) instanceof EventEdgeIterable);
assertTrue(vertex.getEdges(Direction.OUT, "knows") instanceof EventEdgeIterable);
assertTrue(vertex.getEdges(Direction.IN, "created") instanceof EventEdgeIterable);
}
for (Edge edge : graph.getEdges()) {
assertTrue(edge instanceof EventEdge);
edge.removeProperty("weight");
assertNull(edge.getProperty("weight"));
assertTrue(edge.getVertex(Direction.OUT) instanceof EventVertex);
assertTrue(edge.getVertex(Direction.IN) instanceof EventVertex);
}
}
public void testManageListeners() {
EventGraph graph = this.graph;
ConsoleGraphChangedListener listener1 = new ConsoleGraphChangedListener(graph);
ConsoleGraphChangedListener listener2 = new ConsoleGraphChangedListener(graph);
graph.addListener(listener1);
graph.addListener(listener2);
Iterator<GraphChangedListener> itty = graph.getListenerIterator();
int counter = 0;
while (itty.hasNext()) {
itty.next();
counter++;
}
assertEquals(2, counter);
graph.removeListener(listener2);
itty = graph.getListenerIterator();
counter = 0;
while (itty.hasNext()) {
itty.next();
counter++;
}
assertEquals(1, counter);
graph.removeAllListeners();
itty = graph.getListenerIterator();
counter = 0;
while (itty.hasNext()) {
itty.next();
counter++;
}
assertEquals(0, counter);
}
public void testFireVertexAdded() {
graph.addListener(graphChangedListener);
Vertex vertex = createVertex();
assertEquals(0, graphChangedListener.addVertexEventRecorded());
((EventTransactionalGraph) graph).commit();
assertEquals(1, graphChangedListener.addVertexEventRecorded());
graphChangedListener.reset();
graph.getVertex(vertex.getId());
assertEquals(0, graphChangedListener.addVertexEventRecorded());
}
public void testFireVertexPropertyChanged() {
graph.addListener(graphChangedListener);
Vertex vertex = createVertex();
vertex.setProperty("name", "marko");
assertEquals(0, graphChangedListener.vertexPropertyChangedEventRecorded());
((EventTransactionalGraph) graph).commit();
assertEquals(1, graphChangedListener.vertexPropertyChangedEventRecorded());
graphChangedListener.reset();
vertex.getProperty("name");
assertEquals(0, graphChangedListener.vertexPropertyChangedEventRecorded());
}
public void testFireVertexPropertyRemoved() {
graph.addListener(graphChangedListener);
Vertex vertex = createVertex();
vertex.setProperty("name", "marko");
vertex.removeProperty("name");
assertEquals(0, graphChangedListener.vertexPropertyRemovedEventRecorded());
((EventTransactionalGraph) graph).commit();
assertEquals(1, graphChangedListener.vertexPropertyRemovedEventRecorded());
}
public void testFireVertexRemoved() {
graph.addListener(graphChangedListener);
Vertex vertex = createVertex();
graph.removeVertex(vertex);
assertEquals(0, graphChangedListener.vertexRemovedEventRecorded());
((EventTransactionalGraph) graph).commit();
assertEquals(1, graphChangedListener.vertexRemovedEventRecorded());
}
public void testFireEdgeAdded() {
graph.addListener(graphChangedListener);
Edge edge = createEdge();
assertEquals(0, graphChangedListener.addEdgeEventRecorded());
((EventTransactionalGraph) graph).commit();
assertEquals(1, graphChangedListener.addEdgeEventRecorded());
graphChangedListener.reset();
graph.getEdge(edge.getId());
assertEquals(0, graphChangedListener.addEdgeEventRecorded());
}
public void testFireEdgePropertyChanged() {
graph.addListener(graphChangedListener);
Edge edge = createEdge();
edge.setProperty("weight", System.currentTimeMillis());
assertEquals(0, graphChangedListener.edgePropertyChangedEventRecorded());
((EventTransactionalGraph) graph).commit();
assertEquals(1, graphChangedListener.edgePropertyChangedEventRecorded());
graphChangedListener.reset();
edge.getProperty("weight");
assertEquals(0, graphChangedListener.edgePropertyChangedEventRecorded());
}
public void testFireEdgePropertyRemoved() {
graph.addListener(graphChangedListener);
Edge edge = createEdge();
edge.setProperty("weight", System.currentTimeMillis());
edge.removeProperty("weight");
assertEquals(0, graphChangedListener.edgePropertyRemovedEventRecorded());
((EventTransactionalGraph) graph).commit();
assertEquals(1, graphChangedListener.edgePropertyRemovedEventRecorded());
}
public void testFireEdgeRemoved() {
graph.addListener(graphChangedListener);
Edge edge = createEdge();
graph.removeEdge(edge);
assertEquals(0, graphChangedListener.edgeRemovedEventRecorded());
((EventTransactionalGraph) graph).commit();
assertEquals(1, graphChangedListener.edgeRemovedEventRecorded());
}
public void testTransactionSeriesWithSuccess() {
graph.addListener(graphChangedListener);
createEdge();
Edge e = createEdge();
e.setProperty("test", "it");
e.setProperty("test", "that");
Vertex v = createVertex();
v.setProperty("test", "it");
assertEquals(0, graphChangedListener.addEdgeEventRecorded());
assertEquals(0, graphChangedListener.addVertexEventRecorded());
assertEquals(0, graphChangedListener.edgePropertyChangedEventRecorded());
assertEquals(0, graphChangedListener.vertexPropertyChangedEventRecorded());
((EventTransactionalGraph) graph).commit();
assertEquals(2, graphChangedListener.addEdgeEventRecorded());
assertEquals(5, graphChangedListener.addVertexEventRecorded());
assertEquals(2, graphChangedListener.edgePropertyChangedEventRecorded());
assertEquals(1, graphChangedListener.vertexPropertyChangedEventRecorded());
}
public void testTransactionSeriesWithFailure() {
graph.addListener(graphChangedListener);
createEdge();
Edge e = createEdge();
e.setProperty("test", "it");
e.setProperty("test", "that");
Vertex v = createVertex();
v.setProperty("test", "it");
assertEquals(0, graphChangedListener.addEdgeEventRecorded());
assertEquals(0, graphChangedListener.addVertexEventRecorded());
assertEquals(0, graphChangedListener.edgePropertyChangedEventRecorded());
assertEquals(0, graphChangedListener.vertexPropertyChangedEventRecorded());
((EventTransactionalGraph) graph).rollback();
assertEquals(0, graphChangedListener.addEdgeEventRecorded());
assertEquals(0, graphChangedListener.addVertexEventRecorded());
assertEquals(0, graphChangedListener.edgePropertyChangedEventRecorded());
assertEquals(0, graphChangedListener.vertexPropertyChangedEventRecorded());
}
public void testTransactionSeriesOrder() {
graph.addListener(graphChangedListener);
graph.addListener(new ConsoleGraphChangedListener(graph));
Vertex v1 = graph.addVertex(10);
v1.setProperty("aaa", "bbb");
v1.setProperty("ccc", "ddd");
v1.removeProperty("aaa");
Vertex v2 = graph.addVertex(20);
Vertex v3 = graph.addVertex(30);
Edge e1 = graph.addEdge(100, v1, v2, "friend");
e1.setProperty("eee", "fff");
e1.setProperty("ggg", "hhh");
e1.setProperty("ggg", "hhhh");
e1.removeProperty("eee");
Edge e2 = graph.addEdge(101, v1, v2, "enemy");
graph.removeEdge(e2);
graph.removeVertex(v3);
assertEquals(0, graphChangedListener.getOrder().size());
((EventTransactionalGraph) graph).commit();
List<String> order = graphChangedListener.getOrder();
assertEquals("v-added-10", order.get(0));
assertEquals("v-property-changed-10-aaa:null->bbb", order.get(1));
assertEquals("v-property-changed-10-ccc:null->ddd", order.get(2));
assertEquals("v-property-removed-10-aaa:bbb", order.get(3));
assertEquals("v-added-20", order.get(4));
assertEquals("v-added-30", order.get(5));
assertEquals("e-added-100", order.get(6));
assertEquals("e-property-changed-100-eee:null->fff", order.get(7));
assertEquals("e-property-changed-100-ggg:null->hhh", order.get(8));
assertEquals("e-property-changed-100-ggg:hhh->hhhh", order.get(9));
assertEquals("e-property-removed-100-eee:fff", order.get(10));
assertEquals("e-added-101", order.get(11));
assertEquals("e-removed-101", order.get(12));
assertEquals("v-removed-30", order.get(13));
}
private Edge createEdge() {
return graph.addEdge(null, createVertex(), createVertex(), "knows");
}
private Vertex createVertex() {
return graph.addVertex(null);
}
public void testMutateInListener() {
StubGraphChangedListener listener = new StubGraphChangedListener() {
@Override
public void vertexPropertyChanged(Vertex vertex, String key, Object oldValue, Object setValue) {
if (!"setInListener".equals(key)) {
vertex.setProperty("setInListener", 12345);
}
super.vertexPropertyChanged(vertex, key, oldValue, setValue);
}
};
graph.addListener(listener);
Vertex vertex = createVertex();
vertex.setProperty("test", 123);
graph.commit();
assertEquals(12345, vertex.getProperty("setInListener"));
assertEquals(2, listener.vertexPropertyChangedEventRecorded());
}
}