Skip to content

Commit c8898ab

Browse files
committed
Merge branch 1.2 into 1.3
2 parents 24e6af1 + 53e6a62 commit c8898ab

File tree

3 files changed

+123
-3
lines changed

3 files changed

+123
-3
lines changed

driver/src/main/java/org/neo4j/driver/internal/ExplicitTransaction.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,12 @@ else if ( state == State.MARKED_FAILED || state == State.ACTIVE )
135135
{
136136
rollbackTx();
137137
}
138+
else if ( state == State.FAILED )
139+
{
140+
// unrecoverable error happened, transaction should've been rolled back on the server
141+
// update state so that this transaction does not remain open
142+
state = State.ROLLED_BACK;
143+
}
138144
}
139145
}
140146
finally
@@ -206,7 +212,7 @@ public synchronized StatementResult run( Statement statement )
206212
@Override
207213
public boolean isOpen()
208214
{
209-
return state == State.ACTIVE;
215+
return state != State.SUCCEEDED && state != State.ROLLED_BACK;
210216
}
211217

212218
private void ensureNotFailed()

driver/src/test/java/org/neo4j/driver/internal/ExplicitTransactionTest.java

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,11 @@
2626

2727
import org.neo4j.driver.internal.spi.Collector;
2828
import org.neo4j.driver.internal.spi.Connection;
29+
import org.neo4j.driver.v1.Transaction;
2930
import org.neo4j.driver.v1.Value;
3031

32+
import static org.junit.Assert.assertFalse;
33+
import static org.junit.Assert.assertTrue;
3134
import static org.mockito.Matchers.any;
3235
import static org.mockito.Mockito.inOrder;
3336
import static org.mockito.Mockito.mock;
@@ -144,4 +147,82 @@ public void shouldSyncWhenBookmarkGiven()
144147
inOrder.verify( connection ).pullAll( Collector.NO_OP );
145148
inOrder.verify( connection ).sync();
146149
}
150+
151+
@Test
152+
public void shouldBeOpenAfterConstruction()
153+
{
154+
Transaction tx = new ExplicitTransaction( openConnectionMock(), mock( SessionResourcesHandler.class ) );
155+
156+
assertTrue( tx.isOpen() );
157+
}
158+
159+
@Test
160+
public void shouldBeOpenWhenMarkedForSuccess()
161+
{
162+
Transaction tx = new ExplicitTransaction( openConnectionMock(), mock( SessionResourcesHandler.class ) );
163+
164+
tx.success();
165+
166+
assertTrue( tx.isOpen() );
167+
}
168+
169+
@Test
170+
public void shouldBeOpenWhenMarkedForFailure()
171+
{
172+
Transaction tx = new ExplicitTransaction( openConnectionMock(), mock( SessionResourcesHandler.class ) );
173+
174+
tx.failure();
175+
176+
assertTrue( tx.isOpen() );
177+
}
178+
179+
@Test
180+
public void shouldBeOpenWhenMarkedToClose()
181+
{
182+
ExplicitTransaction tx = new ExplicitTransaction( openConnectionMock(), mock( SessionResourcesHandler.class ) );
183+
184+
tx.markToClose();
185+
186+
assertTrue( tx.isOpen() );
187+
}
188+
189+
@Test
190+
public void shouldBeClosedAfterCommit()
191+
{
192+
Transaction tx = new ExplicitTransaction( openConnectionMock(), mock( SessionResourcesHandler.class ) );
193+
194+
tx.success();
195+
tx.close();
196+
197+
assertFalse( tx.isOpen() );
198+
}
199+
200+
@Test
201+
public void shouldBeClosedAfterRollback()
202+
{
203+
Transaction tx = new ExplicitTransaction( openConnectionMock(), mock( SessionResourcesHandler.class ) );
204+
205+
tx.failure();
206+
tx.close();
207+
208+
assertFalse( tx.isOpen() );
209+
}
210+
211+
@Test
212+
public void shouldBeClosedWhenMarkedToCloseAndClosed()
213+
{
214+
ExplicitTransaction tx = new ExplicitTransaction( openConnectionMock(), mock( SessionResourcesHandler.class ) );
215+
216+
tx.markToClose();
217+
tx.close();
218+
219+
assertFalse( tx.isOpen() );
220+
}
221+
222+
private static Connection openConnectionMock()
223+
{
224+
Connection connection = mock( Connection.class );
225+
when( connection.isOpen() ).thenReturn( true );
226+
return connection;
227+
}
147228
}

driver/src/test/java/org/neo4j/driver/internal/NetworkSessionTest.java

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ public void markTxAsFailedOnRecoverableConnectionError()
479479

480480
session.onConnectionError( true );
481481

482-
assertFalse( tx.isOpen() );
482+
assertTrue( tx.isOpen() );
483483
}
484484

485485
@Test
@@ -495,7 +495,7 @@ public void markTxToCloseOnUnrecoverableConnectionError()
495495

496496
session.onConnectionError( false );
497497

498-
assertFalse( tx.isOpen() );
498+
assertTrue( tx.isOpen() );
499499
}
500500

501501
@Test
@@ -734,6 +734,39 @@ public void writeTxRetriedUntilFailureWhenTxCloseThrows()
734734
testTxIsRetriedUntilFailureWhenTxCloseThrows( WRITE );
735735
}
736736

737+
@Test
738+
public void transactionShouldBeOpenAfterSessionReset()
739+
{
740+
ConnectionProvider connectionProvider = mock( ConnectionProvider.class );
741+
PooledConnection connection = openConnectionMock();
742+
when( connectionProvider.acquireConnection( READ ) ).thenReturn( connection );
743+
NetworkSession session = newSession( connectionProvider, READ );
744+
Transaction tx = session.beginTransaction();
745+
746+
assertTrue( tx.isOpen() );
747+
748+
session.reset();
749+
assertTrue( tx.isOpen() );
750+
}
751+
752+
@Test
753+
public void transactionShouldBeClosedAfterSessionResetAndClose()
754+
{
755+
ConnectionProvider connectionProvider = mock( ConnectionProvider.class );
756+
PooledConnection connection = openConnectionMock();
757+
when( connectionProvider.acquireConnection( READ ) ).thenReturn( connection );
758+
NetworkSession session = newSession( connectionProvider, READ );
759+
Transaction tx = session.beginTransaction();
760+
761+
assertTrue( tx.isOpen() );
762+
763+
session.reset();
764+
assertTrue( tx.isOpen() );
765+
766+
tx.close();
767+
assertFalse( tx.isOpen() );
768+
}
769+
737770
private static void testConnectionAcquisition( AccessMode sessionMode, AccessMode transactionMode )
738771
{
739772
ConnectionProvider connectionProvider = mock( ConnectionProvider.class );

0 commit comments

Comments
 (0)