/** * Copyright (c) 2002-2014 "Neo Technology," * Network Engine for Objects in Lund AB [http://neotechnology.com] * * This file is part of Neo4j. * * Neo4j is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.neo4j.index.impl.lucene; import static junit.framework.Assert.fail; import static org.junit.Assert.assertTrue; import java.io.File; import java.util.concurrent.TimeUnit; import org.junit.Test; import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.index.Index; import org.neo4j.kernel.EmbeddedGraphDatabase; import org.neo4j.kernel.impl.util.FileUtils; import org.neo4j.tooling.GlobalGraphOperations; public class RecoveryIT { @Test public void testHardCoreRecovery() throws Exception { String path = "target/hcdb"; FileUtils.deleteRecursively( new File( path ) ); Process process = Runtime.getRuntime().exec( new String[]{ "java", "-cp", System.getProperty( "java.class.path" ), Inserter.class.getName(), path } ); // Let it run for a while and then kill it, and wait for it to die awaitFile( new File( path, "started" ) ); Thread.sleep( 5000 ); process.destroy(); process.waitFor(); GraphDatabaseService db = new EmbeddedGraphDatabase( path ); assertTrue( db.index().existsForNodes( "myIndex" ) ); Index<Node> index = db.index().forNodes( "myIndex" ); for ( Node node : GlobalGraphOperations.at( db ).getAllNodes() ) { for ( String key : node.getPropertyKeys() ) { String value = (String) node.getProperty( key ); boolean found = false; for ( Node indexedNode : index.get( key, value ) ) { if ( indexedNode.equals( node ) ) { found = true; break; } } if ( !found ) { throw new IllegalStateException( node + " has property '" + key + "'='" + value + "', but not in index" ); } } } db.shutdown(); } private void awaitFile( File file ) throws InterruptedException { long end = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis( 30 ); while ( !file.exists() && System.currentTimeMillis() < end ) { Thread.sleep( 100 ); } if ( !file.exists() ) { fail( "The inserter doesn't seem to have run properly" ); } } }