mirror of https://github.com/grpc/grpc-java.git
Implement Connection Backoff Interop test.
This commit is contained in:
parent
d2ab1c26cb
commit
b83742d61c
|
|
@ -46,9 +46,18 @@ task test_server(type: CreateStartScripts) {
|
|||
classpath = jar.outputs.files + project.configurations.runtime
|
||||
}
|
||||
|
||||
task reconnect_test_client(type: CreateStartScripts) {
|
||||
mainClassName = "io.grpc.testing.integration.ReconnectTestClient"
|
||||
applicationName = "reconnect-test-client"
|
||||
defaultJvmOpts = ["-Xbootclasspath/p:" + configurations.alpnboot.asPath]
|
||||
outputDir = new File(project.buildDir, 'tmp')
|
||||
classpath = jar.outputs.files + project.configurations.runtime
|
||||
}
|
||||
|
||||
applicationDistribution.into("bin") {
|
||||
from(test_client)
|
||||
from(test_server)
|
||||
from(reconnect_test_client)
|
||||
fileMode = 0755
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,197 @@
|
|||
package io.grpc.testing.integration;
|
||||
|
||||
import static io.grpc.stub.ClientCalls.asyncUnaryCall;
|
||||
import static io.grpc.stub.ClientCalls.asyncServerStreamingCall;
|
||||
import static io.grpc.stub.ClientCalls.asyncClientStreamingCall;
|
||||
import static io.grpc.stub.ClientCalls.asyncBidiStreamingCall;
|
||||
import static io.grpc.stub.ClientCalls.blockingUnaryCall;
|
||||
import static io.grpc.stub.ClientCalls.blockingServerStreamingCall;
|
||||
import static io.grpc.stub.ClientCalls.futureUnaryCall;
|
||||
import static io.grpc.stub.ServerCalls.asyncUnaryCall;
|
||||
import static io.grpc.stub.ServerCalls.asyncServerStreamingCall;
|
||||
import static io.grpc.stub.ServerCalls.asyncClientStreamingCall;
|
||||
import static io.grpc.stub.ServerCalls.asyncBidiStreamingCall;
|
||||
|
||||
@javax.annotation.Generated("by gRPC proto compiler")
|
||||
public class ReconnectServiceGrpc {
|
||||
|
||||
// Static method descriptors that strictly reflect the proto.
|
||||
public static final io.grpc.MethodDescriptor<com.google.protobuf.EmptyProtos.Empty,
|
||||
com.google.protobuf.EmptyProtos.Empty> METHOD_START =
|
||||
io.grpc.MethodDescriptor.create(
|
||||
io.grpc.MethodDescriptor.MethodType.UNARY,
|
||||
"grpc.testing.ReconnectService", "Start",
|
||||
io.grpc.protobuf.ProtoUtils.marshaller(com.google.protobuf.EmptyProtos.Empty.parser()),
|
||||
io.grpc.protobuf.ProtoUtils.marshaller(com.google.protobuf.EmptyProtos.Empty.parser()));
|
||||
public static final io.grpc.MethodDescriptor<com.google.protobuf.EmptyProtos.Empty,
|
||||
io.grpc.testing.integration.Messages.ReconnectInfo> METHOD_STOP =
|
||||
io.grpc.MethodDescriptor.create(
|
||||
io.grpc.MethodDescriptor.MethodType.UNARY,
|
||||
"grpc.testing.ReconnectService", "Stop",
|
||||
io.grpc.protobuf.ProtoUtils.marshaller(com.google.protobuf.EmptyProtos.Empty.parser()),
|
||||
io.grpc.protobuf.ProtoUtils.marshaller(io.grpc.testing.integration.Messages.ReconnectInfo.parser()));
|
||||
|
||||
public static ReconnectServiceStub newStub(io.grpc.Channel channel) {
|
||||
return new ReconnectServiceStub(channel);
|
||||
}
|
||||
|
||||
public static ReconnectServiceBlockingStub newBlockingStub(
|
||||
io.grpc.Channel channel) {
|
||||
return new ReconnectServiceBlockingStub(channel);
|
||||
}
|
||||
|
||||
public static ReconnectServiceFutureStub newFutureStub(
|
||||
io.grpc.Channel channel) {
|
||||
return new ReconnectServiceFutureStub(channel);
|
||||
}
|
||||
|
||||
public static interface ReconnectService {
|
||||
|
||||
public void start(com.google.protobuf.EmptyProtos.Empty request,
|
||||
io.grpc.stub.StreamObserver<com.google.protobuf.EmptyProtos.Empty> responseObserver);
|
||||
|
||||
public void stop(com.google.protobuf.EmptyProtos.Empty request,
|
||||
io.grpc.stub.StreamObserver<io.grpc.testing.integration.Messages.ReconnectInfo> responseObserver);
|
||||
}
|
||||
|
||||
public static interface ReconnectServiceBlockingClient {
|
||||
|
||||
public com.google.protobuf.EmptyProtos.Empty start(com.google.protobuf.EmptyProtos.Empty request);
|
||||
|
||||
public io.grpc.testing.integration.Messages.ReconnectInfo stop(com.google.protobuf.EmptyProtos.Empty request);
|
||||
}
|
||||
|
||||
public static interface ReconnectServiceFutureClient {
|
||||
|
||||
public com.google.common.util.concurrent.ListenableFuture<com.google.protobuf.EmptyProtos.Empty> start(
|
||||
com.google.protobuf.EmptyProtos.Empty request);
|
||||
|
||||
public com.google.common.util.concurrent.ListenableFuture<io.grpc.testing.integration.Messages.ReconnectInfo> stop(
|
||||
com.google.protobuf.EmptyProtos.Empty request);
|
||||
}
|
||||
|
||||
public static class ReconnectServiceStub extends io.grpc.stub.AbstractStub<ReconnectServiceStub>
|
||||
implements ReconnectService {
|
||||
private ReconnectServiceStub(io.grpc.Channel channel) {
|
||||
super(channel);
|
||||
}
|
||||
|
||||
private ReconnectServiceStub(io.grpc.Channel channel,
|
||||
io.grpc.CallOptions callOptions) {
|
||||
super(channel, callOptions);
|
||||
}
|
||||
|
||||
@java.lang.Override
|
||||
protected ReconnectServiceStub build(io.grpc.Channel channel,
|
||||
io.grpc.CallOptions callOptions) {
|
||||
return new ReconnectServiceStub(channel, callOptions);
|
||||
}
|
||||
|
||||
@java.lang.Override
|
||||
public void start(com.google.protobuf.EmptyProtos.Empty request,
|
||||
io.grpc.stub.StreamObserver<com.google.protobuf.EmptyProtos.Empty> responseObserver) {
|
||||
asyncUnaryCall(
|
||||
channel.newCall(METHOD_START, callOptions), request, responseObserver);
|
||||
}
|
||||
|
||||
@java.lang.Override
|
||||
public void stop(com.google.protobuf.EmptyProtos.Empty request,
|
||||
io.grpc.stub.StreamObserver<io.grpc.testing.integration.Messages.ReconnectInfo> responseObserver) {
|
||||
asyncUnaryCall(
|
||||
channel.newCall(METHOD_STOP, callOptions), request, responseObserver);
|
||||
}
|
||||
}
|
||||
|
||||
public static class ReconnectServiceBlockingStub extends io.grpc.stub.AbstractStub<ReconnectServiceBlockingStub>
|
||||
implements ReconnectServiceBlockingClient {
|
||||
private ReconnectServiceBlockingStub(io.grpc.Channel channel) {
|
||||
super(channel);
|
||||
}
|
||||
|
||||
private ReconnectServiceBlockingStub(io.grpc.Channel channel,
|
||||
io.grpc.CallOptions callOptions) {
|
||||
super(channel, callOptions);
|
||||
}
|
||||
|
||||
@java.lang.Override
|
||||
protected ReconnectServiceBlockingStub build(io.grpc.Channel channel,
|
||||
io.grpc.CallOptions callOptions) {
|
||||
return new ReconnectServiceBlockingStub(channel, callOptions);
|
||||
}
|
||||
|
||||
@java.lang.Override
|
||||
public com.google.protobuf.EmptyProtos.Empty start(com.google.protobuf.EmptyProtos.Empty request) {
|
||||
return blockingUnaryCall(
|
||||
channel.newCall(METHOD_START, callOptions), request);
|
||||
}
|
||||
|
||||
@java.lang.Override
|
||||
public io.grpc.testing.integration.Messages.ReconnectInfo stop(com.google.protobuf.EmptyProtos.Empty request) {
|
||||
return blockingUnaryCall(
|
||||
channel.newCall(METHOD_STOP, callOptions), request);
|
||||
}
|
||||
}
|
||||
|
||||
public static class ReconnectServiceFutureStub extends io.grpc.stub.AbstractStub<ReconnectServiceFutureStub>
|
||||
implements ReconnectServiceFutureClient {
|
||||
private ReconnectServiceFutureStub(io.grpc.Channel channel) {
|
||||
super(channel);
|
||||
}
|
||||
|
||||
private ReconnectServiceFutureStub(io.grpc.Channel channel,
|
||||
io.grpc.CallOptions callOptions) {
|
||||
super(channel, callOptions);
|
||||
}
|
||||
|
||||
@java.lang.Override
|
||||
protected ReconnectServiceFutureStub build(io.grpc.Channel channel,
|
||||
io.grpc.CallOptions callOptions) {
|
||||
return new ReconnectServiceFutureStub(channel, callOptions);
|
||||
}
|
||||
|
||||
@java.lang.Override
|
||||
public com.google.common.util.concurrent.ListenableFuture<com.google.protobuf.EmptyProtos.Empty> start(
|
||||
com.google.protobuf.EmptyProtos.Empty request) {
|
||||
return futureUnaryCall(
|
||||
channel.newCall(METHOD_START, callOptions), request);
|
||||
}
|
||||
|
||||
@java.lang.Override
|
||||
public com.google.common.util.concurrent.ListenableFuture<io.grpc.testing.integration.Messages.ReconnectInfo> stop(
|
||||
com.google.protobuf.EmptyProtos.Empty request) {
|
||||
return futureUnaryCall(
|
||||
channel.newCall(METHOD_STOP, callOptions), request);
|
||||
}
|
||||
}
|
||||
|
||||
public static io.grpc.ServerServiceDefinition bindService(
|
||||
final ReconnectService serviceImpl) {
|
||||
return io.grpc.ServerServiceDefinition.builder("grpc.testing.ReconnectService")
|
||||
.addMethod(io.grpc.ServerMethodDefinition.create(
|
||||
METHOD_START,
|
||||
asyncUnaryCall(
|
||||
new io.grpc.stub.ServerCalls.UnaryMethod<
|
||||
com.google.protobuf.EmptyProtos.Empty,
|
||||
com.google.protobuf.EmptyProtos.Empty>() {
|
||||
@java.lang.Override
|
||||
public void invoke(
|
||||
com.google.protobuf.EmptyProtos.Empty request,
|
||||
io.grpc.stub.StreamObserver<com.google.protobuf.EmptyProtos.Empty> responseObserver) {
|
||||
serviceImpl.start(request, responseObserver);
|
||||
}
|
||||
})))
|
||||
.addMethod(io.grpc.ServerMethodDefinition.create(
|
||||
METHOD_STOP,
|
||||
asyncUnaryCall(
|
||||
new io.grpc.stub.ServerCalls.UnaryMethod<
|
||||
com.google.protobuf.EmptyProtos.Empty,
|
||||
io.grpc.testing.integration.Messages.ReconnectInfo>() {
|
||||
@java.lang.Override
|
||||
public void invoke(
|
||||
com.google.protobuf.EmptyProtos.Empty request,
|
||||
io.grpc.stub.StreamObserver<io.grpc.testing.integration.Messages.ReconnectInfo> responseObserver) {
|
||||
serviceImpl.stop(request, responseObserver);
|
||||
}
|
||||
}))).build();
|
||||
}
|
||||
}
|
||||
|
|
@ -6230,6 +6230,565 @@ public final class Messages {
|
|||
|
||||
}
|
||||
|
||||
public interface ReconnectInfoOrBuilder extends
|
||||
// @@protoc_insertion_point(interface_extends:grpc.testing.ReconnectInfo)
|
||||
com.google.protobuf.MessageOrBuilder {
|
||||
|
||||
/**
|
||||
* <code>optional bool passed = 1;</code>
|
||||
*/
|
||||
boolean getPassed();
|
||||
|
||||
/**
|
||||
* <code>repeated int32 backoff_ms = 2;</code>
|
||||
*/
|
||||
java.util.List<java.lang.Integer> getBackoffMsList();
|
||||
/**
|
||||
* <code>repeated int32 backoff_ms = 2;</code>
|
||||
*/
|
||||
int getBackoffMsCount();
|
||||
/**
|
||||
* <code>repeated int32 backoff_ms = 2;</code>
|
||||
*/
|
||||
int getBackoffMs(int index);
|
||||
}
|
||||
/**
|
||||
* Protobuf type {@code grpc.testing.ReconnectInfo}
|
||||
*
|
||||
* <pre>
|
||||
* For reconnect interop test only.
|
||||
* Server tells client whether its reconnects are following the spec and the
|
||||
* reconnect backoffs it saw.
|
||||
* </pre>
|
||||
*/
|
||||
public static final class ReconnectInfo extends
|
||||
com.google.protobuf.GeneratedMessage implements
|
||||
// @@protoc_insertion_point(message_implements:grpc.testing.ReconnectInfo)
|
||||
ReconnectInfoOrBuilder {
|
||||
// Use ReconnectInfo.newBuilder() to construct.
|
||||
private ReconnectInfo(com.google.protobuf.GeneratedMessage.Builder builder) {
|
||||
super(builder);
|
||||
}
|
||||
private ReconnectInfo() {
|
||||
passed_ = false;
|
||||
backoffMs_ = java.util.Collections.emptyList();
|
||||
}
|
||||
|
||||
@java.lang.Override
|
||||
public final com.google.protobuf.UnknownFieldSet
|
||||
getUnknownFields() {
|
||||
return com.google.protobuf.UnknownFieldSet.getDefaultInstance();
|
||||
}
|
||||
private ReconnectInfo(
|
||||
com.google.protobuf.CodedInputStream input,
|
||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
|
||||
this();
|
||||
int mutable_bitField0_ = 0;
|
||||
try {
|
||||
boolean done = false;
|
||||
while (!done) {
|
||||
int tag = input.readTag();
|
||||
switch (tag) {
|
||||
case 0:
|
||||
done = true;
|
||||
break;
|
||||
default: {
|
||||
if (!input.skipField(tag)) {
|
||||
done = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 8: {
|
||||
|
||||
passed_ = input.readBool();
|
||||
break;
|
||||
}
|
||||
case 16: {
|
||||
if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
|
||||
backoffMs_ = new java.util.ArrayList<java.lang.Integer>();
|
||||
mutable_bitField0_ |= 0x00000002;
|
||||
}
|
||||
backoffMs_.add(input.readInt32());
|
||||
break;
|
||||
}
|
||||
case 18: {
|
||||
int length = input.readRawVarint32();
|
||||
int limit = input.pushLimit(length);
|
||||
if (!((mutable_bitField0_ & 0x00000002) == 0x00000002) && input.getBytesUntilLimit() > 0) {
|
||||
backoffMs_ = new java.util.ArrayList<java.lang.Integer>();
|
||||
mutable_bitField0_ |= 0x00000002;
|
||||
}
|
||||
while (input.getBytesUntilLimit() > 0) {
|
||||
backoffMs_.add(input.readInt32());
|
||||
}
|
||||
input.popLimit(limit);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
|
||||
throw new RuntimeException(e.setUnfinishedMessage(this));
|
||||
} catch (java.io.IOException e) {
|
||||
throw new RuntimeException(
|
||||
new com.google.protobuf.InvalidProtocolBufferException(
|
||||
e.getMessage()).setUnfinishedMessage(this));
|
||||
} finally {
|
||||
if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
|
||||
backoffMs_ = java.util.Collections.unmodifiableList(backoffMs_);
|
||||
}
|
||||
makeExtensionsImmutable();
|
||||
}
|
||||
}
|
||||
public static final com.google.protobuf.Descriptors.Descriptor
|
||||
getDescriptor() {
|
||||
return io.grpc.testing.integration.Messages.internal_static_grpc_testing_ReconnectInfo_descriptor;
|
||||
}
|
||||
|
||||
protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
|
||||
internalGetFieldAccessorTable() {
|
||||
return io.grpc.testing.integration.Messages.internal_static_grpc_testing_ReconnectInfo_fieldAccessorTable
|
||||
.ensureFieldAccessorsInitialized(
|
||||
io.grpc.testing.integration.Messages.ReconnectInfo.class, io.grpc.testing.integration.Messages.ReconnectInfo.Builder.class);
|
||||
}
|
||||
|
||||
private int bitField0_;
|
||||
public static final int PASSED_FIELD_NUMBER = 1;
|
||||
private boolean passed_;
|
||||
/**
|
||||
* <code>optional bool passed = 1;</code>
|
||||
*/
|
||||
public boolean getPassed() {
|
||||
return passed_;
|
||||
}
|
||||
|
||||
public static final int BACKOFF_MS_FIELD_NUMBER = 2;
|
||||
private java.util.List<java.lang.Integer> backoffMs_;
|
||||
/**
|
||||
* <code>repeated int32 backoff_ms = 2;</code>
|
||||
*/
|
||||
public java.util.List<java.lang.Integer>
|
||||
getBackoffMsList() {
|
||||
return backoffMs_;
|
||||
}
|
||||
/**
|
||||
* <code>repeated int32 backoff_ms = 2;</code>
|
||||
*/
|
||||
public int getBackoffMsCount() {
|
||||
return backoffMs_.size();
|
||||
}
|
||||
/**
|
||||
* <code>repeated int32 backoff_ms = 2;</code>
|
||||
*/
|
||||
public int getBackoffMs(int index) {
|
||||
return backoffMs_.get(index);
|
||||
}
|
||||
private int backoffMsMemoizedSerializedSize = -1;
|
||||
|
||||
private byte memoizedIsInitialized = -1;
|
||||
public final boolean isInitialized() {
|
||||
byte isInitialized = memoizedIsInitialized;
|
||||
if (isInitialized == 1) return true;
|
||||
if (isInitialized == 0) return false;
|
||||
|
||||
memoizedIsInitialized = 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
public void writeTo(com.google.protobuf.CodedOutputStream output)
|
||||
throws java.io.IOException {
|
||||
getSerializedSize();
|
||||
if (passed_ != false) {
|
||||
output.writeBool(1, passed_);
|
||||
}
|
||||
if (getBackoffMsList().size() > 0) {
|
||||
output.writeRawVarint32(18);
|
||||
output.writeRawVarint32(backoffMsMemoizedSerializedSize);
|
||||
}
|
||||
for (int i = 0; i < backoffMs_.size(); i++) {
|
||||
output.writeInt32NoTag(backoffMs_.get(i));
|
||||
}
|
||||
}
|
||||
|
||||
private int memoizedSerializedSize = -1;
|
||||
public int getSerializedSize() {
|
||||
int size = memoizedSerializedSize;
|
||||
if (size != -1) return size;
|
||||
|
||||
size = 0;
|
||||
if (passed_ != false) {
|
||||
size += com.google.protobuf.CodedOutputStream
|
||||
.computeBoolSize(1, passed_);
|
||||
}
|
||||
{
|
||||
int dataSize = 0;
|
||||
for (int i = 0; i < backoffMs_.size(); i++) {
|
||||
dataSize += com.google.protobuf.CodedOutputStream
|
||||
.computeInt32SizeNoTag(backoffMs_.get(i));
|
||||
}
|
||||
size += dataSize;
|
||||
if (!getBackoffMsList().isEmpty()) {
|
||||
size += 1;
|
||||
size += com.google.protobuf.CodedOutputStream
|
||||
.computeInt32SizeNoTag(dataSize);
|
||||
}
|
||||
backoffMsMemoizedSerializedSize = dataSize;
|
||||
}
|
||||
memoizedSerializedSize = size;
|
||||
return size;
|
||||
}
|
||||
|
||||
private static final long serialVersionUID = 0L;
|
||||
public static io.grpc.testing.integration.Messages.ReconnectInfo parseFrom(
|
||||
com.google.protobuf.ByteString data)
|
||||
throws com.google.protobuf.InvalidProtocolBufferException {
|
||||
return PARSER.parseFrom(data);
|
||||
}
|
||||
public static io.grpc.testing.integration.Messages.ReconnectInfo parseFrom(
|
||||
com.google.protobuf.ByteString data,
|
||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||
throws com.google.protobuf.InvalidProtocolBufferException {
|
||||
return PARSER.parseFrom(data, extensionRegistry);
|
||||
}
|
||||
public static io.grpc.testing.integration.Messages.ReconnectInfo parseFrom(byte[] data)
|
||||
throws com.google.protobuf.InvalidProtocolBufferException {
|
||||
return PARSER.parseFrom(data);
|
||||
}
|
||||
public static io.grpc.testing.integration.Messages.ReconnectInfo parseFrom(
|
||||
byte[] data,
|
||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||
throws com.google.protobuf.InvalidProtocolBufferException {
|
||||
return PARSER.parseFrom(data, extensionRegistry);
|
||||
}
|
||||
public static io.grpc.testing.integration.Messages.ReconnectInfo parseFrom(java.io.InputStream input)
|
||||
throws java.io.IOException {
|
||||
return PARSER.parseFrom(input);
|
||||
}
|
||||
public static io.grpc.testing.integration.Messages.ReconnectInfo parseFrom(
|
||||
java.io.InputStream input,
|
||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||
throws java.io.IOException {
|
||||
return PARSER.parseFrom(input, extensionRegistry);
|
||||
}
|
||||
public static io.grpc.testing.integration.Messages.ReconnectInfo parseDelimitedFrom(java.io.InputStream input)
|
||||
throws java.io.IOException {
|
||||
return PARSER.parseDelimitedFrom(input);
|
||||
}
|
||||
public static io.grpc.testing.integration.Messages.ReconnectInfo parseDelimitedFrom(
|
||||
java.io.InputStream input,
|
||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||
throws java.io.IOException {
|
||||
return PARSER.parseDelimitedFrom(input, extensionRegistry);
|
||||
}
|
||||
public static io.grpc.testing.integration.Messages.ReconnectInfo parseFrom(
|
||||
com.google.protobuf.CodedInputStream input)
|
||||
throws java.io.IOException {
|
||||
return PARSER.parseFrom(input);
|
||||
}
|
||||
public static io.grpc.testing.integration.Messages.ReconnectInfo parseFrom(
|
||||
com.google.protobuf.CodedInputStream input,
|
||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||
throws java.io.IOException {
|
||||
return PARSER.parseFrom(input, extensionRegistry);
|
||||
}
|
||||
|
||||
public Builder newBuilderForType() { return newBuilder(); }
|
||||
public static Builder newBuilder() {
|
||||
return DEFAULT_INSTANCE.toBuilder();
|
||||
}
|
||||
public static Builder newBuilder(io.grpc.testing.integration.Messages.ReconnectInfo prototype) {
|
||||
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
|
||||
}
|
||||
public Builder toBuilder() {
|
||||
return this == DEFAULT_INSTANCE
|
||||
? new Builder() : new Builder().mergeFrom(this);
|
||||
}
|
||||
|
||||
@java.lang.Override
|
||||
protected Builder newBuilderForType(
|
||||
com.google.protobuf.GeneratedMessage.BuilderParent parent) {
|
||||
Builder builder = new Builder(parent);
|
||||
return builder;
|
||||
}
|
||||
/**
|
||||
* Protobuf type {@code grpc.testing.ReconnectInfo}
|
||||
*
|
||||
* <pre>
|
||||
* For reconnect interop test only.
|
||||
* Server tells client whether its reconnects are following the spec and the
|
||||
* reconnect backoffs it saw.
|
||||
* </pre>
|
||||
*/
|
||||
public static final class Builder extends
|
||||
com.google.protobuf.GeneratedMessage.Builder<Builder> implements
|
||||
// @@protoc_insertion_point(builder_implements:grpc.testing.ReconnectInfo)
|
||||
io.grpc.testing.integration.Messages.ReconnectInfoOrBuilder {
|
||||
public static final com.google.protobuf.Descriptors.Descriptor
|
||||
getDescriptor() {
|
||||
return io.grpc.testing.integration.Messages.internal_static_grpc_testing_ReconnectInfo_descriptor;
|
||||
}
|
||||
|
||||
protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
|
||||
internalGetFieldAccessorTable() {
|
||||
return io.grpc.testing.integration.Messages.internal_static_grpc_testing_ReconnectInfo_fieldAccessorTable
|
||||
.ensureFieldAccessorsInitialized(
|
||||
io.grpc.testing.integration.Messages.ReconnectInfo.class, io.grpc.testing.integration.Messages.ReconnectInfo.Builder.class);
|
||||
}
|
||||
|
||||
// Construct using io.grpc.testing.integration.Messages.ReconnectInfo.newBuilder()
|
||||
private Builder() {
|
||||
maybeForceBuilderInitialization();
|
||||
}
|
||||
|
||||
private Builder(
|
||||
com.google.protobuf.GeneratedMessage.BuilderParent parent) {
|
||||
super(parent);
|
||||
maybeForceBuilderInitialization();
|
||||
}
|
||||
private void maybeForceBuilderInitialization() {
|
||||
if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
|
||||
}
|
||||
}
|
||||
public Builder clear() {
|
||||
super.clear();
|
||||
passed_ = false;
|
||||
|
||||
backoffMs_ = java.util.Collections.emptyList();
|
||||
bitField0_ = (bitField0_ & ~0x00000002);
|
||||
return this;
|
||||
}
|
||||
|
||||
public com.google.protobuf.Descriptors.Descriptor
|
||||
getDescriptorForType() {
|
||||
return io.grpc.testing.integration.Messages.internal_static_grpc_testing_ReconnectInfo_descriptor;
|
||||
}
|
||||
|
||||
public io.grpc.testing.integration.Messages.ReconnectInfo getDefaultInstanceForType() {
|
||||
return io.grpc.testing.integration.Messages.ReconnectInfo.getDefaultInstance();
|
||||
}
|
||||
|
||||
public io.grpc.testing.integration.Messages.ReconnectInfo build() {
|
||||
io.grpc.testing.integration.Messages.ReconnectInfo result = buildPartial();
|
||||
if (!result.isInitialized()) {
|
||||
throw newUninitializedMessageException(result);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public io.grpc.testing.integration.Messages.ReconnectInfo buildPartial() {
|
||||
io.grpc.testing.integration.Messages.ReconnectInfo result = new io.grpc.testing.integration.Messages.ReconnectInfo(this);
|
||||
int from_bitField0_ = bitField0_;
|
||||
int to_bitField0_ = 0;
|
||||
result.passed_ = passed_;
|
||||
if (((bitField0_ & 0x00000002) == 0x00000002)) {
|
||||
backoffMs_ = java.util.Collections.unmodifiableList(backoffMs_);
|
||||
bitField0_ = (bitField0_ & ~0x00000002);
|
||||
}
|
||||
result.backoffMs_ = backoffMs_;
|
||||
result.bitField0_ = to_bitField0_;
|
||||
onBuilt();
|
||||
return result;
|
||||
}
|
||||
|
||||
public Builder mergeFrom(com.google.protobuf.Message other) {
|
||||
if (other instanceof io.grpc.testing.integration.Messages.ReconnectInfo) {
|
||||
return mergeFrom((io.grpc.testing.integration.Messages.ReconnectInfo)other);
|
||||
} else {
|
||||
super.mergeFrom(other);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
public Builder mergeFrom(io.grpc.testing.integration.Messages.ReconnectInfo other) {
|
||||
if (other == io.grpc.testing.integration.Messages.ReconnectInfo.getDefaultInstance()) return this;
|
||||
if (other.getPassed() != false) {
|
||||
setPassed(other.getPassed());
|
||||
}
|
||||
if (!other.backoffMs_.isEmpty()) {
|
||||
if (backoffMs_.isEmpty()) {
|
||||
backoffMs_ = other.backoffMs_;
|
||||
bitField0_ = (bitField0_ & ~0x00000002);
|
||||
} else {
|
||||
ensureBackoffMsIsMutable();
|
||||
backoffMs_.addAll(other.backoffMs_);
|
||||
}
|
||||
onChanged();
|
||||
}
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
|
||||
public final boolean isInitialized() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public Builder mergeFrom(
|
||||
com.google.protobuf.CodedInputStream input,
|
||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||
throws java.io.IOException {
|
||||
io.grpc.testing.integration.Messages.ReconnectInfo parsedMessage = null;
|
||||
try {
|
||||
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
|
||||
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
|
||||
parsedMessage = (io.grpc.testing.integration.Messages.ReconnectInfo) e.getUnfinishedMessage();
|
||||
throw e;
|
||||
} finally {
|
||||
if (parsedMessage != null) {
|
||||
mergeFrom(parsedMessage);
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
private int bitField0_;
|
||||
|
||||
private boolean passed_ ;
|
||||
/**
|
||||
* <code>optional bool passed = 1;</code>
|
||||
*/
|
||||
public boolean getPassed() {
|
||||
return passed_;
|
||||
}
|
||||
/**
|
||||
* <code>optional bool passed = 1;</code>
|
||||
*/
|
||||
public Builder setPassed(boolean value) {
|
||||
|
||||
passed_ = value;
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* <code>optional bool passed = 1;</code>
|
||||
*/
|
||||
public Builder clearPassed() {
|
||||
|
||||
passed_ = false;
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
|
||||
private java.util.List<java.lang.Integer> backoffMs_ = java.util.Collections.emptyList();
|
||||
private void ensureBackoffMsIsMutable() {
|
||||
if (!((bitField0_ & 0x00000002) == 0x00000002)) {
|
||||
backoffMs_ = new java.util.ArrayList<java.lang.Integer>(backoffMs_);
|
||||
bitField0_ |= 0x00000002;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* <code>repeated int32 backoff_ms = 2;</code>
|
||||
*/
|
||||
public java.util.List<java.lang.Integer>
|
||||
getBackoffMsList() {
|
||||
return java.util.Collections.unmodifiableList(backoffMs_);
|
||||
}
|
||||
/**
|
||||
* <code>repeated int32 backoff_ms = 2;</code>
|
||||
*/
|
||||
public int getBackoffMsCount() {
|
||||
return backoffMs_.size();
|
||||
}
|
||||
/**
|
||||
* <code>repeated int32 backoff_ms = 2;</code>
|
||||
*/
|
||||
public int getBackoffMs(int index) {
|
||||
return backoffMs_.get(index);
|
||||
}
|
||||
/**
|
||||
* <code>repeated int32 backoff_ms = 2;</code>
|
||||
*/
|
||||
public Builder setBackoffMs(
|
||||
int index, int value) {
|
||||
ensureBackoffMsIsMutable();
|
||||
backoffMs_.set(index, value);
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* <code>repeated int32 backoff_ms = 2;</code>
|
||||
*/
|
||||
public Builder addBackoffMs(int value) {
|
||||
ensureBackoffMsIsMutable();
|
||||
backoffMs_.add(value);
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* <code>repeated int32 backoff_ms = 2;</code>
|
||||
*/
|
||||
public Builder addAllBackoffMs(
|
||||
java.lang.Iterable<? extends java.lang.Integer> values) {
|
||||
ensureBackoffMsIsMutable();
|
||||
com.google.protobuf.AbstractMessageLite.Builder.addAll(
|
||||
values, backoffMs_);
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* <code>repeated int32 backoff_ms = 2;</code>
|
||||
*/
|
||||
public Builder clearBackoffMs() {
|
||||
backoffMs_ = java.util.Collections.emptyList();
|
||||
bitField0_ = (bitField0_ & ~0x00000002);
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
public final Builder setUnknownFields(
|
||||
final com.google.protobuf.UnknownFieldSet unknownFields) {
|
||||
return this;
|
||||
}
|
||||
|
||||
public final Builder mergeUnknownFields(
|
||||
final com.google.protobuf.UnknownFieldSet unknownFields) {
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
// @@protoc_insertion_point(builder_scope:grpc.testing.ReconnectInfo)
|
||||
}
|
||||
|
||||
// @@protoc_insertion_point(class_scope:grpc.testing.ReconnectInfo)
|
||||
private static final io.grpc.testing.integration.Messages.ReconnectInfo DEFAULT_INSTANCE;
|
||||
static {
|
||||
DEFAULT_INSTANCE = new io.grpc.testing.integration.Messages.ReconnectInfo();
|
||||
}
|
||||
|
||||
public static io.grpc.testing.integration.Messages.ReconnectInfo getDefaultInstance() {
|
||||
return DEFAULT_INSTANCE;
|
||||
}
|
||||
|
||||
public static final com.google.protobuf.Parser<ReconnectInfo> PARSER =
|
||||
new com.google.protobuf.AbstractParser<ReconnectInfo>() {
|
||||
public ReconnectInfo parsePartialFrom(
|
||||
com.google.protobuf.CodedInputStream input,
|
||||
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
|
||||
throws com.google.protobuf.InvalidProtocolBufferException {
|
||||
try {
|
||||
return new ReconnectInfo(input, extensionRegistry);
|
||||
} catch (RuntimeException e) {
|
||||
if (e.getCause() instanceof
|
||||
com.google.protobuf.InvalidProtocolBufferException) {
|
||||
throw (com.google.protobuf.InvalidProtocolBufferException)
|
||||
e.getCause();
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public static com.google.protobuf.Parser<ReconnectInfo> parser() {
|
||||
return PARSER;
|
||||
}
|
||||
|
||||
@java.lang.Override
|
||||
public com.google.protobuf.Parser<ReconnectInfo> getParserForType() {
|
||||
return PARSER;
|
||||
}
|
||||
|
||||
public io.grpc.testing.integration.Messages.ReconnectInfo getDefaultInstanceForType() {
|
||||
return DEFAULT_INSTANCE;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static com.google.protobuf.Descriptors.Descriptor
|
||||
internal_static_grpc_testing_Payload_descriptor;
|
||||
private static
|
||||
|
|
@ -6275,6 +6834,11 @@ public final class Messages {
|
|||
private static
|
||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable
|
||||
internal_static_grpc_testing_StreamingOutputCallResponse_fieldAccessorTable;
|
||||
private static com.google.protobuf.Descriptors.Descriptor
|
||||
internal_static_grpc_testing_ReconnectInfo_descriptor;
|
||||
private static
|
||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable
|
||||
internal_static_grpc_testing_ReconnectInfo_fieldAccessorTable;
|
||||
|
||||
public static com.google.protobuf.Descriptors.FileDescriptor
|
||||
getDescriptor() {
|
||||
|
|
@ -6305,10 +6869,11 @@ public final class Messages {
|
|||
"meters\030\002 \003(\0132 .grpc.testing.ResponsePara" +
|
||||
"meters\022&\n\007payload\030\003 \001(\0132\025.grpc.testing.P",
|
||||
"ayload\"E\n\033StreamingOutputCallResponse\022&\n" +
|
||||
"\007payload\030\001 \001(\0132\025.grpc.testing.Payload*?\n" +
|
||||
"\013PayloadType\022\020\n\014COMPRESSABLE\020\000\022\022\n\016UNCOMP" +
|
||||
"RESSABLE\020\001\022\n\n\006RANDOM\020\002B\035\n\033io.grpc.testin" +
|
||||
"g.integrationb\006proto3"
|
||||
"\007payload\030\001 \001(\0132\025.grpc.testing.Payload\"3\n" +
|
||||
"\rReconnectInfo\022\016\n\006passed\030\001 \001(\010\022\022\n\nbackof" +
|
||||
"f_ms\030\002 \003(\005*?\n\013PayloadType\022\020\n\014COMPRESSABL" +
|
||||
"E\020\000\022\022\n\016UNCOMPRESSABLE\020\001\022\n\n\006RANDOM\020\002B\035\n\033i" +
|
||||
"o.grpc.testing.integrationb\006proto3"
|
||||
};
|
||||
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
|
||||
new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() {
|
||||
|
|
@ -6376,6 +6941,12 @@ public final class Messages {
|
|||
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
||||
internal_static_grpc_testing_StreamingOutputCallResponse_descriptor,
|
||||
new java.lang.String[] { "Payload", });
|
||||
internal_static_grpc_testing_ReconnectInfo_descriptor =
|
||||
getDescriptor().getMessageTypes().get(9);
|
||||
internal_static_grpc_testing_ReconnectInfo_fieldAccessorTable = new
|
||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
||||
internal_static_grpc_testing_ReconnectInfo_descriptor,
|
||||
new java.lang.String[] { "Passed", "BackoffMs", });
|
||||
}
|
||||
|
||||
// @@protoc_insertion_point(outer_class_scope)
|
||||
|
|
|
|||
|
|
@ -34,8 +34,12 @@ public final class Test {
|
|||
").grpc.testing.StreamingOutputCallRespon" +
|
||||
"se(\0010\001\022i\n\016HalfDuplexCall\022(.grpc.testing." +
|
||||
"StreamingOutputCallRequest\032).grpc.testin" +
|
||||
"g.StreamingOutputCallResponse(\0010\001B\035\n\033io." +
|
||||
"grpc.testing.integrationb\006proto3"
|
||||
"g.StreamingOutputCallResponse(\0010\0012\177\n\020Rec" +
|
||||
"onnectService\0221\n\005Start\022\023.grpc.testing.Em" +
|
||||
"pty\032\023.grpc.testing.Empty\0228\n\004Stop\022\023.grpc.",
|
||||
"testing.Empty\032\033.grpc.testing.ReconnectIn" +
|
||||
"foB\035\n\033io.grpc.testing.integrationb\006proto" +
|
||||
"3"
|
||||
};
|
||||
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
|
||||
new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,132 @@
|
|||
/*
|
||||
* Copyright 2015, Google Inc. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* * Neither the name of Google Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package io.grpc.testing.integration;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import com.google.protobuf.EmptyProtos.Empty;
|
||||
|
||||
import io.grpc.ChannelImpl;
|
||||
import io.grpc.StatusRuntimeException;
|
||||
import io.grpc.netty.NegotiationType;
|
||||
import io.grpc.netty.NettyChannelBuilder;
|
||||
import io.grpc.okhttp.OkHttpChannelBuilder;
|
||||
import io.grpc.testing.integration.Messages.ReconnectInfo;
|
||||
|
||||
/**
|
||||
* Verifies the client is reconnecting the server with correct backoffs
|
||||
*
|
||||
* <p>See the <a href="https://github.com/grpc/grpc/blob/master/doc/connection-backoff-interop-test-description.md">Test Spec</a>.
|
||||
*/
|
||||
public class ReconnectTestClient {
|
||||
private static final int TEST_TIME_MS = 540 * 1000;
|
||||
|
||||
private int serverControlPort = 8080;
|
||||
private int serverRetryPort = 8081;
|
||||
private boolean useOkhttp = false;
|
||||
private ChannelImpl controlChannel;
|
||||
private ChannelImpl retryChannel;
|
||||
private ReconnectServiceGrpc.ReconnectServiceBlockingStub controlStub;
|
||||
private ReconnectServiceGrpc.ReconnectServiceBlockingStub retryStub;
|
||||
|
||||
private void parseArgs(String[] args) {
|
||||
for (String arg : args) {
|
||||
if (!arg.startsWith("--")) {
|
||||
System.err.println("All arguments must start with '--': " + arg);
|
||||
System.exit(1);
|
||||
}
|
||||
String[] parts = arg.substring(2).split("=", 2);
|
||||
String key = parts[0];
|
||||
String value = parts[1];
|
||||
if ("server_control_port".equals(key)) {
|
||||
serverControlPort = Integer.parseInt(value);
|
||||
} else if ("server_retry_port".equals(key)) {
|
||||
serverRetryPort = Integer.parseInt(value);
|
||||
} else if ("use_okhttp".equals(key)) {
|
||||
useOkhttp = Boolean.parseBoolean(value);
|
||||
} else {
|
||||
System.err.println("Unknown argument: " + key);
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void runTest() throws Exception {
|
||||
try {
|
||||
controlChannel = NettyChannelBuilder.forAddress("127.0.0.1", serverControlPort)
|
||||
.negotiationType(NegotiationType.PLAINTEXT).build();
|
||||
controlStub = ReconnectServiceGrpc.newBlockingStub(controlChannel);
|
||||
if (useOkhttp) {
|
||||
retryChannel = OkHttpChannelBuilder.forAddress("127.0.0.1", serverRetryPort)
|
||||
.negotiationType(io.grpc.okhttp.NegotiationType.TLS).build();
|
||||
} else {
|
||||
retryChannel = NettyChannelBuilder.forAddress("127.0.0.1", serverRetryPort)
|
||||
.negotiationType(NegotiationType.TLS).build();
|
||||
}
|
||||
retryStub = ReconnectServiceGrpc.newBlockingStub(retryChannel);
|
||||
controlStub.start(Empty.getDefaultInstance());
|
||||
|
||||
long startTimeStamp = System.currentTimeMillis();
|
||||
while ((System.currentTimeMillis() - startTimeStamp) < TEST_TIME_MS) {
|
||||
try {
|
||||
retryStub.start(Empty.getDefaultInstance());
|
||||
} catch (StatusRuntimeException expected) {
|
||||
// Make CheckStyle happy.
|
||||
}
|
||||
Thread.sleep(50);
|
||||
}
|
||||
ReconnectInfo info = controlStub.stop(Empty.getDefaultInstance());
|
||||
assertTrue(info.getPassed());
|
||||
} finally {
|
||||
controlChannel.shutdownNow();
|
||||
retryChannel.shutdownNow();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The main application allowing this client to be launched from the command line.
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
ReconnectTestClient client = new ReconnectTestClient();
|
||||
client.parseArgs(args);
|
||||
System.out.println("Starting test:");
|
||||
try {
|
||||
client.runTest();
|
||||
System.out.println("Finished successfully");
|
||||
System.exit(0);
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
System.err.println("Test failed!");
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -136,3 +136,11 @@ message StreamingOutputCallResponse {
|
|||
// Payload to increase response size.
|
||||
Payload payload = 1;
|
||||
}
|
||||
|
||||
// For reconnect interop test only.
|
||||
// Server tells client whether its reconnects are following the spec and the
|
||||
// reconnect backoffs it saw.
|
||||
message ReconnectInfo {
|
||||
bool passed = 1;
|
||||
repeated int32 backoff_ms = 2;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -71,3 +71,9 @@ service TestService {
|
|||
rpc HalfDuplexCall(stream StreamingOutputCallRequest)
|
||||
returns (stream StreamingOutputCallResponse);
|
||||
}
|
||||
|
||||
// A service used to control reconnect server.
|
||||
service ReconnectService {
|
||||
rpc Start(grpc.testing.Empty) returns (grpc.testing.Empty);
|
||||
rpc Stop(grpc.testing.Empty) returns (grpc.testing.ReconnectInfo);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue