/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
* Red Hat Inc. - Add test cases
*******************************************************************************/
package org.eclipse.che.plugin.docker.machine;
import org.eclipse.che.api.core.model.machine.MachineConfig;
import org.eclipse.che.api.core.model.machine.ServerConf;
import org.eclipse.che.api.machine.server.model.impl.ServerConfImpl;
import org.eclipse.che.api.machine.server.model.impl.ServerImpl;
import org.eclipse.che.plugin.docker.client.json.ContainerConfig;
import org.eclipse.che.plugin.docker.client.json.ContainerInfo;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.testng.MockitoTestNGListener;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static java.util.Collections.singleton;
import static java.util.Collections.singletonList;
import static java.util.stream.Collectors.toMap;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.testng.Assert.assertEquals;
/**
* @author Angel Misevski <amisevsk@redhat.com>
* @author Alexander Garagatyi
*/
@Listeners(MockitoTestNGListener.class)
public class DockerInstanceRuntimeInfoTest {
private static final String DEFAULT_HOSTNAME = "localhost";
@Mock
private ContainerInfo containerInfo;
@Mock
private MachineConfig machineConfig;
@Mock
private ContainerConfig containerConfig;
@Mock
private ServerEvaluationStrategy serverEvaluationStrategy;
@Mock
private ServerEvaluationStrategyProvider provider;
@Mock
private Map<String, ServerImpl> serversMap;
@Captor
private ArgumentCaptor<Map<String, ServerConfImpl>> serversCaptor;
private DockerInstanceRuntimeInfo runtimeInfo;
@BeforeMethod
public void setUp() {
runtimeInfo = new DockerInstanceRuntimeInfo(containerInfo,
machineConfig,
DEFAULT_HOSTNAME,
provider,
Collections.emptySet(),
Collections.emptySet());
when(containerInfo.getConfig()).thenReturn(containerConfig);
when(machineConfig.getServers()).thenReturn(Collections.emptyList());
when(provider.get()).thenReturn(serverEvaluationStrategy);
when(serverEvaluationStrategy.getServers(any(), anyString(), any())).thenReturn(serversMap);
}
@Test
public void shouldReturnEnvVars() throws Exception {
// given
Map<String, String> expectedVariables = new HashMap<>();
expectedVariables.put("env_var1", "value1");
expectedVariables.put("env_var2", "value2");
expectedVariables.put("env_var3", "value3");
when(containerConfig.getEnv()).thenReturn(expectedVariables.entrySet()
.stream()
.map(stringStringEntry ->
stringStringEntry.getKey() +
"=" +
stringStringEntry.getValue())
.collect(Collectors.toList())
.toArray(new String[expectedVariables.size()]));
// when
final Map<String, String> envVariables = runtimeInfo.getEnvVariables();
// then
assertEquals(envVariables, expectedVariables);
}
@Test
public void shouldReturnEmptyMapIfNoEnvVariablesFound() throws Exception {
when(containerConfig.getEnv()).thenReturn(new String[0]);
assertEquals(runtimeInfo.getEnvVariables(), Collections.emptyMap());
}
@Test
public void shouldReturnProjectsRoot() throws Exception {
final String projectsRoot = "/testProjectRoot";
final String[] envVars = {
"var1=value1",
"var2=value2",
DockerInstanceRuntimeInfo.PROJECTS_ROOT_VARIABLE + "=" + projectsRoot,
"var3=value3"
};
when(containerConfig.getEnv()).thenReturn(envVars);
assertEquals(runtimeInfo.projectsRoot(), projectsRoot);
}
@Test
public void shouldReturnNullProjectsRootIfNoAppropriateEnvVarFound() throws Exception {
final String[] envVars = {
"var1=value1",
"var2=value2",
"var3=value3"
};
when(containerConfig.getEnv()).thenReturn(envVars);
assertEquals(runtimeInfo.projectsRoot(), null);
}
@Test
public void shouldBeAbleToGetServers() throws Exception {
Map<String, ServerImpl> servers = runtimeInfo.getServers();
assertEquals(servers, serversMap);
verify(serverEvaluationStrategy).getServers(eq(containerInfo), eq(DEFAULT_HOSTNAME), any());
}
@Test
public void shouldPassCommonServerConfigsOnGetServersForNonDevMachine() throws Exception {
// given
Set<ServerConf> commonSystemServersConfigs = new HashSet<>();
commonSystemServersConfigs.add(new ServerConfImpl("sysServer1-tcp",
"4301/tcp",
"http",
"/some/path"));
commonSystemServersConfigs.add(new ServerConfImpl("sysServer2-udp",
"4302/udp",
"dhcp",
null));
commonSystemServersConfigs.add(new ServerConfImpl("sysServer1-udp",
"4301/udp",
null,
"some/path"));
Set<ServerConf> devSystemServersConfigs = singleton(new ServerConfImpl("devSysServer1-tcp",
"4305/tcp",
"http",
null));
List<ServerConf> serversConfFromMachineConf = singletonList(new ServerConfImpl("machineConfServer1-tcp",
"4306/tcp",
"http",
null));
when(machineConfig.getServers()).thenAnswer(invocation -> serversConfFromMachineConf);
when(machineConfig.isDev()).thenReturn(false);
runtimeInfo = new DockerInstanceRuntimeInfo(containerInfo,
machineConfig,
DEFAULT_HOSTNAME,
provider,
devSystemServersConfigs,
commonSystemServersConfigs);
// when
Map<String, ServerImpl> servers = runtimeInfo.getServers();
// then
assertEquals(servers, serversMap);
verify(serverEvaluationStrategy).getServers(eq(containerInfo), eq(DEFAULT_HOSTNAME), serversCaptor.capture());
assertEquals(serversCaptor.getValue(), serversToMap(commonSystemServersConfigs, serversConfFromMachineConf));
}
@Test
public void shouldPassCommonAndDevServerConfigsOnGetServersForNonDevMachine() throws Exception {
Set<ServerConf> commonSystemServersConfigs = new HashSet<>();
commonSystemServersConfigs.add(new ServerConfImpl("sysServer1-tcp",
"4301/tcp",
"http",
"/some/path1"));
commonSystemServersConfigs.add(new ServerConfImpl("sysServer2-udp",
"4302/udp",
"dhcp",
"some/path2"));
Set<ServerConf> devSystemServersConfigs = new HashSet<>();
devSystemServersConfigs.add(new ServerConfImpl("devSysServer1-tcp",
"4305/tcp",
"http",
"/some/path3"));
devSystemServersConfigs.add(new ServerConfImpl("devSysServer1-udp",
"4305/udp",
null,
"some/path4"));
List<ServerConf> serversConfFromMachineConf = singletonList(new ServerConfImpl("machineConfServer1-tcp",
"4306/tcp",
"http",
null));
when(machineConfig.getServers()).thenAnswer(invocation -> serversConfFromMachineConf);
when(machineConfig.isDev()).thenReturn(true);
runtimeInfo = new DockerInstanceRuntimeInfo(containerInfo,
machineConfig,
DEFAULT_HOSTNAME,
provider,
devSystemServersConfigs,
commonSystemServersConfigs);
Map<String, ServerImpl> servers = runtimeInfo.getServers();
assertEquals(servers, serversMap);
verify(serverEvaluationStrategy).getServers(eq(containerInfo), eq(DEFAULT_HOSTNAME), serversCaptor.capture());
assertEquals(serversCaptor.getValue(), serversToMap(commonSystemServersConfigs,
devSystemServersConfigs,
serversConfFromMachineConf));
}
private Map<String, ServerConfImpl> serversToMap(Collection<ServerConf> serverConfigs,
Collection<ServerConf> serverConfigs2) {
return serversToMap(Stream.concat(serverConfigs.stream(), serverConfigs2.stream()));
}
private Map<String, ServerConfImpl> serversToMap(Collection<ServerConf> serverConfigs,
Collection<ServerConf> serverConfigs2,
Collection<ServerConf> serverConfigs3) {
return serversToMap(Stream.concat(Stream.concat(serverConfigs.stream(), serverConfigs2.stream()),
serverConfigs3.stream()));
}
private Map<String, ServerConfImpl> serversToMap(Stream<ServerConf> serverConfigs) {
return serverConfigs.collect(toMap(srvConf -> srvConf.getPort().contains("/") ?
srvConf.getPort() :
srvConf.getPort() + "/tcp",
ServerConfImpl::new));
}
}