package com.lordofthejars.nosqlunit.elasticsearch2;
import com.lordofthejars.nosqlunit.core.CommandLineExecutor;
import com.lordofthejars.nosqlunit.core.ConnectionManagement;
import com.lordofthejars.nosqlunit.core.OperatingSystem;
import com.lordofthejars.nosqlunit.core.OperatingSystemResolver;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import static com.lordofthejars.nosqlunit.elasticsearch2.ManagedElasticsearch.ManagedElasticsearchRuleBuilder.newManagedElasticsearchRule;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyListOf;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class WhenManagedElasticsearchLifecycleIsManaged {
private static final String DEFAULT_ELASTICSEARCH_HOME = "/opt/elasticsearch-2.0.0-beta1/";
private static final String ES_HOME = System.getProperty("ES_HOME", DEFAULT_ELASTICSEARCH_HOME);
private static final Path ES_HOME_PATH = Paths.get(ES_HOME);
@Mock
private OperatingSystemResolver operatingSystemResolver;
@Mock
private LowLevelElasticSearchOperations lowLevelElasticSearchOperations;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void managed_elasticsearch_should_be_started_from_elasticsearch_home() throws Throwable {
final String oldElasticsearchHome = System.getProperty("ES_HOME");
if (oldElasticsearchHome == null) {
System.setProperty("ES_HOME", ES_HOME);
}
when(lowLevelElasticSearchOperations.assertThatConnectionToElasticsearchIsPossible(anyString(), anyInt())).thenReturn(true);
when(operatingSystemResolver.currentOperatingSystem()).thenReturn(OperatingSystem.LINUX_OS);
CommandLineExecutor commandLineExecutor = mock(CommandLineExecutor.class);
Process mockProcess = mock(Process.class);
when(mockProcess.exitValue()).thenReturn(0);
when(commandLineExecutor.startProcessInDirectoryAndArguments(anyString(), anyListOf(String.class))).thenReturn(mockProcess);
try {
ManagedElasticsearch managedElasticsearch = newManagedElasticsearchRule().build();
managedElasticsearch.managedElasticsearchLifecycleManager.setCommandLineExecutor(commandLineExecutor);
managedElasticsearch.managedElasticsearchLifecycleManager.setOperatingSystemResolver(operatingSystemResolver);
managedElasticsearch.managedElasticsearchLifecycleManager.setLowLevelElasticSearchOperations(lowLevelElasticSearchOperations);
managedElasticsearch.before();
managedElasticsearch.after();
verify(commandLineExecutor).startProcessInDirectoryAndArguments(ManagedElasticsearchLifecycleManager.DEFAULT_ELASTICSEARCH_TARGET_PATH,
getExpectedXCommand());
} finally {
if (oldElasticsearchHome == null) {
System.clearProperty("ES_HOME");
}
}
}
@Test
public void managed_elasticsearch_should_be_started_from_elasticsearch_custom_location() throws Throwable {
when(lowLevelElasticSearchOperations.assertThatConnectionToElasticsearchIsPossible(anyString(), anyInt())).thenReturn(true);
when(operatingSystemResolver.currentOperatingSystem()).thenReturn(OperatingSystem.LINUX_OS);
CommandLineExecutor commandLineExecutor = mock(CommandLineExecutor.class);
Process mockProcess = mock(Process.class);
when(mockProcess.exitValue()).thenReturn(0);
when(commandLineExecutor.startProcessInDirectoryAndArguments(anyString(), anyListOf(String.class))).thenReturn(mockProcess);
ManagedElasticsearch managedElasticsearch = newManagedElasticsearchRule().elasticsearchPath(ES_HOME).build();
managedElasticsearch.managedElasticsearchLifecycleManager.setCommandLineExecutor(commandLineExecutor);
managedElasticsearch.managedElasticsearchLifecycleManager.setOperatingSystemResolver(operatingSystemResolver);
managedElasticsearch.managedElasticsearchLifecycleManager.setLowLevelElasticSearchOperations(lowLevelElasticSearchOperations);
managedElasticsearch.before();
managedElasticsearch.after();
verify(commandLineExecutor).startProcessInDirectoryAndArguments(ManagedElasticsearchLifecycleManager.DEFAULT_ELASTICSEARCH_TARGET_PATH,
getExpectedXCommand());
}
@Test
public void managed_elasticsearch_should_be_started_from_windows_custom_location() throws Throwable {
when(lowLevelElasticSearchOperations.assertThatConnectionToElasticsearchIsPossible(anyString(), anyInt())).thenReturn(true);
when(operatingSystemResolver.currentOperatingSystem()).thenReturn(OperatingSystem.WINDOWS_7);
CommandLineExecutor commandLineExecutor = mock(CommandLineExecutor.class);
Process mockProcess = mock(Process.class);
when(mockProcess.exitValue()).thenReturn(0);
when(commandLineExecutor.startProcessInDirectoryAndArguments(anyString(), anyListOf(String.class))).thenReturn(mockProcess);
ManagedElasticsearch managedElasticsearch = newManagedElasticsearchRule().elasticsearchPath(ES_HOME).build();
managedElasticsearch.managedElasticsearchLifecycleManager.setCommandLineExecutor(commandLineExecutor);
managedElasticsearch.managedElasticsearchLifecycleManager.setOperatingSystemResolver(operatingSystemResolver);
managedElasticsearch.managedElasticsearchLifecycleManager.setLowLevelElasticSearchOperations(lowLevelElasticSearchOperations);
managedElasticsearch.before();
managedElasticsearch.after();
verify(commandLineExecutor).startProcessInDirectoryAndArguments(ManagedElasticsearchLifecycleManager.DEFAULT_ELASTICSEARCH_TARGET_PATH,
getExpectedWindowsCommand());
}
@Test
public void managed_elasticsearch_should_be_stopped() throws Throwable {
when(lowLevelElasticSearchOperations.assertThatConnectionToElasticsearchIsPossible(anyString(), anyInt())).thenReturn(true);
when(operatingSystemResolver.currentOperatingSystem()).thenReturn(OperatingSystem.LINUX_OS);
CommandLineExecutor commandLineExecutor = mock(CommandLineExecutor.class);
Process mockProcess = mock(Process.class);
when(mockProcess.exitValue()).thenReturn(0);
when(commandLineExecutor.startProcessInDirectoryAndArguments(anyString(), anyListOf(String.class))).thenReturn(mockProcess);
ManagedElasticsearch managedElasticsearch = newManagedElasticsearchRule().elasticsearchPath(ES_HOME).build();
managedElasticsearch.managedElasticsearchLifecycleManager.setCommandLineExecutor(commandLineExecutor);
managedElasticsearch.managedElasticsearchLifecycleManager.setOperatingSystemResolver(operatingSystemResolver);
managedElasticsearch.managedElasticsearchLifecycleManager.setLowLevelElasticSearchOperations(lowLevelElasticSearchOperations);
managedElasticsearch.before();
managedElasticsearch.after();
assertThat(ConnectionManagement.getInstance().isConnectionRegistered("127.0.0.1", ManagedElasticsearchLifecycleManager.DEFAULT_PORT), is(false));
}
private List<String> getExpectedWindowsCommand() {
final List<String> expectedCommand = new ArrayList<>();
expectedCommand.add(ES_HOME_PATH.resolve(Paths.get("bin", "elasticsearch.bat")).toString());
return expectedCommand;
}
private List<String> getExpectedXCommand() {
final List<String> expectedCommand = new ArrayList<>();
expectedCommand.add(ES_HOME_PATH.resolve(Paths.get("bin", "elasticsearch")).toString());
expectedCommand.add(ManagedElasticsearchLifecycleManager.FOREGROUND_OPTION);
return expectedCommand;
}
}