/* Copyright (c) 2005 Ricebridge. All Rights Reserved.
 *
 * This file is available under the terms and conditions of the
 * Ricebridge "Open Source API" policy; Ricebridge grants use of this
 * copyrighted work under the terms of a BSD-style license only. See
 * http://www.opensource.org/licenses/bsd-license.php for more
 * information.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 
 *  - Redistributions of source code must retain the above copyright
 *  notice, this list of conditions and the following disclaimer.
 *
 *  - Redistributions in binary form must reproduce the above
 *  copyright notice, this list of conditions and the following
 *  disclaimer in the documentation and/or other materials provided
 *  with the distribution.
 *
 *  - Neither the name of the Ricebridge nor the names of its
 *  contributors may be used to endorse or promote products derived
 *  from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.  
 */

package com.ricebridge.xmlman.test;


import com.ricebridge.xmlman.*;
import com.ricebridge.xmlman.in.*;
import com.ricebridge.xmlman.in.test.*;
import com.ricebridge.xmlman.log.*;

import org.jostraca.util.*;

import junit.framework.*;
import junit.textui.*;

import java.util.*;
import java.io.*;
import javax.swing.table.TableModel;
import java.sql.ResultSet;


/** Test cases for {@link com.ricebridge.xmlman.XmlManager} background processing. 
 *    <p>Test file is <a href="example.xml">example.xml</a>.</p> 
 *    <p>The <b><a href="BackgroundTest.java.html">Source Code</a></b> of this Java class 
 *    is available under a <a href="http://www.opensource.org/licenses/bsd-license.php">BSD-style license</a>.</p>
 */
public class BackgroundTest extends TestCase {

  // test framework
  
  public BackgroundTest( String pName ) {
    super( pName );
  }

  public static TestSuite suite() {
    return new TestSuite( BackgroundTest.class );
  }

  public static void main( String[] pArgs ) {
    TestRunner.run( suite() );
  }

  // test cases

  public void testLoad() throws Exception {
    File         xmlFile    = TestUtil.findFile( "com/ricebridge/xmlman/test/example.xml" );
    XmlManager   xmlManager = new XmlManager();
    RecordSpec   rs         = new RecordSpec( "/root/record", new String[] {"@name","foo","bar"} );
    boolean      waited     = false;
    
    xmlManager.getXmlSpec().setBackground(true);
    xmlManager.getXmlSpec().setProperty("test.delay",""+100);

    // StringArray
    waited = false;
    xmlManager.getXmlManagerStore().setStringArrayRecordListenerClass( DelayedStringArrayRecordListener.class );
    List stringarray = xmlManager.load( xmlFile, rs );
    assertEquals( 0, stringarray.size() );
    while( !xmlManager.isLoadFinished() ) { try { Thread.sleep(50); waited=true; } catch( Exception e ) {} }
    assertTrue( waited );
    assertEquals( "[r1, f1, b1]\n[r2, f2, b2]\n[r3, f3, b3]\n", TestUtil.dataToString(stringarray) );

    // StringList
    waited = false;
    xmlManager.getXmlManagerStore().setStringListRecordListenerClass( DelayedStringListRecordListener.class );
    List stringlist = xmlManager.loadAsLists( xmlFile, rs );
    assertEquals( 0, stringlist.size() );
    while( !xmlManager.isLoadFinished() ) { try { Thread.sleep(50); waited=true; } catch( Exception e ) {} }
    assertTrue( waited );
    assertEquals( "[[r1, f1, b1], [r2, f2, b2], [r3, f3, b3]]", stringlist.toString() );

    // TableModel
    waited = false;
    xmlManager.getXmlManagerStore().setTableModelRecordListenerClass( DelayedTableModelRecordListener.class );
    TableModel tm = xmlManager.loadTableModel( xmlFile, rs );
    assertEquals( 0, tm.getRowCount() );
    while( !xmlManager.isLoadFinished() ) { try { Thread.sleep(50); waited=true; } catch( Exception e ) {} }
    assertTrue( waited );
    assertEquals( "XmlTableModel[head:false,edit:false, data:[|r1|f1|b1|\n|r2|f2|b2|\n|r3|f3|b3|\n]]", tm.toString() );

    // ResultSet
    waited = false;
    xmlManager.getXmlManagerStore().setResultSetRecordListenerClass( DelayedResultSetRecordListener.class );
    ResultSet resultset = xmlManager.loadResultSet( xmlFile, rs );
    assertEquals( 0, ((XmlResultSet)resultset).getRowCount() );
    while( !xmlManager.isLoadFinished() ) { try { Thread.sleep(50); waited=true; } catch( Exception e ) {} }
    assertTrue( waited );
    assertEquals( "XmlResultSet[head:false, data:[r1 f1 b1|r2 f2 b2|r3 f3 b3|]]", resultset.toString() );

    // Listener
    waited = false;
    DelayedStringArrayRecordListener drl = new DelayedStringArrayRecordListener();
    xmlManager.load( xmlFile, rs, drl );
    stringarray = drl.getRecords();
    assertEquals( 0, stringarray.size() );
    while( !xmlManager.isLoadFinished() ) { try { Thread.sleep(50); waited=true; } catch( Exception e ) {} }
    assertTrue( waited );
    assertEquals( "[r1, f1, b1]\n[r2, f2, b2]\n[r3, f3, b3]\n", TestUtil.dataToString(stringarray) );
  }


  public void testSave() throws Exception {
    String xmlcanon = "<root><record name=\"r1\"><foo>f1</foo><bar>b1</bar></record><record name=\"r2\"><foo>f2</foo><bar>b2</bar></record><record name=\"r3\"><foo>f3</foo><bar>b3</bar></record></root>";

    File         xmlFile    = TestUtil.findFile( "com/ricebridge/xmlman/test/save.xml" );
    XmlManager   xmlManager = new XmlManager();
    RecordSpec   rs         = new RecordSpec( "/root/record", new String[] {"@name","foo","bar"} );
    boolean      waited     = false;
    
    xmlManager.getXmlSpec().setIndent(false);
    xmlManager.getXmlSpec().setBackground(true);
    xmlManager.getXmlSpec().setProperty("test.delay",""+500);

    List data = new ArrayList();
    data.add( new String[]{"r1", "f1", "b1"} );
    data.add( new String[]{"r2", "f2", "b2"} );
    data.add( new String[]{"r3", "f3", "b3"} );

    // StringArray
    waited = false;
    xmlManager.getXmlManagerStore().setStringArrayRecordProviderClass( DelayedStringArrayRecordProvider.class );
    FileUtil.writeFile(xmlFile,"");
    xmlManager.save( xmlFile, rs, data );
    assertEquals( "", FileUtil.readFile(xmlFile) );
    while( !xmlManager.isSaveFinished() ) { try { Thread.sleep(50); waited=true; } catch( Exception e ) {} }
    assertTrue( waited );
    assertEquals( xmlcanon, FileUtil.readFile(xmlFile) );

    // StringList
    waited = false;
    xmlManager.getXmlManagerStore().setStringListRecordProviderClass( DelayedStringListRecordProvider.class );
    FileUtil.writeFile(xmlFile,"");
    xmlManager.save( xmlFile, rs, data );
    assertEquals( "", FileUtil.readFile(xmlFile) );
    while( !xmlManager.isSaveFinished() ) { try { Thread.sleep(50); waited=true; } catch( Exception e ) {} }
    assertTrue( waited );
    assertEquals( xmlcanon, FileUtil.readFile(xmlFile) );
  }
  

  // Shucks Java, give us some mixins honey!

  public static class DelayedStringArrayRecordListener extends StringArrayRecordListener {
    Delayer iDelayer;
    protected void setXmlSpecImpl( XmlSpec pXmlSpec ) { iDelayer = new Delayer( pXmlSpec ); }
    protected void startProcessImpl() { iDelayer.delay(); }
  }
  public static class DelayedStringListRecordListener extends StringListRecordListener {
    Delayer iDelayer;
    protected void setXmlSpecImpl( XmlSpec pXmlSpec ) { iDelayer = new Delayer( pXmlSpec ); }
    protected void startProcessImpl() { iDelayer.delay(); }
  }
  public static class DelayedTableModelRecordListener extends TableModelRecordListener {
    Delayer iDelayer;
    protected void setXmlSpecImpl( XmlSpec pXmlSpec ) { iDelayer = new Delayer( pXmlSpec ); }
    protected void startProcessImpl() { iDelayer.delay(); }
  }
  public static class DelayedResultSetRecordListener extends ResultSetRecordListener {
    Delayer iDelayer;
    protected void setXmlSpecImpl( XmlSpec pXmlSpec ) { iDelayer = new Delayer( pXmlSpec ); }
    protected void startProcessImpl() { iDelayer.delay(); }
  }


  public static class DelayedStringArrayRecordProvider extends StringArrayRecordProvider {
    Delayer iDelayer;
    protected void setXmlSpecImpl( XmlSpec pXmlSpec ) { iDelayer = new Delayer( pXmlSpec ); }
    protected void startProcessImpl() { iDelayer.delay(); }
  }
  public static class DelayedStringListRecordProvider extends StringListRecordProvider {
    Delayer iDelayer;
    protected void setXmlSpecImpl( XmlSpec pXmlSpec ) { iDelayer = new Delayer( pXmlSpec ); }
    protected void startProcessImpl() { iDelayer.delay(); }
  }


  public static class Delayer {
    private long iMillis = 0;

    public Delayer( XmlSpec pXmlSpec ) {
      iMillis = Integer.parseInt( pXmlSpec.getProperty("test.delay") );
    }

    public Delayer( long pMillis ) {
      iMillis = pMillis;
    }

    public void delay() {
      long end = new Date().getTime() + iMillis ;
      long now;
      while( (now = new Date().getTime()) < end ) {
        try { Thread.sleep( end-now ); } catch( Exception e ) {}
      }
    }
  } 

}





Syntax Highlighting created using the com.Ostermiller.Syntax package.
Thursday, February 23 2006 at 16:47