    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 }