From ff9dd16399d0f8e1fd7124f3b53cd8f09427cb3f Mon Sep 17 00:00:00 2001 From: Charles Oliver Nutter Date: Wed, 9 Jul 2025 15:12:27 -0500 Subject: [PATCH 1/2] Make version checking test more robust Use actual JRuby version so we don't have to update these tests. --- .../de/saumya/mojo/ruby/script/ScriptFactoryTest.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/ruby-tools/src/test/java/de/saumya/mojo/ruby/script/ScriptFactoryTest.java b/ruby-tools/src/test/java/de/saumya/mojo/ruby/script/ScriptFactoryTest.java index 89e20f60..e089d30e 100644 --- a/ruby-tools/src/test/java/de/saumya/mojo/ruby/script/ScriptFactoryTest.java +++ b/ruby-tools/src/test/java/de/saumya/mojo/ruby/script/ScriptFactoryTest.java @@ -1,6 +1,7 @@ package de.saumya.mojo.ruby.script; import org.jruby.Main; +import org.jruby.runtime.Constants; import org.junit.Test; import java.io.ByteArrayOutputStream; @@ -14,6 +15,8 @@ public class ScriptFactoryTest { + private static final String BASE_JRUBY_VERSION_STRING = "jruby " + Constants.VERSION + " (" + Constants.RUBY_VERSION + ")"; + @Test public void should_execute_script_with_only_args_and_return_in_output_stream() throws ScriptException, IOException { Main main = new Main(); @@ -25,7 +28,7 @@ public void should_execute_script_with_only_args_and_return_in_output_stream() t .execute(outputStream); final String output = outputStream.toString(); - assertThat(output).startsWith("jruby 9.4.13.0 (3.1.4)"); + assertThat(output).startsWith(BASE_JRUBY_VERSION_STRING); } @Test @@ -40,7 +43,7 @@ public void should_execute_script_with_only_args_and_return_in_file() throws Scr byte[] fileBytes = Files.readAllBytes(outputFile.toPath()); final String output = new String(fileBytes, StandardCharsets.UTF_8); - assertThat(output).startsWith("jruby 9.4.13.0 (3.1.4)"); + assertThat(output).startsWith(BASE_JRUBY_VERSION_STRING); } @Test @@ -49,7 +52,7 @@ public void should_return_jruby_version() throws ScriptException, IOException { JRubyVersion version = gemScriptFactory.getVersion(); - assertThat(version.getVersion()).isEqualTo("9.4.13.0"); - assertThat(version.getLanguage()).isEqualTo("3.1.4"); + assertThat(version.getVersion()).isEqualTo(Constants.VERSION); + assertThat(version.getLanguage()).isEqualTo(Constants.RUBY_VERSION); } } From 102db8b322231b33dbf9142ae7117892d6d2dd5e Mon Sep 17 00:00:00 2001 From: Charles Oliver Nutter Date: Wed, 9 Jul 2025 15:13:52 -0500 Subject: [PATCH 2/2] Make JRuby version parsing more robust This modifies the handling of the `jruby -v` output to specifically search for the line starting with `jruby`, avoiding other lines such as those that might be output by the JDK for the env var JDK_JAVA_OPTIONS. Fixes #140 --- .../mojo/ruby/script/ScriptFactory.java | 20 ++++++++++++++----- .../mojo/ruby/script/ScriptFactoryTest.java | 12 +++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/ruby-tools/src/main/java/de/saumya/mojo/ruby/script/ScriptFactory.java b/ruby-tools/src/main/java/de/saumya/mojo/ruby/script/ScriptFactory.java index c79bc314..2f1dff2a 100644 --- a/ruby-tools/src/main/java/de/saumya/mojo/ruby/script/ScriptFactory.java +++ b/ruby-tools/src/main/java/de/saumya/mojo/ruby/script/ScriptFactory.java @@ -209,14 +209,24 @@ public JRubyVersion getVersion() { try { final ByteArrayOutputStream os = new ByteArrayOutputStream(); this.newArguments().addArg("-v").execute(os); - final String[] versionParts = os.toString(StandardCharsets.UTF_8.toString()).split(" "); - final String jrubyVersion = versionParts[1]; - final String languageVersion = extractLanguageVersion(versionParts[2]); - return new JRubyVersion(jrubyVersion, languageVersion); + String output = os.toString(StandardCharsets.UTF_8.toString()); + final String[] lines = output.split("\n"); + for (String line : lines) { + line = line.trim(); + if (line.startsWith("jruby")) { + final String[] versionParts = output.split(" "); + final String jrubyVersion = versionParts[1]; + final String languageVersion = extractLanguageVersion(versionParts[2]); + return new JRubyVersion(jrubyVersion, languageVersion); + } + } + logger.warn("Could not identify version from -v output: \n" + output); } catch (Exception e) { logger.warn("Could not identify version: " + e.getMessage()); - return null; } + + // only in cases where we cannot parse the version + return null; } private String extractLanguageVersion(String versionPart) { diff --git a/ruby-tools/src/test/java/de/saumya/mojo/ruby/script/ScriptFactoryTest.java b/ruby-tools/src/test/java/de/saumya/mojo/ruby/script/ScriptFactoryTest.java index e089d30e..e2772bcf 100644 --- a/ruby-tools/src/test/java/de/saumya/mojo/ruby/script/ScriptFactoryTest.java +++ b/ruby-tools/src/test/java/de/saumya/mojo/ruby/script/ScriptFactoryTest.java @@ -55,4 +55,16 @@ public void should_return_jruby_version() throws ScriptException, IOException { assertThat(version.getVersion()).isEqualTo(Constants.VERSION); assertThat(version.getLanguage()).isEqualTo(Constants.RUBY_VERSION); } + + @Test + public void should_return_jruby_version_with_jdk_options_set() throws ScriptException, IOException { + final GemScriptFactory gemScriptFactory = gemScriptFactory(); + + gemScriptFactory.addEnv("JDK_JAVA_OPTIONS", "-Xmx1G"); + + JRubyVersion version = gemScriptFactory.getVersion(); + + assertThat(version.getVersion()).isEqualTo(Constants.VERSION); + assertThat(version.getLanguage()).isEqualTo(Constants.RUBY_VERSION); + } }