Skip to content

Commit 223b84c

Browse files
committed
[test] package pre-install java check (elastic#32259)
This recreates a test that was added to the bats packaging tests in elastic#31343 but didn't make it over to the java project during when the linux package tests were ported in elastic#31943 When packages are installed but can not locate the java executable, they should fail with a descriptive message
1 parent 1c32896 commit 223b84c

File tree

3 files changed

+42
-6
lines changed

3 files changed

+42
-6
lines changed

qa/vagrant/src/main/java/org/elasticsearch/packaging/test/ArchiveTestCase.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public void test30AbortWhenJavaMissing() {
128128
});
129129

130130
Platforms.onLinux(() -> {
131-
final String javaPath = sh.run("which java").stdout.trim();
131+
final String javaPath = sh.run("command -v java").stdout.trim();
132132

133133
try {
134134
sh.run("chmod -x '" + javaPath + "'");

qa/vagrant/src/main/java/org/elasticsearch/packaging/test/PackageTestCase.java

+19
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,22 @@
3131

3232
import java.io.IOException;
3333
import java.nio.file.Files;
34+
import java.nio.file.Path;
35+
import java.nio.file.Paths;
3436
import java.util.regex.Matcher;
3537
import java.util.regex.Pattern;
3638

3739
import static junit.framework.TestCase.assertFalse;
3840
import static junit.framework.TestCase.assertTrue;
3941
import static org.elasticsearch.packaging.util.Cleanup.cleanEverything;
4042
import static org.elasticsearch.packaging.util.FileUtils.assertPathsDontExist;
43+
import static org.elasticsearch.packaging.util.FileUtils.mv;
4144
import static org.elasticsearch.packaging.util.Packages.SYSTEMD_SERVICE;
4245
import static org.elasticsearch.packaging.util.Packages.assertInstalled;
4346
import static org.elasticsearch.packaging.util.Packages.assertRemoved;
4447
import static org.elasticsearch.packaging.util.Packages.install;
4548
import static org.elasticsearch.packaging.util.Packages.remove;
49+
import static org.elasticsearch.packaging.util.Packages.runInstallCommand;
4650
import static org.elasticsearch.packaging.util.Packages.startElasticsearch;
4751
import static org.elasticsearch.packaging.util.Packages.verifyPackageInstallation;
4852
import static org.elasticsearch.packaging.util.Platforms.getOsRelease;
@@ -77,6 +81,21 @@ public void onlyCompatibleDistributions() {
7781
assumeTrue("only compatible distributions", distribution().packaging.compatible);
7882
}
7983

84+
public void test05InstallFailsWhenJavaMissing() {
85+
final Shell sh = new Shell();
86+
final Result java = sh.run("command -v java");
87+
88+
final Path originalJavaPath = Paths.get(java.stdout.trim());
89+
final Path relocatedJavaPath = originalJavaPath.getParent().resolve("java.relocated");
90+
try {
91+
mv(originalJavaPath, relocatedJavaPath);
92+
final Result installResult = runInstallCommand(distribution());
93+
assertThat(installResult.exitCode, is(1));
94+
} finally {
95+
mv(relocatedJavaPath, originalJavaPath);
96+
}
97+
}
98+
8099
public void test10InstallPackage() {
81100
assertRemoved(distribution());
82101
installation = install(distribution());

qa/vagrant/src/main/java/org/elasticsearch/packaging/util/Packages.java

+22-5
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,10 @@ public static void assertRemoved(Distribution distribution) {
6767
Platforms.onDPKG(() -> {
6868
assertThat(status.exitCode, anyOf(is(0), is(1)));
6969
if (status.exitCode == 0) {
70-
assertTrue(Pattern.compile("(?m)^Status:.+deinstall ok").matcher(status.stdout).find());
70+
assertTrue("an uninstalled status should be indicated: " + status.stdout,
71+
Pattern.compile("(?m)^Status:.+deinstall ok").matcher(status.stdout).find() ||
72+
Pattern.compile("(?m)^Status:.+ok not-installed").matcher(status.stdout).find()
73+
);
7174
}
7275
});
7376
}
@@ -90,13 +93,27 @@ public static Installation install(Distribution distribution) {
9093
}
9194

9295
public static Installation install(Distribution distribution, String version) {
96+
final Result result = runInstallCommand(distribution, version);
97+
if (result.exitCode != 0) {
98+
throw new RuntimeException("Installing distribution " + distribution + " version " + version + " failed: " + result);
99+
}
100+
101+
return Installation.ofPackage(distribution.packaging);
102+
}
103+
104+
public static Result runInstallCommand(Distribution distribution) {
105+
return runInstallCommand(distribution, getCurrentVersion());
106+
}
107+
108+
public static Result runInstallCommand(Distribution distribution, String version) {
93109
final Shell sh = new Shell();
94110
final Path distributionFile = getDistributionFile(distribution, version);
95111

96-
Platforms.onRPM(() -> sh.run("rpm -i " + distributionFile));
97-
Platforms.onDPKG(() -> sh.run("dpkg -i " + distributionFile));
98-
99-
return Installation.ofPackage(distribution.packaging);
112+
if (Platforms.isRPM()) {
113+
return sh.runIgnoreExitCode("rpm -i " + distributionFile);
114+
} else {
115+
return sh.runIgnoreExitCode("dpkg -i " + distributionFile);
116+
}
100117
}
101118

102119
public static void remove(Distribution distribution) {

0 commit comments

Comments
 (0)