/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2013 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ******************************************************************************/ package org.pentaho.di.cluster; import java.io.File; import java.util.UUID; import junit.framework.TestCase; import org.pentaho.di.core.KettleEnvironment; import org.pentaho.di.core.database.Database; import org.pentaho.di.core.database.DatabaseMeta; import org.pentaho.di.core.logging.KettleLogStore; import org.pentaho.di.core.logging.LoggingObjectInterface; import org.pentaho.di.core.logging.LoggingObjectType; import org.pentaho.di.core.logging.SimpleLoggingObject; import org.pentaho.di.www.SlaveSequence; import org.pentaho.di.www.SlaveServerConfig; public class SlaveSequenceTest extends TestCase { private LoggingObjectInterface loggingObject; protected void init() throws Exception { // Bootstrap the Kettle API... // KettleEnvironment.init(); KettleLogStore.init( 5000, 60 ); // Keep 5000 log rows for at least 60 minutes loggingObject = new SimpleLoggingObject( "SlaveSequenceTest", LoggingObjectType.GENERAL, null ); } /** * This test retrieves next values from a slave sequence.<br> */ public void testSlaveSequenceRetrieval_Specifed() throws Exception { init(); String SLAVE_SEQUENCE_NAME = "test"; SlaveServerConfig slaveConfig = new SlaveServerConfig( "localhost", 8282, false ); slaveConfig.getSlaveServer().setUsername( "cluster" ); slaveConfig.getSlaveServer().setPassword( "cluster" ); String dbDir = System.getProperty( "java.io.tmpdir" ) + "/" + UUID.randomUUID().toString() + "-slaveSeqTest-H2-DB"; DatabaseMeta databaseMeta = new DatabaseMeta( "H2", "H2", "Native", null, dbDir, null, null, null ); slaveConfig.getDatabases().add( databaseMeta ); String table = "SLAVE_SEQUENCE"; String nameField = "SEQ_NAME"; String valueField = "SEQ_VALUE"; SlaveSequence slaveSequence = new SlaveSequence( SLAVE_SEQUENCE_NAME, 1L, databaseMeta, null, table, nameField, valueField ); slaveConfig.getSlaveSequences().add( slaveSequence ); Database db = new Database( loggingObject, databaseMeta ); db.connect(); db.execStatement( "CREATE TABLE SLAVE_SEQUENCE(SEQ_NAME VARCHAR(100), SEQ_VALUE INTEGER);" ); db.disconnect(); // Start the Carte launcher CarteLauncher carteLauncher = new CarteLauncher( slaveConfig ); Thread thread = new Thread( carteLauncher ); thread.start(); // Wait until the carte object is available... // while ( carteLauncher.getCarte() == null && !carteLauncher.isFailure() ) { Thread.sleep( 100 ); } long value = slaveConfig.getSlaveServer().getNextSlaveSequenceValue( SLAVE_SEQUENCE_NAME, 1000 ); assertEquals( 1L, value ); value = slaveConfig.getSlaveServer().getNextSlaveSequenceValue( SLAVE_SEQUENCE_NAME, 1000 ); assertEquals( 1001L, value ); try { slaveConfig.getSlaveServer().getNextSlaveSequenceValue( "Unknown sequence", 1000 ); fail( "No error was thrown for retrieval of an unknown sequence" ); } catch ( Exception e ) { // OK! } // After the test, stop the server // carteLauncher.getCarte().getWebServer().stopServer(); // Remove the database + table in the temporary directory // File dir = new File( dbDir ); if ( dir.exists() ) { for ( File child : dir.listFiles() ) { if ( child.isFile() ) { child.delete(); } } dir.delete(); } } /** * This test retrieves next values from a slave sequence.<br> */ public void testSlaveSequenceRetrieval_AutoCreation() throws Exception { init(); String SLAVE_SEQUENCE_NAME = "test"; SlaveServerConfig slaveConfig = new SlaveServerConfig( "localhost", 8282, false ); slaveConfig.getSlaveServer().setUsername( "cluster" ); slaveConfig.getSlaveServer().setPassword( "cluster" ); String dbDir = System.getProperty( "java.io.tmpdir" ) + "/" + UUID.randomUUID().toString() + "-slaveSeqTest-H2-DB"; DatabaseMeta databaseMeta = new DatabaseMeta( "H2", "H2", "Native", null, dbDir, null, null, null ); slaveConfig.getDatabases().add( databaseMeta ); String table = "SLAVE_SEQUENCE"; String nameField = "SEQ_NAME"; String valueField = "SEQ_VALUE"; SlaveSequence slaveSequence = new SlaveSequence( SLAVE_SEQUENCE_NAME, 1L, databaseMeta, null, table, nameField, valueField ); slaveConfig.setAutomaticCreationAllowed( true ); slaveConfig.setAutoSequence( slaveSequence ); Database db = new Database( loggingObject, databaseMeta ); db.connect(); db.execStatement( "CREATE TABLE SLAVE_SEQUENCE(SEQ_NAME VARCHAR(100), SEQ_VALUE INTEGER);" ); db.disconnect(); // Start the Carte launcher CarteLauncher carteLauncher = new CarteLauncher( slaveConfig ); Thread thread = new Thread( carteLauncher ); thread.start(); // Wait until the carte object is available... // while ( carteLauncher.getCarte() == null && !carteLauncher.isFailure() ) { Thread.sleep( 100 ); } try { long value = slaveConfig.getSlaveServer().getNextSlaveSequenceValue( SLAVE_SEQUENCE_NAME, 1000 ); assertEquals( 1L, value ); value = slaveConfig.getSlaveServer().getNextSlaveSequenceValue( SLAVE_SEQUENCE_NAME, 1000 ); assertEquals( 1001L, value ); value = slaveConfig.getSlaveServer().getNextSlaveSequenceValue( "new sequence", 1000 ); assertEquals( 1L, value ); value = slaveConfig.getSlaveServer().getNextSlaveSequenceValue( "new sequence", 1000 ); assertEquals( 1001L, value ); value = slaveConfig.getSlaveServer().getNextSlaveSequenceValue( SLAVE_SEQUENCE_NAME, 1000 ); assertEquals( 2001L, value ); } catch ( Exception e ) { fail( "And error was thrown for retrieval of an unknown sequence, auto-creation expected" ); } // After the test, stop the server // carteLauncher.getCarte().getWebServer().stopServer(); // Remove the database + table in the temporary directory // File dir = new File( dbDir ); if ( dir.exists() ) { for ( File child : dir.listFiles() ) { if ( child.isFile() ) { child.delete(); } } dir.delete(); } } }