blob: 67619cc44696bdb36a2d3cf74ed6a30bdca64821 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.ambari.server.controller;
import static junit.framework.Assert.assertEquals;
import static org.easymock.EasyMock.anyObject;
import static org.easymock.EasyMock.anyString;
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.isA;
import static org.easymock.EasyMock.partialMockBuilder;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import java.net.Authenticator;
import java.net.InetAddress;
import java.net.PasswordAuthentication;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.EnumSet;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.servlet.DispatcherType;
import javax.servlet.SessionCookieConfig;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.H2DatabaseCleaner;
import org.apache.ambari.server.api.services.AmbariMetaInfo;
import org.apache.ambari.server.checks.DatabaseConsistencyCheckHelper;
import org.apache.ambari.server.configuration.Configuration;
import org.apache.ambari.server.orm.DBAccessor;
import org.apache.ambari.server.orm.GuiceJpaInitializer;
import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
import org.apache.ambari.server.stack.StackManagerFactory;
import org.apache.ambari.server.state.Clusters;
import org.apache.ambari.server.state.stack.OsFamily;
import org.apache.ambari.server.testutils.PartialNiceMockBinder;
import org.apache.velocity.app.Velocity;
import org.easymock.EasyMock;
import org.easymock.EasyMockSupport;
import org.eclipse.jetty.http.MimeTypes;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.session.SessionHandler;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlets.GzipFilter;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
public class AmbariServerTest {
private Injector injector;
@Before
public void setup() throws Exception {
injector = Guice.createInjector(new InMemoryDefaultTestModule());
injector.getInstance(GuiceJpaInitializer.class);
injector.injectMembers(this);
}
@After
public void teardown() throws AmbariException, SQLException {
H2DatabaseCleaner.clearDatabaseAndStopPersistenceService(injector);
}
@Test
public void testVelocityLogger() throws Exception {
new AmbariServer();
Assert.assertEquals(AmbariServer.VELOCITY_LOG_CATEGORY, Velocity.getProperty("runtime.log.logsystem.log4j.logger"));
}
@Test
public void testConfigureSessionManager() throws Exception {
SessionHandlerConfigurer sessionHandlerConfigurer = new SessionHandlerConfigurer();
Configuration configuration = createNiceMock(Configuration.class);
SessionHandler sessionHandler = createNiceMock(SessionHandler.class);
SessionCookieConfig sessionCookieConfig = createNiceMock(SessionCookieConfig.class);
sessionHandlerConfigurer.configuration = configuration;
expect(sessionHandler.getSessionCookieConfig()).andReturn(sessionCookieConfig).anyTimes();
expect(configuration.getApiSSLAuthentication()).andReturn(false);
sessionCookieConfig.setHttpOnly(true);
expect(configuration.getApiSSLAuthentication()).andReturn(true);
sessionCookieConfig.setHttpOnly(true);
sessionCookieConfig.setSecure(true);
replay(configuration, sessionHandler, sessionCookieConfig);
// getApiSSLAuthentication == false
sessionHandlerConfigurer.configureSessionHandler(sessionHandler);
// getApiSSLAuthentication == true
sessionHandlerConfigurer.configureSessionHandler(sessionHandler);
verify(configuration, sessionHandler, sessionCookieConfig);
}
@Test
public void testSystemProperties() throws Exception {
Configuration configuration = EasyMock.createNiceMock(Configuration.class);
expect(configuration.getServerTempDir()).andReturn("/ambari/server/temp/dir").anyTimes();
replay(configuration);
AmbariServer.setSystemProperties(configuration);
Assert.assertEquals(System.getProperty("java.io.tmpdir"), "/ambari/server/temp/dir");
}
@Test
public void testProxyUser() throws Exception {
PasswordAuthentication pa = Authenticator.requestPasswordAuthentication(
InetAddress.getLocalHost(), 80, null, null, null);
Assert.assertNull(pa);
System.setProperty("http.proxyUser", "abc");
System.setProperty("http.proxyPassword", "def");
AmbariServer.setupProxyAuth();
pa = Authenticator.requestPasswordAuthentication(
InetAddress.getLocalHost(), 80, null, null, null);
Assert.assertNotNull(pa);
Assert.assertEquals("abc", pa.getUserName());
Assert.assertArrayEquals("def".toCharArray(), pa.getPassword());
}
@Test
public void testConfigureRootHandler() throws Exception {
final ServletContextHandler handler =
EasyMock.createNiceMock(ServletContextHandler.class);
final FilterHolder filter = EasyMock.createNiceMock(FilterHolder.class);
handler.setMaxFormContentSize(-1);
EasyMock.expectLastCall().once();
EasyMock.expect(handler.addFilter(GzipFilter.class, "/*",
EnumSet.of(DispatcherType.REQUEST))).andReturn(filter).once();
EasyMock.expect(handler.getMimeTypes()).andReturn(new MimeTypes()).anyTimes();
replay(handler, filter);
injector.getInstance(AmbariServer.class).configureRootHandler(handler);
EasyMock.verify(handler);
}
@Test
public void testConfigureCompression() throws Exception {
final ServletContextHandler handler =
EasyMock.createNiceMock(ServletContextHandler.class);
final FilterHolder filter = EasyMock.createNiceMock(FilterHolder.class);
EasyMock.expect(handler.addFilter(GzipFilter.class, "/*",
EnumSet.of(DispatcherType.REQUEST))).andReturn(filter).once();
filter.setInitParameter(anyObject(String.class),anyObject(String.class));
EasyMock.expectLastCall().times(3);
replay(handler, filter);
injector.getInstance(AmbariServer.class).configureHandlerCompression(handler);
EasyMock.verify(handler);
}
@Test
public void testConfigureContentTypes() throws Exception {
ServletContextHandler handler = EasyMock.createNiceMock(ServletContextHandler.class);
FilterHolder filter = EasyMock.createNiceMock(FilterHolder.class);
MimeTypes expectedMimeTypes = new MimeTypes();
EasyMock.expect(handler.getMimeTypes()).andReturn(expectedMimeTypes).anyTimes();
EasyMock.expect(handler.addFilter(isA(Class.class), anyString(), isA(EnumSet.class))).andReturn(filter).anyTimes();
replay(handler, filter);
injector.getInstance(AmbariServer.class).configureRootHandler(handler);
assertEquals("application/font-woff", expectedMimeTypes.getMimeByExtension("/file.woff").toString());
assertEquals("application/font-sfnt", expectedMimeTypes.getMimeByExtension("/file.ttf").toString());
EasyMock.verify(handler);
}
/**
* Tests that Jetty pools are configured with the correct number of
* Acceptor/Selector threads.
*
* @throws Exception
*/
@Test
public void testJettyThreadPoolCalculation() throws Exception {
Server server = new Server();
AmbariServer ambariServer = new AmbariServer();
// 12 acceptors (48 core machine) with a configured pool size of 25
server = ambariServer.configureJettyThreadPool(12, "mock-pool", 25);
Assert.assertEquals(44, ((QueuedThreadPool) server.getThreadPool()).getMaxThreads());
// 2 acceptors (8 core machine) with a configured pool size of 25
server = ambariServer.configureJettyThreadPool(2, "mock-pool", 25);
Assert.assertEquals(25, ((QueuedThreadPool) server.getThreadPool()).getMaxThreads());
// 16 acceptors (64 core machine) with a configured pool size of 35
server = ambariServer.configureJettyThreadPool(16, "mock-pool", 35);
Assert.assertEquals(52, ((QueuedThreadPool) server.getThreadPool()).getMaxThreads());
}
@Test
public void testRunDatabaseConsistencyCheck() throws Exception {
EasyMockSupport easyMockSupport = new EasyMockSupport();
final AmbariMetaInfo mockAmbariMetainfo = easyMockSupport.createNiceMock(AmbariMetaInfo.class);
final DBAccessor mockDBDbAccessor = easyMockSupport.createNiceMock(DBAccessor.class);
final Connection mockConnection = easyMockSupport.createNiceMock(Connection.class);
final Statement mockStatement = easyMockSupport.createNiceMock(Statement.class);
final OsFamily mockOSFamily = easyMockSupport.createNiceMock(OsFamily.class);
final EntityManager mockEntityManager = easyMockSupport.createNiceMock(EntityManager.class);
final Clusters mockClusters = easyMockSupport.createNiceMock(Clusters.class);
AmbariServer ambariServer = new AmbariServer();
final Configuration mockConfiguration = partialMockBuilder(Configuration.class).withConstructor()
.addMockedMethod("getDatabaseType").createMock();
final TypedQuery mockQuery = easyMockSupport.createNiceMock(TypedQuery.class);
expect(mockConfiguration.getDatabaseType()).andReturn(null).anyTimes();
expect(mockEntityManager.createNamedQuery(anyString(),anyObject(Class.class))).andReturn(mockQuery);
expect(mockQuery.getResultList()).andReturn(new ArrayList());
replay(mockConfiguration);
final Injector mockInjector = createMockInjector(mockAmbariMetainfo,
mockDBDbAccessor, mockOSFamily, mockEntityManager, mockClusters, mockConfiguration);
expect(mockDBDbAccessor.getConnection()).andReturn(mockConnection).atLeastOnce();
expect(mockConnection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE)).andReturn(mockStatement).atLeastOnce();
expect(mockStatement.executeQuery(anyString())).andReturn(null).atLeastOnce();
DatabaseConsistencyCheckHelper.setInjector(mockInjector);
easyMockSupport.replayAll();
mockAmbariMetainfo.init();
ambariServer.runDatabaseConsistencyCheck();
easyMockSupport.verifyAll();
}
@Test
public void testRunDatabaseConsistencyCheck_IgnoreDBCheck() throws Exception {
AmbariServer ambariServer = new AmbariServer();
System.setProperty("skipDatabaseConsistencyCheck", "");
final Injector mockInjector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
}
});
DatabaseConsistencyCheckHelper.setInjector(mockInjector);
ambariServer.runDatabaseConsistencyCheck();
System.clearProperty("skipDatabaseConsistencyCheck");
}
@Test
public void testRunDatabaseConsistencyCheck_ThrowException() throws Exception {
EasyMockSupport easyMockSupport = new EasyMockSupport();
final AmbariMetaInfo mockAmbariMetainfo = easyMockSupport.createNiceMock(AmbariMetaInfo.class);
final DBAccessor mockDBDbAccessor = easyMockSupport.createNiceMock(DBAccessor.class);
final OsFamily mockOSFamily = easyMockSupport.createNiceMock(OsFamily.class);
final EntityManager mockEntityManager = easyMockSupport.createNiceMock(EntityManager.class);
final Clusters mockClusters = easyMockSupport.createNiceMock(Clusters.class);
AmbariServer ambariServer = new AmbariServer();
final Configuration mockConfiguration = partialMockBuilder(Configuration.class).withConstructor()
.addMockedMethod("getDatabaseType").createMock();
final TypedQuery mockQuery = easyMockSupport.createNiceMock(TypedQuery.class);
expect(mockConfiguration.getDatabaseType()).andReturn(null).anyTimes();
expect(mockEntityManager.createNamedQuery(anyString(),anyObject(Class.class))).andReturn(mockQuery);
expect(mockQuery.getResultList()).andReturn(new ArrayList());
replay(mockConfiguration);
final Injector mockInjector = createMockInjector(mockAmbariMetainfo,
mockDBDbAccessor, mockOSFamily, mockEntityManager, mockClusters, mockConfiguration);
expect(mockDBDbAccessor.getConnection()).andReturn(null);
DatabaseConsistencyCheckHelper.setInjector(mockInjector);
easyMockSupport.replayAll();
mockAmbariMetainfo.init();
boolean errorOccurred = false;
try {
ambariServer.runDatabaseConsistencyCheck();
} catch(Exception e) {
errorOccurred = true;
}
junit.framework.Assert.assertTrue(errorOccurred);
easyMockSupport.verifyAll();
}
private Injector createMockInjector(final AmbariMetaInfo mockAmbariMetainfo,
final DBAccessor mockDBDbAccessor,
final OsFamily mockOSFamily,
final EntityManager mockEntityManager,
final Clusters mockClusters,
final Configuration mockConfiguration) {
return Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
PartialNiceMockBinder.newBuilder().addClustersBinding().addLdapBindings().build().configure(binder());
bind(StackManagerFactory.class).toInstance(createNiceMock(StackManagerFactory.class));
bind(AmbariMetaInfo.class).toInstance(mockAmbariMetainfo);
bind(DBAccessor.class).toInstance(mockDBDbAccessor);
bind(OsFamily.class).toInstance(mockOSFamily);
bind(EntityManager.class).toInstance(mockEntityManager);
bind(Clusters.class).toInstance(mockClusters);
bind(Configuration.class).toInstance(mockConfiguration);
}
});
}
}