1 package org.xmlBlaster.test.classtest;
2
3 import java.util.logging.Logger;
4 import java.util.logging.Level;
5 import org.xmlBlaster.util.StopWatch;
6 import org.xmlBlaster.engine.ServerScope;
7 import org.xmlBlaster.util.XmlBlasterException;
8 import org.xmlBlaster.util.def.ErrorCode;
9 import org.xmlBlaster.util.recorder.file.FileIO;
10 import org.xmlBlaster.util.recorder.file.I_UserDataHandler;
11
12 import java.io.*;
13
14 import junit.framework.*;
15
16 /**
17 * Test FileIO class.
18 * <p />
19 * Invoke: java -Djava.compiler= junit.textui.TestRunner org.xmlBlaster.test.classtest.FileIOTest
20 *
21 * @see org.xmlBlaster.util.recorder.file.FileIO
22 */
23 public class FileIOTest extends TestCase {
24 private String ME = "FileIOTest";
25 protected ServerScope glob;
26 private static Logger log = Logger.getLogger(FileIOTest.class.getName());
27 private String fileName = null;
28 private StopWatch stopWatch = new StopWatch();
29 private boolean testDiscardOldest = false;
30
31 public FileIOTest(String name) {
32 super(name);
33 }
34
35 protected void setUp() {
36 glob = new ServerScope();
37
38 }
39
40 protected void tearDown() {
41 File file;
42 file = new File("testSync.txt");
43 file.delete();
44 file = new File("testNoSync.txt");
45 file.delete();
46 if (fileName != null) {
47 file = new File(fileName);
48 file.delete();
49 }
50 }
51
52 public void testBasic() {
53 testSync(false);
54 testSync(true);
55 }
56
57 public void testSync(boolean sync) {
58 String testName = sync ? "testSync" : "testNoSync";
59 System.out.println("***** Test " + testName + " write ...");
60
61 fileName = testName + ".txt";
62 I_UserDataHandler userDataHandler = new UserDataHandler();
63 long num = 2000;
64 if (sync) num = 100;
65 FileIO fileIO = null;
66
67 try {
68 log.info("Opening file '" + fileName + "' num=" + num + " sync=" + sync + " ...");
69 fileIO = new FileIO(glob, fileName, userDataHandler, num, sync);
70 File f = new File(fileName);
71 long emptyLength = f.length();
72
73 {
74 System.out.println("Write " + num + " ...");
75 long start = System.currentTimeMillis();
76 for (int ii=0; ii<num; ii++)
77 fileIO.writeNext("World-" + ii);
78 long elapsed = System.currentTimeMillis() - start;
79 if (num > 0L && elapsed > 0L)
80 System.out.println("For num=" + num + " writes numLost=" + fileIO.getNumLost() + " numUnread=" + fileIO.getNumUnread() + " we needed " + elapsed + " millis -> " + (num*1000L)/elapsed + " writes/sec " + elapsed/num + " millis/write");
81
82 assertEquals("NumUnread", num, fileIO.getNumUnread());
83 assertEquals("NumLost", 0L, fileIO.getNumLost());
84 File file = new File(fileName);
85 assertTrue("File size emptyLength=" + emptyLength + " file.length()=" + file.length(), file.length() > emptyLength);
86 }
87
88 {
89 System.out.println("***** Test " + testName + " read ...");
90 long count = 0L;
91 long start = System.currentTimeMillis();
92 while (true) {
93 String data = (String)fileIO.readNext(true);
94 if (data == null)
95 break;
96 count++;
97 }
98 long elapsed = System.currentTimeMillis() - start;
99 if (count > 0L && elapsed > 0L)
100 System.out.println("For count=" + count + " numLost=" + fileIO.getNumLost() + " numUnread=" + fileIO.getNumUnread() +
101 " reades we needed " + elapsed + " millis -> " + (count*1000L)/elapsed + " reads/sec " + elapsed/count + " millis/read");
102
103 assertEquals("NumUnread", 0L, fileIO.getNumUnread());
104 assertEquals("NumLost", 0L, fileIO.getNumLost());
105 File file = new File(fileName);
106 assertEquals("File size emptyLength=" + emptyLength + " file.length()=" + file.length(), emptyLength, file.length());
107 }
108 }
109 catch(IOException e) {
110 fail(testName + " failed: " + e.toString());
111 }
112 catch(XmlBlasterException e) {
113 fail(testName + " failed: " + e.toString());
114 }
115 finally {
116 if (fileIO != null) { fileIO.destroy(); fileIO = null; }
117 }
118 }
119
120 public void testOverflow() {
121 String testName = "testOverflow";
122 System.out.println("***** Test " + testName);
123
124 fileName = testName + ".txt";
125 I_UserDataHandler userDataHandler = new UserDataHandler();
126 long num = 10;
127 long numOverflow = 2;
128 FileIO fileIO = null;
129
130 try {
131 {
132 fileIO = new FileIO(glob, fileName, userDataHandler, num-numOverflow, false);
133 fileIO.setModeDiscardOldest();
134
135 System.out.println("Write " + num + " data objects (DISCARD_OLDEST) ...");
136 for (int ii=0; ii<num; ii++)
137 fileIO.writeNext("World-" + ii);
138
139 assertEquals("NumUnread", num-numOverflow, fileIO.getNumUnread());
140 assertEquals("NumLost", numOverflow, fileIO.getNumLost());
141 }
142 {
143 fileIO = new FileIO(glob, fileName, userDataHandler, num-numOverflow, false);
144 fileIO.setModeDiscard();
145
146 System.out.println("Write " + num + " data objects (DISCARD) ...");
147 for (int ii=0; ii<num; ii++)
148 fileIO.writeNext("World-" + ii);
149
150 assertEquals("NumUnread", num-numOverflow, fileIO.getNumUnread());
151 assertEquals("NumLost", numOverflow, fileIO.getNumLost());
152 }
153 {
154 fileIO = new FileIO(glob, fileName, userDataHandler, num-numOverflow, false);
155 fileIO.setModeException();
156
157 System.out.println("Write " + num + " data objects (EXCEPTION) ...");
158 int numExceptions = 0;
159 for (int ii=0; ii<num; ii++) {
160 try {
161 fileIO.writeNext("World-" + ii);
162 }
163 catch(XmlBlasterException e) {
164 numExceptions++;
165 }
166 }
167
168 assertEquals("NumUnread", num-numOverflow, fileIO.getNumUnread());
169 assertEquals("NumLost", numOverflow, fileIO.getNumLost());
170 assertEquals("NumExceptions", numOverflow, numExceptions);
171 }
172 }
173 catch(IOException e) {
174 fail(testName + " failed: " + e.toString());
175 }
176 catch(XmlBlasterException e) {
177 fail(testName + " failed: " + e.toString());
178 }
179 finally {
180 if (fileIO != null) { fileIO.destroy(); fileIO = null; }
181 }
182 }
183
184 public void testDataCorruption() {
185 String testName = "testDataCorruption";
186 System.out.println("***** Test " + testName);
187
188 fileName = testName + ".txt";
189 I_UserDataHandler userDataHandler = new UserDataHandler();
190 long num = 20;
191 FileIO fileIO = null;
192
193 try {
194 fileIO = new FileIO(glob, fileName, userDataHandler, num, false);
195 fileIO.writeNext("AFirstValue");
196 fileIO.writeNext("ASecondValue");
197 assertEquals("Data corrupted", "AFirstValue", (String)fileIO.readNext(true));
198 assertEquals("Data corrupted", "ASecondValue", (String)fileIO.readNext(true));
199 }
200 catch(IOException e) {
201 fail(testName + " failed: " + e.toString());
202 }
203 catch(XmlBlasterException e) {
204 fail(testName + " failed: " + e.toString());
205 }
206 finally {
207 if (fileIO != null) { fileIO.destroy(); fileIO = null; }
208 }
209 }
210
211 public void testKilledFileOnWrite() {
212 String testName = "testKilledFileOnWrite";
213 System.out.println("***** Test " + testName);
214
215 fileName = testName + ".txt";
216 I_UserDataHandler userDataHandler = new UserDataHandler();
217 long num = 20;
218 long numKill = 5;
219 FileIO fileIO = null;
220
221 try {
222 fileIO = new FileIO(glob, fileName, userDataHandler, num, false);
223 for (int ii=0; ii<num; ii++) {
224 if (ii == numKill) {
225 File ff = new File(fileName);
226 ff.delete();
227 }
228 try {
229 fileIO.writeNext("World-" + ii);
230 }
231 catch (XmlBlasterException e) {
232 if (e.getErrorCode() == ErrorCode.RESOURCE_FILEIO)
233 fail("Wrong exception thrown: " + e.toString());
234 else
235 System.out.println(e.getMessage());
236
237 }
238 }
239
240 assertEquals("NumUnread", num-numKill, fileIO.getNumUnread());
241
242 int count = 0;
243 while (true) {
244 String data = (String)fileIO.readNext(true);
245 if (data == null)
246 break;
247 count++;
248 }
249
250 assertEquals("num after kill", num-numKill, count);
251 assertEquals("NumUnread", 0L, fileIO.getNumUnread());
252 assertEquals("NumKillLost", numKill, fileIO.getNumFileDeleteLost());
253 assertEquals("NumLost", 0L, fileIO.getNumLost());
254 }
255 catch(IOException e) {
256 fail(testName + " failed: " + e.toString());
257 }
258 catch(XmlBlasterException e) {
259 fail(testName + " failed: " + e.toString());
260 }
261 finally {
262 if (fileIO != null) { fileIO.destroy(); fileIO = null; }
263 }
264 }
265
266 public void testKilledFileOnRead() {
267 String testName = "testKilledFileOnRead";
268 System.out.println("***** Test " + testName);
269
270 fileName = testName + ".txt";
271 I_UserDataHandler userDataHandler = new UserDataHandler();
272 long num = 20;
273 long numKill = 5;
274 FileIO fileIO = null;
275
276 try {
277 fileIO = new FileIO(glob, fileName, userDataHandler, num, false);
278 for (int ii=0; ii<num; ii++) {
279 fileIO.writeNext("World-" + ii);
280 }
281
282 assertEquals("NumUnread", num, fileIO.getNumUnread());
283
284 int count = 0;
285 while (true) {
286 if (count == numKill) {
287 File ff = new File(fileName);
288 ff.delete();
289 }
290
291 try {
292 String data = (String)fileIO.readNext(true);
293 if (data == null)
294 break;
295 count++;
296 }
297 catch (XmlBlasterException e) {
298 if (e.getErrorCode() == ErrorCode.RESOURCE_FILEIO_FILELOST)
299 fail("Wrong exception thrown: " + e.toString());
300 else {
301 System.out.println(e.getMessage());
302 break; // no more data to read
303 }
304
305 }
306 }
307
308 assertEquals("num after kill", numKill, count);
309 assertEquals("NumUnread", 0L, fileIO.getNumUnread());
310 assertEquals("NumKillLost", num-numKill, fileIO.getNumFileDeleteLost());
311 assertEquals("NumLost", 0L, fileIO.getNumLost());
312 }
313 catch(IOException e) {
314 fail(testName + " failed: " + e.toString());
315 }
316 catch(XmlBlasterException e) {
317 fail(testName + " failed: " + e.toString());
318 }
319 finally {
320 if (fileIO != null) { fileIO.destroy(); fileIO = null; }
321 }
322 }
323
324 public void testRestart() {
325 String testName = "testRestart";
326 System.out.println("***** Test " + testName);
327
328 fileName = testName + ".txt";
329 I_UserDataHandler userDataHandler = new UserDataHandler();
330 long num = 20;
331 long numRead = 8;
332 FileIO fileIO = null;
333
334 try {
335
336 {
337 fileIO = new FileIO(glob, fileName, userDataHandler, num, false);
338
339 for (int ii=0; ii<num; ii++)
340 fileIO.writeNext("World-" + ii);
341
342 assertEquals("NumUnread", num, fileIO.getNumUnread());
343 assertEquals("NumLost", 0L, fileIO.getNumLost());
344
345 for (int ii=0; ii<numRead; ii++)
346 fileIO.readNext(true);
347
348 assertEquals("NumUnread", num-numRead, fileIO.getNumUnread());
349 assertEquals("NumLost", 0L, fileIO.getNumLost());
350 }
351
352 // Simulates restart of software ...
353
354 {
355 fileIO = new FileIO(glob, fileName, userDataHandler, num, false);
356
357 int count = 0;
358 while (true) {
359 String data = (String)fileIO.readNext(true);
360 if (data == null)
361 break;
362 count++;
363 }
364
365 assertEquals("num after restart", num-numRead, count);
366 assertEquals("NumUnread", 0L, fileIO.getNumUnread());
367 assertEquals("NumLost", 0L, fileIO.getNumLost());
368 }
369 }
370 catch(IOException e) {
371 fail(testName + " failed: " + e.toString());
372 }
373 catch(XmlBlasterException e) {
374 fail(testName + " failed: " + e.toString());
375 }
376 finally {
377 if (fileIO != null) { fileIO.destroy(); fileIO = null; }
378 }
379 }
380
381 /** Simulate some data format to be recorded */
382 class UserDataHandler implements I_UserDataHandler
383 {
384 public final void writeData(final RandomAccessFile ra, final Object userData) throws IOException {
385 ra.writeUTF((String)userData);
386 }
387 public final Object readData(final RandomAccessFile ra) throws IOException {
388 return ra.readUTF();
389 }
390 }
391
392 /**
393 * Invoke: java org.xmlBlaster.test.qos.FileIOTest
394 * @deprecated Use the TestRunner from the testsuite to run it:<p />
395 * <pre> java -Djava.compiler= junit.textui.TestRunner org.xmlBlaster.test.classtest.FileIOTest</pre>
396 */
397 public static void main(String args[])
398 {
399 ServerScope glob = new ServerScope();
400 if (glob.init(args) != 0) {
401 System.err.println("******* FileIOTest: Init failed");
402 }
403 FileIOTest testSub = new FileIOTest("FileIOTest");
404 testSub.setUp();
405 testSub.testBasic();
406 testSub.tearDown();
407 }
408 }
syntax highlighted by Code2HTML, v. 0.9.1