Hi all,
I've spent the day reading through the Wiki on writing tests
(http://projects.puppetlabs.com/projects/puppet/wiki/Development_Writing_Tests)
and doing the RSpec tutorial that was linked, and otherwise examining rspec
tests in ./spec/unit/util/uptime_spec.rb in facter. I am working on a fix
and have recently updated the following bug:
http://projects.puppetlabs.com/issues/13535.
I have established that the existing RSpec test relating to who -b is
flawed, and I've come to the conclusion that the who -b calls are probably
unused, no matter what OS is used. Of course, I can't get access to
absolutely every OS, but I've certainly ruled out a pretty large set.
Nonetheless because I am highly risk averse I would like to discuss before
proposing to completely remove the calls to who -b. :)
My conclusion is that the method uptime_who_dash_b could only work in
theory on one OS, namely Linux, and that in the case of Linux, it will
never be called, because Linux is catered for by the method
uptime_proc_uptime. Furthermore, I have established that the RSpec test of
the who -b functionality is flawed, based on the contents of the fixture
file who_b_boottime, and works only because only the case of testing one
hour into the future was considered. The test would have failed if any
time between Jan 1 and Aug 1 had been considered, based on the contents
The fixture file appears to contain output from probably OSX or OpenBSD.
$ cat ./spec/fixtures/unit/util/uptime/who_b_boottime
reboot ~ Aug 1 14:13
In the case of OSX, and other BSD derivatives, the code will use the call
to sysctl -n kern.boottime and never reach the problematic who -b call.
That said, I don't have access to OpenBSD to check but comments in the
RSpec tests tell me that OpenBSD goes to sysctl -n kern.boottime.
In the case of Linux, this who -b code does work, but the code is
redundant, because Linux uses the uptime_proc_uptime method instead.
In the case of all other OSes I know of, the who -b code will fail, because
Linux seems to be the only OS that provides the year in who -b output.
Linux
$ who -b
system boot 2012-08-27 14:41
OSX/NetBSD/PCBSD
$ who -b
reboot ~ Jul 28 16:34
AIX
$ who -b
. system boot Jun 27 12:05
Solaris
$ who -b
. system boot May 31 17:42
HP-UX
$ who -b
. system boot Aug 13 08:05
$ who -b
. system boot Aug 7 13:40
Now, next problem is that in the case of Solaris prior to Solaris 8,
uptime_kstat also won't work because kstat wasn't introduced until Solaris
8. Nonetheless, the fix for AIX proposed by Malcolm Howe will work on
Solaris 10 as well. Thus, it seems simpler and easier if we let Solaris
use the same solution as AIX & HP-UX.
So I am proposing the following changes as a fix to the bug I am working on
-
- remove the who -b code altogether, including the associated RSpec test.
- add a case statement to make it explicit as to which OS uses which method
- add a method uptime_uptime per Malcolm Howe's suggestion that will work
for all commercial Unix.
- remove the uptime_kstat altogether, including the associated RSpect tests
as it will no longer be needed.
- restructure the RSpec tests to follow the new code structure*
* I am aware of TDD, although it seems the existing tests really follow the
implementation?
i.e.
Thus, instead of
def self.get_uptime_seconds_unix
uptime_proc_uptime or uptime_sysctl or uptime_kstat or uptime_who_dash_b
end
I would replace this with
def self.get_uptime_seconds_unix
case Facter.value(:kernel)
when "Linux"
uptime_proc_uptime
when "FreeBSD", "OpenBSD", "NetBSD", "GNU/kFreeBSD", "DragonFly",
"Darwin"
uptime_sysctl
when "SunOS", "AIX", "HP-UX"
uptime_uptime
else
nil
end
end
I have access to all of these platforms to test on except for OpenBSD and
DragonFly. '
I'd like some feedback to make sure I'm not being too aggressive in my plan
for changes here.
Of course, another solution that involves fewer changes is just do exactly
what Malcolm Howe suggested.
Thanks in advance,
Alex Harvey
--
You received this message because you are subscribed to the Google Groups
"Puppet Developers" group.
To view this discussion on the web visit
https://groups.google.com/d/msg/puppet-dev/-/Zj0P4fHpEUMJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/puppet-dev?hl=en.