|
30 | 30 | import com.google.cloud.spanner.ErrorCode;
|
31 | 31 | import com.google.cloud.spanner.MockSpannerServiceImpl;
|
32 | 32 | import com.google.cloud.spanner.MockSpannerServiceImpl.SimulatedExecutionTime;
|
| 33 | +import com.google.cloud.spanner.Options.RpcPriority; |
33 | 34 | import com.google.cloud.spanner.ResultSet;
|
34 | 35 | import com.google.cloud.spanner.SpannerException;
|
35 | 36 | import com.google.cloud.spanner.SpannerOptions;
|
36 | 37 | import com.google.cloud.spanner.Statement;
|
| 38 | +import com.google.cloud.spanner.TimestampBound; |
37 | 39 | import com.google.common.collect.ImmutableList;
|
38 | 40 | import com.google.spanner.v1.BatchCreateSessionsRequest;
|
39 | 41 | import com.google.spanner.v1.CommitRequest;
|
| 42 | +import com.google.spanner.v1.DirectedReadOptions; |
| 43 | +import com.google.spanner.v1.DirectedReadOptions.ExcludeReplicas; |
| 44 | +import com.google.spanner.v1.DirectedReadOptions.ReplicaSelection; |
40 | 45 | import com.google.spanner.v1.ExecuteBatchDmlRequest;
|
41 | 46 | import com.google.spanner.v1.ExecuteSqlRequest;
|
42 | 47 | import com.google.spanner.v1.ExecuteSqlRequest.QueryOptions;
|
43 | 48 | import com.google.spanner.v1.RequestOptions;
|
| 49 | +import java.nio.charset.StandardCharsets; |
| 50 | +import java.time.Duration; |
44 | 51 | import java.util.Arrays;
|
45 | 52 | import java.util.Collections;
|
46 | 53 | import java.util.concurrent.ExecutionException;
|
47 | 54 | import java.util.concurrent.TimeUnit;
|
48 | 55 | import java.util.concurrent.TimeoutException;
|
| 56 | +import java.util.function.Consumer; |
| 57 | +import java.util.function.Supplier; |
49 | 58 | import javax.annotation.Nonnull;
|
50 | 59 | import org.junit.After;
|
51 | 60 | import org.junit.AfterClass;
|
@@ -228,6 +237,145 @@ public void testBatchUpdateAborted() {
|
228 | 237 | }
|
229 | 238 | }
|
230 | 239 | }
|
| 240 | + |
| 241 | + @Test |
| 242 | + public void testReset() { |
| 243 | + try (ConnectionImpl connection = (ConnectionImpl) createConnection()) { |
| 244 | + assertResetBooleanProperty( |
| 245 | + connection, |
| 246 | + true, |
| 247 | + connection::setRetryAbortsInternally, |
| 248 | + connection::isRetryAbortsInternally); |
| 249 | + assertResetBooleanProperty( |
| 250 | + connection, false, connection::setReadOnly, connection::isReadOnly); |
| 251 | + assertResetBooleanProperty( |
| 252 | + connection, false, connection::setAutocommit, connection::isAutocommit); |
| 253 | + assertResetBooleanProperty( |
| 254 | + connection, false, connection::setReturnCommitStats, connection::isReturnCommitStats); |
| 255 | + assertResetBooleanProperty( |
| 256 | + connection, |
| 257 | + false, |
| 258 | + connection::setDelayTransactionStartUntilFirstWrite, |
| 259 | + connection::isDelayTransactionStartUntilFirstWrite); |
| 260 | + assertResetBooleanProperty( |
| 261 | + connection, false, connection::setDataBoostEnabled, connection::isDataBoostEnabled); |
| 262 | + assertResetBooleanProperty( |
| 263 | + connection, false, connection::setAutoPartitionMode, connection::isAutoPartitionMode); |
| 264 | + assertResetBooleanProperty( |
| 265 | + connection, |
| 266 | + false, |
| 267 | + connection::setExcludeTxnFromChangeStreams, |
| 268 | + connection::isExcludeTxnFromChangeStreams); |
| 269 | + |
| 270 | + assertResetProperty( |
| 271 | + connection, "", "1", connection::setOptimizerVersion, connection::getOptimizerVersion); |
| 272 | + assertResetProperty( |
| 273 | + connection, |
| 274 | + null, |
| 275 | + RpcPriority.LOW, |
| 276 | + connection::setRPCPriority, |
| 277 | + connection::getRPCPriority); |
| 278 | + assertResetProperty( |
| 279 | + connection, |
| 280 | + DdlInTransactionMode.ALLOW_IN_EMPTY_TRANSACTION, |
| 281 | + DdlInTransactionMode.AUTO_COMMIT_TRANSACTION, |
| 282 | + connection::setDdlInTransactionMode, |
| 283 | + connection::getDdlInTransactionMode); |
| 284 | + assertResetProperty( |
| 285 | + connection, 0, 4, connection::setMaxPartitions, connection::getMaxPartitions); |
| 286 | + assertResetProperty( |
| 287 | + connection, |
| 288 | + 1, |
| 289 | + 8, |
| 290 | + connection::setMaxPartitionedParallelism, |
| 291 | + connection::getMaxPartitionedParallelism); |
| 292 | + assertResetProperty( |
| 293 | + connection, |
| 294 | + null, |
| 295 | + Duration.ofMillis(20), |
| 296 | + connection::setMaxCommitDelay, |
| 297 | + connection::getMaxCommitDelay); |
| 298 | + assertResetProperty( |
| 299 | + connection, |
| 300 | + TimestampBound.strong(), |
| 301 | + TimestampBound.ofExactStaleness(10L, TimeUnit.SECONDS), |
| 302 | + connection::setReadOnlyStaleness, |
| 303 | + connection::getReadOnlyStaleness); |
| 304 | + assertResetProperty( |
| 305 | + connection, null, "tag", connection::setStatementTag, connection::getStatementTag); |
| 306 | + assertResetProperty( |
| 307 | + connection, null, "tag", connection::setTransactionTag, connection::getTransactionTag); |
| 308 | + assertResetProperty( |
| 309 | + connection, |
| 310 | + null, |
| 311 | + DirectedReadOptions.newBuilder() |
| 312 | + .setExcludeReplicas( |
| 313 | + ExcludeReplicas.newBuilder() |
| 314 | + .addReplicaSelections( |
| 315 | + ReplicaSelection.newBuilder().setLocation("foo").build()) |
| 316 | + .build()) |
| 317 | + .build(), |
| 318 | + connection::setDirectedRead, |
| 319 | + connection::getDirectedRead); |
| 320 | + assertResetProperty( |
| 321 | + connection, |
| 322 | + SavepointSupport.FAIL_AFTER_ROLLBACK, |
| 323 | + SavepointSupport.ENABLED, |
| 324 | + connection::setSavepointSupport, |
| 325 | + connection::getSavepointSupport); |
| 326 | + assertResetProperty( |
| 327 | + connection, |
| 328 | + null, |
| 329 | + "descriptor".getBytes(StandardCharsets.UTF_8), |
| 330 | + connection::setProtoDescriptors, |
| 331 | + connection::getProtoDescriptors); |
| 332 | + assertResetProperty( |
| 333 | + connection, |
| 334 | + null, |
| 335 | + "filename", |
| 336 | + connection::setProtoDescriptorsFilePath, |
| 337 | + connection::getProtoDescriptorsFilePath); |
| 338 | + |
| 339 | + // Test the AutocommitDmlMode property that is only supported in auto-commit mode. |
| 340 | + connection.rollback(); |
| 341 | + connection.setAutocommit(true); |
| 342 | + assertResetProperty( |
| 343 | + connection, |
| 344 | + AutocommitDmlMode.TRANSACTIONAL, |
| 345 | + AutocommitDmlMode.PARTITIONED_NON_ATOMIC, |
| 346 | + connection::setAutocommitDmlMode, |
| 347 | + connection::getAutocommitDmlMode); |
| 348 | + connection.setAutocommit(false); |
| 349 | + |
| 350 | + // Statement timeouts use a customer getter/setter, so we need to manually test that. |
| 351 | + assertEquals(0L, connection.getStatementTimeout(TimeUnit.MILLISECONDS)); |
| 352 | + connection.setStatementTimeout(10L, TimeUnit.SECONDS); |
| 353 | + assertEquals(10L, connection.getStatementTimeout(TimeUnit.SECONDS)); |
| 354 | + connection.reset(); |
| 355 | + assertEquals(0L, connection.getStatementTimeout(TimeUnit.MILLISECONDS)); |
| 356 | + } |
| 357 | + } |
| 358 | + |
| 359 | + private void assertResetBooleanProperty( |
| 360 | + ConnectionImpl connection, |
| 361 | + boolean defaultValue, |
| 362 | + Consumer<Boolean> setter, |
| 363 | + Supplier<Boolean> getter) { |
| 364 | + assertResetProperty(connection, defaultValue, !defaultValue, setter, getter); |
| 365 | + } |
| 366 | + |
| 367 | + private <T> void assertResetProperty( |
| 368 | + ConnectionImpl connection, |
| 369 | + T defaultValue, |
| 370 | + T alternativeValue, |
| 371 | + Consumer<T> setter, |
| 372 | + Supplier<T> getter) { |
| 373 | + assertEquals(defaultValue, getter.get()); |
| 374 | + setter.accept(alternativeValue); |
| 375 | + assertEquals(alternativeValue, getter.get()); |
| 376 | + connection.reset(); |
| 377 | + assertEquals(defaultValue, getter.get()); |
| 378 | + } |
231 | 379 | }
|
232 | 380 |
|
233 | 381 | public static class ConnectionMinSessionsTest extends AbstractMockServerTest {
|
|
0 commit comments