/** * Copyright 2015 StreamSets Inc. * * Licensed under 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 com.streamsets.datacollector.restapi; import com.streamsets.datacollector.config.ConfigDefinition; import com.streamsets.datacollector.config.PipelineDefinition; import com.streamsets.datacollector.config.PipelineRulesDefinition; import com.streamsets.datacollector.config.StageDefinition; import com.streamsets.datacollector.el.ElConstantDefinition; import com.streamsets.datacollector.el.ElFunctionDefinition; import com.streamsets.datacollector.main.BuildInfo; import com.streamsets.datacollector.main.RuntimeInfo; import com.streamsets.datacollector.main.UserGroupManager; import com.streamsets.datacollector.restapi.bean.UserJson; import com.streamsets.datacollector.runner.StageDefinitionBuilder; import com.streamsets.datacollector.stagelibrary.StageLibraryTask; import com.streamsets.pipeline.api.Batch; import com.streamsets.pipeline.api.BatchMaker; import com.streamsets.pipeline.api.ConfigDef; import com.streamsets.pipeline.api.ExecutionMode; import com.streamsets.pipeline.api.StageException; import com.streamsets.pipeline.api.base.BaseSource; import com.streamsets.pipeline.api.base.BaseTarget; import org.glassfish.hk2.api.Factory; import org.mockito.Mockito; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Singleton; import java.net.URI; import java.net.URISyntaxException; import java.security.Principal; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class TestUtil { private static final Logger LOG = LoggerFactory.getLogger(TestUtil.class); private static final String PIPELINE_NAME = "myPipeline"; private static final String PIPELINE_REV = "2.0"; private static final String DEFAULT_PIPELINE_REV = "0"; private static final String SNAPSHOT_NAME = "snapshot"; /** * Mock source implementation */ public static class TSource extends BaseSource { public boolean inited; public boolean destroyed; @Override protected List<ConfigIssue> init() { List<ConfigIssue> issues = super.init(); inited = true; return issues; } @Override public void destroy() { destroyed = true; } @Override public String produce(String lastSourceOffset, int maxBatchSize, BatchMaker batchMaker) throws StageException { return null; } } /** * Mock target implementation */ public static class TTarget extends BaseTarget { public boolean inited; public boolean destroyed; @Override protected List<ConfigIssue> init() { List<ConfigIssue> issues = super.init(); inited = true; return issues; } @Override public void destroy() { destroyed = true; } @Override public void write(Batch batch) throws StageException { } } @SuppressWarnings("unchecked") /** * * @return Mock stage library implementation */ public static StageLibraryTask createMockStageLibrary() { StageLibraryTask lib = Mockito.mock(StageLibraryTask.class); ConfigDefinition configDef1 = new ConfigDefinition("string", ConfigDef.Type.STRING, "l1", "d1", "--", true, "g", "stringVar", null, "", new ArrayList<>(), 0, Collections.<ElFunctionDefinition>emptyList(), Collections.<ElConstantDefinition>emptyList(), Long.MIN_VALUE, Long.MAX_VALUE, "text/plain", 0, Collections.<Class> emptyList(), ConfigDef.Evaluation.IMPLICIT, null); ConfigDefinition configDef2 = new ConfigDefinition("int", ConfigDef.Type.NUMBER, "l2", "d2", "-1", true, "g", "intVar", null, "", new ArrayList<>(), 0, Collections.<ElFunctionDefinition>emptyList(), Collections.<ElConstantDefinition>emptyList(), Long.MIN_VALUE, Long.MAX_VALUE, "text/plain", 0, Collections.<Class> emptyList(), ConfigDef.Evaluation.IMPLICIT, null); ConfigDefinition configDef3 = new ConfigDefinition("long", ConfigDef.Type.NUMBER, "l3", "d3", "-2", true, "g", "longVar", null, "", new ArrayList<>(), 0, Collections.<ElFunctionDefinition>emptyList(), Collections.<ElConstantDefinition>emptyList(), Long.MIN_VALUE, Long.MAX_VALUE, "text/plain", 0, Collections.<Class> emptyList(), ConfigDef.Evaluation.IMPLICIT, null); ConfigDefinition configDef4 = new ConfigDefinition("boolean", ConfigDef.Type.BOOLEAN, "l4", "d4", "false", true, "g", "booleanVar", null, "", new ArrayList<>(), 0, Collections.<ElFunctionDefinition>emptyList(), Collections.<ElConstantDefinition>emptyList(), Long.MIN_VALUE, Long.MAX_VALUE, "text/plain", 0, Collections.<Class> emptyList(), ConfigDef.Evaluation.IMPLICIT, null); StageDefinition sourceDef = new StageDefinitionBuilder(TestUtil.class.getClassLoader(), TSource.class, "source") .withConfig(configDef1, configDef2, configDef3, configDef4) .withExecutionModes(ExecutionMode.CLUSTER_BATCH, ExecutionMode.STANDALONE) .build(); StageDefinition targetDef = new StageDefinitionBuilder(TestUtil.class.getClassLoader(), TTarget.class, "target") .withExecutionModes(ExecutionMode.CLUSTER_BATCH, ExecutionMode.STANDALONE) .build(); Mockito.when(lib.getStage(Mockito.eq("library"), Mockito.eq("source"), Mockito.eq(false))) .thenReturn(sourceDef); Mockito.when(lib.getStage(Mockito.eq("library"), Mockito.eq("target"), Mockito.eq(false))) .thenReturn(targetDef); List<StageDefinition> stages = new ArrayList<>(2); stages.add(sourceDef); stages.add(targetDef); Mockito.when(lib.getStages()).thenReturn(stages); Mockito.when(lib.getPipeline()).thenReturn(PipelineDefinition.getPipelineDef()); Mockito.when(lib.getPipelineRules()).thenReturn(PipelineRulesDefinition.getPipelineRulesDef()); return lib; } public static class StageLibraryTestInjector implements Factory<StageLibraryTask> { public StageLibraryTestInjector() { } @Singleton @Override public StageLibraryTask provide() { return createMockStageLibrary(); } @Override public void dispose(StageLibraryTask stageLibrary) { } } public static class URITestInjector implements Factory<URI> { @Override public URI provide() { try { return new URI("URIInjector"); } catch (URISyntaxException e) { LOG.debug("Ignoring exception", e); return null; } } @Override public void dispose(URI uri) { } } public static class PrincipalTestInjector implements Factory<Principal> { @Override public Principal provide() { return new Principal() { @Override public String getName() { return "user1"; } }; } @Override public void dispose(Principal principal) { } } public static class RuntimeInfoTestInjector implements Factory<RuntimeInfo> { @Singleton @Override public RuntimeInfo provide() { RuntimeInfo runtimeInfo = Mockito.mock(RuntimeInfo.class); Mockito.when(runtimeInfo.isAclEnabled()).thenReturn(true); return runtimeInfo; } @Override public void dispose(RuntimeInfo runtimeInfo) { } } public static class BuildInfoTestInjector implements Factory<BuildInfo> { @Singleton @Override public BuildInfo provide() { BuildInfo buildInfo = Mockito.mock(BuildInfo.class); Mockito.when(buildInfo.getVersion()).thenReturn("2.0.0.0"); return buildInfo; } @Override public void dispose(BuildInfo buildInfo) { } } public static class RuntimeInfoTestInjectorForSlaveMode implements Factory<RuntimeInfo> { @Singleton @Override public RuntimeInfo provide() { RuntimeInfo runtimeInfo = Mockito.mock(RuntimeInfo.class); return runtimeInfo; } @Override public void dispose(RuntimeInfo runtimeInfo) { } } public static class UserGroupManagerTestInjector implements Factory<UserGroupManager> { @Singleton @Override public UserGroupManager provide() { UserGroupManager userGroupManager = Mockito.mock(UserGroupManager.class); UserJson userJson = new UserJson(); userJson.setName("user1"); userJson.setGroups(Collections.<String>emptyList()); Mockito.when(userGroupManager.getUser((Principal) Mockito.anyObject())) .thenReturn(userJson); return userGroupManager; } @Override public void dispose(UserGroupManager userGroupManager) { } } }