1   /*** 
2    * 
3    * Copyright 2004 Hiram Chirino
4    * 
5    * Licensed under the Apache License, Version 2.0 (the "License"); 
6    * you may not use this file except in compliance with the License. 
7    * You may obtain a copy of the License at 
8    * 
9    * http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS, 
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
14   * See the License for the specific language governing permissions and 
15   * limitations under the License. 
16   * 
17   **/
18  package org.activeio.journal.active;
19  
20  import java.io.File;
21  import java.io.IOException;
22  import java.nio.ByteBuffer;
23  
24  import junit.framework.TestCase;
25  
26  import org.activeio.journal.InvalidRecordLocationException;
27  import org.activeio.packet.ByteArrayPacket;
28  import org.activeio.packet.ByteBufferPacket;
29  
30  /***
31   * Tests the LogFile used by JournalImpl
32   * 
33   * @version $Revision: 1.1 $
34   */
35  public class LogFileManagerTest extends TestCase {
36  
37      int size = 1024 * 512;
38  
39      int logFileCount = 4;
40  
41      File logDirectory = new File("test-logfile");
42  
43      private LogFileManager logFile;
44  
45      /***
46       * @see junit.framework.TestCase#setUp()
47       */
48      protected void setUp() throws Exception {
49          if (logDirectory.exists()) {
50              deleteDir(logDirectory);
51          }
52          assertTrue(!logDirectory.exists());
53          logFile = new LogFileManager(logDirectory, logFileCount, size);
54      }
55  
56      /***
57       */
58      private void deleteDir(File f) {
59          File[] files = f.listFiles();
60          for (int i = 0; i < files.length; i++) {
61              File file = files[i];
62              file.delete();
63          }
64          f.delete();
65      }
66  
67      protected void tearDown() throws Exception {
68          logFile.dispose();
69          if (logDirectory.exists())
70              deleteDir(logDirectory);
71          assertTrue(!logDirectory.exists());
72      }
73  
74      public void testLogFileCreation() throws IOException {
75          assertTrue(logFile.canActivateNextLogFile());
76          assertEquals(null,logFile.getFirstActiveLogLocation());
77          assertNull(logFile.getLastMarkedRecordLocation());
78          assertEquals(new Location(0, 0),logFile.getNextAppendLocation());
79      }
80  
81      public void testAppendAndRead() throws IOException, InvalidRecordLocationException, InterruptedException {
82  
83          System.out.println("Initial:"+logFile.getNextAppendLocation());
84          appendHelloRecord(1001);
85          Location loc2 = logFile.getNextAppendLocation();
86          appendHelloRecord(2002);
87          appendHelloRecord(3003);
88          appendHelloRecord(3004);
89  
90          Location loc3 = logFile.getNextDataRecordLocation(loc2);
91          assertTrue(loc3.getLogFileOffset() > loc2.getLogFileOffset());
92          Location loc4 = logFile.getNextDataRecordLocation(loc3);
93          assertTrue(loc4.getLogFileOffset() > loc3.getLogFileOffset());
94  
95      }
96  
97      public void testRollOver() throws IOException, InvalidRecordLocationException, InterruptedException {
98  
99          int lastId = logFile.getNextAppendLocation().getLogFileId();
100         int counter = 0;
101         for (int i = 0; i < logFileCount; i++) {
102             counter += 500;
103             appendHelloRecord(counter);
104             if (i + 1 == logFileCount) {
105                 assertFalse(logFile.canActivateNextLogFile());
106             } else {
107                 assertTrue(logFile.canActivateNextLogFile());
108                 logFile.activateNextLogFile();
109                 assertEquals(lastId + 1, logFile.getNextAppendLocation().getLogFileId());
110                 lastId = logFile.getNextAppendLocation().getLogFileId();
111             }
112         }
113 
114     }
115 
116     /***
117      * @param i
118      * @throws IOException
119      * @throws InterruptedException
120      */
121     private void appendHelloRecord(int i) throws IOException, InterruptedException {
122         byte data[] = ("Hello World: " + i).getBytes();
123         Record batchedRecord = new Record(LogFileManager.DATA_RECORD_TYPE, new ByteArrayPacket(data), null);
124         batchedRecord.setLocation(logFile.getNextAppendLocation());
125         
126         BatchedWrite write = new BatchedWrite(new ByteBufferPacket(ByteBuffer.allocate(1024)));
127         write.append(batchedRecord,null, true);
128         write.flip();
129         logFile.append(write);
130     }
131 }