From 378dcc7802eac6a47a00ee9b02ebc08a5937554b Mon Sep 17 00:00:00 2001 From: Peter Souter Date: Fri, 5 Dec 2014 17:33:52 +0000 Subject: [PATCH 1/6] (MODULES-1570) TDD Style - Add specs first Facter unit tests to check resolution of Java version --- spec/unit/facter/java_patch_level_spec.rb | 31 +++++++++++++++++++++++ spec/unit/facter/java_version_spec.rb | 29 +++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 spec/unit/facter/java_patch_level_spec.rb create mode 100644 spec/unit/facter/java_version_spec.rb diff --git a/spec/unit/facter/java_patch_level_spec.rb b/spec/unit/facter/java_patch_level_spec.rb new file mode 100644 index 0000000..b9892c6 --- /dev/null +++ b/spec/unit/facter/java_patch_level_spec.rb @@ -0,0 +1,31 @@ +require "spec_helper" + +describe Facter::Util::Fact do + before { + Facter.clear + } + + describe "java_patch_level" do + context "if java is installed" do + context 'returns java patch version extracted from java_version fact' do + before :each do + Facter.fact(:java_version).stubs(:value).returns('1.7.0_71') + end + it do + Facter.fact(:java_patch_level).value.should == "71" + end + end + end + + context "if java is installed" do + context 'returns java patch version extracted from java_version fact' do + before :each do + Facter.fact(:java_version).stubs(:value).returns(nil) + end + it do + Facter.fact(:java_patch_level).value.should == "JAVA_NOT_INSTALLED" + end + end + end + end +end \ No newline at end of file diff --git a/spec/unit/facter/java_version_spec.rb b/spec/unit/facter/java_version_spec.rb new file mode 100644 index 0000000..a0974ac --- /dev/null +++ b/spec/unit/facter/java_version_spec.rb @@ -0,0 +1,29 @@ +require "spec_helper" + +describe Facter::Util::Fact do + before { + Facter.clear + } + + describe "java_version" do + context 'returns java version when java present' do + it do + java_version_output = <<-EOS +java version "1.7.0_71" +Java(TM) SE Runtime Environment (build 1.7.0_71-b14) +Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode) + EOS + Facter::Util::Resolution.expects(:exec).with("java -version 2>&1").returns(java_version_output) + Facter.fact(:java_version).value.should == "1.7.0_71" + end + end + + context 'returns nil when java not present' do + it do + java_version_output = "bash: java: command not found" + Facter::Util::Resolution.expects(:exec).with("java -version 2>&1").returns(java_version_output) + Facter.fact(:java_version).value.should be_nil + end + end + end +end \ No newline at end of file From 8724592f2b81af40c22a7c18b22ca564ead80dfa Mon Sep 17 00:00:00 2001 From: Peter Souter Date: Fri, 5 Dec 2014 17:35:38 +0000 Subject: [PATCH 2/6] (MODULES-1570) `java_version` fact Adapted from the many found on Github, simply runs `java -version` and strips the results. From what I can find there aren't many edge cases for the result `java -version 2>&1` could return, so this should be fairly compatible. --- lib/facter/java_version.rb | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 lib/facter/java_version.rb diff --git a/lib/facter/java_version.rb b/lib/facter/java_version.rb new file mode 100644 index 0000000..785c99c --- /dev/null +++ b/lib/facter/java_version.rb @@ -0,0 +1,19 @@ +# Fact: java_version +# +# Purpose: store java versions in the config DB +# +# Resolution: +# Tests for presence of java, returns nil if not present +# returns output of "java -version" and splits on \n + '"' +# +# Caveats: +# none +# +# Notes: +# None +Facter.add(:java_version) do + setcode do + t_java = Facter::Util::Resolution.exec("java -version 2>&1") + java_version = t_java.to_s.lines.first.strip.split(/version/)[1].gsub(/"/, "").strip + end +end \ No newline at end of file From ea4717ea2941c1ef275ebf85cf7d8094e417682e Mon Sep 17 00:00:00 2001 From: Peter Souter Date: Fri, 5 Dec 2014 17:37:03 +0000 Subject: [PATCH 3/6] (MODULES-1570) `java_patch_level` fact Uses the `java_version` fact and gets the patch level by splitting after `_` This would be useful if you want to make sure you're not accidentally downgrading the version of Java to a lower patch level (I've noticed some package managers don't notice this too well) --- lib/facter/java_patch_level.rb | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 lib/facter/java_patch_level.rb diff --git a/lib/facter/java_patch_level.rb b/lib/facter/java_patch_level.rb new file mode 100644 index 0000000..3ec97be --- /dev/null +++ b/lib/facter/java_patch_level.rb @@ -0,0 +1,22 @@ +# Fact: java_patch_level +# +# Purpose: get Java's patch level +# +# Resolution: +# Uses java_version fact splits on the patch number (after _) +# +# Caveats: +# none +# +# Notes: +# None +Facter.add(:java_patch_level) do + setcode do + java_version = Facter.value(:java_version) + if java_version.nil? + "JAVA_NOT_INSTALLED" + else + java_patch_level = java_version.strip.split('_')[1] + end + end +end \ No newline at end of file From 5168f61c26bd5bf40ef8dd82153115cfff3ef8b1 Mon Sep 17 00:00:00 2001 From: Peter Souter Date: Fri, 5 Dec 2014 19:20:29 +0000 Subject: [PATCH 4/6] (MODULES-1570) Improve variable names Lets keep it vaguely consistent --- lib/facter/java_version.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/facter/java_version.rb b/lib/facter/java_version.rb index 785c99c..5216932 100644 --- a/lib/facter/java_version.rb +++ b/lib/facter/java_version.rb @@ -13,7 +13,7 @@ # None Facter.add(:java_version) do setcode do - t_java = Facter::Util::Resolution.exec("java -version 2>&1") - java_version = t_java.to_s.lines.first.strip.split(/version/)[1].gsub(/"/, "").strip + java_version = Facter::Util::Resolution.exec("java -version 2>&1") + java_version = java_version.to_s.lines.first.strip.split(/version/)[1].gsub(/"/, "").strip end end \ No newline at end of file From cd3ac1ee468f43e4e4473743c69a4adc549d39b5 Mon Sep 17 00:00:00 2001 From: Peter Souter Date: Mon, 29 Dec 2014 15:06:22 +0000 Subject: [PATCH 5/6] (MODULES-1570) Add java_major_version fact Gives the major version of the Java release (ie. Java 1.7.0_71, major version is 7) We also want to specifically return nil when java not present --- lib/facter/java_major_version.rb | 20 +++++++++++++++ lib/facter/java_patch_level.rb | 6 +---- lib/facter/java_version.rb | 13 +++++----- spec/unit/facter/java_major_version_spec.rb | 27 +++++++++++++++++++++ spec/unit/facter/java_patch_level_spec.rb | 2 +- spec/unit/facter/java_version_spec.rb | 6 ++--- 6 files changed, 59 insertions(+), 15 deletions(-) create mode 100644 lib/facter/java_major_version.rb create mode 100644 spec/unit/facter/java_major_version_spec.rb diff --git a/lib/facter/java_major_version.rb b/lib/facter/java_major_version.rb new file mode 100644 index 0000000..b0a0aae --- /dev/null +++ b/lib/facter/java_major_version.rb @@ -0,0 +1,20 @@ +# Fact: java_major_version +# +# Purpose: get Java's major version +# +# Resolution: +# Tests for presence of java, returns nil if not present +# returns output of "java -version" and splits on \n + '"' +# eg. +# +# Caveats: +# none +# +# Notes: +# None +Facter.add(:java_major_version) do + setcode do + java_version = Facter.value(:java_version) + java_patch_level = java_version.strip.split('_')[0].split('.')[1] unless java_version.nil? + end +end \ No newline at end of file diff --git a/lib/facter/java_patch_level.rb b/lib/facter/java_patch_level.rb index 3ec97be..1d7921f 100644 --- a/lib/facter/java_patch_level.rb +++ b/lib/facter/java_patch_level.rb @@ -13,10 +13,6 @@ Facter.add(:java_patch_level) do setcode do java_version = Facter.value(:java_version) - if java_version.nil? - "JAVA_NOT_INSTALLED" - else - java_patch_level = java_version.strip.split('_')[1] - end + java_patch_level = java_version.strip.split('_')[1] unless java_version.nil? end end \ No newline at end of file diff --git a/lib/facter/java_version.rb b/lib/facter/java_version.rb index 5216932..47d1a66 100644 --- a/lib/facter/java_version.rb +++ b/lib/facter/java_version.rb @@ -1,6 +1,6 @@ # Fact: java_version # -# Purpose: store java versions in the config DB +# Purpose: get full java version string # # Resolution: # Tests for presence of java, returns nil if not present @@ -11,9 +11,10 @@ # # Notes: # None -Facter.add(:java_version) do - setcode do - java_version = Facter::Util::Resolution.exec("java -version 2>&1") - java_version = java_version.to_s.lines.first.strip.split(/version/)[1].gsub(/"/, "").strip +if Facter::Util::Resolution.which('java') + Facter.add(:java_version) do + setcode do + Facter::Util::Resolution.exec('java -version 2>&1').lines.first.split(/"/)[1].strip + end end -end \ No newline at end of file +end diff --git a/spec/unit/facter/java_major_version_spec.rb b/spec/unit/facter/java_major_version_spec.rb new file mode 100644 index 0000000..94d1328 --- /dev/null +++ b/spec/unit/facter/java_major_version_spec.rb @@ -0,0 +1,27 @@ +require "spec_helper" + +describe Facter::Util::Fact do + before { + Facter.clear + } + + describe "java_major_version" do + context 'returns major version when java_version fact present' do + before :each do + Facter.fact(:java_version).stubs(:value).returns('1.7.0_71') + end + it do + Facter.fact(:java_major_version).value.should == "7" + end + end + + context 'returns nil when java not present' do + before :each do + Facter.fact(:java_version).stubs(:value).returns(nil) + end + it do + Facter.fact(:java_major_version).value.should be_nil + end + end + end +end \ No newline at end of file diff --git a/spec/unit/facter/java_patch_level_spec.rb b/spec/unit/facter/java_patch_level_spec.rb index b9892c6..8371c45 100644 --- a/spec/unit/facter/java_patch_level_spec.rb +++ b/spec/unit/facter/java_patch_level_spec.rb @@ -23,7 +23,7 @@ describe Facter::Util::Fact do Facter.fact(:java_version).stubs(:value).returns(nil) end it do - Facter.fact(:java_patch_level).value.should == "JAVA_NOT_INSTALLED" + Facter.fact(:java_patch_level).value.should be_nil end end end diff --git a/spec/unit/facter/java_version_spec.rb b/spec/unit/facter/java_version_spec.rb index a0974ac..8e21b43 100644 --- a/spec/unit/facter/java_version_spec.rb +++ b/spec/unit/facter/java_version_spec.rb @@ -13,6 +13,7 @@ java version "1.7.0_71" Java(TM) SE Runtime Environment (build 1.7.0_71-b14) Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode) EOS + Facter::Util::Resolution.expects(:which).with("java").returns(true) Facter::Util::Resolution.expects(:exec).with("java -version 2>&1").returns(java_version_output) Facter.fact(:java_version).value.should == "1.7.0_71" end @@ -20,9 +21,8 @@ Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode) context 'returns nil when java not present' do it do - java_version_output = "bash: java: command not found" - Facter::Util::Resolution.expects(:exec).with("java -version 2>&1").returns(java_version_output) - Facter.fact(:java_version).value.should be_nil + Facter::Util::Resolution.expects(:which).with("java").returns(false) + Facter.fact(:java_version).should be_nil end end end From 46524ee6eb504b999f3ef4b2b1b1003b7ea23c75 Mon Sep 17 00:00:00 2001 From: Peter Souter Date: Thu, 8 Jan 2015 08:27:56 -0800 Subject: [PATCH 6/6] (MODULES-1570) Stub exec for older Facter Otherwise this spec will fail with ``` Mocha::ExpectationError: unexpected invocation: Facter::Util::Resolution.which('uname') ``` --- spec/unit/facter/java_version_spec.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/unit/facter/java_version_spec.rb b/spec/unit/facter/java_version_spec.rb index 8e21b43..b90cd46 100644 --- a/spec/unit/facter/java_version_spec.rb +++ b/spec/unit/facter/java_version_spec.rb @@ -21,6 +21,7 @@ Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode) context 'returns nil when java not present' do it do + Facter::Util::Resolution.stubs(:exec) Facter::Util::Resolution.expects(:which).with("java").returns(false) Facter.fact(:java_version).should be_nil end