Skip to content

Commit 23b7acf

Browse files
committed
test: add transaction retry test
1 parent beef118 commit 23b7acf

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/AutoDmlBatchMockServerTest.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import static org.junit.Assert.assertThrows;
2323
import static org.junit.Assert.assertTrue;
2424

25+
import com.google.cloud.spanner.AbortedDueToConcurrentModificationException;
2526
import com.google.cloud.spanner.ErrorCode;
2627
import com.google.cloud.spanner.MockSpannerServiceImpl;
2728
import com.google.cloud.spanner.ReadContext.QueryAnalyzeMode;
@@ -668,4 +669,57 @@ public void testUpdateCountVerification_succeedsIfSame() {
668669
assertEquals(5, request.getStatementsCount());
669670
assertEquals(1, mockSpanner.countRequestsOfType(CommitRequest.class));
670671
}
672+
673+
@Test
674+
public void testTransactionRetry() {
675+
try (Connection connection = createConnection()) {
676+
assertEquals(1L, connection.executeUpdate(INSERT_STATEMENT));
677+
assertEquals(1L, connection.executeUpdate(INSERT_STATEMENT));
678+
try (ResultSet resultSet = connection.executeQuery(SELECT1_STATEMENT)) {
679+
assertTrue(resultSet.next());
680+
assertEquals(1L, resultSet.getLong(0));
681+
assertFalse(resultSet.next());
682+
}
683+
684+
mockSpanner.abortNextStatement();
685+
connection.commit();
686+
}
687+
688+
assertEquals(2, mockSpanner.countRequestsOfType(ExecuteBatchDmlRequest.class));
689+
ExecuteBatchDmlRequest request =
690+
mockSpanner.getRequestsOfType(ExecuteBatchDmlRequest.class).get(0);
691+
assertEquals(2, request.getStatementsCount());
692+
assertEquals(2, mockSpanner.countRequestsOfType(ExecuteSqlRequest.class));
693+
assertEquals(2, mockSpanner.countRequestsOfType(CommitRequest.class));
694+
}
695+
696+
@Test
697+
public void testTransactionRetryFails() {
698+
try (Connection connection = createConnection()) {
699+
assertEquals(1L, connection.executeUpdate(INSERT_STATEMENT));
700+
assertEquals(1L, connection.executeUpdate(INSERT_STATEMENT));
701+
try (ResultSet resultSet = connection.executeQuery(SELECT1_STATEMENT)) {
702+
assertTrue(resultSet.next());
703+
assertEquals(1L, resultSet.getLong(0));
704+
assertFalse(resultSet.next());
705+
}
706+
707+
// Modify the update count that is returned by the insert statement. This will cause the
708+
// retry attempt to fail.
709+
mockSpanner.putStatementResult(
710+
MockSpannerServiceImpl.StatementResult.update(INSERT_STATEMENT, 2L));
711+
mockSpanner.abortNextStatement();
712+
assertThrows(AbortedDueToConcurrentModificationException.class, connection::commit);
713+
} finally {
714+
mockSpanner.putStatementResult(
715+
MockSpannerServiceImpl.StatementResult.update(INSERT_STATEMENT, 1L));
716+
}
717+
718+
assertEquals(2, mockSpanner.countRequestsOfType(ExecuteBatchDmlRequest.class));
719+
ExecuteBatchDmlRequest request =
720+
mockSpanner.getRequestsOfType(ExecuteBatchDmlRequest.class).get(0);
721+
assertEquals(2, request.getStatementsCount());
722+
assertEquals(1, mockSpanner.countRequestsOfType(ExecuteSqlRequest.class));
723+
assertEquals(1, mockSpanner.countRequestsOfType(CommitRequest.class));
724+
}
671725
}

0 commit comments

Comments
 (0)