| /** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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 org.apache.hadoop.hbase.protobuf; |
| |
| import static org.junit.Assert.assertEquals; |
| |
| import java.io.IOException; |
| |
| import org.apache.hadoop.hbase.SmallTests; |
| import org.apache.hadoop.hbase.client.Append; |
| import org.apache.hadoop.hbase.client.Delete; |
| import org.apache.hadoop.hbase.client.Get; |
| import org.apache.hadoop.hbase.client.Increment; |
| import org.apache.hadoop.hbase.client.Put; |
| import org.apache.hadoop.hbase.client.Scan; |
| import org.apache.hadoop.hbase.client.coprocessor.Exec; |
| import org.apache.hadoop.hbase.coprocessor.ColumnAggregationEndpoint; |
| import org.apache.hadoop.hbase.protobuf.generated.ClientProtos; |
| import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.Column; |
| import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.Mutate; |
| import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.Mutate.ColumnValue; |
| import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.Mutate.ColumnValue.QualifierValue; |
| import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.Mutate.DeleteType; |
| import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.Mutate.MutateType; |
| import org.apache.hadoop.hbase.util.Bytes; |
| import org.junit.Test; |
| import org.junit.experimental.categories.Category; |
| |
| import com.google.protobuf.ByteString; |
| |
| /** |
| * Class to test ProtobufUtil. |
| */ |
| @Category(SmallTests.class) |
| public class TestProtobufUtil { |
| |
| /** |
| * Test basic Get conversions. |
| * |
| * @throws IOException |
| */ |
| @Test |
| public void testGet() throws IOException { |
| ClientProtos.Get.Builder getBuilder = ClientProtos.Get.newBuilder(); |
| getBuilder.setRow(ByteString.copyFromUtf8("row")); |
| Column.Builder columnBuilder = Column.newBuilder(); |
| columnBuilder.setFamily(ByteString.copyFromUtf8("f1")); |
| columnBuilder.addQualifier(ByteString.copyFromUtf8("c1")); |
| columnBuilder.addQualifier(ByteString.copyFromUtf8("c2")); |
| getBuilder.addColumn(columnBuilder.build()); |
| |
| columnBuilder.clear(); |
| columnBuilder.setFamily(ByteString.copyFromUtf8("f2")); |
| getBuilder.addColumn(columnBuilder.build()); |
| |
| ClientProtos.Get proto = getBuilder.build(); |
| // default fields |
| assertEquals(1, proto.getMaxVersions()); |
| assertEquals(true, proto.getCacheBlocks()); |
| |
| // set the default value for equal comparison |
| getBuilder = ClientProtos.Get.newBuilder(proto); |
| getBuilder.setMaxVersions(1); |
| getBuilder.setCacheBlocks(true); |
| |
| Get get = ProtobufUtil.toGet(proto); |
| assertEquals(getBuilder.build(), ProtobufUtil.toGet(get)); |
| } |
| |
| /** |
| * Test Append Mutate conversions. |
| * |
| * @throws IOException |
| */ |
| @Test |
| public void testAppend() throws IOException { |
| Mutate.Builder mutateBuilder = Mutate.newBuilder(); |
| mutateBuilder.setRow(ByteString.copyFromUtf8("row")); |
| mutateBuilder.setMutateType(MutateType.APPEND); |
| mutateBuilder.setTimestamp(111111); |
| ColumnValue.Builder valueBuilder = ColumnValue.newBuilder(); |
| valueBuilder.setFamily(ByteString.copyFromUtf8("f1")); |
| QualifierValue.Builder qualifierBuilder = QualifierValue.newBuilder(); |
| qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c1")); |
| qualifierBuilder.setValue(ByteString.copyFromUtf8("v1")); |
| valueBuilder.addQualifierValue(qualifierBuilder.build()); |
| qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c2")); |
| qualifierBuilder.setValue(ByteString.copyFromUtf8("v2")); |
| valueBuilder.addQualifierValue(qualifierBuilder.build()); |
| mutateBuilder.addColumnValue(valueBuilder.build()); |
| |
| Mutate proto = mutateBuilder.build(); |
| // default fields |
| assertEquals(true, proto.getWriteToWAL()); |
| |
| // set the default value for equal comparison |
| mutateBuilder = Mutate.newBuilder(proto); |
| mutateBuilder.setWriteToWAL(true); |
| |
| Append append = ProtobufUtil.toAppend(proto); |
| |
| // append always use the latest timestamp, |
| // add the timestamp to the original mutate |
| long timestamp = append.getTimeStamp(); |
| mutateBuilder.setTimestamp(timestamp); |
| for (ColumnValue.Builder column: |
| mutateBuilder.getColumnValueBuilderList()) { |
| for (QualifierValue.Builder qualifier: |
| column.getQualifierValueBuilderList()) { |
| qualifier.setTimestamp(timestamp); |
| } |
| } |
| assertEquals(mutateBuilder.build(), |
| ProtobufUtil.toMutate(MutateType.APPEND, append)); |
| } |
| |
| /** |
| * Test Delete Mutate conversions. |
| * |
| * @throws IOException |
| */ |
| @Test |
| public void testDelete() throws IOException { |
| Mutate.Builder mutateBuilder = Mutate.newBuilder(); |
| mutateBuilder.setRow(ByteString.copyFromUtf8("row")); |
| mutateBuilder.setMutateType(MutateType.DELETE); |
| mutateBuilder.setTimestamp(111111); |
| ColumnValue.Builder valueBuilder = ColumnValue.newBuilder(); |
| valueBuilder.setFamily(ByteString.copyFromUtf8("f1")); |
| QualifierValue.Builder qualifierBuilder = QualifierValue.newBuilder(); |
| qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c1")); |
| qualifierBuilder.setDeleteType(DeleteType.DELETE_ONE_VERSION); |
| qualifierBuilder.setTimestamp(111222); |
| valueBuilder.addQualifierValue(qualifierBuilder.build()); |
| qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c2")); |
| qualifierBuilder.setDeleteType(DeleteType.DELETE_MULTIPLE_VERSIONS); |
| qualifierBuilder.setTimestamp(111333); |
| valueBuilder.addQualifierValue(qualifierBuilder.build()); |
| mutateBuilder.addColumnValue(valueBuilder.build()); |
| |
| Mutate proto = mutateBuilder.build(); |
| // default fields |
| assertEquals(true, proto.getWriteToWAL()); |
| |
| // set the default value for equal comparison |
| mutateBuilder = Mutate.newBuilder(proto); |
| mutateBuilder.setWriteToWAL(true); |
| |
| Delete delete = ProtobufUtil.toDelete(proto); |
| |
| // delete always have empty value, |
| // add empty value to the original mutate |
| for (ColumnValue.Builder column: |
| mutateBuilder.getColumnValueBuilderList()) { |
| for (QualifierValue.Builder qualifier: |
| column.getQualifierValueBuilderList()) { |
| qualifier.setValue(ByteString.EMPTY); |
| } |
| } |
| assertEquals(mutateBuilder.build(), |
| ProtobufUtil.toMutate(MutateType.DELETE, delete)); |
| } |
| |
| /** |
| * Test Increment Mutate conversions. |
| * |
| * @throws IOException |
| */ |
| @Test |
| public void testIncrement() throws IOException { |
| Mutate.Builder mutateBuilder = Mutate.newBuilder(); |
| mutateBuilder.setRow(ByteString.copyFromUtf8("row")); |
| mutateBuilder.setMutateType(MutateType.INCREMENT); |
| ColumnValue.Builder valueBuilder = ColumnValue.newBuilder(); |
| valueBuilder.setFamily(ByteString.copyFromUtf8("f1")); |
| QualifierValue.Builder qualifierBuilder = QualifierValue.newBuilder(); |
| qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c1")); |
| qualifierBuilder.setValue(ByteString.copyFrom(Bytes.toBytes(11L))); |
| valueBuilder.addQualifierValue(qualifierBuilder.build()); |
| qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c2")); |
| qualifierBuilder.setValue(ByteString.copyFrom(Bytes.toBytes(22L))); |
| valueBuilder.addQualifierValue(qualifierBuilder.build()); |
| mutateBuilder.addColumnValue(valueBuilder.build()); |
| |
| Mutate proto = mutateBuilder.build(); |
| // default fields |
| assertEquals(true, proto.getWriteToWAL()); |
| |
| // set the default value for equal comparison |
| mutateBuilder = Mutate.newBuilder(proto); |
| mutateBuilder.setWriteToWAL(true); |
| |
| Increment increment = ProtobufUtil.toIncrement(proto); |
| assertEquals(mutateBuilder.build(), ProtobufUtil.toMutate(increment)); |
| } |
| |
| /** |
| * Test Put Mutate conversions. |
| * |
| * @throws IOException |
| */ |
| @Test |
| public void testPut() throws IOException { |
| Mutate.Builder mutateBuilder = Mutate.newBuilder(); |
| mutateBuilder.setRow(ByteString.copyFromUtf8("row")); |
| mutateBuilder.setMutateType(MutateType.PUT); |
| mutateBuilder.setTimestamp(111111); |
| ColumnValue.Builder valueBuilder = ColumnValue.newBuilder(); |
| valueBuilder.setFamily(ByteString.copyFromUtf8("f1")); |
| QualifierValue.Builder qualifierBuilder = QualifierValue.newBuilder(); |
| qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c1")); |
| qualifierBuilder.setValue(ByteString.copyFromUtf8("v1")); |
| valueBuilder.addQualifierValue(qualifierBuilder.build()); |
| qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c2")); |
| qualifierBuilder.setValue(ByteString.copyFromUtf8("v2")); |
| qualifierBuilder.setTimestamp(222222); |
| valueBuilder.addQualifierValue(qualifierBuilder.build()); |
| mutateBuilder.addColumnValue(valueBuilder.build()); |
| |
| Mutate proto = mutateBuilder.build(); |
| // default fields |
| assertEquals(true, proto.getWriteToWAL()); |
| |
| // set the default value for equal comparison |
| mutateBuilder = Mutate.newBuilder(proto); |
| mutateBuilder.setWriteToWAL(true); |
| |
| Put put = ProtobufUtil.toPut(proto); |
| |
| // put value always use the default timestamp if no |
| // value level timestamp specified, |
| // add the timestamp to the original mutate |
| long timestamp = put.getTimeStamp(); |
| for (ColumnValue.Builder column: |
| mutateBuilder.getColumnValueBuilderList()) { |
| for (QualifierValue.Builder qualifier: |
| column.getQualifierValueBuilderList()) { |
| if (!qualifier.hasTimestamp()) { |
| qualifier.setTimestamp(timestamp); |
| } |
| } |
| } |
| assertEquals(mutateBuilder.build(), |
| ProtobufUtil.toMutate(MutateType.PUT, put)); |
| } |
| |
| /** |
| * Test basic Scan conversions. |
| * |
| * @throws IOException |
| */ |
| @Test |
| public void testScan() throws IOException { |
| ClientProtos.Scan.Builder scanBuilder = ClientProtos.Scan.newBuilder(); |
| scanBuilder.setStartRow(ByteString.copyFromUtf8("row1")); |
| scanBuilder.setStopRow(ByteString.copyFromUtf8("row2")); |
| Column.Builder columnBuilder = Column.newBuilder(); |
| columnBuilder.setFamily(ByteString.copyFromUtf8("f1")); |
| columnBuilder.addQualifier(ByteString.copyFromUtf8("c1")); |
| columnBuilder.addQualifier(ByteString.copyFromUtf8("c2")); |
| scanBuilder.addColumn(columnBuilder.build()); |
| |
| columnBuilder.clear(); |
| columnBuilder.setFamily(ByteString.copyFromUtf8("f2")); |
| scanBuilder.addColumn(columnBuilder.build()); |
| |
| ClientProtos.Scan proto = scanBuilder.build(); |
| // default fields |
| assertEquals(1, proto.getMaxVersions()); |
| assertEquals(true, proto.getCacheBlocks()); |
| |
| scanBuilder = ClientProtos.Scan.newBuilder(proto); |
| scanBuilder.setMaxVersions(1); |
| scanBuilder.setCacheBlocks(true); |
| |
| Scan scan = ProtobufUtil.toScan(proto); |
| assertEquals(scanBuilder.build(), ProtobufUtil.toScan(scan)); |
| } |
| |
| /** |
| * Test basic Exec conversions. |
| * |
| * @throws IOException |
| */ |
| @Test |
| public void testExec() throws IOException { |
| ClientProtos.Exec.Builder execBuilder = ClientProtos.Exec.newBuilder(); |
| execBuilder.setRow(ByteString.copyFromUtf8("row")); |
| execBuilder.setProtocolName(ColumnAggregationEndpoint.class.getName()); |
| execBuilder.setMethodName("sum"); |
| execBuilder.addParameter(ProtobufUtil.toParameter(Bytes.toBytes("f"))); |
| execBuilder.addParameter(ProtobufUtil.toParameter(Bytes.toBytes("c"))); |
| |
| ClientProtos.Exec proto = execBuilder.build(); |
| Exec exec = ProtobufUtil.toExec(proto); |
| execBuilder = ClientProtos.Exec.newBuilder(ProtobufUtil.toExec(exec)); |
| execBuilder.clearProperty(); // remove properties added by default |
| assertEquals(proto, execBuilder.build()); |
| } |
| } |