diff --git a/core/src/main/java/io/grpc/MethodDescriptor.java b/core/src/main/java/io/grpc/MethodDescriptor.java index e64661c867..2f679681e8 100644 --- a/core/src/main/java/io/grpc/MethodDescriptor.java +++ b/core/src/main/java/io/grpc/MethodDescriptor.java @@ -53,6 +53,7 @@ public class MethodDescriptor { private final String fullMethodName; private final Marshaller requestMarshaller; private final Marshaller responseMarshaller; + private final boolean idempotent; /** * The call type of a method. @@ -148,16 +149,18 @@ public class MethodDescriptor { Marshaller requestMarshaller, Marshaller responseMarshaller) { return new MethodDescriptor( - type, fullMethodName, requestMarshaller, responseMarshaller); + type, fullMethodName, requestMarshaller, responseMarshaller, false); } private MethodDescriptor(MethodType type, String fullMethodName, Marshaller requestMarshaller, - Marshaller responseMarshaller) { + Marshaller responseMarshaller, + boolean idempotent) { this.type = Preconditions.checkNotNull(type, "type"); this.fullMethodName = Preconditions.checkNotNull(fullMethodName, "fullMethodName"); this.requestMarshaller = Preconditions.checkNotNull(requestMarshaller, "requestMarshaller"); this.responseMarshaller = Preconditions.checkNotNull(responseMarshaller, "responseMarshaller"); + this.idempotent = idempotent; } /** @@ -214,6 +217,26 @@ public class MethodDescriptor { return responseMarshaller.stream(response); } + /** + * Returns whether this method is idempotent. + */ + @ExperimentalApi + public boolean isIdempotent() { + return idempotent; + } + + /** + * Set idempotency on this method. + * + * @param idempotent the idempotency of this method. + * @return a new copy of MethodDescriptor. + */ + @ExperimentalApi + public MethodDescriptor withIdempotent(boolean idempotent) { + return new MethodDescriptor(type, fullMethodName, requestMarshaller, + responseMarshaller, idempotent); + } + /** * Generate the fully qualified method name. * diff --git a/core/src/test/java/io/grpc/MethodDescriptorTest.java b/core/src/test/java/io/grpc/MethodDescriptorTest.java new file mode 100644 index 0000000000..bf10012524 --- /dev/null +++ b/core/src/test/java/io/grpc/MethodDescriptorTest.java @@ -0,0 +1,75 @@ +/* + * Copyright 2016, 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; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import io.grpc.MethodDescriptor; +import io.grpc.MethodDescriptor.MethodType; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** + * Tests for {@link MethodDescriptor}. + */ +@RunWith(JUnit4.class) +public class MethodDescriptorTest { + @Test + public void createMethodDescriptor() { + MethodDescriptor descriptor = MethodDescriptor.create( + MethodType.CLIENT_STREAMING, "/package.service/method", new StringMarshaller(), + new StringMarshaller()); + assertEquals(MethodType.CLIENT_STREAMING, descriptor.getType()); + assertEquals("/package.service/method", descriptor.getFullMethodName()); + assertFalse(descriptor.isIdempotent()); + } + + @Test + public void idempotent() { + MethodDescriptor descriptor = MethodDescriptor.create( + MethodType.SERVER_STREAMING, "/package.service/method", new StringMarshaller(), + new StringMarshaller()); + assertFalse(descriptor.isIdempotent()); + + // Create a new desriptor by setting idempotent to true + MethodDescriptor newDescriptor = descriptor.withIdempotent(true); + assertTrue(newDescriptor.isIdempotent()); + // All other fields should staty the same + assertEquals(MethodType.SERVER_STREAMING, newDescriptor.getType()); + assertEquals("/package.service/method", newDescriptor.getFullMethodName()); + } +} +