Skip to content

Commit 6fd51f1

Browse files
committed
Merge branch 1.1 into 1.2
2 parents 0f1c3ba + 30cc1a4 commit 6fd51f1

File tree

3 files changed

+119
-1
lines changed

3 files changed

+119
-1
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( Runnable.class ) );
155+
156+
assertTrue( tx.isOpen() );
157+
}
158+
159+
@Test
160+
public void shouldBeOpenWhenMarkedForSuccess()
161+
{
162+
Transaction tx = new ExplicitTransaction( openConnectionMock(), mock( Runnable.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( Runnable.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( Runnable.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( Runnable.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( Runnable.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( Runnable.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: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,37 @@ public void writeTxRetriedUntilFailureWhenTxCloseThrows()
734734
testTxIsRetriedUntilFailureWhenTxCloseThrows( WRITE );
735735
}
736736

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

0 commit comments

Comments
 (0)