Skip to content

Commit fb03b74

Browse files
test(spanner): unflake multiUseReadOnlyTransactionCanUseInlineBeginForReadAsync
In `SessionImplTest#multiUseReadOnlyTransactionCanUseInlineBeginForReadAsync`, mock `rpc.read` invoked stream callbacks synchronously before returning `NoOpStreamingCall`. This caused a background thread to process rows and invoke `startStream` while `this.stream` was still unassigned, triggering a duplicate request (`expected:<1> but was:<2>`). Fix this by dispatching callbacks asynchronously with `CompletableFuture.runAsync`, allowing `rpc.read` to return and assign `this.stream` before row consumption starts.
1 parent d9a8eef commit fb03b74

1 file changed

Lines changed: 7 additions & 2 deletions

File tree

java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionImplTest.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import java.util.List;
6767
import java.util.Map;
6868
import java.util.TimeZone;
69+
import java.util.concurrent.CompletableFuture;
6970
import java.util.concurrent.CountDownLatch;
7071
import java.util.concurrent.ExecutorService;
7172
import java.util.concurrent.Executors;
@@ -823,8 +824,12 @@ public void multiUseReadOnlyTransactionCanUseInlineBeginForReadAsync() throws Ex
823824
Mockito.when(rpc.read(request.capture(), consumer.capture(), anyMap(), any(), eq(false)))
824825
.then(
825826
invocation -> {
826-
consumer.getValue().onPartialResultSet(resultSet);
827-
consumer.getValue().onCompleted();
827+
SpannerRpc.ResultStreamConsumer c = invocation.getArgument(1);
828+
CompletableFuture.runAsync(
829+
() -> {
830+
c.onPartialResultSet(resultSet);
831+
c.onCompleted();
832+
});
828833
return new NoOpStreamingCall();
829834
});
830835

0 commit comments

Comments
 (0)