1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.hbase;
20
21 import java.io.File;
22 import java.io.IOException;
23 import java.util.UUID;
24
25 import org.apache.commons.io.FileUtils;
26 import org.apache.commons.logging.Log;
27 import org.apache.commons.logging.LogFactory;
28 import org.apache.hadoop.hbase.classification.InterfaceAudience;
29 import org.apache.hadoop.hbase.classification.InterfaceStability;
30 import org.apache.hadoop.conf.Configuration;
31 import org.apache.hadoop.fs.Path;
32
33
34
35
36
37
38 @InterfaceAudience.Public
39 @InterfaceStability.Unstable
40 public class HBaseCommonTestingUtility {
41 protected static final Log LOG = LogFactory.getLog(HBaseCommonTestingUtility.class);
42
43 protected final Configuration conf;
44
45 public HBaseCommonTestingUtility() {
46 this(null);
47 }
48
49 public HBaseCommonTestingUtility(Configuration conf) {
50 this.conf = (conf == null ? HBaseConfiguration.create() : conf);
51 }
52
53
54
55
56
57
58 public Configuration getConfiguration() {
59 return this.conf;
60 }
61
62
63
64
65 public static final String BASE_TEST_DIRECTORY_KEY =
66 "test.build.data.basedirectory";
67
68
69
70
71 public static final String DEFAULT_BASE_TEST_DIRECTORY = "target/test-data";
72
73
74
75
76 private File dataTestDir = null;
77
78
79
80
81
82 public Path getDataTestDir() {
83 if (this.dataTestDir == null) {
84 setupDataTestDir();
85 }
86 return new Path(this.dataTestDir.getAbsolutePath());
87 }
88
89
90
91
92
93
94 public Path getDataTestDir(final String subdirName) {
95 return new Path(getDataTestDir(), subdirName);
96 }
97
98
99
100
101
102
103 protected Path setupDataTestDir() {
104 if (this.dataTestDir != null) {
105 LOG.warn("Data test dir already setup in " +
106 dataTestDir.getAbsolutePath());
107 return null;
108 }
109
110 String randomStr = UUID.randomUUID().toString();
111 Path testPath = new Path(getBaseTestDir(), randomStr);
112
113 this.dataTestDir = new File(testPath.toString()).getAbsoluteFile();
114
115 System.setProperty("test.build.dir", this.dataTestDir.toString());
116
117 if (deleteOnExit()) {
118 this.dataTestDir.deleteOnExit();
119 }
120
121 createSubDir("hbase.local.dir", testPath, "hbase-local-dir");
122
123 return testPath;
124 }
125
126 protected void createSubDir(String propertyName, Path parent, String subDirName) {
127 Path newPath = new Path(parent, subDirName);
128 File newDir = new File(newPath.toString()).getAbsoluteFile();
129
130 if (deleteOnExit()) {
131 newDir.deleteOnExit();
132 }
133
134 conf.set(propertyName, newDir.getAbsolutePath());
135 }
136
137
138
139
140 boolean deleteOnExit() {
141 String v = System.getProperty("hbase.testing.preserve.testdir");
142
143 return v == null ? true : !Boolean.parseBoolean(v);
144 }
145
146
147
148
149 public boolean cleanupTestDir() {
150 if (deleteDir(this.dataTestDir)) {
151 this.dataTestDir = null;
152 return true;
153 }
154 return false;
155 }
156
157
158
159
160
161 boolean cleanupTestDir(final String subdir) {
162 if (this.dataTestDir == null) {
163 return false;
164 }
165 return deleteDir(new File(this.dataTestDir, subdir));
166 }
167
168
169
170
171
172
173
174
175 private Path getBaseTestDir() {
176 String PathName = System.getProperty(
177 BASE_TEST_DIRECTORY_KEY, DEFAULT_BASE_TEST_DIRECTORY);
178
179 return new Path(PathName);
180 }
181
182 public Path getRandomDir() {
183 String randomStr = UUID.randomUUID().toString();
184 Path testPath = new Path(getBaseTestDir(), randomStr);
185 return testPath;
186 }
187
188
189
190
191
192 boolean deleteDir(final File dir) {
193 if (dir == null || !dir.exists()) {
194 return true;
195 }
196 int ntries = 0;
197 do {
198 ntries += 1;
199 try {
200 if (deleteOnExit()) {
201 FileUtils.deleteDirectory(dir);
202 }
203
204 return true;
205 } catch (IOException ex) {
206 LOG.warn("Failed to delete " + dir.getAbsolutePath());
207 } catch (IllegalArgumentException ex) {
208 LOG.warn("Failed to delete " + dir.getAbsolutePath(), ex);
209 }
210 } while (ntries < 30);
211
212 return false;
213 }
214 }