1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
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
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
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
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
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
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
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