/**
* 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.scheduler;
import static org.easymock.EasyMock.expect;
import static org.mockito.Mockito.spy;
import static org.powermock.api.easymock.PowerMock.createNiceMock;
import static org.powermock.api.easymock.PowerMock.expectNew;
import static org.powermock.api.easymock.PowerMock.expectPrivate;
import java.util.Properties;
import org.apache.ambari.server.configuration.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.quartz.Scheduler;
import org.quartz.impl.StdSchedulerFactory;
import junit.framework.Assert;
@RunWith(PowerMockRunner.class)
@PowerMockIgnore("javax.management.*")
public class ExecutionSchedulerTest {
private Configuration configuration;
@Before
public void setup() throws Exception {
Properties properties = new Properties();
properties.setProperty(Configuration.EXECUTION_SCHEDULER_THREADS.getKey(), "2");
properties.setProperty(Configuration.EXECUTION_SCHEDULER_CLUSTERED.getKey(), "false");
properties.setProperty(Configuration.EXECUTION_SCHEDULER_CONNECTIONS.getKey(), "2");
properties.setProperty(Configuration.SERVER_JDBC_DRIVER.getKey(), "db.driver");
properties.setProperty(Configuration.SERVER_JDBC_URL.getKey(), "jdbc:postgresql://localhost/");
properties.setProperty(Configuration.SERVER_JDBC_USER_NAME.getKey(), "user");
properties.setProperty(Configuration.SERVER_DB_NAME.getKey(), "derby");
configuration = new Configuration(properties);
}
@After
public void teardown() throws Exception {
}
@Test
@PrepareForTest({ ExecutionSchedulerImpl.class })
public void testSchedulerInitialize() throws Exception {
ExecutionSchedulerImpl executionScheduler =
spy(new ExecutionSchedulerImpl(configuration));
Properties actualProperties = executionScheduler
.getQuartzSchedulerProperties();
Assert.assertEquals("2", actualProperties.getProperty("org.quartz.threadPool.threadCount"));
Assert.assertEquals("2", actualProperties.getProperty("org.quartz.dataSource.myDS.maxConnections"));
Assert.assertEquals("false", actualProperties.getProperty("org.quartz.jobStore.isClustered"));
Assert.assertEquals("org.quartz.impl.jdbcjobstore.PostgreSQLDelegate",
actualProperties.getProperty("org.quartz.jobStore.driverDelegateClass"));
Assert.assertEquals("select 0",
actualProperties.getProperty("org.quartz.dataSource.myDS.validationQuery"));
Assert.assertEquals(ExecutionSchedulerImpl.DEFAULT_SCHEDULER_NAME,
actualProperties.getProperty("org.quartz.scheduler.instanceName"));
Assert.assertEquals("org.quartz.simpl.SimpleThreadPool",
actualProperties.getProperty("org.quartz.threadPool.class"));
}
@Test
@PrepareForTest({ ExecutionSchedulerImpl.class })
public void testSchedulerStartStop() throws Exception {
StdSchedulerFactory factory = createNiceMock(StdSchedulerFactory.class);
Scheduler scheduler = createNiceMock(Scheduler.class);
expect(factory.getScheduler()).andReturn(scheduler);
expectPrivate(scheduler, "startDelayed", new Integer(180)).once();
expectNew(StdSchedulerFactory.class).andReturn(factory);
expectPrivate(scheduler, "shutdown").once();
PowerMock.replay(factory, StdSchedulerFactory.class, scheduler);
ExecutionSchedulerImpl executionScheduler = new ExecutionSchedulerImpl(configuration);
executionScheduler.startScheduler(180);
executionScheduler.stopScheduler();
PowerMock.verify(factory, StdSchedulerFactory.class, scheduler);
Assert.assertTrue(executionScheduler.isInitialized());
}
@Test
public void testGetQuartzDbDelegateClassAndValidationQuery() throws Exception {
Properties testProperties = new Properties();
testProperties.setProperty(Configuration.SERVER_JDBC_URL.getKey(),
"jdbc:postgresql://host:port/dbname");
testProperties.setProperty(Configuration.SERVER_DB_NAME.getKey(), "ambari");
Configuration configuration1 = new Configuration(testProperties);
ExecutionSchedulerImpl executionScheduler =
spy(new ExecutionSchedulerImpl(configuration1));
String[] subProps = executionScheduler
.getQuartzDbDelegateClassAndValidationQuery();
Assert.assertEquals("org.quartz.impl.jdbcjobstore.PostgreSQLDelegate", subProps[0]);
Assert.assertEquals("select 0", subProps[1]);
testProperties.setProperty(Configuration.SERVER_JDBC_URL.getKey(),
"jdbc:mysql://host:port/dbname");
configuration1 = new Configuration(testProperties);
executionScheduler = spy(new ExecutionSchedulerImpl(configuration1));
subProps = executionScheduler.getQuartzDbDelegateClassAndValidationQuery();
Assert.assertEquals("org.quartz.impl.jdbcjobstore.StdJDBCDelegate", subProps[0]);
Assert.assertEquals("select 0", subProps[1]);
testProperties.setProperty(Configuration.SERVER_JDBC_URL.getKey(),
"jdbc:oracle:thin://host:port/dbname");
configuration1 = new Configuration(testProperties);
executionScheduler = spy(new ExecutionSchedulerImpl(configuration1));
subProps = executionScheduler.getQuartzDbDelegateClassAndValidationQuery();
Assert.assertEquals("org.quartz.impl.jdbcjobstore.oracle.OracleDelegate", subProps[0]);
Assert.assertEquals("select 0 from dual", subProps[1]);
}
@Test
@PrepareForTest({ ExecutionSchedulerImpl.class })
public void testSchedulerStartDelay() throws Exception {
StdSchedulerFactory factory = createNiceMock(StdSchedulerFactory.class);
Scheduler scheduler = createNiceMock(Scheduler.class);
expect(factory.getScheduler()).andReturn(scheduler).anyTimes();
expectNew(StdSchedulerFactory.class).andReturn(factory);
expect(scheduler.isStarted()).andReturn(false).anyTimes();
expectPrivate(scheduler, "startDelayed", new Integer(180)).once();
expectPrivate(scheduler, "start").once();
PowerMock.replay(factory, StdSchedulerFactory.class, scheduler);
ExecutionSchedulerImpl executionScheduler = new ExecutionSchedulerImpl(configuration);
executionScheduler.startScheduler(180);
executionScheduler.startScheduler(null);
PowerMock.verify(factory, StdSchedulerFactory.class, scheduler);
Assert.assertTrue(executionScheduler.isInitialized());
}
}