|
27 | 27 | import com.google.cloud.spanner.connection.AbstractMockServerTest; |
28 | 28 | import com.google.cloud.spanner.connection.SpannerPool; |
29 | 29 | import com.google.spanner.v1.CommitRequest; |
| 30 | +import com.google.spanner.v1.ExecuteSqlRequest; |
| 31 | +import com.google.spanner.v1.TransactionOptions.IsolationLevel; |
| 32 | +import java.sql.Connection; |
30 | 33 | import java.sql.DriverManager; |
31 | 34 | import java.sql.ResultSet; |
32 | 35 | import java.sql.SQLException; |
33 | 36 | import java.time.Duration; |
| 37 | +import java.util.Arrays; |
| 38 | +import java.util.stream.Collectors; |
34 | 39 | import org.junit.After; |
35 | 40 | import org.junit.Test; |
36 | 41 | import org.junit.runner.RunWith; |
@@ -138,4 +143,63 @@ public void testMaxCommitDelay() throws SQLException { |
138 | 143 | assertEquals(Duration.ofMillis(50).toNanos(), request.getMaxCommitDelay().getNanos()); |
139 | 144 | } |
140 | 145 | } |
| 146 | + |
| 147 | + @Test |
| 148 | + public void testDefaultIsolationLevel() throws SQLException { |
| 149 | + for (IsolationLevel isolationLevel : |
| 150 | + Arrays.stream(IsolationLevel.values()) |
| 151 | + .filter(level -> !level.equals(IsolationLevel.UNRECOGNIZED)) |
| 152 | + .collect(Collectors.toList())) { |
| 153 | + try (java.sql.Connection connection = |
| 154 | + DriverManager.getConnection( |
| 155 | + "jdbc:" + getBaseUrl() + ";default_isolation_level=" + isolationLevel.name())) { |
| 156 | + connection.setAutoCommit(false); |
| 157 | + try (ResultSet resultSet = |
| 158 | + connection.createStatement().executeQuery(SELECT1_STATEMENT.getSql())) { |
| 159 | + while (resultSet.next()) { |
| 160 | + // ignore |
| 161 | + } |
| 162 | + } |
| 163 | + connection.commit(); |
| 164 | + assertEquals(1, mockSpanner.countRequestsOfType(ExecuteSqlRequest.class)); |
| 165 | + ExecuteSqlRequest request = mockSpanner.getRequestsOfType(ExecuteSqlRequest.class).get(0); |
| 166 | + assertTrue(request.hasTransaction()); |
| 167 | + assertTrue(request.getTransaction().hasBegin()); |
| 168 | + assertTrue(request.getTransaction().getBegin().hasReadWrite()); |
| 169 | + assertEquals(isolationLevel, request.getTransaction().getBegin().getIsolationLevel()); |
| 170 | + assertEquals(1, mockSpanner.countRequestsOfType(CommitRequest.class)); |
| 171 | + |
| 172 | + mockSpanner.clearRequests(); |
| 173 | + } |
| 174 | + } |
| 175 | + } |
| 176 | + |
| 177 | + @Test |
| 178 | + public void testSetIsolationLevel() throws SQLException { |
| 179 | + try (java.sql.Connection connection = createJdbcConnection()) { |
| 180 | + connection.setAutoCommit(false); |
| 181 | + for (int isolationLevel : |
| 182 | + new int[] {Connection.TRANSACTION_REPEATABLE_READ, Connection.TRANSACTION_SERIALIZABLE}) { |
| 183 | + connection.setTransactionIsolation(isolationLevel); |
| 184 | + try (ResultSet resultSet = |
| 185 | + connection.createStatement().executeQuery(SELECT1_STATEMENT.getSql())) { |
| 186 | + while (resultSet.next()) { |
| 187 | + // ignore |
| 188 | + } |
| 189 | + } |
| 190 | + connection.commit(); |
| 191 | + assertEquals(1, mockSpanner.countRequestsOfType(ExecuteSqlRequest.class)); |
| 192 | + ExecuteSqlRequest request = mockSpanner.getRequestsOfType(ExecuteSqlRequest.class).get(0); |
| 193 | + assertTrue(request.hasTransaction()); |
| 194 | + assertTrue(request.getTransaction().hasBegin()); |
| 195 | + assertTrue(request.getTransaction().getBegin().hasReadWrite()); |
| 196 | + assertEquals( |
| 197 | + IsolationLevelConverter.convertToSpanner(isolationLevel), |
| 198 | + request.getTransaction().getBegin().getIsolationLevel()); |
| 199 | + assertEquals(1, mockSpanner.countRequestsOfType(CommitRequest.class)); |
| 200 | + |
| 201 | + mockSpanner.clearRequests(); |
| 202 | + } |
| 203 | + } |
| 204 | + } |
141 | 205 | } |
0 commit comments