/* * 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.lifecycle.internal.settings; import com.dangdang.ddframe.job.executor.handler.JobProperties.JobPropertiesEnum; import com.dangdang.ddframe.job.executor.handler.impl.DefaultExecutorServiceHandler; import com.dangdang.ddframe.job.executor.handler.impl.DefaultJobExceptionHandler; import com.dangdang.ddframe.job.lite.lifecycle.api.JobSettingsAPI; import com.dangdang.ddframe.job.lite.lifecycle.domain.JobSettings; import com.dangdang.ddframe.job.lite.lifecycle.fixture.LifecycleJsonConstants; 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 static org.hamcrest.core.Is.is; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class JobSettingsAPIImplTest { private JobSettingsAPI jobSettingsAPI; @Mock private CoordinatorRegistryCenter regCenter; @Before public void setUp() { MockitoAnnotations.initMocks(this); jobSettingsAPI = new JobSettingsAPIImpl(regCenter); } @Test public void assertGetDataflowJobSettings() { when(regCenter.get("/test_job/config")).thenReturn(LifecycleJsonConstants.getDataflowJobJson()); JobSettings actual = jobSettingsAPI.getJobSettings("test_job"); assertJobSettings(actual, "DATAFLOW", "com.dangdang.ddframe.job.lite.fixture.TestDataflowJob"); verify(regCenter).get("/test_job/config"); } @Test public void assertGetScriptJobSettings() { when(regCenter.get("/test_job/config")).thenReturn(LifecycleJsonConstants.getScriptJobJson()); JobSettings actual = jobSettingsAPI.getJobSettings("test_job"); assertJobSettings(actual, "SCRIPT", "com.dangdang.ddframe.job.api.script.ScriptJob"); verify(regCenter).get("/test_job/config"); } private void assertJobSettings(final JobSettings jobSettings, final String jobType, final String className) { assertThat(jobSettings.getJobName(), is("test_job")); assertThat(jobSettings.getJobType(), is(jobType)); assertThat(jobSettings.getJobClass(), is(className)); assertThat(jobSettings.getShardingTotalCount(), is(3)); assertThat(jobSettings.getCron(), is("0/1 * * * * ?")); assertThat(jobSettings.getShardingItemParameters(), is("")); assertThat(jobSettings.getJobParameter(), is("param")); assertThat(jobSettings.isMonitorExecution(), is(true)); assertThat(jobSettings.getMaxTimeDiffSeconds(), is(-1)); assertThat(jobSettings.getMonitorPort(), is(8888)); assertFalse(jobSettings.isFailover()); assertTrue(jobSettings.isMisfire()); assertThat(jobSettings.getJobShardingStrategyClass(), is("")); assertThat(jobSettings.getReconcileIntervalMinutes(), is(10)); jobSettings.getJobProperties().put(JobPropertiesEnum.EXECUTOR_SERVICE_HANDLER.getKey(), DefaultExecutorServiceHandler.class.getCanonicalName()); jobSettings.getJobProperties().put(JobPropertiesEnum.JOB_EXCEPTION_HANDLER.getKey(), DefaultJobExceptionHandler.class.getCanonicalName()); assertThat(jobSettings.getDescription(), is("")); if ("DATAFLOW".equals(jobType)) { assertTrue(jobSettings.isStreamingProcess()); } if ("SCRIPT".equals(jobType)) { assertThat(jobSettings.getScriptCommandLine(), is("test.sh")); } } @Test public void assertUpdateJobSettings() { when(regCenter.get("/test_job/config")).thenReturn(LifecycleJsonConstants.getDataflowJobJson()); JobSettings jobSettings = new JobSettings(); jobSettings.setJobName("test_job"); jobSettings.setJobClass("com.dangdang.ddframe.job.lite.fixture.TestDataflowJob"); jobSettings.setShardingTotalCount(10); jobSettings.setMaxTimeDiffSeconds(-1); jobSettings.setMonitorExecution(true); jobSettings.setCron("0/1 * * * * ?"); jobSettings.setStreamingProcess(true); jobSettings.setFailover(false); jobSettings.setMisfire(true); jobSettings.getJobProperties().put(JobPropertiesEnum.EXECUTOR_SERVICE_HANDLER.getKey(), DefaultExecutorServiceHandler.class.getCanonicalName()); jobSettings.getJobProperties().put(JobPropertiesEnum.JOB_EXCEPTION_HANDLER.getKey(), DefaultJobExceptionHandler.class.getCanonicalName()); jobSettings.setReconcileIntervalMinutes(70); jobSettingsAPI.updateJobSettings(jobSettings); verify(regCenter).update("/test_job/config", "{\"jobName\":\"test_job\",\"jobClass\":\"com.dangdang.ddframe.job.lite.fixture.TestDataflowJob\"," + "\"cron\":\"0/1 * * * * ?\",\"shardingTotalCount\":10,\"monitorExecution\":true,\"streamingProcess\":true," + "\"maxTimeDiffSeconds\":-1,\"monitorPort\":-1,\"failover\":false,\"misfire\":true," + "\"jobProperties\":{\"executor_service_handler\":\"" + DefaultExecutorServiceHandler.class.getCanonicalName() + "\"," + "\"job_exception_handler\":\"" + DefaultJobExceptionHandler.class.getCanonicalName() + "\"},\"reconcileIntervalMinutes\":70}"); } @Test(expected = IllegalArgumentException.class) public void assertUpdateJobSettingsIfJobNameIsEmpty() { JobSettings jobSettings = new JobSettings(); jobSettings.setJobName(""); jobSettingsAPI.updateJobSettings(jobSettings); } @Test(expected = IllegalArgumentException.class) public void assertUpdateJobSettingsIfCronIsEmpty() { JobSettings jobSettings = new JobSettings(); jobSettings.setJobName("test_job"); jobSettings.setCron(""); jobSettingsAPI.updateJobSettings(jobSettings); } @Test(expected = IllegalArgumentException.class) public void assertUpdateJobSettingsIfShardingTotalCountLessThanOne() { JobSettings jobSettings = new JobSettings(); jobSettings.setJobName("test_job"); jobSettings.setCron("0/1 * * * * ?"); jobSettings.setShardingTotalCount(0); jobSettingsAPI.updateJobSettings(jobSettings); } @Test public void assertRemoveJobSettings() { when(regCenter.get("/test_job/config")).thenReturn(LifecycleJsonConstants.getScriptJobJson()); jobSettingsAPI.removeJobSettings("test_job"); verify(regCenter).remove("/test_job"); } }