1   /**
2    * Copyright 2011 The Apache Software Foundation
3    *
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *     http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing, software
15   * distributed under the License is distributed on an "AS IS" BASIS,
16   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17   * See the License for the specific language governing permissions and
18   * limitations under the License.
19   */
20  
21  package org.apache.hadoop.hbase.client;
22  
23  import static org.junit.Assert.assertEquals;
24  import static org.junit.Assert.assertFalse;
25  import static org.junit.Assert.assertTrue;
26  import static org.junit.Assert.fail;
27  
28  import java.io.ByteArrayInputStream;
29  import java.io.ByteArrayOutputStream;
30  import java.io.DataInput;
31  import java.io.DataInputStream;
32  import java.io.DataOutput;
33  import java.io.DataOutputStream;
34  import java.io.File;
35  import java.io.FileOutputStream;
36  import java.io.IOException;
37  import java.util.Arrays;
38  import java.util.List;
39  
40  import org.apache.hadoop.conf.Configuration;
41  import org.apache.hadoop.hbase.HBaseConfiguration;
42  import org.apache.hadoop.hbase.SmallTests;
43  import org.apache.hadoop.hbase.filter.Filter;
44  import org.apache.hadoop.hbase.filter.FilterList;
45  import org.apache.hadoop.hbase.filter.KeyOnlyFilter;
46  import org.apache.hadoop.hbase.util.Base64;
47  import org.apache.hadoop.hbase.util.Bytes;
48  import org.junit.Assert;
49  import org.junit.Test;
50  import org.junit.experimental.categories.Category;
51  
52  import com.google.common.io.ByteStreams;
53  
54  // TODO: cover more test cases
55  @Category(SmallTests.class)
56  public class TestGet {
57  
58    private static final String WRITABLE_GET =
59      "AgD//////////wAAAAEBD3Rlc3QuTW9ja0ZpbHRlcgEAAAAAAAAAAH//////////AQAAAAAAAAAA";
60  
61    private static final String WRITABLE_GET_WITH_FILTER_LIST =
62      "AgD//////////wAAAAEBKW9yZy5hcGFjaGUuaGFkb29wLmhiYXNlLmZpbHRlci5GaWx0ZXJMaXN0" +
63      "AAAAAAMOAA90ZXN0Lk1vY2tGaWx0ZXIOAA1teS5Nb2NrRmlsdGVyDkYAAQAAAAAAAAAAf///////" +
64      "//8BAAAAAAAAAAA=";
65  
66    private static final String MOCK_FILTER_JAR =
67      "UEsDBBQACAgIADRQI0QAAAAAAAAAAAAAAAAJAAQATUVUQS1JTkYv/soAAAMAUEsHCAAAAAACAAAA" +
68      "AAAAAFBLAwQUAAgICAA0UCNEAAAAAAAAAAAAAAAAFAAAAE1FVEEtSU5GL01BTklGRVNULk1G803M" +
69      "y0xLLS7RDUstKs7Mz7NSMNQz4OVyLkpNLElN0XWqBAmY6xnEG1gqaPgXJSbnpCo45xcV5BcllgCV" +
70      "a/Jy8XIBAFBLBwgxyqRbQwAAAEQAAABQSwMEFAAICAgAcIsiRAAAAAAAAAAAAAAAABMAAABteS9N" +
71      "b2NrRmlsdGVyLmNsYXNzjVDLTsJAFL1DC5UKIg9B3bkDF4wxcYVx4YOEBGWhYT+0Ix0tnWaY+vgs" +
72      "VyYu/AA/yng7gAaDibO4r3PuOTfz8fn2DgCHsOtAhkBx8kwvpXffFaHmygGbQEuqMWUx8wJOA+ZL" +
73      "GdNgxKac3hoOnVFPcUIgdywioU8IWM3WkIB9Jn3uggX5AmQhR6DUFxG/SiYjrm7YKMSNSl96LBwy" +
74      "JdJ+PrR1IKYpe+maDgFXceZ3BQ99hOvN/h17YFRIes4060VxojuprXvx5PFYCxlNHagQqC5ovcE3" +
75      "giZMjQ8QXCFCIPuohMZLGsseg0QvTGqrAPS+lonyOF6M26Wf49spG/YAvwbSZ2GFX4LRwY5iJpiz" +
76      "+6+w9oJFBlyMOTPMwzrGwoyAuYiZwAaUkLWJtY1d2cgcmU1Ef0sUjUR9Bs4l0qoKNeO8ZbB/ipX/" +
77      "FGsYsW3D3/kCUEsHCEYmW6RQAQAAWgIAAFBLAwQUAAgICABuiyJEAAAAAAAAAAAAAAAAFQAAAHRl" +
78      "c3QvTW9ja0ZpbHRlci5jbGFzc41Qy07CQBS9A4VKBZGHoO7cgQvHmLjCuPBBQlJloWE/tCMdLZ1m" +
79      "OlV/y5WJCz/AjzLeDqCRYOIs7uuce87NfHy+vQPAEezakCNQ1TzR9Ep6D30Raq5ssAh0pZpQFjMv" +
80      "4DRgvpQxDcYs4fTOcOiMeoYTAsUTEQl9SiDf6Y4IWOfS5w7koVSGAhTRwBURv06nY65u2TjEjbor" +
81      "PRaOmBJZPx9aOhAJgZq7dE+PgKM48/uChz4SWh33nj0yKiS9YJoNojjVvczYuXz2eKyFjBIb6gQa" +
82      "C9pg+I2gDVOTQwRXiBAoPCmh8Zb2b49hqhcmzVUAet/IVHkcL8bt6s/xBxkb9gA/B7KXxwo/BaON" +
83      "HcVMMBf2X2HtBYscOBiLZliCdYzlGQFzBTOBDagiaxNrC7uakTk2m4guS1SMRGsGziWyqgFN47xl" +
84      "sH+K1f4UaxuxbcPf+QJQSwcI8UIYqlEBAABeAgAAUEsBAhQAFAAICAgANFAjRAAAAAACAAAAAAAA" +
85      "AAkABAAAAAAAAAAAAAAAAAAAAE1FVEEtSU5GL/7KAABQSwECFAAUAAgICAA0UCNEMcqkW0MAAABE" +
86      "AAAAFAAAAAAAAAAAAAAAAAA9AAAATUVUQS1JTkYvTUFOSUZFU1QuTUZQSwECFAAUAAgICABwiyJE" +
87      "RiZbpFABAABaAgAAEwAAAAAAAAAAAAAAAADCAAAAbXkvTW9ja0ZpbHRlci5jbGFzc1BLAQIUABQA" +
88      "CAgIAG6LIkTxQhiqUQEAAF4CAAAVAAAAAAAAAAAAAAAAAFMCAAB0ZXN0L01vY2tGaWx0ZXIuY2xh" +
89      "c3NQSwUGAAAAAAQABAABAQAA5wMAAAAA";
90  
91    @Test
92    public void testAttributesSerialization() throws IOException {
93      Get get = new Get();
94      get.setAttribute("attribute1", Bytes.toBytes("value1"));
95      get.setAttribute("attribute2", Bytes.toBytes("value2"));
96      get.setAttribute("attribute3", Bytes.toBytes("value3"));
97  
98      ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
99      DataOutput out = new DataOutputStream(byteArrayOutputStream);
100     get.write(out);
101 
102     Get get2 = new Get();
103     Assert.assertTrue(get2.getAttributesMap().isEmpty());
104 
105     get2.readFields(new DataInputStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray())));
106 
107     Assert.assertNull(get2.getAttribute("absent"));
108     Assert.assertTrue(Arrays.equals(Bytes.toBytes("value1"), get2.getAttribute("attribute1")));
109     Assert.assertTrue(Arrays.equals(Bytes.toBytes("value2"), get2.getAttribute("attribute2")));
110     Assert.assertTrue(Arrays.equals(Bytes.toBytes("value3"), get2.getAttribute("attribute3")));
111     Assert.assertEquals(3, get2.getAttributesMap().size());
112   }
113 
114   @Test
115   public void testGetAttributes() {
116     Get get = new Get();
117     Assert.assertTrue(get.getAttributesMap().isEmpty());
118     Assert.assertNull(get.getAttribute("absent"));
119 
120     get.setAttribute("absent", null);
121     Assert.assertTrue(get.getAttributesMap().isEmpty());
122     Assert.assertNull(get.getAttribute("absent"));
123 
124     // adding attribute
125     get.setAttribute("attribute1", Bytes.toBytes("value1"));
126     Assert.assertTrue(Arrays.equals(Bytes.toBytes("value1"), get.getAttribute("attribute1")));
127     Assert.assertEquals(1, get.getAttributesMap().size());
128     Assert.assertTrue(Arrays.equals(Bytes.toBytes("value1"), get.getAttributesMap().get("attribute1")));
129 
130     // overriding attribute value
131     get.setAttribute("attribute1", Bytes.toBytes("value12"));
132     Assert.assertTrue(Arrays.equals(Bytes.toBytes("value12"), get.getAttribute("attribute1")));
133     Assert.assertEquals(1, get.getAttributesMap().size());
134     Assert.assertTrue(Arrays.equals(Bytes.toBytes("value12"), get.getAttributesMap().get("attribute1")));
135 
136     // adding another attribute
137     get.setAttribute("attribute2", Bytes.toBytes("value2"));
138     Assert.assertTrue(Arrays.equals(Bytes.toBytes("value2"), get.getAttribute("attribute2")));
139     Assert.assertEquals(2, get.getAttributesMap().size());
140     Assert.assertTrue(Arrays.equals(Bytes.toBytes("value2"), get.getAttributesMap().get("attribute2")));
141 
142     // removing attribute
143     get.setAttribute("attribute2", null);
144     Assert.assertNull(get.getAttribute("attribute2"));
145     Assert.assertEquals(1, get.getAttributesMap().size());
146     Assert.assertNull(get.getAttributesMap().get("attribute2"));
147 
148     // removing non-existed attribute
149     get.setAttribute("attribute2", null);
150     Assert.assertNull(get.getAttribute("attribute2"));
151     Assert.assertEquals(1, get.getAttributesMap().size());
152     Assert.assertNull(get.getAttributesMap().get("attribute2"));
153 
154     // removing another attribute
155     get.setAttribute("attribute1", null);
156     Assert.assertNull(get.getAttribute("attribute1"));
157     Assert.assertTrue(get.getAttributesMap().isEmpty());
158     Assert.assertNull(get.getAttributesMap().get("attribute1"));
159   }
160 
161   @Test
162   public void testDynamicFilter() throws Exception {
163     Configuration conf = HBaseConfiguration.create();
164     String localPath = conf.get("hbase.local.dir")
165       + File.separator + "jars" + File.separator;
166     File jarFile = new File(localPath, "MockFilter.jar");
167     jarFile.delete();
168     assertFalse("Should be deleted: " + jarFile.getPath(), jarFile.exists());
169 
170     DataInput dis = ByteStreams.newDataInput(Base64.decode(WRITABLE_GET));
171     Get get = new Get();
172     try {
173       get.readFields(dis);
174       fail("Should not be able to load the filter class");
175     } catch (RuntimeException re) {
176       String msg = re.getMessage();
177       assertTrue(msg != null && msg.contains("Can't find class test.MockFilter"));
178     }
179 
180     dis = ByteStreams.newDataInput(Base64.decode(WRITABLE_GET_WITH_FILTER_LIST));
181     try {
182       get.readFields(dis);
183       fail("Should not be able to load the filter class");
184     } catch (IOException ioe) {
185       assertTrue(ioe.getCause() instanceof ClassNotFoundException);
186     }
187 
188     FileOutputStream fos = new FileOutputStream(jarFile);
189     fos.write(Base64.decode(MOCK_FILTER_JAR));
190     fos.close();
191 
192     dis = ByteStreams.newDataInput(Base64.decode(WRITABLE_GET));
193     get.readFields(dis);
194     assertEquals("test.MockFilter", get.getFilter().getClass().getName());
195 
196     get = new Get();
197     dis = ByteStreams.newDataInput(Base64.decode(WRITABLE_GET_WITH_FILTER_LIST));
198     get.readFields(dis);
199     assertTrue(get.getFilter() instanceof FilterList);
200     List<Filter> filters = ((FilterList)get.getFilter()).getFilters();
201     assertEquals(3, filters.size());
202     assertEquals("test.MockFilter", filters.get(0).getClass().getName());
203     assertEquals("my.MockFilter", filters.get(1).getClass().getName());
204     assertTrue(filters.get(2) instanceof KeyOnlyFilter);
205   }
206 
207   @org.junit.Rule
208   public org.apache.hadoop.hbase.ResourceCheckerJUnitRule cu =
209     new org.apache.hadoop.hbase.ResourceCheckerJUnitRule();
210 }
211