Make sure Stream.cancel() can be called multiple times.
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=72928049
diff --git a/core/src/main/java/com/google/net/stubby/newtransport/okhttp/OkHttpClientTransport.java b/core/src/main/java/com/google/net/stubby/newtransport/okhttp/OkHttpClientTransport.java
index 6acddf8..292adc3 100644
--- a/core/src/main/java/com/google/net/stubby/newtransport/okhttp/OkHttpClientTransport.java
+++ b/core/src/main/java/com/google/net/stubby/newtransport/okhttp/OkHttpClientTransport.java
@@ -14,6 +14,7 @@
import com.google.net.stubby.newtransport.ClientTransport;
import com.google.net.stubby.newtransport.InputStreamDeframer;
import com.google.net.stubby.newtransport.StreamListener;
+import com.google.net.stubby.newtransport.StreamState;
import com.google.net.stubby.transport.Transport;
import com.google.net.stubby.transport.Transport.Code;
@@ -425,7 +426,10 @@
@Override
public void cancel() {
- Preconditions.checkState(streamId != 0, "streamId should be set");
+ if (streamId == 0) {
+ // This should only happens when the stream was failed in constructor.
+ Preconditions.checkState(state() == StreamState.CLOSED, "A unclosed stream has no id");
+ }
outboundPhase = Phase.STATUS;
if (finishStream(streamId, toGrpcStatus(ErrorCode.CANCEL))) {
frameWriter.rstStream(streamId, ErrorCode.CANCEL);