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