Status { public Status withCause(Throwable cause) { if (Objects.equal(this.cause, cause)) { return this; } return new Status(this.code, this.description, cause); } private  Status(Code code); private  Status(Code code, @Nullable String description, @Nullable Throwable cause); static Status fromCodeValue(int codeValue); static Status fromThrowable(Throwable t); Status withCause(Throwable cause); Status withDescription(String description); Status augmentDescription(String additionalDetail); Code getCode(); @Nullable String getDescription(); @Nullable Throwable getCause(); boolean isOk(); StatusRuntimeException asRuntimeException(); StatusException asException(); @Override String toString(); @Override boolean equals(Object obj); @Override int hashCode(); static final Status OK; static final Status CANCELLED; static final Status UNKNOWN; static final Status INVALID_ARGUMENT; static final Status DEADLINE_EXCEEDED; static final Status NOT_FOUND; static final Status ALREADY_EXISTS; static final Status PERMISSION_DENIED; static final Status UNAUTHENTICATED; static final Status RESOURCE_EXHAUSTED; static final Status FAILED_PRECONDITION; static final Status ABORTED; static final Status OUT_OF_RANGE; static final Status UNIMPLEMENTED; static final Status INTERNAL; static final Status UNAVAILABLE; static final Status DATA_LOSS; @Internal
  static final Metadata.Key<Status> CODE_KEY; @Internal
  static final Metadata.Key<String> MESSAGE_KEY; }
@Test public void sameCauseReturnsSelf() { assertSame(Status.CANCELLED, Status.CANCELLED.withCause(null)); }