From 7847beac783e844e162f3c5557b9359aa74d31eb Mon Sep 17 00:00:00 2001 From: Marco Ziccardi Date: Wed, 20 Apr 2016 13:24:35 +0200 Subject: [PATCH 1/3] Chain cause exception to service exception in translateAndThrow --- .../cloud/bigquery/BigQueryException.java | 9 +- .../cloud/bigquery/BigQueryExceptionTest.java | 18 +++- .../cloud/datastore/DatastoreException.java | 10 +-- .../datastore/DatastoreExceptionTest.java | 19 +++- .../com/google/cloud/dns/DnsException.java | 6 +- .../google/cloud/dns/DnsExceptionTest.java | 86 +++++++++++++++++++ .../ResourceManagerException.java | 8 +- .../ResourceManagerExceptionTest.java | 18 +++- .../cloud/storage/StorageException.java | 8 +- .../cloud/storage/StorageExceptionTest.java | 18 +++- 10 files changed, 181 insertions(+), 19 deletions(-) create mode 100644 gcloud-java-dns/src/test/java/com/google/cloud/dns/DnsExceptionTest.java diff --git a/gcloud-java-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryException.java b/gcloud-java-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryException.java index 7f314a01b088..3445d2fc1c89 100644 --- a/gcloud-java-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryException.java +++ b/gcloud-java-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryException.java @@ -44,7 +44,12 @@ public class BigQueryException extends BaseServiceException { private final BigQueryError error; public BigQueryException(int code, String message) { - this(code, message, null); + this(code, message, (Throwable) null); + } + + private BigQueryException(int code, String message, Throwable cause) { + super(code, message, null, true, cause); + this.error = null; } public BigQueryException(int code, String message, BigQueryError error) { @@ -100,6 +105,6 @@ public int hashCode() { */ static BaseServiceException translateAndThrow(RetryHelperException ex) { BaseServiceException.translateAndPropagateIfPossible(ex); - throw new BigQueryException(UNKNOWN_CODE, ex.getMessage()); + throw new BigQueryException(UNKNOWN_CODE, ex.getMessage(), ex.getCause()); } } diff --git a/gcloud-java-bigquery/src/test/java/com/google/cloud/bigquery/BigQueryExceptionTest.java b/gcloud-java-bigquery/src/test/java/com/google/cloud/bigquery/BigQueryExceptionTest.java index b0a32cd7f0c7..c352124fbc93 100644 --- a/gcloud-java-bigquery/src/test/java/com/google/cloud/bigquery/BigQueryExceptionTest.java +++ b/gcloud-java-bigquery/src/test/java/com/google/cloud/bigquery/BigQueryExceptionTest.java @@ -97,7 +97,7 @@ public void testBigqueryException() { @Test public void testTranslateAndThrow() throws Exception { - BigQueryException cause = new BigQueryException(503, "message"); + Exception cause = new BigQueryException(503, "message"); RetryHelperException exceptionMock = createMock(RetryHelperException.class); expect(exceptionMock.getCause()).andReturn(cause).times(2); replay(exceptionMock); @@ -111,5 +111,21 @@ public void testTranslateAndThrow() throws Exception { } finally { verify(exceptionMock); } + cause = new IllegalArgumentException("message"); + exceptionMock = createMock(RetryHelperException.class); + expect(exceptionMock.getMessage()).andReturn("message").times(1); + expect(exceptionMock.getCause()).andReturn(cause).times(2); + replay(exceptionMock); + try { + BigQueryException.translateAndThrow(exceptionMock); + } catch (BaseServiceException ex) { + assertEquals(BigQueryException.UNKNOWN_CODE, ex.code()); + assertEquals("message", ex.getMessage()); + assertFalse(ex.retryable()); + assertTrue(ex.idempotent()); + assertEquals(cause, ex.getCause()); + } finally { + verify(exceptionMock); + } } } diff --git a/gcloud-java-datastore/src/main/java/com/google/cloud/datastore/DatastoreException.java b/gcloud-java-datastore/src/main/java/com/google/cloud/datastore/DatastoreException.java index 419cffc7bf3e..c502172c046f 100644 --- a/gcloud-java-datastore/src/main/java/com/google/cloud/datastore/DatastoreException.java +++ b/gcloud-java-datastore/src/main/java/com/google/cloud/datastore/DatastoreException.java @@ -37,12 +37,12 @@ public class DatastoreException extends BaseServiceException { new Error(10, "ABORTED"), new Error(4, "DEADLINE_EXCEEDED"), new Error(14, "UNAVAILABLE")); private static final long serialVersionUID = 2663750991205874435L; - public DatastoreException(int code, String message, String reason, Throwable cause) { - super(code, message, reason, true, cause); + public DatastoreException(int code, String message, String reason) { + this(code, message, reason, null); } - public DatastoreException(int code, String message, String reason) { - super(code, message, reason, true); + public DatastoreException(int code, String message, String reason, Throwable cause) { + super(code, message, reason, true, cause); } public DatastoreException(IOException exception) { @@ -63,7 +63,7 @@ protected Set retryableErrors() { */ static DatastoreException translateAndThrow(RetryHelperException ex) { BaseServiceException.translateAndPropagateIfPossible(ex); - throw new DatastoreException(UNKNOWN_CODE, ex.getMessage(), null); + throw new DatastoreException(UNKNOWN_CODE, ex.getMessage(), null, ex.getCause()); } /** diff --git a/gcloud-java-datastore/src/test/java/com/google/cloud/datastore/DatastoreExceptionTest.java b/gcloud-java-datastore/src/test/java/com/google/cloud/datastore/DatastoreExceptionTest.java index cf086ff25ba0..44981286961c 100644 --- a/gcloud-java-datastore/src/test/java/com/google/cloud/datastore/DatastoreExceptionTest.java +++ b/gcloud-java-datastore/src/test/java/com/google/cloud/datastore/DatastoreExceptionTest.java @@ -72,12 +72,11 @@ public void testDatastoreException() throws Exception { assertNull(exception.getMessage()); assertTrue(exception.retryable()); assertTrue(exception.idempotent()); - } @Test public void testTranslateAndThrow() throws Exception { - DatastoreException cause = new DatastoreException(14, "message", "UNAVAILABLE"); + Exception cause = new DatastoreException(14, "message", "UNAVAILABLE"); RetryHelper.RetryHelperException exceptionMock = createMock(RetryHelper.RetryHelperException.class); expect(exceptionMock.getCause()).andReturn(cause).times(2); @@ -92,6 +91,22 @@ public void testTranslateAndThrow() throws Exception { } finally { verify(exceptionMock); } + cause = new IllegalArgumentException("message"); + exceptionMock = createMock(RetryHelper.RetryHelperException.class); + expect(exceptionMock.getMessage()).andReturn("message").times(1); + expect(exceptionMock.getCause()).andReturn(cause).times(2); + replay(exceptionMock); + try { + DatastoreException.translateAndThrow(exceptionMock); + } catch (BaseServiceException ex) { + assertEquals(DatastoreException.UNKNOWN_CODE, ex.code()); + assertEquals("message", ex.getMessage()); + assertFalse(ex.retryable()); + assertTrue(ex.idempotent()); + assertEquals(cause, ex.getCause()); + } finally { + verify(exceptionMock); + } } @Test diff --git a/gcloud-java-dns/src/main/java/com/google/cloud/dns/DnsException.java b/gcloud-java-dns/src/main/java/com/google/cloud/dns/DnsException.java index 274ff91b3bd0..ef183aa39d0c 100644 --- a/gcloud-java-dns/src/main/java/com/google/cloud/dns/DnsException.java +++ b/gcloud-java-dns/src/main/java/com/google/cloud/dns/DnsException.java @@ -48,8 +48,8 @@ public DnsException(GoogleJsonError error, boolean idempotent) { super(error, idempotent); } - private DnsException(int code, String message) { - super(code, message, null, true); + DnsException(int code, String message, Throwable cause) { + super(code, message, null, true, cause); } @Override @@ -66,6 +66,6 @@ protected Set retryableErrors() { */ static DnsException translateAndThrow(RetryHelperException ex) { BaseServiceException.translateAndPropagateIfPossible(ex); - throw new DnsException(UNKNOWN_CODE, ex.getMessage()); + throw new DnsException(UNKNOWN_CODE, ex.getMessage(), ex.getCause()); } } diff --git a/gcloud-java-dns/src/test/java/com/google/cloud/dns/DnsExceptionTest.java b/gcloud-java-dns/src/test/java/com/google/cloud/dns/DnsExceptionTest.java new file mode 100644 index 000000000000..7962bbce5b60 --- /dev/null +++ b/gcloud-java-dns/src/test/java/com/google/cloud/dns/DnsExceptionTest.java @@ -0,0 +1,86 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.cloud.dns; + +import com.google.cloud.BaseServiceException; +import com.google.cloud.RetryHelper.RetryHelperException; + +import org.junit.Test; + +import java.io.IOException; +import java.net.SocketTimeoutException; + +import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.verify; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +public class DnsExceptionTest { + + @Test + public void testDnsException() throws Exception { + IOException cause = new SocketTimeoutException("message"); + DnsException exception = new DnsException(cause, true); + assertEquals(DnsException.UNKNOWN_CODE, exception.code()); + assertNull(exception.reason()); + assertEquals("message", exception.getMessage()); + assertEquals(cause, exception.getCause()); + assertTrue(exception.retryable()); + assertTrue(exception.idempotent()); + } + + @Test + public void testTranslateAndThrow() throws Exception { + IOException timeoutException = new SocketTimeoutException("message"); + Exception cause = new DnsException(timeoutException, true); + RetryHelperException exceptionMock = createMock(RetryHelperException.class); + expect(exceptionMock.getCause()).andReturn(cause).times(2); + replay(exceptionMock); + try { + DnsException.translateAndThrow(exceptionMock); + } catch (BaseServiceException ex) { + assertEquals(DnsException.UNKNOWN_CODE, ex.code()); + assertNull(ex.reason()); + assertEquals("message", ex.getMessage()); + assertEquals(timeoutException, ex.getCause()); + assertTrue(ex.retryable()); + assertTrue(ex.idempotent()); + } finally { + verify(exceptionMock); + } + cause = new IllegalArgumentException("message"); + exceptionMock = createMock(RetryHelperException.class); + expect(exceptionMock.getMessage()).andReturn("message").times(1); + expect(exceptionMock.getCause()).andReturn(cause).times(2); + replay(exceptionMock); + try { + DnsException.translateAndThrow(exceptionMock); + } catch (BaseServiceException ex) { + assertEquals(DnsException.UNKNOWN_CODE, ex.code()); + assertEquals("message", ex.getMessage()); + assertFalse(ex.retryable()); + assertTrue(ex.idempotent()); + assertEquals(cause, ex.getCause()); + } finally { + verify(exceptionMock); + } + } +} diff --git a/gcloud-java-resourcemanager/src/main/java/com/google/cloud/resourcemanager/ResourceManagerException.java b/gcloud-java-resourcemanager/src/main/java/com/google/cloud/resourcemanager/ResourceManagerException.java index 1df014e450ee..8612f527eaf2 100644 --- a/gcloud-java-resourcemanager/src/main/java/com/google/cloud/resourcemanager/ResourceManagerException.java +++ b/gcloud-java-resourcemanager/src/main/java/com/google/cloud/resourcemanager/ResourceManagerException.java @@ -48,7 +48,11 @@ public class ResourceManagerException extends BaseServiceException { private static final long serialVersionUID = -9207194488966554136L; public ResourceManagerException(int code, String message) { - super(code, message, null, true); + this(code, message, null); + } + + private ResourceManagerException(int code, String message, Throwable cause) { + super(code, message, null, true, cause); } public ResourceManagerException(IOException exception) { @@ -70,6 +74,6 @@ protected Set retryableErrors() { */ static ResourceManagerException translateAndThrow(RetryHelperException ex) { BaseServiceException.translateAndPropagateIfPossible(ex); - throw new ResourceManagerException(UNKNOWN_CODE, ex.getMessage()); + throw new ResourceManagerException(UNKNOWN_CODE, ex.getMessage(), ex.getCause()); } } diff --git a/gcloud-java-resourcemanager/src/test/java/com/google/cloud/resourcemanager/ResourceManagerExceptionTest.java b/gcloud-java-resourcemanager/src/test/java/com/google/cloud/resourcemanager/ResourceManagerExceptionTest.java index 2ac8d1acba7f..6c641c2d817b 100644 --- a/gcloud-java-resourcemanager/src/test/java/com/google/cloud/resourcemanager/ResourceManagerExceptionTest.java +++ b/gcloud-java-resourcemanager/src/test/java/com/google/cloud/resourcemanager/ResourceManagerExceptionTest.java @@ -76,7 +76,7 @@ public void testResourceManagerException() { @Test public void testTranslateAndThrow() throws Exception { - ResourceManagerException cause = new ResourceManagerException(503, "message"); + Exception cause = new ResourceManagerException(503, "message"); RetryHelperException exceptionMock = createMock(RetryHelperException.class); expect(exceptionMock.getCause()).andReturn(cause).times(2); replay(exceptionMock); @@ -90,5 +90,21 @@ public void testTranslateAndThrow() throws Exception { } finally { verify(exceptionMock); } + cause = new IllegalArgumentException("message"); + exceptionMock = createMock(RetryHelperException.class); + expect(exceptionMock.getMessage()).andReturn("message").times(1); + expect(exceptionMock.getCause()).andReturn(cause).times(2); + replay(exceptionMock); + try { + ResourceManagerException.translateAndThrow(exceptionMock); + } catch (BaseServiceException ex) { + assertEquals(ResourceManagerException.UNKNOWN_CODE, ex.code()); + assertEquals("message", ex.getMessage()); + assertFalse(ex.retryable()); + assertTrue(ex.idempotent()); + assertEquals(cause, ex.getCause()); + } finally { + verify(exceptionMock); + } } } diff --git a/gcloud-java-storage/src/main/java/com/google/cloud/storage/StorageException.java b/gcloud-java-storage/src/main/java/com/google/cloud/storage/StorageException.java index d6333c5c24e3..723a1ab715ff 100644 --- a/gcloud-java-storage/src/main/java/com/google/cloud/storage/StorageException.java +++ b/gcloud-java-storage/src/main/java/com/google/cloud/storage/StorageException.java @@ -46,7 +46,11 @@ public class StorageException extends BaseServiceException { private static final long serialVersionUID = -4168430271327813063L; public StorageException(int code, String message) { - super(code, message, null, true); + this(code, message, null); + } + + private StorageException(int code, String message, Throwable cause) { + super(code, message, null, true, cause); } public StorageException(IOException exception) { @@ -71,6 +75,6 @@ protected Set retryableErrors() { */ static StorageException translateAndThrow(RetryHelperException ex) { BaseServiceException.translateAndPropagateIfPossible(ex); - throw new StorageException(UNKNOWN_CODE, ex.getMessage()); + throw new StorageException(UNKNOWN_CODE, ex.getMessage(), ex.getCause()); } } diff --git a/gcloud-java-storage/src/test/java/com/google/cloud/storage/StorageExceptionTest.java b/gcloud-java-storage/src/test/java/com/google/cloud/storage/StorageExceptionTest.java index a562ec1194c9..29d3db93bea5 100644 --- a/gcloud-java-storage/src/test/java/com/google/cloud/storage/StorageExceptionTest.java +++ b/gcloud-java-storage/src/test/java/com/google/cloud/storage/StorageExceptionTest.java @@ -107,7 +107,7 @@ public void testStorageException() { @Test public void testTranslateAndThrow() throws Exception { - StorageException cause = new StorageException(503, "message"); + Exception cause = new StorageException(503, "message"); RetryHelperException exceptionMock = createMock(RetryHelperException.class); expect(exceptionMock.getCause()).andReturn(cause).times(2); replay(exceptionMock); @@ -121,5 +121,21 @@ public void testTranslateAndThrow() throws Exception { } finally { verify(exceptionMock); } + cause = new IllegalArgumentException("message"); + exceptionMock = createMock(RetryHelperException.class); + expect(exceptionMock.getMessage()).andReturn("message").times(1); + expect(exceptionMock.getCause()).andReturn(cause).times(2); + replay(exceptionMock); + try { + StorageException.translateAndThrow(exceptionMock); + } catch (BaseServiceException ex) { + assertEquals(StorageException.UNKNOWN_CODE, ex.code()); + assertEquals("message", ex.getMessage()); + assertFalse(ex.retryable()); + assertTrue(ex.idempotent()); + assertEquals(cause, ex.getCause()); + } finally { + verify(exceptionMock); + } } } From 4b8f3ea825f70efad3a592ad18769e453d1d4ede Mon Sep 17 00:00:00 2001 From: Marco Ziccardi Date: Wed, 20 Apr 2016 21:13:22 +0200 Subject: [PATCH 2/3] Make exception constructors package scoped, better test coverage --- .../cloud/bigquery/BigQueryException.java | 4 +- .../cloud/bigquery/BigQueryExceptionTest.java | 20 ++++- .../cloud/datastore/DatastoreException.java | 2 +- .../datastore/DatastoreExceptionTest.java | 18 ++++- .../google/cloud/dns/DnsExceptionTest.java | 76 ++++++++++++++++--- .../ResourceManagerException.java | 4 +- .../ResourceManagerExceptionTest.java | 13 +++- .../cloud/storage/StorageException.java | 2 +- .../cloud/storage/StorageExceptionTest.java | 13 +++- 9 files changed, 123 insertions(+), 29 deletions(-) diff --git a/gcloud-java-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryException.java b/gcloud-java-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryException.java index 3445d2fc1c89..501ec1e809e2 100644 --- a/gcloud-java-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryException.java +++ b/gcloud-java-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryException.java @@ -47,12 +47,12 @@ public BigQueryException(int code, String message) { this(code, message, (Throwable) null); } - private BigQueryException(int code, String message, Throwable cause) { + BigQueryException(int code, String message, Throwable cause) { super(code, message, null, true, cause); this.error = null; } - public BigQueryException(int code, String message, BigQueryError error) { + BigQueryException(int code, String message, BigQueryError error) { super(code, message, error != null ? error.reason() : null, true); this.error = error; } diff --git a/gcloud-java-bigquery/src/test/java/com/google/cloud/bigquery/BigQueryExceptionTest.java b/gcloud-java-bigquery/src/test/java/com/google/cloud/bigquery/BigQueryExceptionTest.java index c352124fbc93..e97606bfc463 100644 --- a/gcloud-java-bigquery/src/test/java/com/google/cloud/bigquery/BigQueryExceptionTest.java +++ b/gcloud-java-bigquery/src/test/java/com/google/cloud/bigquery/BigQueryExceptionTest.java @@ -23,6 +23,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import com.google.cloud.BaseServiceException; @@ -86,13 +87,24 @@ public void testBigqueryException() { assertTrue(exception.retryable()); assertTrue(exception.idempotent()); - IOException cause = new SocketTimeoutException(); + IOException cause = new SocketTimeoutException("socketTimeoutMessage"); exception = new BigQueryException(cause); + assertEquals(BigQueryException.UNKNOWN_CODE, exception.code()); assertNull(exception.reason()); - assertNull(exception.getMessage()); + assertEquals("socketTimeoutMessage", exception.getMessage()); + assertEquals(cause, exception.getCause()); assertTrue(exception.retryable()); assertTrue(exception.idempotent()); - assertEquals(cause, exception.getCause()); + assertSame(cause, exception.getCause()); + + exception = new BigQueryException(504, "message", cause); + assertEquals(504, exception.code()); + assertEquals("message", exception.getMessage()); + assertNull(exception.reason()); + assertNull(exception.error()); + assertTrue(exception.retryable()); + assertTrue(exception.idempotent()); + assertSame(cause, exception.getCause()); } @Test @@ -123,7 +135,7 @@ public void testTranslateAndThrow() throws Exception { assertEquals("message", ex.getMessage()); assertFalse(ex.retryable()); assertTrue(ex.idempotent()); - assertEquals(cause, ex.getCause()); + assertSame(cause, ex.getCause()); } finally { verify(exceptionMock); } diff --git a/gcloud-java-datastore/src/main/java/com/google/cloud/datastore/DatastoreException.java b/gcloud-java-datastore/src/main/java/com/google/cloud/datastore/DatastoreException.java index c502172c046f..de04a0a563f2 100644 --- a/gcloud-java-datastore/src/main/java/com/google/cloud/datastore/DatastoreException.java +++ b/gcloud-java-datastore/src/main/java/com/google/cloud/datastore/DatastoreException.java @@ -37,7 +37,7 @@ public class DatastoreException extends BaseServiceException { new Error(10, "ABORTED"), new Error(4, "DEADLINE_EXCEEDED"), new Error(14, "UNAVAILABLE")); private static final long serialVersionUID = 2663750991205874435L; - public DatastoreException(int code, String message, String reason) { + DatastoreException(int code, String message, String reason) { this(code, message, reason, null); } diff --git a/gcloud-java-datastore/src/test/java/com/google/cloud/datastore/DatastoreExceptionTest.java b/gcloud-java-datastore/src/test/java/com/google/cloud/datastore/DatastoreExceptionTest.java index 44981286961c..0da45f083210 100644 --- a/gcloud-java-datastore/src/test/java/com/google/cloud/datastore/DatastoreExceptionTest.java +++ b/gcloud-java-datastore/src/test/java/com/google/cloud/datastore/DatastoreExceptionTest.java @@ -23,6 +23,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -66,12 +67,23 @@ public void testDatastoreException() throws Exception { assertFalse(exception.retryable()); assertTrue(exception.idempotent()); - IOException cause = new SocketTimeoutException(); + IOException cause = new SocketTimeoutException("socketTimeoutMessage"); exception = new DatastoreException(cause); + assertEquals(DatastoreException.UNKNOWN_CODE, exception.code()); assertNull(exception.reason()); - assertNull(exception.getMessage()); + assertEquals("socketTimeoutMessage", exception.getMessage()); + assertEquals(cause, exception.getCause()); assertTrue(exception.retryable()); assertTrue(exception.idempotent()); + assertSame(cause, exception.getCause()); + + exception = new DatastoreException(2, "message", "INTERNAL", cause); + assertEquals(2, exception.code()); + assertEquals("INTERNAL", exception.reason()); + assertEquals("message", exception.getMessage()); + assertFalse(exception.retryable()); + assertTrue(exception.idempotent()); + assertSame(cause, exception.getCause()); } @Test @@ -103,7 +115,7 @@ public void testTranslateAndThrow() throws Exception { assertEquals("message", ex.getMessage()); assertFalse(ex.retryable()); assertTrue(ex.idempotent()); - assertEquals(cause, ex.getCause()); + assertSame(cause, ex.getCause()); } finally { verify(exceptionMock); } diff --git a/gcloud-java-dns/src/test/java/com/google/cloud/dns/DnsExceptionTest.java b/gcloud-java-dns/src/test/java/com/google/cloud/dns/DnsExceptionTest.java index 7962bbce5b60..f97d9f697baa 100644 --- a/gcloud-java-dns/src/test/java/com/google/cloud/dns/DnsExceptionTest.java +++ b/gcloud-java-dns/src/test/java/com/google/cloud/dns/DnsExceptionTest.java @@ -16,14 +16,6 @@ package com.google.cloud.dns; -import com.google.cloud.BaseServiceException; -import com.google.cloud.RetryHelper.RetryHelperException; - -import org.junit.Test; - -import java.io.IOException; -import java.net.SocketTimeoutException; - import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; @@ -31,20 +23,80 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; +import com.google.api.client.googleapis.json.GoogleJsonError; +import com.google.cloud.BaseServiceException; +import com.google.cloud.RetryHelper.RetryHelperException; + +import org.junit.Test; + +import java.io.IOException; +import java.net.SocketTimeoutException; + public class DnsExceptionTest { @Test public void testDnsException() throws Exception { - IOException cause = new SocketTimeoutException("message"); - DnsException exception = new DnsException(cause, true); - assertEquals(DnsException.UNKNOWN_CODE, exception.code()); + IOException cause = new SocketTimeoutException("socketTimeoutMessage"); + DnsException exception = new DnsException(500, "message", cause); + assertEquals(500, exception.code()); + assertEquals("message", exception.getMessage()); assertNull(exception.reason()); + assertTrue(exception.retryable()); + assertTrue(exception.idempotent()); + assertSame(cause, exception.getCause()); + + exception = new DnsException(502, "message", cause); + assertEquals(502, exception.code()); assertEquals("message", exception.getMessage()); + assertNull(exception.reason()); + assertTrue(exception.retryable()); + assertTrue(exception.idempotent()); + assertSame(cause, exception.getCause()); + + exception = new DnsException(503, "message", cause); + assertEquals(503, exception.code()); + assertEquals("message", exception.getMessage()); + assertNull(exception.reason()); + assertTrue(exception.retryable()); + assertTrue(exception.idempotent()); + assertSame(cause, exception.getCause()); + + exception = new DnsException(429, "message", cause); + assertEquals(429, exception.code()); + assertEquals("message", exception.getMessage()); + assertNull(exception.reason()); + assertTrue(exception.retryable()); + assertTrue(exception.idempotent()); + assertSame(cause, exception.getCause()); + + exception = new DnsException(404, "message", cause); + assertEquals(404, exception.code()); + assertEquals("message", exception.getMessage()); + assertNull(exception.reason()); + assertFalse(exception.retryable()); + assertTrue(exception.idempotent()); + assertSame(cause, exception.getCause()); + + exception = new DnsException(cause, true); + assertEquals(DnsException.UNKNOWN_CODE, exception.code()); + assertNull(exception.reason()); + assertEquals("socketTimeoutMessage", exception.getMessage()); assertEquals(cause, exception.getCause()); assertTrue(exception.retryable()); assertTrue(exception.idempotent()); + assertSame(cause, exception.getCause()); + + GoogleJsonError error = new GoogleJsonError(); + error.setCode(503); + error.setMessage("message"); + exception = new DnsException(error, true); + assertEquals(503, exception.code()); + assertEquals("message", exception.getMessage()); + assertTrue(exception.retryable()); + assertTrue(exception.idempotent()); } @Test @@ -78,7 +130,7 @@ public void testTranslateAndThrow() throws Exception { assertEquals("message", ex.getMessage()); assertFalse(ex.retryable()); assertTrue(ex.idempotent()); - assertEquals(cause, ex.getCause()); + assertSame(cause, ex.getCause()); } finally { verify(exceptionMock); } diff --git a/gcloud-java-resourcemanager/src/main/java/com/google/cloud/resourcemanager/ResourceManagerException.java b/gcloud-java-resourcemanager/src/main/java/com/google/cloud/resourcemanager/ResourceManagerException.java index 8612f527eaf2..a916eefd86a4 100644 --- a/gcloud-java-resourcemanager/src/main/java/com/google/cloud/resourcemanager/ResourceManagerException.java +++ b/gcloud-java-resourcemanager/src/main/java/com/google/cloud/resourcemanager/ResourceManagerException.java @@ -47,11 +47,11 @@ public class ResourceManagerException extends BaseServiceException { new Error(403, "variableTermLimitExceeded")); private static final long serialVersionUID = -9207194488966554136L; - public ResourceManagerException(int code, String message) { + ResourceManagerException(int code, String message) { this(code, message, null); } - private ResourceManagerException(int code, String message, Throwable cause) { + ResourceManagerException(int code, String message, Throwable cause) { super(code, message, null, true, cause); } diff --git a/gcloud-java-resourcemanager/src/test/java/com/google/cloud/resourcemanager/ResourceManagerExceptionTest.java b/gcloud-java-resourcemanager/src/test/java/com/google/cloud/resourcemanager/ResourceManagerExceptionTest.java index 6c641c2d817b..8e725b366a6b 100644 --- a/gcloud-java-resourcemanager/src/test/java/com/google/cloud/resourcemanager/ResourceManagerExceptionTest.java +++ b/gcloud-java-resourcemanager/src/test/java/com/google/cloud/resourcemanager/ResourceManagerExceptionTest.java @@ -23,6 +23,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import com.google.cloud.BaseServiceException; @@ -71,7 +72,15 @@ public void testResourceManagerException() { assertNull(exception.getMessage()); assertTrue(exception.retryable()); assertTrue(exception.idempotent()); - assertEquals(cause, exception.getCause()); + assertSame(cause, exception.getCause()); + + exception = new ResourceManagerException(404, "message", cause); + assertEquals(404, exception.code()); + assertEquals("message", exception.getMessage()); + assertNull(exception.reason()); + assertFalse(exception.retryable()); + assertTrue(exception.idempotent()); + assertSame(cause, exception.getCause()); } @Test @@ -102,7 +111,7 @@ public void testTranslateAndThrow() throws Exception { assertEquals("message", ex.getMessage()); assertFalse(ex.retryable()); assertTrue(ex.idempotent()); - assertEquals(cause, ex.getCause()); + assertSame(cause, ex.getCause()); } finally { verify(exceptionMock); } diff --git a/gcloud-java-storage/src/main/java/com/google/cloud/storage/StorageException.java b/gcloud-java-storage/src/main/java/com/google/cloud/storage/StorageException.java index 723a1ab715ff..89690090369d 100644 --- a/gcloud-java-storage/src/main/java/com/google/cloud/storage/StorageException.java +++ b/gcloud-java-storage/src/main/java/com/google/cloud/storage/StorageException.java @@ -49,7 +49,7 @@ public StorageException(int code, String message) { this(code, message, null); } - private StorageException(int code, String message, Throwable cause) { + StorageException(int code, String message, Throwable cause) { super(code, message, null, true, cause); } diff --git a/gcloud-java-storage/src/test/java/com/google/cloud/storage/StorageExceptionTest.java b/gcloud-java-storage/src/test/java/com/google/cloud/storage/StorageExceptionTest.java index 29d3db93bea5..1f16ff04cee3 100644 --- a/gcloud-java-storage/src/test/java/com/google/cloud/storage/StorageExceptionTest.java +++ b/gcloud-java-storage/src/test/java/com/google/cloud/storage/StorageExceptionTest.java @@ -23,6 +23,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import com.google.api.client.googleapis.json.GoogleJsonError; @@ -93,7 +94,7 @@ public void testStorageException() { assertNull(exception.getMessage()); assertTrue(exception.retryable()); assertTrue(exception.idempotent()); - assertEquals(cause, exception.getCause()); + assertSame(cause, exception.getCause()); GoogleJsonError error = new GoogleJsonError(); error.setCode(503); @@ -103,6 +104,14 @@ public void testStorageException() { assertEquals("message", exception.getMessage()); assertTrue(exception.retryable()); assertTrue(exception.idempotent()); + + exception = new StorageException(400, "message", cause); + assertEquals(400, exception.code()); + assertEquals("message", exception.getMessage()); + assertNull(exception.reason()); + assertFalse(exception.retryable()); + assertTrue(exception.idempotent()); + assertSame(cause, exception.getCause()); } @Test @@ -133,7 +142,7 @@ public void testTranslateAndThrow() throws Exception { assertEquals("message", ex.getMessage()); assertFalse(ex.retryable()); assertTrue(ex.idempotent()); - assertEquals(cause, ex.getCause()); + assertSame(cause, ex.getCause()); } finally { verify(exceptionMock); } From 93fe6bd01a7ae86cb5ce1018912d6f21f49b30d6 Mon Sep 17 00:00:00 2001 From: Marco Ziccardi Date: Wed, 20 Apr 2016 23:15:16 +0200 Subject: [PATCH 3/3] Make exception classes final with public constructors --- .../java/com/google/cloud/bigquery/BigQueryException.java | 6 +++--- .../java/com/google/cloud/datastore/DatastoreException.java | 4 ++-- .../src/main/java/com/google/cloud/dns/DnsException.java | 4 ++-- .../src/test/java/com/google/cloud/dns/ZoneTest.java | 2 +- .../cloud/resourcemanager/ResourceManagerException.java | 6 +++--- .../java/com/google/cloud/storage/StorageException.java | 4 ++-- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/gcloud-java-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryException.java b/gcloud-java-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryException.java index 501ec1e809e2..0b0c7d3152e3 100644 --- a/gcloud-java-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryException.java +++ b/gcloud-java-bigquery/src/main/java/com/google/cloud/bigquery/BigQueryException.java @@ -31,7 +31,7 @@ * @see Google Cloud * BigQuery error codes */ -public class BigQueryException extends BaseServiceException { +public final class BigQueryException extends BaseServiceException { // see: https://cloud.google.com/bigquery/troubleshooting-errors private static final Set RETRYABLE_ERRORS = ImmutableSet.of( @@ -47,12 +47,12 @@ public BigQueryException(int code, String message) { this(code, message, (Throwable) null); } - BigQueryException(int code, String message, Throwable cause) { + public BigQueryException(int code, String message, Throwable cause) { super(code, message, null, true, cause); this.error = null; } - BigQueryException(int code, String message, BigQueryError error) { + public BigQueryException(int code, String message, BigQueryError error) { super(code, message, error != null ? error.reason() : null, true); this.error = error; } diff --git a/gcloud-java-datastore/src/main/java/com/google/cloud/datastore/DatastoreException.java b/gcloud-java-datastore/src/main/java/com/google/cloud/datastore/DatastoreException.java index de04a0a563f2..42c0079e0a77 100644 --- a/gcloud-java-datastore/src/main/java/com/google/cloud/datastore/DatastoreException.java +++ b/gcloud-java-datastore/src/main/java/com/google/cloud/datastore/DatastoreException.java @@ -30,14 +30,14 @@ * @see Google Cloud * Datastore error codes */ -public class DatastoreException extends BaseServiceException { +public final class DatastoreException extends BaseServiceException { // see https://cloud.google.com/datastore/docs/concepts/errors#Error_Codes" private static final Set RETRYABLE_ERRORS = ImmutableSet.of( new Error(10, "ABORTED"), new Error(4, "DEADLINE_EXCEEDED"), new Error(14, "UNAVAILABLE")); private static final long serialVersionUID = 2663750991205874435L; - DatastoreException(int code, String message, String reason) { + public DatastoreException(int code, String message, String reason) { this(code, message, reason, null); } diff --git a/gcloud-java-dns/src/main/java/com/google/cloud/dns/DnsException.java b/gcloud-java-dns/src/main/java/com/google/cloud/dns/DnsException.java index ef183aa39d0c..90c32aee1681 100644 --- a/gcloud-java-dns/src/main/java/com/google/cloud/dns/DnsException.java +++ b/gcloud-java-dns/src/main/java/com/google/cloud/dns/DnsException.java @@ -28,7 +28,7 @@ /** * DNS service exception. */ -public class DnsException extends BaseServiceException { +public final class DnsException extends BaseServiceException { // see: https://cloud.google.com/dns/troubleshooting private static final Set RETRYABLE_ERRORS = ImmutableSet.of( @@ -48,7 +48,7 @@ public DnsException(GoogleJsonError error, boolean idempotent) { super(error, idempotent); } - DnsException(int code, String message, Throwable cause) { + public DnsException(int code, String message, Throwable cause) { super(code, message, null, true, cause); } diff --git a/gcloud-java-dns/src/test/java/com/google/cloud/dns/ZoneTest.java b/gcloud-java-dns/src/test/java/com/google/cloud/dns/ZoneTest.java index e1f6c8917647..aefc716bf46a 100644 --- a/gcloud-java-dns/src/test/java/com/google/cloud/dns/ZoneTest.java +++ b/gcloud-java-dns/src/test/java/com/google/cloud/dns/ZoneTest.java @@ -64,7 +64,7 @@ public class ZoneTest { ChangeRequestInfo.builder().generatedId("someid").build(); private static final ChangeRequestInfo CHANGE_REQUEST_NO_ID = ChangeRequestInfo.builder().build(); - private static final DnsException EXCEPTION = createStrictMock(DnsException.class); + private static final DnsException EXCEPTION = new DnsException(-1, "message", null); private static final DnsOptions OPTIONS = createStrictMock(DnsOptions.class); private Dns dns; diff --git a/gcloud-java-resourcemanager/src/main/java/com/google/cloud/resourcemanager/ResourceManagerException.java b/gcloud-java-resourcemanager/src/main/java/com/google/cloud/resourcemanager/ResourceManagerException.java index a916eefd86a4..2a6906fc0090 100644 --- a/gcloud-java-resourcemanager/src/main/java/com/google/cloud/resourcemanager/ResourceManagerException.java +++ b/gcloud-java-resourcemanager/src/main/java/com/google/cloud/resourcemanager/ResourceManagerException.java @@ -30,7 +30,7 @@ * @see Google Cloud * Resource Manager error codes */ -public class ResourceManagerException extends BaseServiceException { +public final class ResourceManagerException extends BaseServiceException { // see https://cloud.google.com/resource-manager/v1/errors/core_errors private static final Set RETRYABLE_ERRORS = ImmutableSet.of( @@ -47,11 +47,11 @@ public class ResourceManagerException extends BaseServiceException { new Error(403, "variableTermLimitExceeded")); private static final long serialVersionUID = -9207194488966554136L; - ResourceManagerException(int code, String message) { + public ResourceManagerException(int code, String message) { this(code, message, null); } - ResourceManagerException(int code, String message, Throwable cause) { + public ResourceManagerException(int code, String message, Throwable cause) { super(code, message, null, true, cause); } diff --git a/gcloud-java-storage/src/main/java/com/google/cloud/storage/StorageException.java b/gcloud-java-storage/src/main/java/com/google/cloud/storage/StorageException.java index 89690090369d..e0dcd8df0946 100644 --- a/gcloud-java-storage/src/main/java/com/google/cloud/storage/StorageException.java +++ b/gcloud-java-storage/src/main/java/com/google/cloud/storage/StorageException.java @@ -31,7 +31,7 @@ * @see Google Cloud * Storage error codes */ -public class StorageException extends BaseServiceException { +public final class StorageException extends BaseServiceException { // see: https://cloud.google.com/storage/docs/resumable-uploads-xml#practices private static final Set RETRYABLE_ERRORS = ImmutableSet.of( @@ -49,7 +49,7 @@ public StorageException(int code, String message) { this(code, message, null); } - StorageException(int code, String message, Throwable cause) { + public StorageException(int code, String message, Throwable cause) { super(code, message, null, true, cause); }