/*
* Copyright (c) 2002-2009 "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 Affero 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.neo4j.kernel.impl.core;
import static org.junit.Assert.assertEquals;
import java.util.concurrent.CountDownLatch;
import org.junit.Test;
import org.neo4j.graphdb.DynamicRelationshipType;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.PropertyContainer;
import org.neo4j.graphdb.Relationship;
import org.neo4j.graphdb.Transaction;
import org.neo4j.kernel.impl.AbstractNeo4jTestCase;
public class TestIsolation extends AbstractNeo4jTestCase
{
@Test
public void testSimpleTransactionIsolation()
{
commit();
final CountDownLatch latch1 = new CountDownLatch( 1 );
final CountDownLatch latch2 = new CountDownLatch( 1 );
Transaction tx = getGraphDb().beginTx();
Node n1, n2;
Relationship r1;
try
{
n1 = getGraphDb().createNode();
n2 = getGraphDb().createNode();
r1 = n1.createRelationshipTo( n2,
DynamicRelationshipType.withName( "TEST" ) );
tx.success();
}
finally
{
tx.finish();
}
final Node node1 = n1;
final Node node2 = n2;
final Relationship rel1 = r1;
tx = getGraphDb().beginTx();
try
{
node1.setProperty( "key", "old" );
rel1.setProperty( "key", "old" );
tx.success();
}
finally
{
tx.finish();
}
assertPropertyEqual( node1, "key", "old" );
assertPropertyEqual( rel1, "key", "old" );
assertRelationshipCount( node1, 1 );
assertRelationshipCount( node2, 1 );
Thread t1 = new Thread( new Runnable()
{
public void run()
{
Transaction tx = getGraphDb().beginTx();
try
{
node1.setProperty( "key", "new" );
rel1.setProperty( "key", "new" );
node1.createRelationshipTo( node2,
DynamicRelationshipType.withName( "TEST" ) );
assertPropertyEqual( node1, "key", "new" );
assertPropertyEqual( rel1, "key", "new" );
assertRelationshipCount( node1, 2 );
assertRelationshipCount( node2, 2 );
latch1.countDown();
latch2.await();
assertPropertyEqual( node1, "key", "new" );
assertPropertyEqual( rel1, "key", "new" );
assertRelationshipCount( node1, 2 );
assertRelationshipCount( node2, 2 );
// no tx.success();
}
catch ( InterruptedException e )
{
e.printStackTrace();
Thread.interrupted();
}
finally
{
tx.finish();
assertPropertyEqual( node1, "key", "old" );
assertPropertyEqual( rel1, "key", "old" );
assertRelationshipCount( node1, 1 );
assertRelationshipCount( node2, 1 );
}
}
} );
t1.start();
try
{
latch1.await();
}
catch ( InterruptedException e )
{
Thread.interrupted();
}
assertPropertyEqual( node1, "key", "old" );
assertPropertyEqual( rel1, "key", "old" );
assertRelationshipCount( node1, 1 );
assertRelationshipCount( node2, 1 );
latch2.countDown();
try
{
t1.join();
}
catch ( InterruptedException e )
{
Thread.interrupted();
}
assertPropertyEqual( node1, "key", "old" );
assertPropertyEqual( rel1, "key", "old" );
assertRelationshipCount( node1, 1 );
assertRelationshipCount( node2, 1 );
tx = getGraphDb().beginTx();
try
{
for ( Relationship rel : node1.getRelationships() )
{
rel.delete();
}
node1.delete();
node2.delete();
tx.success();
}
finally
{
tx.finish();
}
}
private void assertPropertyEqual( PropertyContainer primitive, String key,
String value )
{
Transaction tx = getGraphDb().beginTx();
try
{
assertEquals( value, primitive.getProperty( key ) );
}
finally
{
tx.finish();
}
}
private void assertRelationshipCount( Node node, int count )
{
Transaction tx = getGraphDb().beginTx();
try
{
int actualCount = 0;
for ( Relationship rel : node.getRelationships() )
{
actualCount++;
}
assertEquals( count, actualCount );
}
finally
{
tx.finish();
}
}
}