/*
* Copyright 1999-2015 dangdang.com.
* <p>
* 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.
* </p>
*/
package com.dangdang.ddframe.job.lite.internal.schedule;
import com.dangdang.ddframe.job.config.JobCoreConfiguration;
import com.dangdang.ddframe.job.config.dataflow.DataflowJobConfiguration;
import com.dangdang.ddframe.job.lite.api.listener.ElasticJobListener;
import com.dangdang.ddframe.job.lite.api.strategy.JobInstance;
import com.dangdang.ddframe.job.lite.config.LiteJobConfiguration;
import com.dangdang.ddframe.job.lite.fixture.TestDataflowJob;
import com.dangdang.ddframe.job.lite.fixture.util.JobConfigurationUtil;
import com.dangdang.ddframe.job.lite.internal.config.ConfigurationService;
import com.dangdang.ddframe.job.lite.internal.election.LeaderService;
import com.dangdang.ddframe.job.lite.internal.instance.InstanceService;
import com.dangdang.ddframe.job.lite.internal.listener.ListenerManager;
import com.dangdang.ddframe.job.lite.internal.monitor.MonitorService;
import com.dangdang.ddframe.job.lite.internal.reconcile.ReconcileService;
import com.dangdang.ddframe.job.lite.internal.server.ServerService;
import com.dangdang.ddframe.job.lite.internal.sharding.ShardingService;
import com.dangdang.ddframe.job.reg.base.CoordinatorRegistryCenter;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.unitils.util.ReflectionUtils;
import java.util.Collections;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class SchedulerFacadeTest {
@Mock
private CoordinatorRegistryCenter regCenter;
@Mock
private JobScheduleController jobScheduleController;
@Mock
private ConfigurationService configService;
@Mock
private LeaderService leaderService;
@Mock
private ServerService serverService;
@Mock
private InstanceService instanceService;
@Mock
private ShardingService shardingService;
@Mock
private MonitorService monitorService;
@Mock
private ReconcileService reconcileService;
@Mock
private ListenerManager listenerManager;
private final LiteJobConfiguration liteJobConfig = JobConfigurationUtil.createDataflowLiteJobConfiguration();
private SchedulerFacade schedulerFacade;
@Before
public void setUp() throws NoSuchFieldException {
JobRegistry.getInstance().addJobInstance("test_job", new JobInstance("127.0.0.1@-@0"));
MockitoAnnotations.initMocks(this);
schedulerFacade = new SchedulerFacade(null, "test_job", Collections.<ElasticJobListener>emptyList());
when(configService.load(true)).thenReturn(LiteJobConfiguration.newBuilder(new DataflowJobConfiguration(JobCoreConfiguration.newBuilder("test_job", "0/1 * * * * ?", 3).build(),
TestDataflowJob.class.getCanonicalName(), false)).build());
ReflectionUtils.setFieldValue(schedulerFacade, "configService", configService);
ReflectionUtils.setFieldValue(schedulerFacade, "leaderService", leaderService);
ReflectionUtils.setFieldValue(schedulerFacade, "serverService", serverService);
ReflectionUtils.setFieldValue(schedulerFacade, "instanceService", instanceService);
ReflectionUtils.setFieldValue(schedulerFacade, "shardingService", shardingService);
ReflectionUtils.setFieldValue(schedulerFacade, "monitorService", monitorService);
ReflectionUtils.setFieldValue(schedulerFacade, "reconcileService", reconcileService);
ReflectionUtils.setFieldValue(schedulerFacade, "listenerManager", listenerManager);
}
@Test
public void assertUpdateJobConfiguration() {
LiteJobConfiguration jobConfig = LiteJobConfiguration.newBuilder(
new DataflowJobConfiguration(JobCoreConfiguration.newBuilder("test_job", "0/1 * * * * ?", 3).build(), TestDataflowJob.class.getCanonicalName(), false)).build();
when(configService.load(false)).thenReturn(jobConfig);
assertThat(schedulerFacade.updateJobConfiguration(jobConfig), is(jobConfig));
verify(configService).persist(jobConfig);
}
@Test
public void assertRegisterStartUpInfo() {
when(configService.load(false)).thenReturn(LiteJobConfiguration.newBuilder(new DataflowJobConfiguration(JobCoreConfiguration.newBuilder("test_job", "0/1 * * * * ?", 3).build(),
TestDataflowJob.class.getCanonicalName(), false)).build());
schedulerFacade.registerStartUpInfo(true);
verify(listenerManager).startAllListeners();
verify(leaderService).electLeader();
verify(serverService).persistOnline(true);
verify(shardingService).setReshardingFlag();
verify(monitorService).listen();
}
@Test
public void assertShutdownInstanceIfNotLeaderAndReconcileServiceIsNotRunning() {
JobRegistry.getInstance().registerJob("test_job", jobScheduleController, regCenter);
schedulerFacade.shutdownInstance();
verify(leaderService, times(0)).removeLeader();
verify(monitorService).close();
verify(reconcileService, times(0)).stopAsync();
verify(jobScheduleController).shutdown();
}
@Test
public void assertShutdownInstanceIfLeaderAndReconcileServiceIsRunning() {
when(leaderService.isLeader()).thenReturn(true);
when(reconcileService.isRunning()).thenReturn(true);
JobRegistry.getInstance().registerJob("test_job", jobScheduleController, regCenter);
schedulerFacade.shutdownInstance();
verify(leaderService).removeLeader();
verify(monitorService).close();
verify(reconcileService).stopAsync();
verify(jobScheduleController).shutdown();
}
}