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 Configuration conf;
44
45 public HBaseCommonTestingUtility() {
46 this(HBaseConfiguration.create());
47 }
48
49 public HBaseCommonTestingUtility(Configuration conf) {
50 this.conf = 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
83 public Path getDataTestDir() {
84 if (this.dataTestDir == null) {
85 setupDataTestDir();
86 }
87 return new Path(this.dataTestDir.getAbsolutePath());
88 }
89
90
91
92
93
94
95
96 public Path getDataTestDir(final String subdirName) {
97 return new Path(getDataTestDir(), subdirName);
98 }
99
100
101
102
103
104
105 protected Path setupDataTestDir() {
106 if (this.dataTestDir != null) {
107 LOG.warn("Data test dir already setup in " +
108 dataTestDir.getAbsolutePath());
109 return null;
110 }
111
112 String randomStr = UUID.randomUUID().toString();
113 Path testPath = new Path(getBaseTestDir(), randomStr);
114
115 this.dataTestDir = new File(testPath.toString()).getAbsoluteFile();
116
117 System.setProperty("test.build.dir", this.dataTestDir.toString());
118 if (deleteOnExit()) this.dataTestDir.deleteOnExit();
119
120 createSubDir("hbase.local.dir", testPath, "hbase-local-dir");
121
122 return testPath;
123 }
124
125 protected void createSubDir(String propertyName, Path parent, String subDirName) {
126 Path newPath = new Path(parent, subDirName);
127 File newDir = new File(newPath.toString()).getAbsoluteFile();
128 if (deleteOnExit()) newDir.deleteOnExit();
129 conf.set(propertyName, newDir.getAbsolutePath());
130 }
131
132
133
134
135 boolean deleteOnExit() {
136 String v = System.getProperty("hbase.testing.preserve.testdir");
137
138 return v == null ? true : !Boolean.parseBoolean(v);
139 }
140
141
142
143
144
145 public boolean cleanupTestDir() throws IOException {
146 if (deleteDir(this.dataTestDir)) {
147 this.dataTestDir = null;
148 return true;
149 }
150 return false;
151 }
152
153
154
155
156
157
158 boolean cleanupTestDir(final String subdir) throws IOException {
159 if (this.dataTestDir == null) {
160 return false;
161 }
162 return deleteDir(new File(this.dataTestDir, subdir));
163 }
164
165
166
167
168
169
170
171
172 private Path getBaseTestDir() {
173 String PathName = System.getProperty(
174 BASE_TEST_DIRECTORY_KEY, DEFAULT_BASE_TEST_DIRECTORY);
175
176 return new Path(PathName);
177 }
178
179
180
181
182
183
184 boolean deleteDir(final File dir) throws IOException {
185 if (dir == null || !dir.exists()) {
186 return true;
187 }
188 int ntries = 0;
189 do {
190 ntries += 1;
191 try {
192 if (deleteOnExit()) FileUtils.deleteDirectory(dir);
193 return true;
194 } catch (IOException ex) {
195 LOG.warn("Failed to delete " + dir.getAbsolutePath());
196 } catch (IllegalArgumentException ex) {
197 LOG.warn("Failed to delete " + dir.getAbsolutePath(), ex);
198 }
199 } while (ntries < 30);
200 return ntries < 30;
201 }
202 }