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 }