diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/ConditionalRowMutation.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/ConditionalRowMutation.java index 65c06c932c1f..d52418747ef2 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/ConditionalRowMutation.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/ConditionalRowMutation.java @@ -22,12 +22,19 @@ import com.google.cloud.bigtable.data.v2.models.Filters.Filter; import com.google.common.base.Preconditions; import com.google.protobuf.ByteString; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; import javax.annotation.Nonnull; /** Mutates a row atomically based on the output of a condition filter. */ -public final class ConditionalRowMutation { +public final class ConditionalRowMutation implements Serializable { + private static final long serialVersionUID = -3699904745621909502L; + private final String tableId; - private final CheckAndMutateRowRequest.Builder builder = CheckAndMutateRowRequest.newBuilder(); + private transient CheckAndMutateRowRequest.Builder builder = + CheckAndMutateRowRequest.newBuilder(); private ConditionalRowMutation(String tableId, ByteString rowKey) { this.tableId = tableId; @@ -46,6 +53,16 @@ public static ConditionalRowMutation create(String tableId, ByteString rowKey) { return new ConditionalRowMutation(tableId, rowKey); } + private void readObject(ObjectInputStream input) throws IOException, ClassNotFoundException { + input.defaultReadObject(); + builder = CheckAndMutateRowRequest.newBuilder().mergeFrom(input); + } + + private void writeObject(ObjectOutputStream output) throws IOException { + output.defaultWriteObject(); + builder.build().writeTo(output); + } + /** * The filter to be applied to the contents of the specified row. Depending on whether or not any * results are yielded, either the mutations added via {@link #then(Mutation)} or {@link diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Filters.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Filters.java index 57c9750c37f2..6ada09391bb4 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Filters.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Filters.java @@ -25,6 +25,7 @@ import com.google.cloud.bigtable.data.v2.models.Range.AbstractTimestampRange; import com.google.common.base.Preconditions; import com.google.protobuf.ByteString; +import java.io.Serializable; import javax.annotation.Nonnull; /** @@ -458,7 +459,7 @@ public QualifierRangeFilter rangeWithinFamily(@Nonnull String family) { /** Matches only cells from columns within the given range. */ public static final class QualifierRangeFilter - extends AbstractByteStringRange implements Filter { + extends AbstractByteStringRange implements Filter, Serializable { private final String family; private QualifierRangeFilter(String family) { @@ -519,7 +520,7 @@ public TimestampRangeFilter range() { /** Matches only cells with microsecond timestamps within the given range. */ public static final class TimestampRangeFilter - extends AbstractTimestampRange implements Filter { + extends AbstractTimestampRange implements Filter, Serializable { private TimestampRangeFilter() {} @InternalApi @@ -618,7 +619,7 @@ public Filter strip() { /** Matches only cells with values that fall within the given value range. */ public static final class ValueRangeFilter extends AbstractByteStringRange - implements Filter { + implements Filter, Serializable { private ValueRangeFilter() {} @InternalApi diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/KeyOffset.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/KeyOffset.java index 69cfd77c9abd..57b11594ecd5 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/KeyOffset.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/KeyOffset.java @@ -16,12 +16,15 @@ package com.google.cloud.bigtable.data.v2.models; import com.google.api.core.InternalApi; +import com.google.api.core.InternalExtensionOnly; import com.google.auto.value.AutoValue; import com.google.protobuf.ByteString; +import java.io.Serializable; /** Represents the offset of a row key in a table. */ +@InternalExtensionOnly @AutoValue -public abstract class KeyOffset { +public abstract class KeyOffset implements Serializable { @InternalApi public static KeyOffset create(ByteString key, long offsetBytes) { return new AutoValue_KeyOffset(key, offsetBytes); diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Mutation.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Mutation.java index e0ec38e0e178..fde6a5f4e49e 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Mutation.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Mutation.java @@ -23,6 +23,10 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.protobuf.ByteString; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; import java.util.List; import javax.annotation.Nonnull; @@ -31,8 +35,10 @@ * list of mutations. It used by {@link RowMutation} and {@link ConditionalRowMutation} to * encapsulate a list of mutations that will to be applied to a single row. */ -public final class Mutation implements MutationApi { - private final ImmutableList.Builder mutations = +public final class Mutation implements MutationApi, Serializable { + private static final long serialVersionUID = 5893216644683374339L; + + private transient ImmutableList.Builder mutations = ImmutableList.builder(); public static Mutation create() { @@ -41,6 +47,20 @@ public static Mutation create() { private Mutation() {} + private void readObject(ObjectInputStream input) throws IOException, ClassNotFoundException { + input.defaultReadObject(); + + @SuppressWarnings("unchecked") + ImmutableList deserialized = + (ImmutableList) input.readObject(); + this.mutations = ImmutableList.builder().addAll(deserialized); + } + + private void writeObject(ObjectOutputStream output) throws IOException { + output.defaultWriteObject(); + output.writeObject(mutations.build()); + } + @Override public Mutation setCell( @Nonnull String familyName, @Nonnull String qualifier, @Nonnull String value) { diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/MutationApi.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/MutationApi.java index 27b54fdd3ac4..b49ee2a7b0ca 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/MutationApi.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/MutationApi.java @@ -15,11 +15,13 @@ */ package com.google.cloud.bigtable.data.v2.models; +import com.google.api.core.InternalExtensionOnly; import com.google.cloud.bigtable.data.v2.models.Range.TimestampRange; import com.google.protobuf.ByteString; import javax.annotation.Nonnull; /** The API for creating mutations for a single row. */ +@InternalExtensionOnly public interface MutationApi> { /** * Adds a mutation which sets the value of the specified cell. diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Query.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Query.java index adeebea42285..f7b734f167e1 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Query.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Query.java @@ -23,11 +23,17 @@ import com.google.cloud.bigtable.data.v2.models.Range.ByteStringRange; import com.google.common.base.Preconditions; import com.google.protobuf.ByteString; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; /** A simple wrapper to construct a query for the ReadRows RPC. */ -public class Query { +public final class Query implements Serializable { + private static final long serialVersionUID = -316972783499434755L; + private final String tableId; - private final ReadRowsRequest.Builder builder = ReadRowsRequest.newBuilder(); + private transient ReadRowsRequest.Builder builder = ReadRowsRequest.newBuilder(); /** * Constructs a new Query object for the specified table id. The table id will be combined with @@ -42,6 +48,16 @@ private Query(String tableId) { this.tableId = tableId; } + private void readObject(ObjectInputStream input) throws IOException, ClassNotFoundException { + input.defaultReadObject(); + builder = ReadRowsRequest.newBuilder().mergeFrom(input); + } + + private void writeObject(ObjectOutputStream output) throws IOException { + output.defaultWriteObject(); + builder.build().writeTo(output); + } + /** Adds a key to looked up */ public Query rowKey(String key) { Preconditions.checkNotNull(key, "Key can't be null."); diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Range.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Range.java index 6c67cc0c7370..733f7be92426 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Range.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Range.java @@ -20,6 +20,10 @@ import com.google.common.base.Preconditions; import com.google.protobuf.ByteString; import com.google.protobuf.UnsafeByteOperations; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; import javax.annotation.Nonnull; /** @@ -44,7 +48,7 @@ * } */ @InternalExtensionOnly -public abstract class Range> { +public abstract class Range> implements Serializable { public enum BoundType { OPEN, CLOSED, @@ -179,6 +183,7 @@ protected R clone() { * Abstract specialization of a {@link Range} for {@link ByteString}s. Allows for easy interop * with simple Strings. */ + @InternalExtensionOnly abstract static class AbstractByteStringRange> extends Range implements Cloneable { AbstractByteStringRange() { @@ -274,7 +279,10 @@ static ByteString wrap(String str) { } /** Concrete Range for timestamps */ - public static final class TimestampRange extends AbstractTimestampRange { + public static final class TimestampRange extends AbstractTimestampRange + implements Serializable { + private static final long serialVersionUID = 198219379354720855L; + public static TimestampRange unbounded() { return new TimestampRange(BoundType.UNBOUNDED, null, BoundType.UNBOUNDED, null); } @@ -320,7 +328,10 @@ public int hashCode() { } /** Concrete Range for ByteStrings */ - public static final class ByteStringRange extends AbstractByteStringRange { + public static final class ByteStringRange extends AbstractByteStringRange + implements Serializable { + private static final long serialVersionUID = 2199230324202930550L; + public static ByteStringRange prefix(String prefix) { return prefix(ByteString.copyFromUtf8(prefix)); } @@ -377,6 +388,14 @@ private ByteStringRange( super(startBound, start, endBound, end); } + private void readObject(ObjectInputStream input) throws IOException, ClassNotFoundException { + input.defaultReadObject(); + } + + private void writeObject(ObjectOutputStream output) throws IOException { + output.defaultWriteObject(); + } + @Override public boolean equals(Object o) { if (this == o) { diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/ReadModifyWriteRow.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/ReadModifyWriteRow.java index fea708bde936..9e04b14ad255 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/ReadModifyWriteRow.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/ReadModifyWriteRow.java @@ -22,12 +22,19 @@ import com.google.cloud.bigtable.data.v2.internal.RequestContext; import com.google.common.base.Preconditions; import com.google.protobuf.ByteString; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; import javax.annotation.Nonnull; /** Wraps a {@link ReadModifyWriteRowRequest}. */ -public final class ReadModifyWriteRow { +public final class ReadModifyWriteRow implements Serializable { + private static final long serialVersionUID = -8150045424541029193L; + private final String tableId; - private final ReadModifyWriteRowRequest.Builder builder = ReadModifyWriteRowRequest.newBuilder(); + private transient ReadModifyWriteRowRequest.Builder builder = + ReadModifyWriteRowRequest.newBuilder(); private ReadModifyWriteRow(@Nonnull String tableId, @Nonnull ByteString key) { Preconditions.checkNotNull(tableId, "tableId can't be null."); @@ -46,6 +53,16 @@ public static ReadModifyWriteRow create(@Nonnull String tableId, @Nonnull ByteSt return new ReadModifyWriteRow(tableId, key); } + private void readObject(ObjectInputStream input) throws IOException, ClassNotFoundException { + input.defaultReadObject(); + builder = ReadModifyWriteRowRequest.newBuilder().mergeFrom(input); + } + + private void writeObject(ObjectOutputStream output) throws IOException { + output.defaultWriteObject(); + builder.build().writeTo(output); + } + /** * Appends the value to the existing value of the cell. If the targeted cell is unset, it will be * treated as containing the empty string. diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Row.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Row.java index d86560996dc4..a4ea6893548f 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Row.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/Row.java @@ -15,17 +15,18 @@ */ package com.google.cloud.bigtable.data.v2.models; -import com.google.api.core.BetaApi; import com.google.api.core.InternalApi; +import com.google.api.core.InternalExtensionOnly; import com.google.auto.value.AutoValue; import com.google.protobuf.ByteString; +import java.io.Serializable; import java.util.List; import javax.annotation.Nonnull; /** Default representation of a logical row. */ -@BetaApi +@InternalExtensionOnly @AutoValue -public abstract class Row implements Comparable { +public abstract class Row implements Comparable, Serializable { /** Creates a new instance of the {@link Row}. */ @InternalApi public static Row create(ByteString key, List cells) { diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/RowCell.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/RowCell.java index bdd4eb751851..28f19c59e4b7 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/RowCell.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/RowCell.java @@ -16,15 +16,17 @@ package com.google.cloud.bigtable.data.v2.models; import com.google.api.core.InternalApi; +import com.google.api.core.InternalExtensionOnly; import com.google.auto.value.AutoValue; import com.google.protobuf.ByteString; +import java.io.Serializable; import java.util.List; import javax.annotation.Nonnull; -import javax.annotation.Nullable; /** Default representation of a cell in a {@link Row}. */ +@InternalExtensionOnly @AutoValue -public abstract class RowCell { +public abstract class RowCell implements Serializable { /** Creates a new instance of the {@link RowCell}. */ @InternalApi public static RowCell create( diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/RowMutation.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/RowMutation.java index aa5d48950b52..5bd88e55332a 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/RowMutation.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/models/RowMutation.java @@ -23,13 +23,16 @@ import com.google.cloud.bigtable.data.v2.internal.RequestContext; import com.google.cloud.bigtable.data.v2.models.Range.TimestampRange; import com.google.protobuf.ByteString; +import java.io.Serializable; import javax.annotation.Nonnull; /** * Represents a list of mutations targeted at a single row. It's meant to be used as an parameter * for {@link com.google.cloud.bigtable.data.v2.BigtableDataClient#mutateRowAsync(RowMutation)}. */ -public final class RowMutation implements MutationApi { +public final class RowMutation implements MutationApi, Serializable { + private static final long serialVersionUID = 6529002234913236318L; + private final String tableId; private final ByteString key; private final Mutation mutation; diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/package-info.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/package-info.java index c7013607ab5e..16543e386b22 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/package-info.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/package-info.java @@ -22,7 +22,8 @@ * raw GRPC stubs. * * @see com.google.cloud.bigtable.data.v2.BigtableDataClient For the data client. - * @see com.google.cloud.bigtable.admin.v2.BigtableInstanceAdminClient For instance instance admin client. + * @see com.google.cloud.bigtable.admin.v2.BigtableInstanceAdminClient For instance instance admin + * client. * @see com.google.cloud.bigtable.admin.v2.BigtableTableAdminClient For table admin client. */ package com.google.cloud.bigtable; diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/ConditionalRowMutationTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/ConditionalRowMutationTest.java index d2407c76ec30..dfdad7548bf7 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/ConditionalRowMutationTest.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/ConditionalRowMutationTest.java @@ -17,13 +17,17 @@ import static com.google.common.truth.Truth.assertThat; -import com.google.cloud.bigtable.data.v2.models.InstanceName; import com.google.bigtable.v2.CheckAndMutateRowRequest; import com.google.bigtable.v2.Mutation.DeleteFromColumn; import com.google.bigtable.v2.RowFilter; import com.google.bigtable.v2.TableName; import com.google.cloud.bigtable.data.v2.internal.RequestContext; import com.google.protobuf.ByteString; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -141,4 +145,23 @@ public void noEffectClausesTest() { assertThat(actualError).isInstanceOf(IllegalStateException.class); } + + @Test + public void serializationTest() throws IOException, ClassNotFoundException { + ConditionalRowMutation expected = + ConditionalRowMutation.create(TABLE_ID, TEST_KEY) + .condition(Filters.FILTERS.pass()) + .then(Mutation.create().deleteRow()) + .otherwise(Mutation.create().deleteFamily("cf")); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(expected); + oos.close(); + + ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())); + + ConditionalRowMutation actual = (ConditionalRowMutation) ois.readObject(); + assertThat(actual.toProto(REQUEST_CONTEXT)).isEqualTo(expected.toProto(REQUEST_CONTEXT)); + } } diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/MutationTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/MutationTest.java index a1d38d34184f..f6a9954d3aaa 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/MutationTest.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/MutationTest.java @@ -22,6 +22,11 @@ import com.google.bigtable.v2.Mutation.DeleteFromRow; import com.google.cloud.bigtable.data.v2.models.Range.TimestampRange; import com.google.protobuf.ByteString; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.util.List; import org.junit.Before; import org.junit.Test; @@ -156,4 +161,19 @@ public void deleteRowTest() { .setDeleteFromRow(DeleteFromRow.newBuilder()) .build()); } + + @Test + public void serializationTest() throws IOException, ClassNotFoundException { + Mutation expected = Mutation.create().setCell("cf", "q", "val"); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(expected); + oos.close(); + + ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())); + + Mutation actual = (Mutation) ois.readObject(); + assertThat(actual.getMutations()).isEqualTo(expected.getMutations()); + } } diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/QueryTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/QueryTest.java index 057ac662f819..c9e79d06af3f 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/QueryTest.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/QueryTest.java @@ -18,7 +18,6 @@ import static com.google.cloud.bigtable.data.v2.models.Filters.FILTERS; import static com.google.common.truth.Truth.assertThat; -import com.google.cloud.bigtable.data.v2.models.InstanceName; import com.google.bigtable.v2.ReadRowsRequest; import com.google.bigtable.v2.ReadRowsRequest.Builder; import com.google.bigtable.v2.RowFilter; @@ -27,6 +26,11 @@ import com.google.cloud.bigtable.data.v2.internal.RequestContext; import com.google.cloud.bigtable.data.v2.models.Range.ByteStringRange; import com.google.protobuf.ByteString; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -121,6 +125,21 @@ public void limitTest() { assertThat(actualProto).isEqualTo(expectedProto.build()); } + @Test + public void serializationTest() throws IOException, ClassNotFoundException { + Query expected = Query.create(TABLE_NAME.getTable()).filter(FILTERS.key().regex(".*")); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(expected); + oos.close(); + + ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())); + + Query actual = (Query) ois.readObject(); + assertThat(actual.toProto(requestContext)).isEqualTo(expected.toProto(requestContext)); + } + private static ReadRowsRequest.Builder expectedProtoBuilder() { return ReadRowsRequest.newBuilder() .setTableName(TABLE_NAME.toString()) diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/RangeTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/RangeTest.java index 3708ec7f79c8..eebdba5811c7 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/RangeTest.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/RangeTest.java @@ -21,6 +21,11 @@ import com.google.cloud.bigtable.data.v2.models.Range.ByteStringRange; import com.google.cloud.bigtable.data.v2.models.Range.TimestampRange; import com.google.protobuf.ByteString; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -112,6 +117,21 @@ public void timestampEqualsTest() { assertThat(r1).isNotEqualTo(r3); } + @Test + public void timestampSerializationTest() throws IOException, ClassNotFoundException { + TimestampRange expected = TimestampRange.create(10, 20); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(expected); + oos.close(); + + ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())); + + TimestampRange actual = (TimestampRange) ois.readObject(); + assertThat(actual).isEqualTo(expected); + } + @Test public void byteStringUnboundedTest() { ByteStringRange range = ByteStringRange.unbounded(); @@ -271,4 +291,19 @@ public void byteStringEqualsTest() { assertThat(r2).isEqualTo(r1); assertThat(r1).isNotEqualTo(r3); } + + @Test + public void byteStringSerializationTest() throws IOException, ClassNotFoundException { + ByteStringRange expected = ByteStringRange.create("a", "z"); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(expected); + oos.close(); + + ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())); + + ByteStringRange actual = (ByteStringRange) ois.readObject(); + assertThat(actual).isEqualTo(expected); + } } diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/ReadModifyWriteRowTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/ReadModifyWriteRowTest.java index 5c4dfc618205..7d6d8563d093 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/ReadModifyWriteRowTest.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/ReadModifyWriteRowTest.java @@ -17,12 +17,16 @@ import static com.google.common.truth.Truth.assertThat; -import com.google.cloud.bigtable.data.v2.models.InstanceName; import com.google.bigtable.v2.ReadModifyWriteRowRequest; import com.google.bigtable.v2.ReadModifyWriteRule; import com.google.bigtable.v2.TableName; import com.google.cloud.bigtable.data.v2.internal.RequestContext; import com.google.protobuf.ByteString; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import org.junit.Test; public class ReadModifyWriteRowTest { @@ -92,4 +96,22 @@ public void testIncrement() { .setIncrementAmount(2)) .build()); } + + @Test + public void serializationTest() throws IOException, ClassNotFoundException { + ReadModifyWriteRow expected = + ReadModifyWriteRow.create(TABLE_NAME.getTable(), "fake-key") + .increment("fake-family", ByteString.copyFromUtf8("fake-qualifier"), 1) + .append("fake-family", "a", "b"); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(expected); + oos.close(); + + ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())); + + ReadModifyWriteRow actual = (ReadModifyWriteRow) ois.readObject(); + assertThat(actual.toProto(REQUEST_CONTEXT)).isEqualTo(expected.toProto(REQUEST_CONTEXT)); + } } diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/RowMutationTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/RowMutationTest.java index 416a17c9c8e5..080459de83ba 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/RowMutationTest.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/RowMutationTest.java @@ -17,12 +17,16 @@ import static com.google.common.truth.Truth.assertThat; -import com.google.cloud.bigtable.data.v2.models.InstanceName; import com.google.bigtable.v2.MutateRowRequest; import com.google.bigtable.v2.MutateRowsRequest; import com.google.bigtable.v2.TableName; import com.google.cloud.bigtable.data.v2.internal.RequestContext; import com.google.protobuf.ByteString; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -85,4 +89,21 @@ public void toBulkProtoTest() { assertThat(actualRowMutation.getEntries(0).getMutations(0).getSetCell().getTimestampMicros()) .isIn(timestampRange); } + + @Test + public void serializationTest() throws IOException, ClassNotFoundException { + RowMutation expected = + RowMutation.create("fake-table", "fake-key") + .setCell("fake-family", "fake-qualifier", 10_000, "fake-value"); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(expected); + oos.close(); + + ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())); + + RowMutation actual = (RowMutation) ois.readObject(); + assertThat(actual.toProto(REQUEST_CONTEXT)).isEqualTo(expected.toProto(REQUEST_CONTEXT)); + } } diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/RowTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/RowTest.java index bab1a429cf9f..19bad91456bc 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/RowTest.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/models/RowTest.java @@ -19,6 +19,11 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.ByteString; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -65,4 +70,26 @@ public void compareTest() { // Comparator only cares about row keys assertThat(row2).isEquivalentAccordingToCompareTo(row2b); } + + @Test + public void serializationTest() throws IOException, ClassNotFoundException { + Row expected = + Row.create( + ByteString.copyFromUtf8("key1"), + ImmutableList.of( + RowCell.create( + "family", + ByteString.EMPTY, + 1000, + ImmutableList.of(), + ByteString.copyFromUtf8("value")))); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(expected); + oos.close(); + + ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())); + assertThat(ois.readObject()).isEqualTo(expected); + } }