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.codehaus.activemq.journal.impl; 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.codehaus.activemq.journal.InvalidRecordLocationException; 27 28 29 /*** 30 * Tests the LogFile used by JournalImpl 31 * 32 * @version $Revision: 1.1 $ 33 */ 34 public class LogFileTest extends TestCase { 35 36 int size = 1024*512; 37 int segmentCount=4; 38 File logDirectory = new File("test-logfile"); 39 private LogFile logFile; 40 41 /*** 42 * @see junit.framework.TestCase#setUp() 43 */ 44 protected void setUp() throws Exception { 45 if( logDirectory.exists() ) { 46 deleteDir(logDirectory); 47 } 48 assertTrue( !logDirectory.exists() ); 49 logFile = new LogFile(logDirectory,segmentCount,size); 50 } 51 52 /*** 53 */ 54 private void deleteDir(File f) { 55 File[] files = f.listFiles(); 56 for (int i = 0; i < files.length; i++) { 57 File file = files[i]; 58 file.delete(); 59 } 60 f.delete(); 61 } 62 63 protected void tearDown() throws Exception { 64 logFile.close(); 65 if( logDirectory.exists() ) 66 deleteDir(logDirectory); 67 assertTrue( !logDirectory.exists() ); 68 } 69 70 public void testLogFileCreation() throws IOException { 71 assertTrue( logFile.isSegmentIndexActive((byte)0) ); 72 assertEquals( logFile.getAppendSegmentIndex(), (byte)0); 73 assertTrue( logFile.canActivateNextSegment() ); 74 assertEquals( -1, logFile.getLastSequenceId()); 75 } 76 77 public void testAppendAndRead() throws IOException, InvalidRecordLocationException { 78 79 appendHelloRecord(1001); 80 RecordLocationImpl loc = new RecordLocationImpl((byte)0, logFile.getAppendSegmentIndex(), logFile.getAppendSegmentOffset()); 81 appendHelloRecord(2002); 82 appendHelloRecord(3003); 83 84 RecordLocationImpl loc2 = logFile.readRecordLocation(loc); 85 assertEquals( loc2.getSequenceId(), 2002 ); 86 loc2 = logFile.getNextDataRecordLocation(loc2); 87 assertEquals( loc2.getSequenceId(), 3003 ); 88 loc2 = logFile.getNextDataRecordLocation(loc2); 89 assertNull(loc2 ); 90 91 } 92 93 public void testRollOver() throws IOException, InvalidRecordLocationException { 94 95 int counter=0; 96 for( int i=0; i < segmentCount; i++ ) { 97 counter += 500; 98 appendHelloRecord(counter); 99 if( i+1==segmentCount ) { 100 assertFalse( logFile.canActivateNextSegment() ); 101 } else { 102 assertTrue( logFile.getAppendSegmentIndex()==i ); 103 assertTrue( logFile.canActivateNextSegment() ); 104 logFile.activateNextSegment(); 105 assertTrue( logFile.getAppendSegmentIndex()==i+1 ); 106 } 107 } 108 109 110 } 111 112 113 /*** 114 * @param i 115 * @throws IOException 116 */ 117 private void appendHelloRecord(int i) throws IOException { 118 byte data[] = ("Hello World: "+i).getBytes(); 119 120 BatchedWrite write = new BatchedWrite(ByteBuffer.allocate(1024)); 121 Record batchedRecord = new Record((long)i, LogFile.DATA_RECORD_TYPE, data, null); 122 write.append(batchedRecord); 123 logFile.appendAndForce(write); 124 } 125 }