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.util.ByteStringer;
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(ByteStringer.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(ByteStringer.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     long timeStamp = 111111;
109     MutationProto.Builder mutateBuilder = MutationProto.newBuilder();
110     mutateBuilder.setRow(ByteString.copyFromUtf8("row"));
111     mutateBuilder.setMutateType(MutationType.APPEND);
112     mutateBuilder.setTimestamp(timeStamp);
113     ColumnValue.Builder valueBuilder = ColumnValue.newBuilder();
114     valueBuilder.setFamily(ByteString.copyFromUtf8("f1"));
115     QualifierValue.Builder qualifierBuilder = QualifierValue.newBuilder();
116     qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c1"));
117     qualifierBuilder.setValue(ByteString.copyFromUtf8("v1"));
118     qualifierBuilder.setTimestamp(timeStamp);
119     valueBuilder.addQualifierValue(qualifierBuilder.build());
120     qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c2"));
121     qualifierBuilder.setValue(ByteString.copyFromUtf8("v2"));
122     valueBuilder.addQualifierValue(qualifierBuilder.build());
123     qualifierBuilder.setTimestamp(timeStamp);
124     mutateBuilder.addColumnValue(valueBuilder.build());
125 
126     MutationProto proto = mutateBuilder.build();
127     // default fields
128     assertEquals(MutationProto.Durability.USE_DEFAULT, proto.getDurability());
129 
130     // set the default value for equal comparison
131     mutateBuilder = MutationProto.newBuilder(proto);
132     mutateBuilder.setDurability(MutationProto.Durability.USE_DEFAULT);
133 
134     Append append = ProtobufUtil.toAppend(proto, null);
135 
136     // append always use the latest timestamp,
137     // reset the timestamp to the original mutate
138     mutateBuilder.setTimestamp(append.getTimeStamp());
139     assertEquals(mutateBuilder.build(), ProtobufUtil.toMutation(MutationType.APPEND, append));
140   }
141 
142   /**
143    * Test Delete Mutate conversions.
144    *
145    * @throws IOException
146    */
147   @Test
148   public void testDelete() throws IOException {
149     MutationProto.Builder mutateBuilder = MutationProto.newBuilder();
150     mutateBuilder.setRow(ByteString.copyFromUtf8("row"));
151     mutateBuilder.setMutateType(MutationType.DELETE);
152     mutateBuilder.setTimestamp(111111);
153     ColumnValue.Builder valueBuilder = ColumnValue.newBuilder();
154     valueBuilder.setFamily(ByteString.copyFromUtf8("f1"));
155     QualifierValue.Builder qualifierBuilder = QualifierValue.newBuilder();
156     qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c1"));
157     qualifierBuilder.setDeleteType(DeleteType.DELETE_ONE_VERSION);
158     qualifierBuilder.setTimestamp(111222);
159     valueBuilder.addQualifierValue(qualifierBuilder.build());
160     qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c2"));
161     qualifierBuilder.setDeleteType(DeleteType.DELETE_MULTIPLE_VERSIONS);
162     qualifierBuilder.setTimestamp(111333);
163     valueBuilder.addQualifierValue(qualifierBuilder.build());
164     mutateBuilder.addColumnValue(valueBuilder.build());
165 
166     MutationProto proto = mutateBuilder.build();
167     // default fields
168     assertEquals(MutationProto.Durability.USE_DEFAULT, proto.getDurability());
169 
170     // set the default value for equal comparison
171     mutateBuilder = MutationProto.newBuilder(proto);
172     mutateBuilder.setDurability(MutationProto.Durability.USE_DEFAULT);
173 
174     Delete delete = ProtobufUtil.toDelete(proto);
175 
176     // delete always have empty value,
177     // add empty value to the original mutate
178     for (ColumnValue.Builder column:
179         mutateBuilder.getColumnValueBuilderList()) {
180       for (QualifierValue.Builder qualifier:
181           column.getQualifierValueBuilderList()) {
182         qualifier.setValue(ByteString.EMPTY);
183       }
184     }
185     assertEquals(mutateBuilder.build(),
186       ProtobufUtil.toMutation(MutationType.DELETE, delete));
187   }
188 
189   /**
190    * Test Increment Mutate conversions.
191    *
192    * @throws IOException
193    */
194   @Test
195   public void testIncrement() throws IOException {
196     MutationProto.Builder mutateBuilder = MutationProto.newBuilder();
197     mutateBuilder.setRow(ByteString.copyFromUtf8("row"));
198     mutateBuilder.setMutateType(MutationType.INCREMENT);
199     ColumnValue.Builder valueBuilder = ColumnValue.newBuilder();
200     valueBuilder.setFamily(ByteString.copyFromUtf8("f1"));
201     QualifierValue.Builder qualifierBuilder = QualifierValue.newBuilder();
202     qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c1"));
203     qualifierBuilder.setValue(ByteStringer.wrap(Bytes.toBytes(11L)));
204     valueBuilder.addQualifierValue(qualifierBuilder.build());
205     qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c2"));
206     qualifierBuilder.setValue(ByteStringer.wrap(Bytes.toBytes(22L)));
207     valueBuilder.addQualifierValue(qualifierBuilder.build());
208     mutateBuilder.addColumnValue(valueBuilder.build());
209 
210     MutationProto proto = mutateBuilder.build();
211     // default fields
212     assertEquals(MutationProto.Durability.USE_DEFAULT, proto.getDurability());
213 
214     // set the default value for equal comparison
215     mutateBuilder = MutationProto.newBuilder(proto);
216     mutateBuilder.setDurability(MutationProto.Durability.USE_DEFAULT);
217 
218     Increment increment = ProtobufUtil.toIncrement(proto, null);
219     assertEquals(mutateBuilder.build(),
220       ProtobufUtil.toMutation(increment, MutationProto.newBuilder(), HConstants.NO_NONCE));
221   }
222 
223   /**
224    * Test Put Mutate conversions.
225    *
226    * @throws IOException
227    */
228   @Test
229   public void testPut() throws IOException {
230     MutationProto.Builder mutateBuilder = MutationProto.newBuilder();
231     mutateBuilder.setRow(ByteString.copyFromUtf8("row"));
232     mutateBuilder.setMutateType(MutationType.PUT);
233     mutateBuilder.setTimestamp(111111);
234     ColumnValue.Builder valueBuilder = ColumnValue.newBuilder();
235     valueBuilder.setFamily(ByteString.copyFromUtf8("f1"));
236     QualifierValue.Builder qualifierBuilder = QualifierValue.newBuilder();
237     qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c1"));
238     qualifierBuilder.setValue(ByteString.copyFromUtf8("v1"));
239     valueBuilder.addQualifierValue(qualifierBuilder.build());
240     qualifierBuilder.setQualifier(ByteString.copyFromUtf8("c2"));
241     qualifierBuilder.setValue(ByteString.copyFromUtf8("v2"));
242     qualifierBuilder.setTimestamp(222222);
243     valueBuilder.addQualifierValue(qualifierBuilder.build());
244     mutateBuilder.addColumnValue(valueBuilder.build());
245 
246     MutationProto proto = mutateBuilder.build();
247     // default fields
248     assertEquals(MutationProto.Durability.USE_DEFAULT, proto.getDurability());
249 
250     // set the default value for equal comparison
251     mutateBuilder = MutationProto.newBuilder(proto);
252     mutateBuilder.setDurability(MutationProto.Durability.USE_DEFAULT);
253 
254     Put put = ProtobufUtil.toPut(proto);
255 
256     // put value always use the default timestamp if no
257     // value level timestamp specified,
258     // add the timestamp to the original mutate
259     long timestamp = put.getTimeStamp();
260     for (ColumnValue.Builder column:
261         mutateBuilder.getColumnValueBuilderList()) {
262       for (QualifierValue.Builder qualifier:
263           column.getQualifierValueBuilderList()) {
264         if (!qualifier.hasTimestamp()) {
265           qualifier.setTimestamp(timestamp);
266         }
267       }
268     }
269     assertEquals(mutateBuilder.build(),
270       ProtobufUtil.toMutation(MutationType.PUT, put));
271   }
272 
273   /**
274    * Test basic Scan conversions.
275    *
276    * @throws IOException
277    */
278   @Test
279   public void testScan() throws IOException {
280     ClientProtos.Scan.Builder scanBuilder = ClientProtos.Scan.newBuilder();
281     scanBuilder.setStartRow(ByteString.copyFromUtf8("row1"));
282     scanBuilder.setStopRow(ByteString.copyFromUtf8("row2"));
283     Column.Builder columnBuilder = Column.newBuilder();
284     columnBuilder.setFamily(ByteString.copyFromUtf8("f1"));
285     columnBuilder.addQualifier(ByteString.copyFromUtf8("c1"));
286     columnBuilder.addQualifier(ByteString.copyFromUtf8("c2"));
287     scanBuilder.addColumn(columnBuilder.build());
288 
289     columnBuilder.clear();
290     columnBuilder.setFamily(ByteString.copyFromUtf8("f2"));
291     scanBuilder.addColumn(columnBuilder.build());
292 
293     ClientProtos.Scan proto = scanBuilder.build();
294     // default fields
295     assertEquals(1, proto.getMaxVersions());
296     assertEquals(true, proto.getCacheBlocks());
297 
298     scanBuilder = ClientProtos.Scan.newBuilder(proto);
299     scanBuilder.setMaxVersions(1);
300     scanBuilder.setCacheBlocks(true);
301 
302     Scan scan = ProtobufUtil.toScan(proto);
303     assertEquals(scanBuilder.build(), ProtobufUtil.toScan(scan));
304   }
305 }