/*
* Copyright 2017 ThoughtWorks, Inc.
*
* 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.
*/
package com.thoughtworks.go.plugin.access.pluggabletask;
import com.google.gson.GsonBuilder;
import com.thoughtworks.go.plugin.access.PluginRequestHelper;
import com.thoughtworks.go.plugin.api.config.Property;
import com.thoughtworks.go.plugin.api.request.GoPluginApiRequest;
import com.thoughtworks.go.plugin.api.response.DefaultGoApiResponse;
import com.thoughtworks.go.plugin.api.response.GoPluginApiResponse;
import com.thoughtworks.go.plugin.api.response.execution.ExecutionResult;
import com.thoughtworks.go.plugin.api.task.*;
import com.thoughtworks.go.plugin.infra.PluginManager;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static java.util.Arrays.asList;
import static org.junit.Assert.assertTrue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.mockito.Mockito.*;
public class JsonBasedTaskExecutorTest {
private final String extensionVersion = "1.0";
private TaskExecutionContext context;
private PluginManager pluginManager;
private String pluginId;
private GoPluginApiResponse response;
private JsonBasedTaskExtensionHandler handler;
private PluginRequestHelper pluginRequestHelper;
private HashMap<String, JsonBasedTaskExtensionHandler> handlerHashMap = new HashMap<>();
@Before
public void setup() {
context = mock(TaskExecutionContext.class);
pluginManager = mock(PluginManager.class);
pluginId = "pluginId";
response = mock(GoPluginApiResponse.class);
handler = mock(JsonBasedTaskExtensionHandler.class);
handlerHashMap.put("1.0", handler);
final List<String> goSupportedVersions = asList("1.0");
pluginRequestHelper = new PluginRequestHelper(pluginManager, goSupportedVersions, TaskExtension.TASK_EXTENSION);
when(pluginManager.resolveExtensionVersion(pluginId, goSupportedVersions)).thenReturn(extensionVersion);
when(response.responseCode()).thenReturn(DefaultGoApiResponse.SUCCESS_RESPONSE_CODE);
when(pluginManager.isPluginOfType(TaskExtension.TASK_EXTENSION, pluginId)).thenReturn(true);
}
@Test
public void shouldExecuteAndReturnSuccessfulExecutionResultTaskThroughPlugin() {
when(pluginManager.submitTo(eq(pluginId), any(GoPluginApiRequest.class))).thenReturn(response);
when(handler.toExecutionResult(response.responseBody())).thenReturn(ExecutionResult.success("message1"));
ExecutionResult result = new JsonBasedTaskExecutor(pluginId, pluginRequestHelper, handlerHashMap).execute(config(), context);
assertThat(result.isSuccessful(), is(true));
assertThat(result.getMessagesForDisplay(), is("message1"));
ArgumentCaptor<GoPluginApiRequest> argument = ArgumentCaptor.forClass(GoPluginApiRequest.class);
verify(pluginManager).submitTo(eq(pluginId), argument.capture());
assertThat(argument.getValue().extension(), is(TaskExtension.TASK_EXTENSION));
assertThat(argument.getValue().extensionVersion(), is(extensionVersion));
assertThat(argument.getValue().requestName(), is(TaskExtension.EXECUTION_REQUEST));
}
@Test
public void shouldExecuteAndReturnFailureExecutionResultTaskThroughPlugin() {
when(pluginManager.submitTo(eq(pluginId), any(GoPluginApiRequest.class))).thenReturn(response);
when(handler.toExecutionResult(response.responseBody())).thenReturn(ExecutionResult.failure("error1"));
ExecutionResult result = new JsonBasedTaskExecutor(pluginId, pluginRequestHelper, handlerHashMap).execute(config(), context);
assertThat(result.isSuccessful(), is(false));
assertThat(result.getMessagesForDisplay(), is("error1"));
}
@Test
public void shouldConstructExecutionRequestWithRequiredDetails() {
String workingDir = "working-dir";
com.thoughtworks.go.plugin.api.task.Console console = mock(com.thoughtworks.go.plugin.api.task.Console.class);
when(context.workingDir()).thenReturn(workingDir);
EnvironmentVariables environment = getEnvironmentVariables();
when(context.environment()).thenReturn(environment);
when(context.console()).thenReturn(console);
final GoPluginApiRequest[] executionRequest = new GoPluginApiRequest[1];
when(response.responseBody()).thenReturn("{\"success\":true,\"messages\":[\"message1\",\"message2\"]}");
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
GoPluginApiRequest request = (GoPluginApiRequest) invocationOnMock.getArguments()[1];
executionRequest[0] = request;
return response;
}
}).when(pluginManager).submitTo(eq(pluginId), any(GoPluginApiRequest.class));
handler = new JsonBasedTaskExtensionHandler_V1();
handlerHashMap.put("1.0", handler);
new JsonBasedTaskExecutor(pluginId, pluginRequestHelper, handlerHashMap).execute(config(), context);
assertTrue(executionRequest.length == 1);
Map result = (Map) new GsonBuilder().create().fromJson(executionRequest[0].requestBody(), Object.class);
Map context = (Map) result.get("context");
assertThat(context.get("workingDirectory"), is(workingDir));
Map environmentVariables = (Map) context.get("environmentVariables");
assertThat(environmentVariables.size(), is(2));
assertThat(environmentVariables.get("ENV1").toString(), is("VAL1"));
assertThat(environmentVariables.get("ENV2").toString(), is("VAL2"));
assertThat(executionRequest[0].requestParameters().size(), is(0));
}
private EnvironmentVariables getEnvironmentVariables() {
return new EnvironmentVariables() {
@Override
public Map<String, String> asMap() {
final HashMap<String, String> map = new HashMap<>();
map.put("ENV1", "VAL1");
map.put("ENV2", "VAL2");
return map;
}
@Override
public void writeTo(com.thoughtworks.go.plugin.api.task.Console console) {
}
@Override
public com.thoughtworks.go.plugin.api.task.Console.SecureEnvVarSpecifier secureEnvSpecifier() {
return null;
}
};
}
private TaskConfig config() {
TaskConfig taskConfig = new TaskConfig();
TaskConfigProperty p1 = new TaskConfigProperty("k1", "value1");
p1.with(Property.DISPLAY_ORDER, 10);
p1.with(Property.SECURE, true);
p1.with(Property.DISPLAY_NAME, "display name for k1");
p1.with(Property.REQUIRED, true);
TaskConfigProperty p2 = new TaskConfigProperty("k2", "value1");
p2.with(Property.DISPLAY_ORDER, 1);
p2.with(Property.SECURE, false);
p2.with(Property.DISPLAY_NAME, "display name for k2");
p2.with(Property.REQUIRED, true);
p2.with(Property.REQUIRED, true);
taskConfig.add(p1);
taskConfig.add(p2);
return taskConfig;
}
}