diff --git a/gcloud-java-bigquery/pom.xml b/gcloud-java-bigquery/pom.xml
index 9a2137cb987d..5c79f150c722 100644
--- a/gcloud-java-bigquery/pom.xml
+++ b/gcloud-java-bigquery/pom.xml
@@ -39,6 +39,13 @@
+
+ ${project.groupId}
+ gcloud-java-core
+ ${project.version}
+ test-jar
+ test
+
junit
junit
diff --git a/gcloud-java-bigquery/src/main/java/com/google/gcloud/bigquery/BigQueryException.java b/gcloud-java-bigquery/src/main/java/com/google/gcloud/bigquery/BigQueryException.java
index a157afd25db2..e78734a2899e 100644
--- a/gcloud-java-bigquery/src/main/java/com/google/gcloud/bigquery/BigQueryException.java
+++ b/gcloud-java-bigquery/src/main/java/com/google/gcloud/bigquery/BigQueryException.java
@@ -22,6 +22,7 @@
import com.google.gcloud.RetryHelper.RetryInterruptedException;
import java.io.IOException;
+import java.util.Objects;
import java.util.Set;
/**
@@ -73,6 +74,23 @@ protected Set retryableErrors() {
return RETRYABLE_ERRORS;
}
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof BigQueryException)) {
+ return false;
+ }
+ BigQueryException other = (BigQueryException) obj;
+ return super.equals(other) && Objects.equals(error, other.error);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), error);
+ }
+
/**
* Translate RetryHelperException to the BigQueryException that caused the error. This method will
* always throw an exception.
diff --git a/gcloud-java-bigquery/src/test/java/com/google/gcloud/bigquery/SerializationTest.java b/gcloud-java-bigquery/src/test/java/com/google/gcloud/bigquery/SerializationTest.java
index 254c8954bf30..111df074ffa2 100644
--- a/gcloud-java-bigquery/src/test/java/com/google/gcloud/bigquery/SerializationTest.java
+++ b/gcloud-java-bigquery/src/test/java/com/google/gcloud/bigquery/SerializationTest.java
@@ -16,30 +16,19 @@
package com.google.gcloud.bigquery;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotSame;
-
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.gcloud.AuthCredentials;
-import com.google.gcloud.RestorableState;
-import com.google.gcloud.RetryParams;
-import com.google.gcloud.WriteChannel;
+import com.google.gcloud.BaseSerializationTest;
+import com.google.gcloud.Restorable;
import com.google.gcloud.bigquery.StandardTableDefinition.StreamingBuffer;
-import org.junit.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
-public class SerializationTest {
+public class SerializationTest extends BaseSerializationTest {
private static final Acl DOMAIN_ACCESS =
Acl.of(new Acl.Domain("domain"), Acl.Role.WRITER);
@@ -230,75 +219,40 @@ public class SerializationTest {
new Dataset(BIGQUERY, new DatasetInfo.BuilderImpl(DATASET_INFO));
private static final Table TABLE = new Table(BIGQUERY, new TableInfo.BuilderImpl(TABLE_INFO));
private static final Job JOB = new Job(BIGQUERY, new JobInfo.BuilderImpl(JOB_INFO));
+ private static final BigQueryException BIG_QUERY_EXCEPTION =
+ new BigQueryException(42, "message", BIGQUERY_ERROR);
- @Test
- public void testServiceOptions() throws Exception {
+ @Override
+ protected Serializable[] serializableObjects() {
BigQueryOptions options = BigQueryOptions.builder()
.projectId("p1")
.authCredentials(AuthCredentials.createForAppEngine())
.build();
- BigQueryOptions serializedCopy = serializeAndDeserialize(options);
- assertEquals(options, serializedCopy);
-
- options = options.toBuilder()
+ BigQueryOptions otherOptions = options.toBuilder()
.projectId("p2")
- .retryParams(RetryParams.defaultInstance())
.authCredentials(null)
.build();
- serializedCopy = serializeAndDeserialize(options);
- assertEquals(options, serializedCopy);
- }
-
- @Test
- public void testModelAndRequests() throws Exception {
- Serializable[] objects = {DOMAIN_ACCESS, GROUP_ACCESS, USER_ACCESS, VIEW_ACCESS, DATASET_ID,
+ return new Serializable[]{DOMAIN_ACCESS, GROUP_ACCESS, USER_ACCESS, VIEW_ACCESS, DATASET_ID,
DATASET_INFO, TABLE_ID, CSV_OPTIONS, STREAMING_BUFFER, TABLE_DEFINITION,
EXTERNAL_TABLE_DEFINITION, VIEW_DEFINITION, TABLE_SCHEMA, TABLE_INFO, VIEW_INFO,
EXTERNAL_TABLE_INFO, INLINE_FUNCTION, URI_FUNCTION, JOB_STATISTICS, EXTRACT_STATISTICS,
LOAD_STATISTICS, QUERY_STATISTICS, BIGQUERY_ERROR, JOB_STATUS, JOB_ID,
COPY_JOB_CONFIGURATION, EXTRACT_JOB_CONFIGURATION, LOAD_CONFIGURATION,
LOAD_JOB_CONFIGURATION, QUERY_JOB_CONFIGURATION, JOB_INFO, INSERT_ALL_REQUEST,
- INSERT_ALL_RESPONSE, FIELD_VALUE, QUERY_REQUEST, QUERY_RESPONSE,
+ INSERT_ALL_RESPONSE, FIELD_VALUE, QUERY_REQUEST, QUERY_RESPONSE, BIG_QUERY_EXCEPTION,
BigQuery.DatasetOption.fields(), BigQuery.DatasetDeleteOption.deleteContents(),
BigQuery.DatasetListOption.all(), BigQuery.TableOption.fields(),
BigQuery.TableListOption.pageSize(42L), BigQuery.JobOption.fields(),
- BigQuery.JobListOption.allUsers(), DATASET, TABLE, JOB};
- for (Serializable obj : objects) {
- Object copy = serializeAndDeserialize(obj);
- assertEquals(obj, obj);
- assertEquals(obj, copy);
- assertNotSame(obj, copy);
- assertEquals(copy, copy);
- }
+ BigQuery.JobListOption.allUsers(), DATASET, TABLE, JOB, options, otherOptions};
}
- @Test
- public void testWriteChannelState() throws IOException, ClassNotFoundException {
- BigQueryOptions options = BigQueryOptions.builder()
- .projectId("p2")
- .retryParams(RetryParams.defaultInstance())
- .build();
+ @Override
+ protected Restorable>[] restorableObjects() {
+ BigQueryOptions options = BigQueryOptions.builder().projectId("p2").build();
// avoid closing when you don't want partial writes upon failure
@SuppressWarnings("resource")
TableDataWriteChannel writer =
new TableDataWriteChannel(options, LOAD_CONFIGURATION, "upload-id");
- RestorableState state = writer.capture();
- RestorableState deserializedState = serializeAndDeserialize(state);
- assertEquals(state, deserializedState);
- assertEquals(state.hashCode(), deserializedState.hashCode());
- assertEquals(state.toString(), deserializedState.toString());
- }
-
- @SuppressWarnings("unchecked")
- private T serializeAndDeserialize(T obj)
- throws IOException, ClassNotFoundException {
- ByteArrayOutputStream bytes = new ByteArrayOutputStream();
- try (ObjectOutputStream output = new ObjectOutputStream(bytes)) {
- output.writeObject(obj);
- }
- try (ObjectInputStream input =
- new ObjectInputStream(new ByteArrayInputStream(bytes.toByteArray()))) {
- return (T) input.readObject();
- }
+ return new Restorable>[]{writer};
}
}
diff --git a/gcloud-java-core/src/main/java/com/google/gcloud/AuthCredentials.java b/gcloud-java-core/src/main/java/com/google/gcloud/AuthCredentials.java
index 6f9e09ca04bc..27cafc181505 100644
--- a/gcloud-java-core/src/main/java/com/google/gcloud/AuthCredentials.java
+++ b/gcloud-java-core/src/main/java/com/google/gcloud/AuthCredentials.java
@@ -276,8 +276,20 @@ private static class NoAuthCredentialsState
public AuthCredentials restore() {
return INSTANCE;
}
+
+ @Override
+ public int hashCode() {
+ return getClass().getName().hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return obj instanceof NoAuthCredentialsState;
+ }
}
+ private NoAuthCredentials() {}
+
@Override
public GoogleCredentials credentials() {
return null;
diff --git a/gcloud-java-core/src/main/java/com/google/gcloud/BaseServiceException.java b/gcloud-java-core/src/main/java/com/google/gcloud/BaseServiceException.java
index 365243904436..4e0d03e0073a 100644
--- a/gcloud-java-core/src/main/java/com/google/gcloud/BaseServiceException.java
+++ b/gcloud-java-core/src/main/java/com/google/gcloud/BaseServiceException.java
@@ -32,6 +32,16 @@
*/
public class BaseServiceException extends RuntimeException {
+ private static final long serialVersionUID = 759921776378760835L;
+ public static final int UNKNOWN_CODE = 0;
+
+ private final int code;
+ private final boolean retryable;
+ private final String reason;
+ private final boolean idempotent;
+ private final String location;
+ private final String debugInfo;
+
protected static final class Error implements Serializable {
private static final long serialVersionUID = -4019600198652965721L;
@@ -79,16 +89,6 @@ public int hashCode() {
}
}
- private static final long serialVersionUID = 759921776378760835L;
- public static final int UNKNOWN_CODE = 0;
-
- private final int code;
- private final boolean retryable;
- private final String reason;
- private final boolean idempotent;
- private final String location;
- private final String debugInfo;
-
public BaseServiceException(IOException exception, boolean idempotent) {
super(message(exception), exception);
int code = UNKNOWN_CODE;
@@ -198,6 +198,31 @@ protected String debugInfo() {
return debugInfo;
}
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof BaseServiceException)) {
+ return false;
+ }
+ BaseServiceException other = (BaseServiceException) obj;
+ return Objects.equals(getCause(), other.getCause())
+ && Objects.equals(getMessage(), other.getMessage())
+ && code == other.code
+ && retryable == other.retryable
+ && Objects.equals(reason, other.reason)
+ && idempotent == other.idempotent
+ && Objects.equals(location, other.location)
+ && Objects.equals(debugInfo, other.debugInfo);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(getCause(), getMessage(), code, retryable, reason, idempotent, location,
+ debugInfo);
+ }
+
protected static String reason(GoogleJsonError error) {
if (error.getErrors() != null && !error.getErrors().isEmpty()) {
return error.getErrors().get(0).getReason();
diff --git a/gcloud-java-core/src/main/java/com/google/gcloud/ExceptionHandler.java b/gcloud-java-core/src/main/java/com/google/gcloud/ExceptionHandler.java
index 39d4c4e75a1a..0b3c923d1eb9 100644
--- a/gcloud-java-core/src/main/java/com/google/gcloud/ExceptionHandler.java
+++ b/gcloud-java-core/src/main/java/com/google/gcloud/ExceptionHandler.java
@@ -26,6 +26,7 @@
import java.io.Serializable;
import java.lang.reflect.Method;
+import java.util.Objects;
import java.util.Set;
import java.util.concurrent.Callable;
@@ -259,6 +260,26 @@ boolean shouldRetry(Exception ex) {
return retryResult == Interceptor.RetryResult.RETRY;
}
+ @Override
+ public int hashCode() {
+ return Objects.hash(interceptors, retriableExceptions, nonRetriableExceptions, retryInfo);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof ExceptionHandler)) {
+ return false;
+ }
+ ExceptionHandler other = (ExceptionHandler) obj;
+ return Objects.equals(interceptors, other.interceptors)
+ && Objects.equals(retriableExceptions, other.retriableExceptions)
+ && Objects.equals(nonRetriableExceptions, other.nonRetriableExceptions)
+ && Objects.equals(retryInfo, other.retryInfo);
+ }
+
/**
* Returns an instance which retry any checked exception and abort on any runtime exception.
*/
diff --git a/gcloud-java-core/src/test/java/com/google/gcloud/BaseSerializationTest.java b/gcloud-java-core/src/test/java/com/google/gcloud/BaseSerializationTest.java
new file mode 100644
index 000000000000..e9ab3d47984b
--- /dev/null
+++ b/gcloud-java-core/src/test/java/com/google/gcloud/BaseSerializationTest.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.gcloud;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotSame;
+
+import org.junit.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+
+/**
+ * Base class for serialization tests. To use this class in your tests override the
+ * {@code serializableObjects()} method to return all objects that must be serializable. Also
+ * override {@code restorableObjects()} method to return all restorable objects whose state must be
+ * tested for proper serialization. Both methods can return {@code null} if no such object needs to
+ * be tested.
+ */
+public abstract class BaseSerializationTest {
+
+ /**
+ * Returns all objects for which correct serialization must be tested.
+ */
+ protected abstract Serializable[] serializableObjects();
+
+ /**
+ * Returns all restorable objects whose state must be tested for proper serialization.
+ */
+ protected abstract Restorable>[] restorableObjects();
+
+ @Test
+ public void testSerializableObjects() throws Exception {
+ for (Serializable obj : firstNonNull(serializableObjects(), new Serializable[0])) {
+ Object copy = serializeAndDeserialize(obj);
+ assertEquals(obj, obj);
+ assertEquals(obj, copy);
+ assertEquals(obj.hashCode(), copy.hashCode());
+ assertEquals(obj.toString(), copy.toString());
+ assertNotSame(obj, copy);
+ assertEquals(copy, copy);
+ }
+ }
+
+ @Test
+ public void testRestorableObjects() throws Exception {
+ for (Restorable restorable : firstNonNull(restorableObjects(), new Restorable[0])) {
+ RestorableState> state = restorable.capture();
+ RestorableState> deserializedState = serializeAndDeserialize(state);
+ assertEquals(state, deserializedState);
+ assertEquals(state.hashCode(), deserializedState.hashCode());
+ assertEquals(state.toString(), deserializedState.toString());
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public T serializeAndDeserialize(T obj) throws IOException, ClassNotFoundException {
+ ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+ try (ObjectOutputStream output = new ObjectOutputStream(bytes)) {
+ output.writeObject(obj);
+ }
+ try (ObjectInputStream input =
+ new ObjectInputStream(new ByteArrayInputStream(bytes.toByteArray()))) {
+ return (T) input.readObject();
+ }
+ }
+}
diff --git a/gcloud-java-core/src/test/java/com/google/gcloud/SerializationTest.java b/gcloud-java-core/src/test/java/com/google/gcloud/SerializationTest.java
new file mode 100644
index 000000000000..3255a17333aa
--- /dev/null
+++ b/gcloud-java-core/src/test/java/com/google/gcloud/SerializationTest.java
@@ -0,0 +1,100 @@
+/*
+ * 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.gcloud;
+
+import com.google.common.collect.ImmutableList;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.Serializable;
+
+public class SerializationTest extends BaseSerializationTest {
+
+ private static class SomeIamPolicy extends IamPolicy {
+
+ private static final long serialVersionUID = 271243551016958285L;
+
+ private static class Builder extends IamPolicy.Builder {
+
+ @Override
+ public SomeIamPolicy build() {
+ return new SomeIamPolicy(this);
+ }
+ }
+
+ protected SomeIamPolicy(Builder builder) {
+ super(builder);
+ }
+
+ @Override
+ public Builder toBuilder() {
+ return new Builder();
+ }
+ }
+
+ private static final BaseServiceException BASE_SERVICE_EXCEPTION =
+ new BaseServiceException(42, "message", "reason", true);
+ private static final ExceptionHandler EXCEPTION_HANDLER = ExceptionHandler.defaultInstance();
+ private static final Identity IDENTITY = Identity.allAuthenticatedUsers();
+ private static final PageImpl PAGE =
+ new PageImpl<>(null, "cursor", ImmutableList.of("string1", "string2"));
+ private static final RetryParams RETRY_PARAMS = RetryParams.defaultInstance();
+ private static final SomeIamPolicy SOME_IAM_POLICY = new SomeIamPolicy.Builder().build();
+ private static final String JSON_KEY = "{\n"
+ + " \"private_key_id\": \"somekeyid\",\n"
+ + " \"private_key\": \"-----BEGIN PRIVATE KEY-----\\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggS"
+ + "kAgEAAoIBAQC+K2hSuFpAdrJI\\nnCgcDz2M7t7bjdlsadsasad+fvRSW6TjNQZ3p5LLQY1kSZRqBqylRkzteMOyHg"
+ + "aR\\n0Pmxh3ILCND5men43j3h4eDbrhQBuxfEMalkG92sL+PNQSETY2tnvXryOvmBRwa/\\nQP/9dJfIkIDJ9Fw9N4"
+ + "Bhhhp6mCcRpdQjV38H7JsyJ7lih/oNjECgYAt\\nknddadwkwewcVxHFhcZJO+XWf6ofLUXpRwiTZakGMn8EE1uVa2"
+ + "LgczOjwWHGi99MFjxSer5m9\\n1tCa3/KEGKiS/YL71JvjwX3mb+cewlkcmweBKZHM2JPTk0ZednFSpVZMtycjkbLa"
+ + "\\ndYOS8V85AgMBewECggEBAKksaldajfDZDV6nGqbFjMiizAKJolr/M3OQw16K6o3/\\n0S31xIe3sSlgW0+UbYlF"
+ + "4U8KifhManD1apVSC3csafaspP4RZUHFhtBywLO9pR5c\\nr6S5aLp+gPWFyIp1pfXbWGvc5VY/v9x7ya1VEa6rXvL"
+ + "sKupSeWAW4tMj3eo/64ge\\nsdaceaLYw52KeBYiT6+vpsnYrEkAHO1fF/LavbLLOFJmFTMxmsNaG0tuiJHgjshB\\"
+ + "n82DpMCbXG9YcCgI/DbzuIjsdj2JC1cascSP//3PmefWysucBQe7Jryb6NQtASmnv\\nCdDw/0jmZTEjpe4S1lxfHp"
+ + "lAhHFtdgYTvyYtaLZiVVkCgYEA8eVpof2rceecw/I6\\n5ng1q3Hl2usdWV/4mZMvR0fOemacLLfocX6IYxT1zA1FF"
+ + "JlbXSRsJMf/Qq39mOR2\\nSpW+hr4jCoHeRVYLgsbggtrevGmILAlNoqCMpGZ6vDmJpq6ECV9olliDvpPgWOP+\\nm"
+ + "YPDreFBGxWvQrADNbRt2dmGsrsCgYEAyUHqB2wvJHFqdmeBsaacewzV8x9WgmeX\\ngUIi9REwXlGDW0Mz50dxpxcK"
+ + "CAYn65+7TCnY5O/jmL0VRxU1J2mSWyWTo1C+17L0\\n3fUqjxL1pkefwecxwecvC+gFFYdJ4CQ/MHHXU81Lwl1iWdF"
+ + "Cd2UoGddYaOF+KNeM\\nHC7cmqra+JsCgYEAlUNywzq8nUg7282E+uICfCB0LfwejuymR93CtsFgb7cRd6ak\\nECR"
+ + "8FGfCpH8ruWJINllbQfcHVCX47ndLZwqv3oVFKh6pAS/vVI4dpOepP8++7y1u\\ncoOvtreXCX6XqfrWDtKIvv0vjl"
+ + "HBhhhp6mCcRpdQjV38H7JsyJ7lih/oNjECgYAt\\nkndj5uNl5SiuVxHFhcZJO+XWf6ofLUregtevZakGMn8EE1uVa"
+ + "2AY7eafmoU/nZPT\\n00YB0TBATdCbn/nBSuKDESkhSg9s2GEKQZG5hBmL5uCMfo09z3SfxZIhJdlerreP\\nJ7gSi"
+ + "dI12N+EZxYd4xIJh/HFDgp7RRO87f+WJkofMQKBgGTnClK1VMaCRbJZPriw\\nEfeFCoOX75MxKwXs6xgrw4W//AYG"
+ + "GUjDt83lD6AZP6tws7gJ2IwY/qP7+lyhjEqN\\nHtfPZRGFkGZsdaksdlaksd323423d+15/UvrlRSFPNj1tWQmNKk"
+ + "XyRDW4IG1Oa2p\\nrALStNBx5Y9t0/LQnFI4w3aG\\n-----END PRIVATE KEY-----\\n\",\n"
+ + " \"client_email\": \"someclientid@developer.gserviceaccount.com\",\n"
+ + " \"client_id\": \"someclientid.apps.googleusercontent.com\",\n"
+ + " \"type\": \"service_account\"\n"
+ + "}";
+
+ @Override
+ protected Serializable[] serializableObjects() {
+ return new Serializable[]{BASE_SERVICE_EXCEPTION, EXCEPTION_HANDLER, IDENTITY, PAGE,
+ RETRY_PARAMS, SOME_IAM_POLICY};
+ }
+
+ @Override
+ protected Restorable>[] restorableObjects() {
+ try {
+ return new Restorable>[]{AuthCredentials.createForAppEngine(), AuthCredentials.noAuth(),
+ AuthCredentials.createForJson(new ByteArrayInputStream(JSON_KEY.getBytes()))};
+ } catch (IOException ex) {
+ // never reached
+ throw new RuntimeException(ex);
+ }
+ }
+}
diff --git a/gcloud-java-datastore/pom.xml b/gcloud-java-datastore/pom.xml
index 977b6db22b14..f3b46e22b3c8 100644
--- a/gcloud-java-datastore/pom.xml
+++ b/gcloud-java-datastore/pom.xml
@@ -33,6 +33,13 @@
+
+ ${project.groupId}
+ gcloud-java-core
+ ${project.version}
+ test-jar
+ test
+
junit
junit
diff --git a/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/SerializationTest.java b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/SerializationTest.java
index 3976be2cc383..b9e78800ffab 100644
--- a/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/SerializationTest.java
+++ b/gcloud-java-datastore/src/test/java/com/google/gcloud/datastore/SerializationTest.java
@@ -17,28 +17,17 @@
package com.google.gcloud.datastore;
import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotSame;
import com.google.api.services.datastore.DatastoreV1;
-import com.google.common.collect.ImmutableMultimap;
-import com.google.common.collect.Multimap;
import com.google.gcloud.AuthCredentials;
-import com.google.gcloud.RetryParams;
+import com.google.gcloud.BaseSerializationTest;
+import com.google.gcloud.Restorable;
import com.google.gcloud.datastore.StructuredQuery.CompositeFilter;
import com.google.gcloud.datastore.StructuredQuery.OrderBy;
import com.google.gcloud.datastore.StructuredQuery.Projection;
import com.google.gcloud.datastore.StructuredQuery.PropertyFilter;
-import org.junit.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-
-public class SerializationTest {
+public class SerializationTest extends BaseSerializationTest {
private static final IncompleteKey INCOMPLETE_KEY1 =
IncompleteKey.builder("ds", "k").ancestors(PathElement.of("p", 1)).build();
@@ -113,83 +102,31 @@ public class SerializationTest {
.addValue(new NullValue())
.build();
private static final ProjectionEntity PROJECTION_ENTITY = ProjectionEntity.fromPb(ENTITY1.toPb());
+ private static final DatastoreException DATASTORE_EXCEPTION =
+ new DatastoreException(42, "message", "reason");
- @SuppressWarnings("rawtypes")
- private static final Multimap TYPE_TO_VALUES =
- ImmutableMultimap.builder()
- .put(ValueType.NULL, NULL_VALUE)
- .put(ValueType.KEY, KEY_VALUE)
- .put(ValueType.STRING, STRING_VALUE)
- .putAll(ValueType.ENTITY, EMBEDDED_ENTITY_VALUE1, EMBEDDED_ENTITY_VALUE2,
- EMBEDDED_ENTITY_VALUE3)
- .put(ValueType.LIST, LIST_VALUE)
- .put(ValueType.LONG, LONG_VALUE)
- .put(ValueType.DOUBLE, DOUBLE_VALUE)
- .put(ValueType.BOOLEAN, BOOLEAN_VALUE)
- .put(ValueType.DATE_TIME, DATE_AND_TIME_VALUE)
- .put(ValueType.BLOB, BLOB_VALUE)
- .put(ValueType.RAW_VALUE, RAW_VALUE)
- .build();
-
- @Test
- public void testServiceOptions() throws Exception {
+ @Override
+ protected java.io.Serializable[] serializableObjects() {
DatastoreOptions options = DatastoreOptions.builder()
.authCredentials(AuthCredentials.createForAppEngine())
.normalizeDataset(false)
.projectId("ds1")
.build();
- DatastoreOptions serializedCopy = serializeAndDeserialize(options);
- assertEquals(options, serializedCopy);
-
- options = options.toBuilder()
+ DatastoreOptions otherOptions = options.toBuilder()
.namespace("ns1")
- .retryParams(RetryParams.defaultInstance())
.authCredentials(null)
.force(true)
.build();
- serializedCopy = serializeAndDeserialize(options);
- assertEquals(options, serializedCopy);
- }
-
- @Test
- public void testValues() throws Exception {
- for (ValueType valueType : ValueType.values()) {
- for (Value> value : TYPE_TO_VALUES.get(valueType)) {
- Value> copy = serializeAndDeserialize(value);
- assertEquals(value, value);
- assertEquals(value, copy);
- assertNotSame(value, copy);
- assertEquals(copy, copy);
- assertEquals(value.get(), copy.get());
- }
- }
- }
-
- @Test
- public void testTypes() throws Exception {
- Serializable>[] types = { KEY1, KEY2, INCOMPLETE_KEY1, INCOMPLETE_KEY2, ENTITY1, ENTITY2,
- ENTITY3, EMBEDDED_ENTITY, PROJECTION_ENTITY, DATE_TIME1, BLOB1, CURSOR1, GQL1, GQL2,
- QUERY1, QUERY2, QUERY3};
- for (Serializable> obj : types) {
- Object copy = serializeAndDeserialize(obj);
- assertEquals(obj, obj);
- assertEquals(obj, copy);
- assertNotSame(obj, copy);
- assertEquals(copy, copy);
- }
+ return new java.io.Serializable[]{KEY1, KEY2, INCOMPLETE_KEY1, INCOMPLETE_KEY2, ENTITY1,
+ ENTITY2, ENTITY3, EMBEDDED_ENTITY, PROJECTION_ENTITY, DATE_TIME1, BLOB1, CURSOR1, GQL1,
+ GQL2, QUERY1, QUERY2, QUERY3, NULL_VALUE, KEY_VALUE, STRING_VALUE, EMBEDDED_ENTITY_VALUE1,
+ EMBEDDED_ENTITY_VALUE2, EMBEDDED_ENTITY_VALUE3, LIST_VALUE, LONG_VALUE, DOUBLE_VALUE,
+ BOOLEAN_VALUE, DATE_AND_TIME_VALUE, BLOB_VALUE, RAW_VALUE, DATASTORE_EXCEPTION, options,
+ otherOptions};
}
- private T serializeAndDeserialize(T obj)
- throws IOException, ClassNotFoundException {
- ByteArrayOutputStream bytes = new ByteArrayOutputStream();
- try (ObjectOutputStream output = new ObjectOutputStream(bytes)) {
- output.writeObject(obj);
- }
- try (ObjectInputStream input =
- new ObjectInputStream(new ByteArrayInputStream(bytes.toByteArray()))) {
- @SuppressWarnings("unchecked")
- T result = (T) input.readObject();
- return result;
- }
+ @Override
+ protected Restorable>[] restorableObjects() {
+ return null;
}
}
diff --git a/gcloud-java-resourcemanager/pom.xml b/gcloud-java-resourcemanager/pom.xml
index c10691d3b07d..c0c48af48f1e 100644
--- a/gcloud-java-resourcemanager/pom.xml
+++ b/gcloud-java-resourcemanager/pom.xml
@@ -33,6 +33,13 @@
+
+ ${project.groupId}
+ gcloud-java-core
+ ${project.version}
+ test-jar
+ test
+
junit
junit
diff --git a/gcloud-java-resourcemanager/src/test/java/com/google/gcloud/resourcemanager/SerializationTest.java b/gcloud-java-resourcemanager/src/test/java/com/google/gcloud/resourcemanager/SerializationTest.java
index f71f5d7989d6..c6e907da16a0 100644
--- a/gcloud-java-resourcemanager/src/test/java/com/google/gcloud/resourcemanager/SerializationTest.java
+++ b/gcloud-java-resourcemanager/src/test/java/com/google/gcloud/resourcemanager/SerializationTest.java
@@ -16,26 +16,17 @@
package com.google.gcloud.resourcemanager;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotSame;
-
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
+import com.google.gcloud.BaseSerializationTest;
import com.google.gcloud.Identity;
import com.google.gcloud.PageImpl;
-import com.google.gcloud.RetryParams;
-
-import org.junit.Test;
+import com.google.gcloud.Restorable;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Collections;
-public class SerializationTest {
+public class SerializationTest extends BaseSerializationTest {
private static final ResourceManager RESOURCE_MANAGER =
ResourceManagerOptions.defaultInstance().service();
@@ -58,42 +49,22 @@ public class SerializationTest {
private static final Policy POLICY = Policy.builder()
.addBinding(Policy.Role.viewer(), ImmutableSet.of(Identity.user("abc@gmail.com")))
.build();
+ private static final ResourceManagerException RESOURCE_MANAGER_EXCEPTION =
+ new ResourceManagerException(42, "message");
- @Test
- public void testServiceOptions() throws Exception {
+ @Override
+ protected Serializable[] serializableObjects() {
ResourceManagerOptions options = ResourceManagerOptions.builder().build();
- ResourceManagerOptions serializedCopy = serializeAndDeserialize(options);
- assertEquals(options, serializedCopy);
- options = options.toBuilder()
+ ResourceManagerOptions otherOptions = options.toBuilder()
.projectId("some-unnecessary-project-ID")
- .retryParams(RetryParams.defaultInstance())
.build();
- serializedCopy = serializeAndDeserialize(options);
- assertEquals(options, serializedCopy);
- }
-
- @Test
- public void testModelAndRequests() throws Exception {
- Serializable[] objects = {PARTIAL_PROJECT_INFO, FULL_PROJECT_INFO, PROJECT, PAGE_RESULT,
- PROJECT_GET_OPTION, PROJECT_LIST_OPTION, POLICY};
- for (Serializable obj : objects) {
- Object copy = serializeAndDeserialize(obj);
- assertEquals(obj, obj);
- assertEquals(obj, copy);
- assertNotSame(obj, copy);
- assertEquals(copy, copy);
- }
+ return new Serializable[]{PARTIAL_PROJECT_INFO, FULL_PROJECT_INFO, PROJECT, PAGE_RESULT,
+ PROJECT_GET_OPTION, PROJECT_LIST_OPTION, POLICY, RESOURCE_MANAGER_EXCEPTION, options,
+ otherOptions};
}
- @SuppressWarnings("unchecked")
- private T serializeAndDeserialize(T obj) throws IOException, ClassNotFoundException {
- ByteArrayOutputStream bytes = new ByteArrayOutputStream();
- try (ObjectOutputStream output = new ObjectOutputStream(bytes)) {
- output.writeObject(obj);
- }
- try (ObjectInputStream input =
- new ObjectInputStream(new ByteArrayInputStream(bytes.toByteArray()))) {
- return (T) input.readObject();
- }
+ @Override
+ protected Restorable>[] restorableObjects() {
+ return null;
}
}
diff --git a/gcloud-java-storage/pom.xml b/gcloud-java-storage/pom.xml
index d5f0f6d98660..16427d50de3a 100644
--- a/gcloud-java-storage/pom.xml
+++ b/gcloud-java-storage/pom.xml
@@ -37,6 +37,13 @@
+
+ ${project.groupId}
+ gcloud-java-core
+ ${project.version}
+ test-jar
+ test
+
junit
junit
diff --git a/gcloud-java-storage/src/test/java/com/google/gcloud/storage/SerializationTest.java b/gcloud-java-storage/src/test/java/com/google/gcloud/storage/SerializationTest.java
index efa56d9e39b2..613cb81c3549 100644
--- a/gcloud-java-storage/src/test/java/com/google/gcloud/storage/SerializationTest.java
+++ b/gcloud-java-storage/src/test/java/com/google/gcloud/storage/SerializationTest.java
@@ -16,31 +16,20 @@
package com.google.gcloud.storage;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotSame;
-
import com.google.common.collect.ImmutableMap;
import com.google.gcloud.AuthCredentials;
+import com.google.gcloud.BaseSerializationTest;
import com.google.gcloud.PageImpl;
import com.google.gcloud.ReadChannel;
-import com.google.gcloud.RestorableState;
-import com.google.gcloud.RetryParams;
-import com.google.gcloud.WriteChannel;
+import com.google.gcloud.Restorable;
import com.google.gcloud.storage.Acl.Project.ProjectRole;
import com.google.gcloud.storage.spi.StorageRpc;
-import org.junit.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Collections;
import java.util.Map;
-public class SerializationTest {
+public class SerializationTest extends BaseSerializationTest {
private static final Storage STORAGE = StorageOptions.builder().projectId("p").build().service();
private static final Acl.Domain ACL_DOMAIN = new Acl.Domain("domain");
@@ -63,6 +52,7 @@ public class SerializationTest {
Collections.>emptyList());
private static final PageImpl PAGE_RESULT =
new PageImpl<>(null, "c", Collections.singletonList(BLOB));
+ private static final StorageException STORAGE_EXCEPTION = new StorageException(42, "message");
private static final Storage.BlobListOption BLOB_LIST_OPTIONS =
Storage.BlobListOption.pageSize(100);
private static final Storage.BlobSourceOption BLOB_SOURCE_OPTIONS =
@@ -77,82 +67,32 @@ public class SerializationTest {
Storage.BucketTargetOption.metagenerationNotMatch();
private static final Map EMPTY_RPC_OPTIONS = ImmutableMap.of();
- @Test
- public void testServiceOptions() throws Exception {
+ @Override
+ protected Serializable[] serializableObjects() {
StorageOptions options = StorageOptions.builder()
.projectId("p1")
.authCredentials(AuthCredentials.createForAppEngine())
.build();
- StorageOptions serializedCopy = serializeAndDeserialize(options);
- assertEquals(options, serializedCopy);
-
- options = options.toBuilder()
+ StorageOptions otherOptions = options.toBuilder()
.projectId("p2")
- .retryParams(RetryParams.defaultInstance())
.authCredentials(null)
.build();
- serializedCopy = serializeAndDeserialize(options);
- assertEquals(options, serializedCopy);
- }
-
- @Test
- public void testModelAndRequests() throws Exception {
- Serializable[] objects = {ACL_DOMAIN, ACL_GROUP, ACL_PROJECT_, ACL_USER, ACL_RAW, ACL,
+ return new Serializable[]{ACL_DOMAIN, ACL_GROUP, ACL_PROJECT_, ACL_USER, ACL_RAW, ACL,
BLOB_INFO, BLOB, BUCKET_INFO, BUCKET, ORIGIN, CORS, BATCH_REQUEST, BATCH_RESPONSE,
PAGE_RESULT, BLOB_LIST_OPTIONS, BLOB_SOURCE_OPTIONS, BLOB_TARGET_OPTIONS,
- BUCKET_LIST_OPTIONS, BUCKET_SOURCE_OPTIONS, BUCKET_TARGET_OPTIONS};
- for (Serializable obj : objects) {
- Object copy = serializeAndDeserialize(obj);
- assertEquals(obj, obj);
- assertEquals(obj, copy);
- assertNotSame(obj, copy);
- assertEquals(copy, copy);
- }
+ BUCKET_LIST_OPTIONS, BUCKET_SOURCE_OPTIONS, BUCKET_TARGET_OPTIONS, STORAGE_EXCEPTION,
+ options, otherOptions};
}
- @Test
- public void testReadChannelState() throws IOException, ClassNotFoundException {
- StorageOptions options = StorageOptions.builder()
- .projectId("p2")
- .retryParams(RetryParams.defaultInstance())
- .build();
+ @Override
+ protected Restorable>[] restorableObjects() {
+ StorageOptions options = StorageOptions.builder().projectId("p2").build();
ReadChannel reader =
new BlobReadChannel(options, BlobId.of("b", "n"), EMPTY_RPC_OPTIONS);
- RestorableState state = reader.capture();
- RestorableState deserializedState = serializeAndDeserialize(state);
- assertEquals(state, deserializedState);
- assertEquals(state.hashCode(), deserializedState.hashCode());
- assertEquals(state.toString(), deserializedState.toString());
- reader.close();
- }
-
- @Test
- public void testWriteChannelState() throws IOException, ClassNotFoundException {
- StorageOptions options = StorageOptions.builder()
- .projectId("p2")
- .retryParams(RetryParams.defaultInstance())
- .build();
// avoid closing when you don't want partial writes to GCS upon failure
@SuppressWarnings("resource")
BlobWriteChannel writer =
new BlobWriteChannel(options, BlobInfo.builder(BlobId.of("b", "n")).build(), "upload-id");
- RestorableState state = writer.capture();
- RestorableState deserializedState = serializeAndDeserialize(state);
- assertEquals(state, deserializedState);
- assertEquals(state.hashCode(), deserializedState.hashCode());
- assertEquals(state.toString(), deserializedState.toString());
- }
-
- @SuppressWarnings("unchecked")
- private T serializeAndDeserialize(T obj)
- throws IOException, ClassNotFoundException {
- ByteArrayOutputStream bytes = new ByteArrayOutputStream();
- try (ObjectOutputStream output = new ObjectOutputStream(bytes)) {
- output.writeObject(obj);
- }
- try (ObjectInputStream input =
- new ObjectInputStream(new ByteArrayInputStream(bytes.toByteArray()))) {
- return (T) input.readObject();
- }
+ return new Restorable>[]{reader, writer};
}
}
diff --git a/pom.xml b/pom.xml
index b7766ac0e5c6..1abfb094ffb8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -215,6 +215,13 @@
+
+
+
+ test-jar
+
+
+
maven-compiler-plugin