Handle special chars in JAVA_HOME in elasticsearch-service.bat (#52676) (#53057)

* Handle special chars in JAVA_HOME in elasticsearch-service.bat (#52676)

* Test case for windows service where JAVA_HOME path contains spaces (#53028)

Co-authored-by: Muhammad Shaheer Akram <41253927+shaheerakr@users.noreply.github.com>
This commit is contained in:
William Brafford 2020-03-03 12:01:54 -05:00 committed by GitHub
parent 6cece3a709
commit d3a8ac66c6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 35 additions and 2 deletions

View File

@ -123,7 +123,7 @@ rem - fourth, ergonomic JVM options are applied
if not "%ES_JAVA_OPTS%" == "" set ES_JAVA_OPTS=%ES_JAVA_OPTS: =;% if not "%ES_JAVA_OPTS%" == "" set ES_JAVA_OPTS=%ES_JAVA_OPTS: =;%
@setlocal @setlocal
for /F "usebackq delims=" %%a in (`"%JAVA% -cp "!ES_CLASSPATH!" "org.elasticsearch.tools.launchers.JvmOptionsParser" "!ES_PATH_CONF!" || echo jvm_options_parser_failed"`) do set ES_JAVA_OPTS=%%a for /F "usebackq delims=" %%a in (`CALL %JAVA% -cp "!ES_CLASSPATH!" "org.elasticsearch.tools.launchers.JvmOptionsParser" "!ES_PATH_CONF!" ^|^| echo jvm_options_parser_failed`) do set ES_JAVA_OPTS=%%a
@endlocal & set "MAYBE_JVM_OPTIONS_PARSER_FAILED=%ES_JAVA_OPTS%" & set ES_JAVA_OPTS=%ES_JAVA_OPTS% @endlocal & set "MAYBE_JVM_OPTIONS_PARSER_FAILED=%ES_JAVA_OPTS%" & set ES_JAVA_OPTS=%ES_JAVA_OPTS%
if "%MAYBE_JVM_OPTIONS_PARSER_FAILED%" == "jvm_options_parser_failed" ( if "%MAYBE_JVM_OPTIONS_PARSER_FAILED%" == "jvm_options_parser_failed" (

View File

@ -52,6 +52,7 @@ import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.Matchers.isEmptyString; import static org.hamcrest.Matchers.isEmptyString;
import static org.hamcrest.Matchers.startsWith;
import static org.junit.Assume.assumeFalse; import static org.junit.Assume.assumeFalse;
import static org.junit.Assume.assumeThat; import static org.junit.Assume.assumeThat;
import static org.junit.Assume.assumeTrue; import static org.junit.Assume.assumeTrue;
@ -104,12 +105,29 @@ public class ArchiveTests extends PackagingTestCase {
sh.getEnv().put("JAVA_HOME", "doesnotexist"); sh.getEnv().put("JAVA_HOME", "doesnotexist");
// ask for elasticsearch version to quickly exit if java is actually found (ie test failure) // ask for elasticsearch version to quickly exit if java is actually found (ie test failure)
final Result runResult = sh.runIgnoreExitCode(bin.elasticsearch.toString() + " -v"); final Result runResult = sh.runIgnoreExitCode(bin.elasticsearch.toString() + " -V");
assertThat(runResult.exitCode, is(1)); assertThat(runResult.exitCode, is(1));
assertThat(runResult.stderr, containsString("could not find java in JAVA_HOME")); assertThat(runResult.stderr, containsString("could not find java in JAVA_HOME"));
} }
public void test32SpecialCharactersInJdkPath() throws Exception {
final Installation.Executables bin = installation.executables();
assumeTrue("Only run this test when we know where the JDK is.", distribution().hasJdk);
final Path relocatedJdk = installation.bundledJdk.getParent().resolve("a (special) path");
sh.getEnv().put("JAVA_HOME", relocatedJdk.toString());
try {
mv(installation.bundledJdk, relocatedJdk);
// ask for elasticsearch version to avoid starting the app
final Result runResult = sh.run(bin.elasticsearch.toString() + " -V");
assertThat(runResult.stdout, startsWith("Version: "));
} finally {
mv(relocatedJdk, installation.bundledJdk);
}
}
public void test50StartAndStop() throws Exception { public void test50StartAndStop() throws Exception {
// cleanup from previous test // cleanup from previous test
rm(installation.config("elasticsearch.keystore")); rm(installation.config("elasticsearch.keystore"));

View File

@ -146,6 +146,21 @@ public class WindowsServiceTests extends PackagingTestCase {
assertThat(result.stdout, containsString("Failed removing '" + DEFAULT_ID + "' service")); assertThat(result.stdout, containsString("Failed removing '" + DEFAULT_ID + "' service"));
} }
public void test16InstallSpecialCharactersInJdkPath() throws IOException {
assumeTrue("Only run this test when we know where the JDK is.", distribution().hasJdk);
final Path relocatedJdk = installation.bundledJdk.getParent().resolve("a (special) jdk");
sh.getEnv().put("JAVA_HOME", relocatedJdk.toString());
try {
mv(installation.bundledJdk, relocatedJdk);
Result result = sh.run(serviceScript + " install");
assertThat(result.stdout, containsString("The service 'elasticsearch-service-x64' has been installed."));
} finally {
sh.runIgnoreExitCode(serviceScript + " remove");
mv(relocatedJdk, installation.bundledJdk);
}
}
public void test20CustomizeServiceId() { public void test20CustomizeServiceId() {
String serviceId = "my-es-service"; String serviceId = "my-es-service";
String displayName = DEFAULT_DISPLAY_NAME.replace(DEFAULT_ID, serviceId); String displayName = DEFAULT_DISPLAY_NAME.replace(DEFAULT_ID, serviceId);