/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2014 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.www;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.bio.SocketConnector;
import org.pentaho.di.cluster.SlaveServer;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.logging.LogChannelInterface;
import java.util.ArrayList;
import java.util.List;
/**
* @author Tatsiana_Kasiankova
*
*/
public class WebServerTest {
/**
*
*/
private static final String EMPTY_STRING = "";
private static final boolean SHOULD_JOIN = false;
private static final String HOST_NAME = "localhost";
private static final int PORT = 8099;
private static final String ACCEPTORS = "5";
private static final int EXPECTED_ACCEPTORS = 5;
private static final String ACCEPT_QUEUE_SIZE = "5000";
private static final int EXPECTED_ACCEPT_QUEUE_SIZE = 5000;
private static final String RES_MAX_IDLE_TIME = "200";
private static final int EXPECTED_RES_MAX_IDLE_TIME = 200;
private static final int EXPECTED_CONNECTORS_SIZE = 1;
private WebServer webServer;
private WebServer webServerNg;
private TransformationMap trMapMock = mock( TransformationMap.class );
private SlaveServerConfig sServerConfMock = mock( SlaveServerConfig.class );
private SlaveServer sServer = mock( SlaveServer.class );
private JobMap jbMapMock = mock( JobMap.class );
private SocketRepository sRepoMock = mock( SocketRepository.class );
private List<SlaveServerDetection> detections = new ArrayList<SlaveServerDetection>();
private LogChannelInterface logMock = mock( LogChannelInterface.class );
private static final SocketConnector defSocketConnector = new SocketConnector();
@Before
public void setup() throws Exception {
System.setProperty( Const.KETTLE_CARTE_JETTY_ACCEPTORS, ACCEPTORS );
System.setProperty( Const.KETTLE_CARTE_JETTY_ACCEPT_QUEUE_SIZE, ACCEPT_QUEUE_SIZE );
System.setProperty( Const.KETTLE_CARTE_JETTY_RES_MAX_IDLE_TIME, RES_MAX_IDLE_TIME );
when( sServerConfMock.getSlaveServer() ).thenReturn( sServer );
when( trMapMock.getSlaveServerConfig() ).thenReturn( sServerConfMock );
when( sServer.getPassword() ).thenReturn( "cluster" );
when( sServer.getUsername() ).thenReturn( "cluster" );
webServer =
new WebServer( logMock, trMapMock, jbMapMock, sRepoMock, detections, HOST_NAME, PORT, SHOULD_JOIN, null );
}
@After
public void tearDown() {
webServer.setWebServerShutdownHandler( null ); // disable system.exit
webServer.stopServer();
System.getProperties().remove( Const.KETTLE_CARTE_JETTY_ACCEPTORS );
System.getProperties().remove( Const.KETTLE_CARTE_JETTY_ACCEPT_QUEUE_SIZE );
System.getProperties().remove( Const.KETTLE_CARTE_JETTY_RES_MAX_IDLE_TIME );
}
@Test
public void testJettyOption_AcceptorsSetUp() throws Exception {
assertEquals( getSocketConnectors( webServer ).size(), EXPECTED_CONNECTORS_SIZE );
for ( SocketConnector sc : getSocketConnectors( webServer ) ) {
assertEquals( EXPECTED_ACCEPTORS, sc.getAcceptors() );
}
}
@Test
public void testJettyOption_AcceptQueueSizeSetUp() throws Exception {
assertEquals( getSocketConnectors( webServer ).size(), EXPECTED_CONNECTORS_SIZE );
for ( SocketConnector sc : getSocketConnectors( webServer ) ) {
assertEquals( EXPECTED_ACCEPT_QUEUE_SIZE, sc.getAcceptQueueSize() );
}
}
@Test
public void testJettyOption_LowResourceMaxIdleTimeSetUp() throws Exception {
assertEquals( getSocketConnectors( webServer ).size(), EXPECTED_CONNECTORS_SIZE );
for ( SocketConnector sc : getSocketConnectors( webServer ) ) {
assertEquals( EXPECTED_RES_MAX_IDLE_TIME, sc.getLowResourceMaxIdleTime() );
}
}
@Test
public void testNoExceptionAndUsingDefaultServerValue_WhenJettyOptionSetAsInvalidValue() throws Exception {
System.setProperty( Const.KETTLE_CARTE_JETTY_ACCEPTORS, "TEST" );
try {
webServerNg =
new WebServer( logMock, trMapMock, jbMapMock, sRepoMock, detections, HOST_NAME, PORT + 1, SHOULD_JOIN, null );
} catch ( NumberFormatException nmbfExc ) {
fail( "Should not have thrown any NumberFormatException but it does: " + nmbfExc );
}
assertEquals( getSocketConnectors( webServerNg ).size(), EXPECTED_CONNECTORS_SIZE );
for ( SocketConnector sc : getSocketConnectors( webServerNg ) ) {
assertEquals( defSocketConnector.getAcceptors(), sc.getAcceptors() );
}
webServerNg.setWebServerShutdownHandler( null ); // disable system.exit
webServerNg.stopServer();
}
@Test
public void testNoExceptionAndUsingDefaultServerValue_WhenJettyOptionSetAsEmpty() throws Exception {
System.setProperty( Const.KETTLE_CARTE_JETTY_ACCEPTORS, EMPTY_STRING );
try {
webServerNg =
new WebServer( logMock, trMapMock, jbMapMock, sRepoMock, detections, HOST_NAME, PORT + 1, SHOULD_JOIN, null );
} catch ( NumberFormatException nmbfExc ) {
fail( "Should not have thrown any NumberFormatException but it does: " + nmbfExc );
}
assertEquals( getSocketConnectors( webServerNg ).size(), EXPECTED_CONNECTORS_SIZE );
for ( SocketConnector sc : getSocketConnectors( webServerNg ) ) {
assertEquals( defSocketConnector.getAcceptors(), sc.getAcceptors() );
}
webServerNg.setWebServerShutdownHandler( null ); // disable system.exit
webServerNg.stopServer();
}
private List<SocketConnector> getSocketConnectors( WebServer wServer ) {
List<SocketConnector> sConnectors = new ArrayList<SocketConnector>();
Connector[] connectors = wServer.getServer().getConnectors();
for ( Connector cn : connectors ) {
if ( cn instanceof SocketConnector ) {
sConnectors.add( (SocketConnector) cn );
}
}
return sConnectors;
}
}