On Thursday, November 8, 2012 8:27:39 AM UTC+11, Jeff McCune wrote:
Yes, I think we should leave 11612 as it is. Merged pending release is a state that is considered "closed," but it's a soft form of being closed. The ticket changes to the closed state when the change is actually released. Would you mind creating additional tickets for the following "still to do" items? One ticket for each actionable issue will help me streamline the changes through our system.
Will do.
Still to do, add physicalprocessorcount (this is also a headache on HP-UX) and add Hongbo Hu's bugfix for dealing with HP-UX NICs that have an asterisk after them. This could probably be put in straight away - but the question is are we going to use this opportunity to write proper unit tests for ip.rb? That might take me, personally, too far afield.
I'd be happy to write the unit tests for ip.rb, but I do this sort of work when I have the opportunity, which is not all that frequently. If you could isolate the potential blocker of unit tests in it's own issue, it'll help keep the other issues streamlined.
Happy to help out where I can. I'm still new to this so here's the problem as I see it -
The spec test for the interface list on HP-UX is -
it "should return a list three interfaces on HP-UX with three interfaces multiply reporting" do
hpux_netstat = my_fixture_read("hpux_netstat_all_interfaces")
Facter::Util::IP.stubs(:get_all_interface_output).returns(hpux_netstat)
Facter::Util::IP.get_interfaces().should == ["lan1", "lan0", "lo0"]
end
The fixture hpux_netstat_all_interfaces is, surprisingly, not the output of netstat -in on HP-UX, but rather what the author believed the get_all_interface_output method would return.
Now, here is the get_all_interface_output method -
def self.get_all_interface_output
case Facter.value(:kernel)
when 'Linux', 'OpenBSD', 'NetBSD', 'FreeBSD', 'Darwin', 'GNU/kFreeBSD', 'DragonFly'
output = %x{/sbin/ifconfig -a 2>/dev/null}
when 'SunOS'
output = %x{/usr/sbin/ifconfig -a}
when 'HP-UX'
output = %x{/bin/netstat -in | sed -e 1d}
when 'windows'
output = %x|#{ENV['SYSTEMROOT']}/system32/netsh.exe interface ip show interface|
output += %x|#{ENV['SYSTEMROOT']}/system32/netsh.exe interface ipv6 show interface|
end
output
end
The supplied fixture for HP-UX is the output of netstat -in |sed -e 1d -
root@myhost:(ip)> cat hpux_netstat_all_interfaces
lan1 1500 192.168.100.0 192.168.100.182 12964 0 900 0 0
lan0 1500 192.168.100.0 192.168.100.181 12964 0 715 0 0
lo0 4136 127.0.0.0 127.0.0.1 98 0 98 0 0
However the author has not considered the case of netstat -in output that has asterisks after the interface as in -
root@myhost:()> netstat -in |sed -e 's/[0-9]/X/g'
Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll
lanX* XXXX XX.XX.XX.X XX.XX.XX.X XXX X XXX X X
lanX XXXX XXX.XX.X.X XXX.XX.X.X XXXXXXXXXX X XXXXXXXXX X X
loX XXXX XXX.X.X.X XXX.X.X.X XXXXXXX X XXXXXXX X X
And as Hongbo Hu showed, you can solve the problem easily enough by simply extending the sed command to delete not only the first line, but also any asterisks.
From a unit test perspective, however, the code would need to be changed in order to reproduce the failing behaviour.
My feeling is we would need to rewrite this code with shim methods for the commands that are executed externally, collect a good sample of outputs from the various platforms that the code executes on, and then stub all these calls to external commands in completely new unit tests.
Next problem is that the code uses a big case statement of the kind Andy said he doesn't like. So, I guess we would also want to completely rewrite the method - and that would affect all platforms.
Finally, the whole of ip.rb and ip_spec.rb is written in the same way. So, my conclusion is - since the code's working it's probably low priority and when we really have lots of spare time then the whole thing needs to be rewritten, code, unit tests and all. So it's not obvious to me that it's worth the effort of changing this method and implementing spec tests if, really, the whole thing needs to be rewritten.
People with more experience on the project might come to a different conclusion of course.