Skip to content

Commit

Permalink
client/fingerprint/java: improve java version string regex matching
Browse files Browse the repository at this point in the history
This PR improves the regular expression used for matching the java
version string, which varies a lot depending on the java vendor and
version.

These are the example strings we now test for:

java version "1.7.0_80"
openjdk version "11.0.1" 2018-10-16
openjdk version "11.0.1" 2018-10-16
java version "1.6.0_36"
openjdk version "1.8.0_192"
openjdk 11.0.11 2021-04-20 LTS

The last one is a new test added on behalf of #6081, which is
still broken on today's CentOS 7 default JDK package.

openjdk 11.0.11 2021-04-20 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.11+9-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.11+9-LTS, mixed mode, sharing)

==> Evaluation "21c6caf7" finished with status "complete" but failed to place all allocations:
    Task Group "example" (failed to place 1 allocation):
      * Constraint "${driver.java.version} >= 11.0.0": 1 nodes excluded by filter
    Evaluation "2b737d48" waiting for additional capacity to place remainder

Fixes #6081
  • Loading branch information
shoenig committed Jun 15, 2021
1 parent 52bf197 commit 674183c
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 21 deletions.
4 changes: 2 additions & 2 deletions drivers/java/driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,7 @@ func (d *Driver) buildFingerprint() *drivers.Fingerprint {
}
}

version, runtime, vm, err := javaVersionInfo()
version, jdkJRE, vm, err := javaVersionInfo()
if err != nil {
// return no error, as it isn't an error to not find java, it just means we
// can't use it.
Expand All @@ -367,7 +367,7 @@ func (d *Driver) buildFingerprint() *drivers.Fingerprint {

fp.Attributes[driverAttr] = pstructs.NewBoolAttribute(true)
fp.Attributes[driverVersionAttr] = pstructs.NewStringAttribute(version)
fp.Attributes["driver.java.runtime"] = pstructs.NewStringAttribute(runtime)
fp.Attributes["driver.java.runtime"] = pstructs.NewStringAttribute(jdkJRE)
fp.Attributes["driver.java.vm"] = pstructs.NewStringAttribute(vm)

return fp
Expand Down
7 changes: 5 additions & 2 deletions drivers/java/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ func javaVersionInfo() (version, runtime, vm string, err error) {
return
}

var (
javaVersionRe = regexp.MustCompile(`([.\d_]+)`)
)

func parseJavaVersionOutput(infoString string) (version, runtime, vm string) {
infoString = strings.TrimSpace(infoString)

Expand All @@ -65,8 +69,7 @@ func parseJavaVersionOutput(infoString string) (version, runtime, vm string) {

versionString := strings.TrimSpace(lines[0])

re := regexp.MustCompile(`version "([^"]*)"`)
if match := re.FindStringSubmatch(lines[0]); len(match) == 2 {
if match := javaVersionRe.FindStringSubmatch(versionString); len(match) == 2 {
versionString = match[1]
}

Expand Down
42 changes: 25 additions & 17 deletions drivers/java/utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,6 @@ import (
"github.com/stretchr/testify/require"
)

const oracleJDKOutput = `java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)
`

func TestDriver_parseJavaVersionOutput(t *testing.T) {
cases := []struct {
name string
Expand All @@ -23,7 +18,9 @@ func TestDriver_parseJavaVersionOutput(t *testing.T) {
}{
{
"OracleJDK",
oracleJDKOutput,
`java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)`,
"1.7.0_80",
"Java(TM) SE Runtime Environment (build 1.7.0_80-b15)",
"Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)",
Expand Down Expand Up @@ -69,14 +66,22 @@ func TestDriver_parseJavaVersionOutput(t *testing.T) {
"OpenJDK Runtime Environment (build 1.8.0_192-b12_openj9)",
"Eclipse OpenJ9 VM (build openj9-0.11.0, JRE 1.8.0 Linux amd64-64-Bit Compressed References",
},
{
"OpenJDK on CentOS 7",
`openjdk 11.0.11 2021-04-20 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.11+9-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.11+9-LTS, mixed mode, sharing)`,
`11.0.11`,
`OpenJDK Runtime Environment 18.9 (build 11.0.11+9-LTS)`,
`OpenJDK 64-Bit Server VM 18.9 (build 11.0.11+9-LTS, mixed mode, sharing)`,
},
}

for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
version, runtime, vm := parseJavaVersionOutput(c.output)

require.Equal(t, c.version, version)
require.Equal(t, c.runtime, runtime)
jdkVersion, jdkJRE, vm := parseJavaVersionOutput(c.output)
require.Equal(t, c.version, jdkVersion)
require.Equal(t, c.runtime, jdkJRE)
require.Equal(t, c.vm, vm)
})
}
Expand All @@ -94,13 +99,16 @@ func TestDriver_javaVersionInfo(t *testing.T) {

javaVersionCommand = []string{
"/bin/sh", "-c",
fmt.Sprintf("printf '%%s\n' '%s' >/dev/stderr", oracleJDKOutput),
fmt.Sprintf("printf '%%s\n' '%s' >/dev/stderr",
`java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)`),
}

version, runtime, vm, err := javaVersionInfo()
version, jdkJRE, vm, err := javaVersionInfo()
require.NoError(t, err)
require.Equal(t, "1.7.0_80", version)
require.Equal(t, "Java(TM) SE Runtime Environment (build 1.7.0_80-b15)", runtime)
require.Equal(t, "Java(TM) SE Runtime Environment (build 1.7.0_80-b15)", jdkJRE)
require.Equal(t, "Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)", vm)

}
Expand All @@ -120,10 +128,10 @@ func TestDriver_javaVersionInfo_UnexpectedOutput(t *testing.T) {
fmt.Sprintf("printf '%%s\n' '%s' >/dev/stderr", "unexpected java -version output"),
}

version, runtime, vm, err := javaVersionInfo()
version, jdkJRE, vm, err := javaVersionInfo()
require.NoError(t, err)
require.Equal(t, "", version)
require.Equal(t, "", runtime)
require.Equal(t, "", jdkJRE)
require.Equal(t, "", vm)
}

Expand All @@ -142,11 +150,11 @@ func TestDriver_javaVersionInfo_JavaVersionFails(t *testing.T) {
"exit 127",
}

version, runtime, vm, err := javaVersionInfo()
version, jdkJRE, vm, err := javaVersionInfo()
require.Error(t, err)
require.Contains(t, err.Error(), "failed to check java version")

require.Equal(t, "", version)
require.Equal(t, "", runtime)
require.Equal(t, "", jdkJRE)
require.Equal(t, "", vm)
}

0 comments on commit 674183c

Please sign in to comment.