#! /usr/bin/env ruby

require 'spec_helper'
require 'facter/util/uptime'

describe "system_uptime:" do
  before { Facter.clear }
  after { Facter.clear }

  describe "When uptime information is available" do
    describe "uptime" do
      test_cases = [
        [60 * 60 * 24 * 3,      '3 days'],
        [60 * 60 * 24 * 3 + 25, '3 days'],
        [60 * 60 * 24 * 1,      '1 day'],
        [60 * 60 * 24 * 1 + 25, '1 day'],
        [60 * (60 * 3 + 45),    '3:45 hours'],
        [60 * (60 * 3 + 4),     '3:04 hours'],
        [60 * 60,               '1:00 hours'],
        [60 * 35,               '0:35 hours']
      ]

      test_cases.each do |seconds, expected|
        it "should return #{expected.inspect} for #{seconds} seconds in Linux" do
          Facter.fact(:kernel).stubs(:value).returns("linux")
          Facter::Util::Uptime.stubs(:get_uptime_seconds_unix).returns(seconds)
          Facter.fact(:system_uptime).value['uptime'].should eq expected
        end

        it "should return #{expected.inspect} for #{seconds} seconds in Windows" do
          Facter.fact(:kernel).stubs(:value).returns("windows")
          Facter::Util::Uptime.stubs(:get_uptime_seconds_win).returns(seconds)
          Facter.fact(:system_uptime).value['uptime'].should eq expected
        end
      end
    end
  end

  describe "when uptime information is available" do
    before do
      Facter::Util::Uptime.stubs(:get_uptime_seconds_unix).returns(60 * 60 * 24 + 23)
      Facter::Util::Uptime.stubs(:get_uptime_seconds_win).returns(60 * 60 * 24 + 23)
    end

    it "should include a key for seconds" do
      Facter.fact(:system_uptime).value['seconds'].should eq 60 * 60 * 24 + 23
    end

     it "should include a key for hours" do
      Facter.fact(:system_uptime).value['hours'].should eq 24
    end

    it "should include a key for days" do
      Facter.fact(:system_uptime).value['days'].should eq 1
    end
  end

  describe "when uptime information is not available" do
    before do
      Facter::Util::Uptime.stubs(:get_uptime_seconds_unix).returns(nil)
      Facter::Util::Uptime.stubs(:get_uptime_seconds_win).returns(nil)
    end

    it "should have an 'uptime' key with value 'unknown'" do
      Facter.fact(:system_uptime).value['uptime'].should eq "unknown"
    end

    it "should have a 'seconds' key with value nil" do
      Facter.fact(:system_uptime).value['seconds'].should eq nil
    end

    it "should have a 'hours' key with value nil" do
      Facter.fact(:system_uptime).value['hours'].should eq nil
    end

    it "should have a 'days' key with value nil" do
      Facter.fact(:system_uptime).value['days'].should eq nil
    end
  end
end