View Javadoc

1   /**
2    *
3    * Licensed to the Apache Software Foundation (ASF) under one
4    * or more contributor license agreements.  See the NOTICE file
5    * distributed with this work for additional information
6    * regarding copyright ownership.  The ASF licenses this file
7    * to you under the Apache License, Version 2.0 (the
8    * "License"); you may not use this file except in compliance
9    * with the License.  You may obtain a copy of the License at
10   *
11   *     http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing, software
14   * distributed under the License is distributed on an "AS IS" BASIS,
15   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16   * See the License for the specific language governing permissions and
17   * limitations under the License.
18   */
19  package org.apache.hadoop.hbase.protobuf;
20  
21  import static org.junit.Assert.assertEquals;
22  
23  import java.io.IOException;
24  
25  import com.google.protobuf.HBaseZeroCopyByteString;
26  import org.apache.hadoop.hbase.HConstants;
27  import org.apache.hadoop.hbase.SmallTests;
28  import org.apache.hadoop.hbase.client.Append;
29  import org.apache.hadoop.hbase.client.Delete;
30  import org.apache.hadoop.hbase.client.Get;
31  import org.apache.hadoop.hbase.client.Increment;
32  import org.apache.hadoop.hbase.client.Put;
33  import org.apache.hadoop.hbase.client.Scan;
34  import org.apache.hadoop.hbase.protobuf.generated.ClientProtos;
35  import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.Column;
36  import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutationProto;
37  import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutationProto.ColumnValue;
38  import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutationProto.ColumnValue.QualifierValue;
39  import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutationProto.DeleteType;
40  import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutationProto.MutationType;
41  import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.NameBytesPair;
42  import org.apache.hadoop.hbase.util.Bytes;
43  import org.junit.Test;
44  import org.junit.experimental.categories.Category;
45  
46  import com.google.protobuf.ByteString;
47  
48  /**
49   * Class to test ProtobufUtil.
50   */
51  @Category(SmallTests.class)
52  public class TestProtobufUtil {
53    @Test
54    public void testException() throws IOException {
55      NameBytesPair.Builder builder = NameBytesPair.newBuilder();
56      final String omg = "OMG!!!";
57      builder.setName("java.io.IOException");
58      builder.setValue(HBaseZeroCopyByteString.wrap(Bytes.toBytes(omg)));
59      Throwable t = ProtobufUtil.toException(builder.build());
60      assertEquals(omg, t.getMessage());
61      builder.clear();
62      builder.setName("org.apache.hadoop.ipc.RemoteException");
63      builder.setValue(HBaseZeroCopyByteString.wrap(Bytes.toBytes(omg)));
64      t = ProtobufUtil.toException(builder.build());
65      assertEquals(omg, t.getMessage());
66    }
67  
68    /**
69     * Test basic Get conversions.
70     *
71     * @throws IOException
72     */
73    @Test
74    public void testGet() throws IOException {
75      ClientProtos.Get.Builder getBuilder = ClientProtos.Get.newBuilder();
76      getBuilder.setRow(ByteString.copyFromUtf8("row"));
77      Column.Builder columnBuilder = Column.newBuilder();
78      columnBuilder.setFamily(ByteString.copyFromUtf8("f1"));
79      columnBuilder.addQualifier(ByteString.copyFromUtf8("c1"));
80      columnBuilder.addQualifier(ByteString.copyFromUtf8("c2"));
81      getBuilder.addColumn(columnBuilder.build());
82  
83      columnBuilder.clear();
84      columnBuilder.setFamily(ByteString.copyFromUtf8("f2"));
85      getBuilder.addColumn(columnBuilder.build());
86  
87      ClientProtos.Get proto = getBuilder.build();
88      // default fields
89      assertEquals(1, proto.getMaxVersions());
90      assertEquals(true, proto.getCacheBlocks());
91  
92      // set the default value for equal comparison
93      getBuilder = ClientProtos.Get.newBuilder(proto);
94      getBuilder.setMaxVersions(1);
95      getBuilder.setCacheBlocks(true);
96  
97      Get get = ProtobufUtil.toGet(proto);
98      assertEquals(getBuilder.build(), ProtobufUtil.toGet(get));
99    }
100 
101   /**
102    * Test Append Mutate conversions.
103    *
104    * @throws IOException
105    */
106   @Test
107   public void testAppend() throws IOException {
108     MutationProto.Builder mutateBuilder = MutationProto.newBuilder();
109     mutateBuilder.setRow(ByteString.copyFromUtf8("row"));
110     mutateBuilder.setMutateType(MutationType.APPEND);
111     mutateBuilder.setTimestamp(111111);
112     ColumnValue.Builder valueBuilder = ColumnValue.newBuilder();
113     valueBuilder.setFamily(ByteString.copyFromUtf8("f1"));
114     QualifierValue.Builder qualifierBuilder = QualifierValue.newBuilder();
115     qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c1"));
116     qualifierBuilder.setValue(ByteString.copyFromUtf8("v1"));
117     valueBuilder.addQualifierValue(qualifierBuilder.build());
118     qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c2"));
119     qualifierBuilder.setValue(ByteString.copyFromUtf8("v2"));
120     valueBuilder.addQualifierValue(qualifierBuilder.build());
121     mutateBuilder.addColumnValue(valueBuilder.build());
122 
123     MutationProto proto = mutateBuilder.build();
124     // default fields
125     assertEquals(MutationProto.Durability.USE_DEFAULT, proto.getDurability());
126 
127     // set the default value for equal comparison
128     mutateBuilder = MutationProto.newBuilder(proto);
129     mutateBuilder.setDurability(MutationProto.Durability.USE_DEFAULT);
130 
131     Append append = ProtobufUtil.toAppend(proto, null);
132 
133     // append always use the latest timestamp,
134     // add the timestamp to the original mutate
135     long timestamp = append.getTimeStamp();
136     mutateBuilder.setTimestamp(timestamp);
137     for (ColumnValue.Builder column: mutateBuilder.getColumnValueBuilderList()) {
138       for (QualifierValue.Builder qualifier:
139           column.getQualifierValueBuilderList()) {
140         qualifier.setTimestamp(timestamp);
141       }
142     }
143     assertEquals(mutateBuilder.build(), ProtobufUtil.toMutation(MutationType.APPEND, append));
144   }
145 
146   /**
147    * Test Delete Mutate conversions.
148    *
149    * @throws IOException
150    */
151   @Test
152   public void testDelete() throws IOException {
153     MutationProto.Builder mutateBuilder = MutationProto.newBuilder();
154     mutateBuilder.setRow(ByteString.copyFromUtf8("row"));
155     mutateBuilder.setMutateType(MutationType.DELETE);
156     mutateBuilder.setTimestamp(111111);
157     ColumnValue.Builder valueBuilder = ColumnValue.newBuilder();
158     valueBuilder.setFamily(ByteString.copyFromUtf8("f1"));
159     QualifierValue.Builder qualifierBuilder = QualifierValue.newBuilder();
160     qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c1"));
161     qualifierBuilder.setDeleteType(DeleteType.DELETE_ONE_VERSION);
162     qualifierBuilder.setTimestamp(111222);
163     valueBuilder.addQualifierValue(qualifierBuilder.build());
164     qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c2"));
165     qualifierBuilder.setDeleteType(DeleteType.DELETE_MULTIPLE_VERSIONS);
166     qualifierBuilder.setTimestamp(111333);
167     valueBuilder.addQualifierValue(qualifierBuilder.build());
168     mutateBuilder.addColumnValue(valueBuilder.build());
169 
170     MutationProto proto = mutateBuilder.build();
171     // default fields
172     assertEquals(MutationProto.Durability.USE_DEFAULT, proto.getDurability());
173 
174     // set the default value for equal comparison
175     mutateBuilder = MutationProto.newBuilder(proto);
176     mutateBuilder.setDurability(MutationProto.Durability.USE_DEFAULT);
177 
178     Delete delete = ProtobufUtil.toDelete(proto);
179 
180     // delete always have empty value,
181     // add empty value to the original mutate
182     for (ColumnValue.Builder column:
183         mutateBuilder.getColumnValueBuilderList()) {
184       for (QualifierValue.Builder qualifier:
185           column.getQualifierValueBuilderList()) {
186         qualifier.setValue(ByteString.EMPTY);
187       }
188     }
189     assertEquals(mutateBuilder.build(),
190       ProtobufUtil.toMutation(MutationType.DELETE, delete));
191   }
192 
193   /**
194    * Test Increment Mutate conversions.
195    *
196    * @throws IOException
197    */
198   @Test
199   public void testIncrement() throws IOException {
200     MutationProto.Builder mutateBuilder = MutationProto.newBuilder();
201     mutateBuilder.setRow(ByteString.copyFromUtf8("row"));
202     mutateBuilder.setMutateType(MutationType.INCREMENT);
203     ColumnValue.Builder valueBuilder = ColumnValue.newBuilder();
204     valueBuilder.setFamily(ByteString.copyFromUtf8("f1"));
205     QualifierValue.Builder qualifierBuilder = QualifierValue.newBuilder();
206     qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c1"));
207     qualifierBuilder.setValue(HBaseZeroCopyByteString.wrap(Bytes.toBytes(11L)));
208     valueBuilder.addQualifierValue(qualifierBuilder.build());
209     qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c2"));
210     qualifierBuilder.setValue(HBaseZeroCopyByteString.wrap(Bytes.toBytes(22L)));
211     valueBuilder.addQualifierValue(qualifierBuilder.build());
212     mutateBuilder.addColumnValue(valueBuilder.build());
213 
214     MutationProto proto = mutateBuilder.build();
215     // default fields
216     assertEquals(MutationProto.Durability.USE_DEFAULT, proto.getDurability());
217 
218     // set the default value for equal comparison
219     mutateBuilder = MutationProto.newBuilder(proto);
220     mutateBuilder.setDurability(MutationProto.Durability.USE_DEFAULT);
221 
222     Increment increment = ProtobufUtil.toIncrement(proto, null);
223     assertEquals(mutateBuilder.build(),
224       ProtobufUtil.toMutation(increment, MutationProto.newBuilder(), HConstants.NO_NONCE));
225   }
226 
227   /**
228    * Test Put Mutate conversions.
229    *
230    * @throws IOException
231    */
232   @Test
233   public void testPut() throws IOException {
234     MutationProto.Builder mutateBuilder = MutationProto.newBuilder();
235     mutateBuilder.setRow(ByteString.copyFromUtf8("row"));
236     mutateBuilder.setMutateType(MutationType.PUT);
237     mutateBuilder.setTimestamp(111111);
238     ColumnValue.Builder valueBuilder = ColumnValue.newBuilder();
239     valueBuilder.setFamily(ByteString.copyFromUtf8("f1"));
240     QualifierValue.Builder qualifierBuilder = QualifierValue.newBuilder();
241     qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c1"));
242     qualifierBuilder.setValue(ByteString.copyFromUtf8("v1"));
243     valueBuilder.addQualifierValue(qualifierBuilder.build());
244     qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c2"));
245     qualifierBuilder.setValue(ByteString.copyFromUtf8("v2"));
246     qualifierBuilder.setTimestamp(222222);
247     valueBuilder.addQualifierValue(qualifierBuilder.build());
248     mutateBuilder.addColumnValue(valueBuilder.build());
249 
250     MutationProto proto = mutateBuilder.build();
251     // default fields
252     assertEquals(MutationProto.Durability.USE_DEFAULT, proto.getDurability());
253 
254     // set the default value for equal comparison
255     mutateBuilder = MutationProto.newBuilder(proto);
256     mutateBuilder.setDurability(MutationProto.Durability.USE_DEFAULT);
257 
258     Put put = ProtobufUtil.toPut(proto);
259 
260     // put value always use the default timestamp if no
261     // value level timestamp specified,
262     // add the timestamp to the original mutate
263     long timestamp = put.getTimeStamp();
264     for (ColumnValue.Builder column:
265         mutateBuilder.getColumnValueBuilderList()) {
266       for (QualifierValue.Builder qualifier:
267           column.getQualifierValueBuilderList()) {
268         if (!qualifier.hasTimestamp()) {
269           qualifier.setTimestamp(timestamp);
270         }
271       }
272     }
273     assertEquals(mutateBuilder.build(),
274       ProtobufUtil.toMutation(MutationType.PUT, put));
275   }
276 
277   /**
278    * Test basic Scan conversions.
279    *
280    * @throws IOException
281    */
282   @Test
283   public void testScan() throws IOException {
284     ClientProtos.Scan.Builder scanBuilder = ClientProtos.Scan.newBuilder();
285     scanBuilder.setStartRow(ByteString.copyFromUtf8("row1"));
286     scanBuilder.setStopRow(ByteString.copyFromUtf8("row2"));
287     Column.Builder columnBuilder = Column.newBuilder();
288     columnBuilder.setFamily(ByteString.copyFromUtf8("f1"));
289     columnBuilder.addQualifier(ByteString.copyFromUtf8("c1"));
290     columnBuilder.addQualifier(ByteString.copyFromUtf8("c2"));
291     scanBuilder.addColumn(columnBuilder.build());
292 
293     columnBuilder.clear();
294     columnBuilder.setFamily(ByteString.copyFromUtf8("f2"));
295     scanBuilder.addColumn(columnBuilder.build());
296 
297     ClientProtos.Scan proto = scanBuilder.build();
298     // default fields
299     assertEquals(1, proto.getMaxVersions());
300     assertEquals(true, proto.getCacheBlocks());
301 
302     scanBuilder = ClientProtos.Scan.newBuilder(proto);
303     scanBuilder.setMaxVersions(1);
304     scanBuilder.setCacheBlocks(true);
305 
306     Scan scan = ProtobufUtil.toScan(proto);
307     assertEquals(scanBuilder.build(), ProtobufUtil.toScan(scan));
308   }
309 }