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