core: use RESOURCE_EXHAUSTED for max message size failures

diff --git a/core/src/main/java/io/grpc/internal/AbstractClientStream.java b/core/src/main/java/io/grpc/internal/AbstractClientStream.java
index 7df1ac4..4ea3467 100644
--- a/core/src/main/java/io/grpc/internal/AbstractClientStream.java
+++ b/core/src/main/java/io/grpc/internal/AbstractClientStream.java
@@ -172,7 +172,7 @@
 
   @Override
   protected final void deframeFailed(Throwable cause) {
-    cancel(Status.INTERNAL.withDescription("Exception deframing message").withCause(cause));
+    cancel(Status.fromThrowable(cause));
   }
 
   /**
diff --git a/core/src/main/java/io/grpc/internal/MessageDeframer.java b/core/src/main/java/io/grpc/internal/MessageDeframer.java
index feb41f3..47b25aa 100644
--- a/core/src/main/java/io/grpc/internal/MessageDeframer.java
+++ b/core/src/main/java/io/grpc/internal/MessageDeframer.java
@@ -344,8 +344,10 @@
     // Update the required length to include the length of the frame.
     requiredLength = nextFrame.readInt();
     if (requiredLength < 0 || requiredLength > maxInboundMessageSize) {
-      throw Status.INTERNAL.withDescription(String.format("%s: Frame size %d exceeds maximum: %d. ",
-              debugString, requiredLength, maxInboundMessageSize)).asRuntimeException();
+      throw Status.RESOURCE_EXHAUSTED.withDescription(
+          String.format("%s: Frame size %d exceeds maximum: %d. ",
+              debugString, requiredLength, maxInboundMessageSize))
+          .asRuntimeException();
     }
 
     statsTraceCtx.inboundMessage();
@@ -469,7 +471,7 @@
 
     private void verifySize() {
       if (count > maxMessageSize) {
-        throw Status.INTERNAL.withDescription(String.format(
+        throw Status.RESOURCE_EXHAUSTED.withDescription(String.format(
                 "%s: Compressed frame exceeds maximum frame size: %d. Bytes read: %d. ",
                 debugString, maxMessageSize, count)).asRuntimeException();
       }
diff --git a/core/src/main/java/io/grpc/internal/MessageFramer.java b/core/src/main/java/io/grpc/internal/MessageFramer.java
index 9553ba6..fe5deb4 100644
--- a/core/src/main/java/io/grpc/internal/MessageFramer.java
+++ b/core/src/main/java/io/grpc/internal/MessageFramer.java
@@ -169,7 +169,7 @@
     BufferChainOutputStream bufferChain = new BufferChainOutputStream();
     int written = writeToOutputStream(message, bufferChain);
     if (maxOutboundMessageSize >= 0 && written > maxOutboundMessageSize) {
-      throw Status.INTERNAL
+      throw Status.RESOURCE_EXHAUSTED
           .withDescription(
               String.format("message too large %d > %d", written , maxOutboundMessageSize))
           .asRuntimeException();
@@ -189,7 +189,7 @@
       compressingStream.close();
     }
     if (maxOutboundMessageSize >= 0 && written > maxOutboundMessageSize) {
-      throw Status.CANCELLED
+      throw Status.RESOURCE_EXHAUSTED
           .withDescription(
               String.format("message too large %d > %d", written , maxOutboundMessageSize))
           .asRuntimeException();
@@ -212,7 +212,7 @@
   private int writeKnownLengthUncompressed(InputStream message, int messageLength)
       throws IOException {
     if (maxOutboundMessageSize >= 0 && messageLength > maxOutboundMessageSize) {
-      throw Status.CANCELLED
+      throw Status.RESOURCE_EXHAUSTED
           .withDescription(
               String.format("message too large %d > %d", messageLength , maxOutboundMessageSize))
           .asRuntimeException();
diff --git a/core/src/test/java/io/grpc/internal/AbstractClientStreamTest.java b/core/src/test/java/io/grpc/internal/AbstractClientStreamTest.java
index 029017e..0e012ee 100644
--- a/core/src/test/java/io/grpc/internal/AbstractClientStreamTest.java
+++ b/core/src/test/java/io/grpc/internal/AbstractClientStreamTest.java
@@ -155,7 +155,7 @@
     stream.deframeFailed(new RuntimeException("something bad"));
 
     verify(mockListener).closed(statusCaptor.capture(), isA(Metadata.class));
-    assertEquals(Code.INTERNAL, statusCaptor.getValue().getCode());
+    assertEquals(Code.UNKNOWN, statusCaptor.getValue().getCode());
   }
 
   @Test
diff --git a/core/src/test/java/io/grpc/internal/MessageDeframerTest.java b/core/src/test/java/io/grpc/internal/MessageDeframerTest.java
index 5dfc075..094f53e 100644
--- a/core/src/test/java/io/grpc/internal/MessageDeframerTest.java
+++ b/core/src/test/java/io/grpc/internal/MessageDeframerTest.java
@@ -269,7 +269,7 @@
 
     try {
       thrown.expect(StatusRuntimeException.class);
-      thrown.expectMessage("INTERNAL: test: Compressed frame exceeds");
+      thrown.expectMessage("RESOURCE_EXHAUSTED: test: Compressed frame exceeds");
 
       while (stream.read() != -1) {}
     } finally {
@@ -316,7 +316,7 @@
 
     try {
       thrown.expect(StatusRuntimeException.class);
-      thrown.expectMessage("INTERNAL: test: Compressed frame exceeds");
+      thrown.expectMessage("RESOURCE_EXHAUSTED: test: Compressed frame exceeds");
 
       stream.read(buf, 0, buf.length);
     } finally {
@@ -361,7 +361,7 @@
 
     try {
       thrown.expect(StatusRuntimeException.class);
-      thrown.expectMessage("INTERNAL: test: Compressed frame exceeds");
+      thrown.expectMessage("RESOURCE_EXHAUSTED: test: Compressed frame exceeds");
 
       stream.skip(4);
     } finally {
diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java b/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java
index 2cb880a..c6db6cf 100644
--- a/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java
+++ b/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java
@@ -906,7 +906,7 @@
       fail();
     } catch (StatusRuntimeException ex) {
       Status s = ex.getStatus();
-      assertThat(s.getCode()).named(s.toString()).isEqualTo(Status.Code.INTERNAL);
+      assertThat(s.getCode()).named(s.toString()).isEqualTo(Status.Code.RESOURCE_EXHAUSTED);
       assertThat(Throwables.getStackTraceAsString(ex)).contains("exceeds maximum");
     }
   }
diff --git a/netty/src/test/java/io/grpc/netty/NettyClientTransportTest.java b/netty/src/test/java/io/grpc/netty/NettyClientTransportTest.java
index 0810190..9c4aa08 100644
--- a/netty/src/test/java/io/grpc/netty/NettyClientTransportTest.java
+++ b/netty/src/test/java/io/grpc/netty/NettyClientTransportTest.java
@@ -32,7 +32,6 @@
 package io.grpc.netty;
 
 import static com.google.common.base.Charsets.UTF_8;
-import static io.grpc.Status.Code.INTERNAL;
 import static io.grpc.internal.GrpcUtil.DEFAULT_MAX_MESSAGE_SIZE;
 import static io.grpc.internal.GrpcUtil.DEFAULT_SERVER_KEEPALIVE_TIMEOUT_NANOS;
 import static io.grpc.internal.GrpcUtil.DEFAULT_SERVER_KEEPALIVE_TIME_NANOS;
@@ -58,6 +57,7 @@
 import io.grpc.MethodDescriptor.Marshaller;
 import io.grpc.ServerStreamTracer;
 import io.grpc.Status;
+import io.grpc.Status.Code;
 import io.grpc.StatusException;
 import io.grpc.internal.ClientStream;
 import io.grpc.internal.ClientStreamListener;
@@ -213,7 +213,7 @@
       fail("Expected the stream to fail.");
     } catch (ExecutionException e) {
       Status status = Status.fromThrowable(e);
-      assertEquals(INTERNAL, status.getCode());
+      assertEquals(Code.RESOURCE_EXHAUSTED, status.getCode());
       assertTrue("Missing exceeds maximum from: " + status.getDescription(),
           status.getDescription().contains("exceeds maximum"));
     }
diff --git a/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java b/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java
index 70939b1..4b0db01 100644
--- a/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java
+++ b/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java
@@ -33,7 +33,6 @@
 
 import static com.google.common.base.Charsets.UTF_8;
 import static com.google.common.truth.Truth.assertThat;
-import static io.grpc.Status.Code.INTERNAL;
 import static io.grpc.internal.GrpcUtil.DEFAULT_MAX_MESSAGE_SIZE;
 import static io.grpc.okhttp.Headers.CONTENT_TYPE_HEADER;
 import static io.grpc.okhttp.Headers.METHOD_HEADER;
@@ -218,7 +217,7 @@
     frameHandler().data(false, 3, buffer, (int) buffer.size());
 
     listener.waitUntilStreamClosed();
-    assertEquals(INTERNAL, listener.status.getCode());
+    assertEquals(Code.RESOURCE_EXHAUSTED, listener.status.getCode());
     shutdownAndVerify();
   }