package com.ricebridge.csvman.test;
import com.ricebridge.csvman.*;
import org.jostraca.util.*;
import junit.framework.*;
import junit.textui.*;
import javax.swing.table.*;
import java.sql.ResultSet;
import java.util.*;
import java.io.*;
public class StreamingTest extends TestCase {
public StreamingTest( String pName ) {
super( pName );
}
public static TestSuite suite() {
return new TestSuite( StreamingTest.class );
}
public static void main( String[] pArgs ) {
TestRunner.run( suite() );
}
public void testFiles() {
CsvManager cm = new CsvManager();
try {
String fn = null;
LineListener ln = new MeasureStreamLineListener( "primer", 10 );
fn = "p10";
cm.load( TestUtil.getTextCsvFile(fn), ln );
String[] files = new String[] { "p10", "p100", "p1000", "p10000", "p100000", "p1000000" };
ArrayList stats = new ArrayList();
ArrayList row = new ArrayList();
row.add("FileName");
row.add("NumLines");
row.add("MeasureStream");
stats.add( row );
cm.getCsvSpec().setFlushEachLine( true );
int numFiles = files.length;
for( int fI = 0; fI < numFiles; fI++ ) {
measureFile( cm, files[fI], (long) Math.pow(10, fI+1), stats );
}
cm.saveAsLists( TestUtil.getTextCsvFile("stream-stats"), stats );
}
catch( Exception e ) {
System.out.println( e.getMessage() );
e.printStackTrace();
}
catch( Error e ) {
System.out.println( cm.getLineCount() );
System.out.println( e.getMessage() );
e.printStackTrace();
}
}
public void measureFile( CsvManager pCsvManager, String pFileName, long pLineCount, ArrayList pStats ) throws Exception {
LineListener ln = new MeasureStreamLineListener( pFileName, pLineCount );
for( int rI = 0; rI < 1; rI++ ) {
System.out.println( pFileName+":"+rI );
ArrayList row = new ArrayList();
row.add( pFileName );
row.add( new Long(pLineCount) );
pStats.add( row );
pCsvManager.load( TestUtil.getTextCsvFile( pFileName ), ln );
display(pCsvManager);
check( pCsvManager, pLineCount, 0 );
row.add( new Long( pCsvManager.getTimeTaken() ) );
System.out.println( "measure-stream:"+rI+":"+pCsvManager.getTimeTaken() );
System.gc();
}
}
public void check( CsvManager pCsvManager, long pLineCount, long pBadLineCount ) {
assertEquals( pLineCount, pCsvManager.getLineCount() );
assertEquals( pBadLineCount, pCsvManager.getBadLineCount() );
}
public void display( CsvManager pCsvManager ) {
System.out.println( "lc:"+pCsvManager.getLineCount()+" blc:"+pCsvManager.getBadLineCount()+" tt:"+pCsvManager.getTimeTaken() );
}
public static class MeasureStreamLineListener extends CustomLineListener {
private String iMeasureFileName;
private PrintWriter iMeasureWriter;
private long iTimeMillis;
private Runtime iRuntime;
private long iExpectedLines;
public MeasureStreamLineListener( String pFileName, long pExpectedLines ) {
iMeasureFileName = "measure-"+pFileName;
iRuntime = Runtime.getRuntime();
iExpectedLines = pExpectedLines;
}
public void startProcessImpl() {
try {
File mf = TestUtil.getTextCsvFile( iMeasureFileName );
iMeasureWriter = new PrintWriter( new FileWriter( mf ) );
iMeasureWriter.println( "Line,Mem,TimeMillis");
iTimeMillis = new Date().getTime();
}
catch( Exception e ) {
throw new CsvManagerException( e );
}
}
public void endProcessImpl() {
try {
iMeasureWriter.close();
}
catch( Exception e ) {
throw new CsvManagerException( e );
}
}
protected void handleBadLineImpl( BadLine pBadLine ) {
System.out.println( "BADLINE:"+pBadLine );
}
protected BadLine handleLineImpl( String[] pLine, int pNumFields, long pLineNumber, String pOriginalLine ) {
long usedmem = iRuntime.totalMemory() - iRuntime.freeMemory();
Date now = new Date();
long tm = (now.getTime()-iTimeMillis);
if( iExpectedLines < 10001 || tm > 10 || 0 == (pLineNumber % (iExpectedLines/10000)) ) {
iMeasureWriter.println( pLineNumber+","+usedmem+","+tm );
}
iTimeMillis = now.getTime();
return null;
}
}
}