1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.util;
19
20 import java.nio.ByteBuffer;
21 import java.util.HashMap;
22 import java.util.Map;
23
24 import static org.junit.Assert.assertArrayEquals;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertSame;
27 import static org.junit.Assert.fail;
28
29 import org.apache.hadoop.hbase.testclassification.MediumTests;
30 import org.apache.hadoop.hbase.TableName;
31 import org.junit.Test;
32 import org.junit.experimental.categories.Category;
33 import org.junit.rules.TestWatcher;
34 import org.junit.runner.Description;
35
36
37
38
39 @Category(MediumTests.class)
40 public class TestTableName extends TestWatcher {
41 private TableName tableName;
42
43
44
45
46 @Override
47 protected void starting(Description description) {
48 tableName = TableName.valueOf(description.getMethodName());
49 }
50
51 public TableName getTableName() {
52 return tableName;
53 }
54
55 String emptyNames[] ={"", " "};
56 String invalidNamespace[] = {":a", "%:a"};
57 String legalTableNames[] = { "foo", "with-dash_under.dot", "_under_start_ok",
58 "with-dash.with_underscore", "02-01-2012.my_table_01-02", "xyz._mytable_", "9_9_0.table_02"
59 , "dot1.dot2.table", "new.-mytable", "with-dash.with.dot", "legal..t2", "legal..legal.t2",
60 "trailingdots..", "trailing.dots...", "ns:mytable", "ns:_mytable_", "ns:my_table_01-02"};
61 String illegalTableNames[] = { ".dot_start_illegal", "-dash_start_illegal", "spaces not ok",
62 "-dash-.start_illegal", "new.table with space", "01 .table", "ns:-illegaldash",
63 "new:.illegaldot", "new:illegalcolon1:", "new:illegalcolon1:2"};
64
65
66 @Test(expected = IllegalArgumentException.class)
67 public void testInvalidNamespace() {
68 for (String tn : invalidNamespace) {
69 TableName.isLegalFullyQualifiedTableName(Bytes.toBytes(tn));
70 fail("invalid namespace " + tn + " should have failed with IllegalArgumentException for namespace");
71 }
72 }
73
74 @Test(expected = IllegalArgumentException.class)
75 public void testEmptyNamespaceName() {
76 for (String nn : emptyNames) {
77 TableName.isLegalNamespaceName(Bytes.toBytes(nn));
78 fail("invalid Namespace name " + nn + " should have failed with IllegalArgumentException");
79 }
80 }
81
82 @Test(expected = IllegalArgumentException.class)
83 public void testEmptyTableName() {
84 for (String tn : emptyNames) {
85 TableName.isLegalFullyQualifiedTableName(Bytes.toBytes(tn));
86 fail("invalid tablename " + tn + " should have failed with IllegalArgumentException");
87 }
88 }
89
90 @Test
91 public void testLegalHTableNames() {
92 for (String tn : legalTableNames) {
93 TableName.isLegalFullyQualifiedTableName(Bytes.toBytes(tn));
94 }
95 }
96
97 @Test
98 public void testIllegalHTableNames() {
99 for (String tn : illegalTableNames) {
100 try {
101 TableName.isLegalFullyQualifiedTableName(Bytes.toBytes(tn));
102 fail("invalid tablename " + tn + " should have failed");
103 } catch (Exception e) {
104
105 }
106 }
107 }
108
109 class Names {
110 String ns;
111 byte[] nsb;
112 String tn;
113 byte[] tnb;
114 String nn;
115 byte[] nnb;
116
117 Names(String ns, String tn) {
118 this.ns = ns;
119 nsb = ns.getBytes();
120 this.tn = tn;
121 tnb = tn.getBytes();
122 nn = this.ns + ":" + this.tn;
123 nnb = nn.getBytes();
124 }
125
126 @Override
127 public boolean equals(Object o) {
128 if (this == o) return true;
129 if (o == null || getClass() != o.getClass()) return false;
130
131 Names names = (Names) o;
132
133 if (!ns.equals(names.ns)) return false;
134 if (!tn.equals(names.tn)) return false;
135
136 return true;
137 }
138
139 @Override
140 public int hashCode() {
141 int result = ns.hashCode();
142 result = 31 * result + tn.hashCode();
143 return result;
144 }
145 }
146
147 Names[] names = new Names[] {
148 new Names("n1", "n1"),
149 new Names("n2", "n2"),
150 new Names("table1", "table1"),
151 new Names("table2", "table2"),
152 new Names("table2", "table1"),
153 new Names("table1", "table2"),
154 new Names("n1", "table1"),
155 new Names("n1", "table1"),
156 new Names("n2", "table2"),
157 new Names("n2", "table2")
158 };
159
160 @Test
161 public void testValueOf() {
162
163 Map<String, TableName> inCache = new HashMap<String, TableName>();
164
165 for (Names name : names) {
166 inCache.put(name.nn, TableName.valueOf(name.ns, name.tn));
167 }
168 for (Names name : names) {
169 assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(name.ns, name.tn), name));
170 assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(name.nsb, name.tnb), name));
171 assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(name.nn), name));
172 assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(name.nnb), name));
173 assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(
174 ByteBuffer.wrap(name.nsb), ByteBuffer.wrap(name.tnb)), name));
175 }
176
177 }
178
179 private TableName validateNames(TableName expected, Names names) {
180 assertEquals(expected.getNameAsString(), names.nn);
181 assertArrayEquals(expected.getName(), names.nnb);
182 assertEquals(expected.getQualifierAsString(), names.tn);
183 assertArrayEquals(expected.getQualifier(), names.tnb);
184 assertEquals(expected.getNamespaceAsString(), names.ns);
185 assertArrayEquals(expected.getNamespace(), names.nsb);
186 return expected;
187 }
188
189 }