diff options
author | danielsdeleo <dan@opscode.com> | 2013-11-11 09:16:33 -0800 |
---|---|---|
committer | danielsdeleo <dan@opscode.com> | 2013-11-11 09:16:33 -0800 |
commit | a477d8b3315b3c7e0cc20735e3e73819ae690321 (patch) | |
tree | 02716dd0a60b646204f0113ded7c825218bce447 | |
parent | 3c3350076f4bf5bd21b73f84ea3c95423bb1a6ed (diff) | |
parent | 5d2467d741571b93510b03e952a2aa5b43f416e8 (diff) | |
download | ohai-a477d8b3315b3c7e0cc20735e3e73819ae690321.tar.gz |
Merge branch 'OHAI-514'
Fixes OHAI-514, https://tickets.opscode.com/browse/OHAI-514
-rw-r--r-- | lib/ohai/plugins/java.rb | 42 | ||||
-rw-r--r-- | spec/unit/plugins/java_spec.rb | 222 |
2 files changed, 171 insertions, 93 deletions
diff --git a/lib/ohai/plugins/java.rb b/lib/ohai/plugins/java.rb index 11a5a643..c94a93a9 100644 --- a/lib/ohai/plugins/java.rb +++ b/lib/ohai/plugins/java.rb @@ -22,17 +22,12 @@ Ohai.plugin(:Java) do depends "languages" collect_data do - java = Mash.new - - so = nil - if RUBY_PLATFORM.downcase.include?("darwin") - if File.executable?("#{ Ohai.abs_path( "/usr/libexec/java_home" )}") - so = shell_out("java -version") - end - else - so = shell_out("java -version") - end + get_java_info if has_real_java? + end + def get_java_info + java = Mash.new + so = shell_out("java -version") if so.exitstatus == 0 so.stderr.split(/\r?\n/).each do |line| case line @@ -48,4 +43,31 @@ Ohai.plugin(:Java) do languages[:java] = java if java[:version] end end + + # On Mac OS X, the development tools include "stubs" for JVM executables that + # prompt the user to install the JVM if they desire. In our case we simply + # wish to detect if the JVM is there and do not want to trigger a popup + # window. As a workaround, we can run the java_home executable and check its + # exit status to determine if the `java` executable is the real one or the OS + # X stub. In the terminal, it looks like this: + # + # $ /usr/libexec/java_home + # Unable to find any JVMs matching version "(null)". + # No Java runtime present, try --request to install. + # + # $ echo $? + # 1 + # + # This check always returns true when not on darwin because it is just a + # workaround for this particular annoyance. + def has_real_java? + return true unless on_darwin? + shell_out("/usr/libexec/java_home").status.success? + end + + def on_darwin? + RUBY_PLATFORM.downcase.include?("darwin") + end + + end diff --git a/spec/unit/plugins/java_spec.rb b/spec/unit/plugins/java_spec.rb index 7258ce66..cc3e3e0a 100644 --- a/spec/unit/plugins/java_spec.rb +++ b/spec/unit/plugins/java_spec.rb @@ -23,91 +23,147 @@ describe Ohai::System, "plugin java (Java5 Client VM)" do before(:each) do @plugin = get_plugin("java") @plugin[:languages] = Mash.new - @stderr = "java version \"1.5.0_16\"\nJava(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_16-b06-284)\nJava HotSpot(TM) Client VM (build 1.5.0_16-133, mixed mode, sharing)" - @plugin.stub(:shell_out).with("java -version").and_return(mock_shell_out(0, "", @stderr)) end - it "should run java -version" do - @plugin.should_receive(:shell_out).with("java -version").and_return(mock_shell_out(0, "", @stderr)) - @plugin.run - end - - it "should set java[:version]" do - @plugin.run - @plugin[:languages][:java][:version].should eql("1.5.0_16") - end - - it "should set java[:runtime][:name] to runtime name" do - @plugin.run - @plugin[:languages][:java][:runtime][:name].should eql("Java(TM) 2 Runtime Environment, Standard Edition") - end - - it "should set java[:runtime][:build] to runtime build" do - @plugin.run - @plugin[:languages][:java][:runtime][:build].should eql("1.5.0_16-b06-284") - end - - it "should set java[:hotspot][:name] to hotspot name" do - @plugin.run - @plugin[:languages][:java][:hotspot][:name].should eql("Java HotSpot(TM) Client VM") - end - - it "should set java[:hotspot][:build] to hotspot build" do - @plugin.run - @plugin[:languages][:java][:hotspot][:build].should eql("1.5.0_16-133, mixed mode, sharing") - end - - it "should not set the languages[:java] tree up if java command fails" do - @stderr = "Some error output here" - @plugin.stub(:shell_out).with("java -version").and_return(mock_shell_out(1, "", @stderr)) - @plugin.run - @plugin[:languages].should_not have_key(:java) - end -end - -describe Ohai::System, "plugin java (Java6 Server VM)" do - before(:each) do - @plugin = get_plugin("java") - @plugin[:languages] = Mash.new - @stderr = "java version \"1.6.0_22\"\nJava(TM) 2 Runtime Environment (build 1.6.0_22-b04)\nJava HotSpot(TM) Server VM (build 17.1-b03, mixed mode)" - @plugin.stub(:shell_out).with("java -version").and_return(mock_shell_out(0, "", @stderr)) - end - - it "should run java -version" do - @plugin.should_receive(:shell_out).with("java -version").and_return(mock_shell_out(0, "", @stderr)) - @plugin.run - end - - it "should set java[:version]" do - @plugin.run - @plugin[:languages][:java][:version].should eql("1.6.0_22") - end - - it "should set java[:runtime][:name] to runtime name" do - @plugin.run - @plugin[:languages][:java][:runtime][:name].should eql("Java(TM) 2 Runtime Environment") - end - - it "should set java[:runtime][:build] to runtime build" do - @plugin.run - @plugin[:languages][:java][:runtime][:build].should eql("1.6.0_22-b04") - end - - it "should set java[:hotspot][:name] to hotspot name" do - @plugin.run - @plugin[:languages][:java][:hotspot][:name].should eql("Java HotSpot(TM) Server VM") - end - - it "should set java[:hotspot][:build] to hotspot build" do - @plugin.run - @plugin[:languages][:java][:hotspot][:build].should eql("17.1-b03, mixed mode") - end - - it "should not set the languages[:java] tree up if java command fails" do - @stderr = "Some error output here" - @plugin.stub(:shell_out).with("java -version").and_return(mock_shell_out(0, "", @stderr)) - @plugin.run - @plugin[:languages].should_not have_key(:java) + shared_examples_for "when the JRE is installed" do + before do + @stderr = "java version \"1.5.0_16\"\nJava(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_16-b06-284)\nJava HotSpot(TM) Client VM (build 1.5.0_16-133, mixed mode, sharing)" + @plugin.stub(:shell_out).with("java -version").and_return(mock_shell_out(0, "", @stderr)) + end + + it "should run java -version" do + @plugin.should_receive(:shell_out).with("java -version").and_return(mock_shell_out(0, "", @stderr)) + @plugin.run + end + + it "should set java[:version]" do + @plugin.run + @plugin[:languages][:java][:version].should eql("1.5.0_16") + end + + it "should set java[:runtime][:name] to runtime name" do + @plugin.run + @plugin[:languages][:java][:runtime][:name].should eql("Java(TM) 2 Runtime Environment, Standard Edition") + end + + it "should set java[:runtime][:build] to runtime build" do + @plugin.run + @plugin[:languages][:java][:runtime][:build].should eql("1.5.0_16-b06-284") + end + + it "should set java[:hotspot][:name] to hotspot name" do + @plugin.run + @plugin[:languages][:java][:hotspot][:name].should eql("Java HotSpot(TM) Client VM") + end + + it "should set java[:hotspot][:build] to hotspot build" do + @plugin.run + @plugin[:languages][:java][:hotspot][:build].should eql("1.5.0_16-133, mixed mode, sharing") + end + + it "should not set the languages[:java] tree up if java command fails" do + @stderr = "Some error output here" + @plugin.stub(:shell_out).with("java -version").and_return(mock_shell_out(1, "", @stderr)) + @plugin.run + @plugin[:languages].should_not have_key(:java) + end + end + + shared_examples_for "when the Server JRE is installed" do + + before(:each) do + @stderr = "java version \"1.6.0_22\"\nJava(TM) 2 Runtime Environment (build 1.6.0_22-b04)\nJava HotSpot(TM) Server VM (build 17.1-b03, mixed mode)" + @plugin.stub(:shell_out).with("java -version").and_return(mock_shell_out(0, "", @stderr)) + end + + it "should run java -version" do + @plugin.should_receive(:shell_out).with("java -version").and_return(mock_shell_out(0, "", @stderr)) + @plugin.run + end + + it "should set java[:version]" do + @plugin.run + @plugin[:languages][:java][:version].should eql("1.6.0_22") + end + + it "should set java[:runtime][:name] to runtime name" do + @plugin.run + @plugin[:languages][:java][:runtime][:name].should eql("Java(TM) 2 Runtime Environment") + end + + it "should set java[:runtime][:build] to runtime build" do + @plugin.run + @plugin[:languages][:java][:runtime][:build].should eql("1.6.0_22-b04") + end + + it "should set java[:hotspot][:name] to hotspot name" do + @plugin.run + @plugin[:languages][:java][:hotspot][:name].should eql("Java HotSpot(TM) Server VM") + end + + it "should set java[:hotspot][:build] to hotspot build" do + @plugin.run + @plugin[:languages][:java][:hotspot][:build].should eql("17.1-b03, mixed mode") + end + + it "should not set the languages[:java] tree up if java command fails" do + @stderr = "Some error output here" + @plugin.stub(:shell_out).with("java -version").and_return(mock_shell_out(0, "", @stderr)) + @plugin.run + @plugin[:languages].should_not have_key(:java) + end + end + + context "when not on Mac OS X" do + before do + stub_const("RUBY_PLATFORM", "x86_64-linux") + end + + context "and the client JRE is installed" do + include_examples "when the JRE is installed" + end + context "and the server JRE is installed" do + include_examples "when the Server JRE is installed" + end + end + + context "when on Mac OS X with Java installed" do + before do + stub_const("RUBY_PLATFORM", "x86_64-darwin12.3.0") + end + + it "detects that it is on a darwin platform" do + @plugin.should be_on_darwin + end + + context "and real Java is installed" do + before do + java_home_status = double(Process::Status, :success? => true) + java_home_cmd = double(Mixlib::ShellOut, :status => java_home_status) + @plugin.should_receive(:shell_out).with("/usr/libexec/java_home").and_return(java_home_cmd) + end + + context "and the client JRE is installed" do + include_examples "when the JRE is installed" + end + context "and the server JRE is installed" do + include_examples "when the Server JRE is installed" + end + end + + context "and the JVM stubs are installed" do + before do + java_home_status = double(Process::Status, :success? => false) + java_home_cmd = double(Mixlib::ShellOut, :status => java_home_status) + @plugin.should_receive(:shell_out).with("/usr/libexec/java_home").and_return(java_home_cmd) + end + + it "does not attempt to get java info" do + @plugin.should_not_receive(:shell_out).with("java -version") + @plugin.run + @plugin[:languages].should_not have_key(:java) + end + end end |