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.

Reply via email to