Module: CorePluginFunctionalHelper

Includes:
CorePluginBaseHelper, FunctionalHelper
Defined in:
lib/plugins/shared/core_plugin_test_helper.rb

Constant Summary collapse

TRAIN_CONNECTION =
Train.create("local", command_runner: :generic).connection

Instance Method Summary collapse

Instance Method Details

#__find_plugin_path_from_caller(frames_back = 2) ⇒ Object



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/plugins/shared/core_plugin_test_helper.rb', line 109

def __find_plugin_path_from_caller(frames_back = 2)
  caller_path = Pathname.new(caller_locations(frames_back, 1).first.absolute_path)
  # Typical caller path:
  # /Users/cwolfe/sandbox/inspec-resource-lister/test/functional/inspec_resource_lister_test.rb
  # We want:
  # /Users/cwolfe/sandbox/inspec-resource-lister/lib/inspec-resource-lister.rb
  cursor = caller_path
  until cursor.basename.to_s == "test" && cursor.parent.basename.to_s =~ /^(inspec|train)-/
    cursor = cursor.parent
    break if cursor.nil?
  end
  raise "Could not comprehend plugin project directory structure" if cursor.nil?

  project_dir = cursor.parent
  plugin_name = project_dir.basename
  entry_point = File.join(project_dir.to_s, "lib", plugin_name.to_s + ".rb")
  raise "Could not find plugin entry point" unless File.exist?(entry_point)

  entry_point
end

#__make_empty_plugin_file_data_structureObject



142
143
144
145
146
147
148
# File 'lib/plugins/shared/core_plugin_test_helper.rb', line 142

def __make_empty_plugin_file_data_structure
  # TODO: dry this up, refs #3350
  {
    "plugins_config_version" => "1.0.0",
    "plugins" => [],
  }
end

#__make_plugin_file_data_structure_with_path(path) ⇒ Object



130
131
132
133
134
135
136
137
138
139
140
# File 'lib/plugins/shared/core_plugin_test_helper.rb', line 130

def __make_plugin_file_data_structure_with_path(path)
  # TODO: dry this up, refs #3350
  plugin_name = File.basename(path, ".rb")
  data = __make_empty_plugin_file_data_structure
  data["plugins"] << {
    "name" => plugin_name,
    "installation_type" => "path",
    "installation_path" => path,
  }
  data
end

#run_inspec_process(command_line, opts = {}) ⇒ Object

TODO: remove me! it’s in test/functional/helper.rb



58
59
60
61
62
63
64
65
66
67
# File 'lib/plugins/shared/core_plugin_test_helper.rb', line 58

def run_inspec_process(command_line, opts = {})
  prefix = ""
  if opts.key?(:prefix)
    prefix = opts[:prefix]
  elsif opts.key?(:env)
    prefix = assemble_env_prefix opts[:env]
  end

  TRAIN_CONNECTION.run_command("#{prefix} #{exec_inspec} #{command_line}")
end

#run_inspec_process_with_this_plugin(command_line, opts = {}) ⇒ Object

This helper does some fancy footwork to make InSpec think a plugin under development is temporarily installed.



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
# File 'lib/plugins/shared/core_plugin_test_helper.rb', line 79

def run_inspec_process_with_this_plugin(command_line, opts = {})
  plugin_path = __find_plugin_path_from_caller

  # If it looks like it is a core plugin under test, don't add it to the plugin file
  # since the loader will auto-load it anyway
  if plugin_path.include?("lib/plugins/inspec-")
    plugin_file_data = __make_empty_plugin_file_data_structure
  else
    plugin_file_data = __make_plugin_file_data_structure_with_path(plugin_path)
  end

  Dir.mktmpdir do |tmp_dir|
    opts[:pre_run]&.call(plugin_file_data, tmp_dir)
    plugin_file_path = File.join(tmp_dir, "plugins.json")
    # HACK: If the block cleared the hash, take that to mean it will provide a plugins.json file of its own.
    File.write(plugin_file_path, JSON.generate(plugin_file_data)) unless plugin_file_data.empty?
    opts[:env] ||= {}
    opts[:env]["INSPEC_CONFIG_DIR"] = tmp_dir
    run_result = run_inspec_process(command_line, opts)

    # Read the resulting plugins.json into memory, if any
    if File.exist?(plugin_file_path)
      @plugin_data = JSON.parse(File.read(plugin_file_path))
    end

    opts[:post_run]&.call(run_result, tmp_dir)
    run_result
  end
end