/* * 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.sharding; import com.dangdang.ddframe.job.config.JobCoreConfiguration; import com.dangdang.ddframe.job.config.dataflow.DataflowJobConfiguration; import com.dangdang.ddframe.job.executor.ShardingContexts; 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.internal.config.ConfigurationService; import com.dangdang.ddframe.job.lite.internal.schedule.JobRegistry; import com.dangdang.ddframe.job.lite.internal.storage.JobNodeStorage; import com.google.common.collect.Lists; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.unitils.util.ReflectionUtils; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Map; import static junit.framework.TestCase.assertTrue; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.when; public final class ExecutionContextServiceTest { @Mock private JobNodeStorage jobNodeStorage; @Mock private ConfigurationService configService; private final ExecutionContextService executionContextService = new ExecutionContextService(null, "test_job"); @Before public void setUp() throws NoSuchFieldException { MockitoAnnotations.initMocks(this); ReflectionUtils.setFieldValue(executionContextService, "jobNodeStorage", jobNodeStorage); ReflectionUtils.setFieldValue(executionContextService, "configService", configService); JobRegistry.getInstance().addJobInstance("test_job", new JobInstance("127.0.0.1@-@0")); } @Test public void assertGetShardingContextWhenNotAssignShardingItem() { when(configService.load(false)).thenReturn(LiteJobConfiguration.newBuilder(new DataflowJobConfiguration(JobCoreConfiguration.newBuilder("test_job", "0/1 * * * * ?", 3).build(), TestDataflowJob.class.getCanonicalName(), true)).monitorExecution(false).build()); ShardingContexts shardingContexts = executionContextService.getJobShardingContext(Collections.<Integer>emptyList()); assertTrue(shardingContexts.getTaskId().startsWith("test_job@-@@-@READY@-@")); assertThat(shardingContexts.getShardingTotalCount(), is(3)); } @Test public void assertGetShardingContextWhenAssignShardingItems() { when(configService.load(false)).thenReturn(LiteJobConfiguration.newBuilder(new DataflowJobConfiguration(JobCoreConfiguration.newBuilder("test_job", "0/1 * * * * ?", 3) .shardingItemParameters("0=A,1=B,2=C").build(), TestDataflowJob.class.getCanonicalName(), true)).monitorExecution(false).build()); Map<Integer, String> map = new HashMap<>(3); map.put(0, "A"); map.put(1, "B"); ShardingContexts expected = new ShardingContexts("fake_task_id", "test_job", 3, "", map); assertShardingContext(executionContextService.getJobShardingContext(Arrays.asList(0, 1)), expected); } @Test public void assertGetShardingContextWhenHasRunningItems() { when(configService.load(false)).thenReturn(LiteJobConfiguration.newBuilder(new DataflowJobConfiguration(JobCoreConfiguration.newBuilder("test_job", "0/1 * * * * ?", 3) .shardingItemParameters("0=A,1=B,2=C").build(), TestDataflowJob.class.getCanonicalName(), true)).monitorExecution(true).build()); when(jobNodeStorage.isJobNodeExisted("sharding/0/running")).thenReturn(false); when(jobNodeStorage.isJobNodeExisted("sharding/1/running")).thenReturn(true); Map<Integer, String> map = new HashMap<>(1, 1); map.put(0, "A"); ShardingContexts expected = new ShardingContexts("fake_task_id", "test_job", 3, "", map); assertShardingContext(executionContextService.getJobShardingContext(Lists.newArrayList(0, 1)), expected); } private void assertShardingContext(final ShardingContexts actual, final ShardingContexts expected) { assertThat(actual.getJobName(), is(expected.getJobName())); assertThat(actual.getShardingTotalCount(), is(expected.getShardingTotalCount())); assertThat(actual.getJobParameter(), is(expected.getJobParameter())); assertThat(actual.getShardingItemParameters().size(), is(expected.getShardingItemParameters().size())); for (int i = 0; i < expected.getShardingItemParameters().size(); i++) { assertThat(actual.getShardingItemParameters().get(i), is(expected.getShardingItemParameters().get(i))); } } }