summaryrefslogtreecommitdiff
path: root/spec/spec_helper.rb
blob: 5f5491eed12a2015e784f3f54cf81b454b497bdf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
require "rspec"
require "rspec/collection_matchers"

# require 'pry-debugger'
# require 'pry-stack_explorer'

$:.unshift(File.expand_path("../..", __FILE__))
$:.unshift(File.dirname(__FILE__) + "/../lib")

require "spec/support/platform_helpers"
require "spec/support/integration_helper"
require "wmi-lite"
require "ohai"
Ohai.config[:log_level] = :error

PLUGIN_PATH = File.expand_path("../../lib/ohai/plugins", __FILE__)
SPEC_PLUGIN_PATH = File.expand_path("../data/plugins", __FILE__)

RSpec.configure do |config|
  config.before(:each) { @object_pristine = Object.clone }
  config.after(:each) { remove_constants }
end

include Ohai::Mixin::ConstantHelper

if Ohai::Mixin::OS.collect_os == /mswin|mingw32|windows/
  ENV["PATH"] = ""
end

def get_plugin(plugin, ohai = Ohai::System.new, path = PLUGIN_PATH)
  loader = Ohai::Loader.new(ohai)
  loader.load_plugin(File.join(path, "#{plugin}.rb"))
end

def convert_windows_output(stdout)
  stdout.gsub("\n", "\r\n")
end

def it_should_check_from(plugin, attribute, from, value)
  it "should set the #{attribute} to the value from '#{from}'" do
    @plugin.run
    expect(@plugin[attribute]).to eq(value)
  end
end

def it_should_check_from_mash(plugin, attribute, from, value)
  it "should get the #{plugin}[:#{attribute}] value from '#{from}'" do
    expect(@plugin).to receive(:shell_out).with(from).and_return(mock_shell_out(value[0], value[1], value[2]))
    @plugin.run
  end

  it "should set the #{plugin}[:#{attribute}] to the value from '#{from}'" do
    @plugin.run
    expect(@plugin[plugin][attribute]).to eq(value[1].split($/)[0])
  end
end

def mock_shell_out(exitstatus, stdout, stderr)
  shell_out = double("mixlib_shell_out")
  allow(shell_out).to receive(:exitstatus).and_return(exitstatus)
  allow(shell_out).to receive(:stdout).and_return(stdout)
  allow(shell_out).to receive(:stderr).and_return(stderr)
  shell_out
end

# the mash variable may be an array listing multiple levels of Mash hierarchy
def it_should_check_from_deep_mash(plugin, mash, attribute, from, value)
  it "should get the #{mash.inspect}[:#{attribute}] value from '#{from}'" do
    expect(@plugin).to receive(:shell_out).with(from).and_return(mock_shell_out(value[0], value[1], value[2]))
    @plugin.run
  end

  it "should set the #{mash.inspect}[:#{attribute}] to the value from '#{from}'" do
    @plugin.run
    value = value[1].split($/)[0]
    if mash.is_a?(String)
      expect(@plugin[mash][attribute]).to eq(value)
    elsif mash.is_a?(Array)
      if mash.length == 2
        expect(@plugin[mash[0]][mash[1]][attribute]).to eq value
      elsif mash.length == 3
        expect(@plugin[mash[0]][mash[1]][mash[2]][attribute]).to eq value
      else
        return nil
      end
    else
      return nil
    end
  end
end

RSpec.configure do |config|

  # Not worth addressing warnings in Ohai until upstream ones in ffi-yajl are
  # fixed.
  # config.warnings = true

  config.raise_errors_for_deprecations!

  # `expect` should be preferred for new tests or when refactoring old tests,
  # but we're not going to do a "big bang" change at this time.
  config.expect_with :rspec do |c|
    c.syntax = :expect
  end
  config.mock_with :rspec do |c|
    c.syntax = :expect
  end

  config.filter_run :focus => true

  config.filter_run_excluding :windows_only => true unless windows?
  config.filter_run_excluding :unix_only => true unless unix?
  config.filter_run_excluding :ruby_18_only => true unless ruby_18?
  config.filter_run_excluding :ruby_19_only => true unless ruby_19?
  config.filter_run_excluding :requires_root => true unless ENV["USER"] == "root"
  config.filter_run_excluding :requires_unprivileged_user => true if ENV["USER"] == "root"

  config.run_all_when_everything_filtered = true

  config.before :each do
    # TODO: Change to Ohai.config once Ohai::Config is deprecated fully. Needs
    # to stay Ohai::Config for now so that top-level attributes will get cleared
    # out between tests (config_spec should be the only place where top-level
    # config attributes are set).
    Ohai::Config.reset
  end
end