package org.neo4j.shell.tools.imp;
import org.junit.Before;
import org.junit.Test;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Relationship;
import org.neo4j.graphdb.Transaction;
import org.neo4j.kernel.internal.GraphDatabaseAPI;
import org.neo4j.shell.ShellException;
import org.neo4j.shell.impl.SameJvmClient;
import org.neo4j.shell.kernel.GraphDatabaseShellServer;
import org.neo4j.test.TestGraphDatabaseFactory;
import java.io.*;
import java.rmi.RemoteException;
import java.util.Collections;
import java.util.Random;
import static org.junit.Assert.assertTrue;
import static org.neo4j.shell.tools.Asserts.assertCommand;
import static org.neo4j.shell.tools.imp.ExportXmlGraphMLWriterTest.LABEL;
import static org.neo4j.shell.tools.imp.ExportXmlGraphMLWriterTest.TYPE;
/**
* Created by efulton on 5/9/16.
*/
public class ExportBinaryAppTest {
private final Random random = new Random(1);
private GraphDatabaseAPI db;
private SameJvmClient client;
@Test
public void testExportKryo() throws Exception {
createData(1000);
assertCommand(client, "export-binary -o target/kryo-export.bin", "Wrote to binary file target/kryo-export.bin 0. 100%: nodes = 1000 rels = 1000 properties = 2000 time");
InputStream realStream = getClass().getResourceAsStream("/kryo-export.bin");
InputStream testStream = new FileInputStream("target/kryo-export.bin");
assertTrue(streamsAreEqual(realStream, testStream));
}
@Test
public void testExportTinyKryoGraph() throws Exception {
createData(1);
assertCommand(client, "export-binary -o target/tiny-kryo-export.bin", "Wrote to binary file target/tiny-kryo-export.bin 0. 100%: nodes = 1 rels = 1 properties = 2 time");
InputStream realStream = getClass().getResourceAsStream("/tiny-kryo-export.bin");
InputStream testStream = new FileInputStream("target/tiny-kryo-export.bin");
assertTrue(streamsAreEqual(realStream, testStream));
}
private void createData(int nodes) {
try (Transaction tx = db.beginTx()) {
for (int i=0;i< nodes;i++) {
Node node = db.createNode(LABEL);
node.setProperty("na<>me","John & Dö");
}
for (int i=0;i< nodes;i++) {
Node from = db.getNodeById(random.nextInt(nodes));
Node to = db.getNodeById(random.nextInt(nodes));
Relationship rel = from.createRelationshipTo(to, TYPE);
rel.setProperty("count",((double)i+1)/100);
}
tx.success();
}
}
private boolean streamsAreEqual(InputStream input1, InputStream input2) throws IOException {
if (!(input1 instanceof BufferedInputStream)) {
input1 = new BufferedInputStream(input1);
}
if (!(input2 instanceof BufferedInputStream)) {
input2 = new BufferedInputStream(input2);
}
int ch = input1.read();
while (-1 != ch) {
int ch2 = input2.read();
if (ch != ch2) {
return false;
}
ch = input1.read();
}
int ch2 = input2.read();
return (ch2 == -1);
}
@Before
public void setUp() throws RemoteException, ShellException {
db = (GraphDatabaseAPI) new TestGraphDatabaseFactory().newImpermanentDatabase();
client = new SameJvmClient(Collections.<String, Serializable>emptyMap(), new GraphDatabaseShellServer(db), new TestCtrlCHandler());
}
}