Module: RSpecSystem::Helpers

Defined in:
lib/rspec-system/helpers.rb,
lib/rspec-system/helpers/rcp.rb,
lib/rspec-system/helpers/shell.rb

Overview

This module contains the main rspec helpers that are to be used within rspec-system tests. These are the meat-and-potatoes of your system tests, and in theory there shouldn't be anything you can't do without the helpers here.

These helpers in particular are core to the framework. You can however combine these helpers to create your own more powerful helpers in rspec if you wish.

The helpers themselves are split into two main groups, Queries:

  • node - queries and returns node information

And Actions:

  • shell - runs a command on a node

  • rcp - remote copies to a node

Examples:

Using node in your tests

describe 'test running' do
  it 'do something if redhat' do
    if node.facts['operatingsystem'] == 'RedHat' do
      shell 'cat /etc/redhat-release'
    end
  end
end

Make your own helper

describe 'my own helper' do
  def install_puppet
    facts = node.facts

    # Grab PL repository and install PL copy of puppet
    if facts['osfamily'] == 'RedHat'
      shell 'rpm -ivh http://yum.puppetlabs.com/el/5/products/i386/puppetlabs-release-5-6.noarch.rpm'
      shell 'yum install -y puppet'
    elsif facts['osfamily'] == 'Debian'
      shell "wget http://apt.puppetlabs.com/puppetlabs-release-#{facts['lsbdistcodename']}.deb"
      shell "dpkg -i puppetlabs-release-#{facts['lsbdistcodename']}.deb"
      shell 'apt-get update'
      shell 'apt-get install -y puppet'
    end
  end

  it 'test installing latest puppet' do
    install_puppet
    shell 'puppet apply --version' do |r|
      r.exit_code.should be_zero
      r.stdout.should =~ /3.1/
      r.stderr.should be_empty
    end
  end
end

Defined Under Namespace

Classes: Rcp, Shell

Actions collapse

Queries collapse

Instance Method Details

#node(options = {}) ⇒ RSpecSystem::Node

Returns a particular node object from the current nodeset given a set of criteria.

If no options are supplied, it tries to return the default node.

Parameters:

  • options (Hash) (defaults to: {})

    search criteria

Options Hash (options):

  • :name (String)

    the canonical name of the node

Returns:


166
167
168
169
170
171
172
173
174
175
176
177
178
179
# File 'lib/rspec-system/helpers.rb', line 166

def node(options = {})
  ns = RSpecSystem::NodeSet.create
  options = {
    :name => ns.default_node.name,
  }.merge(options)

  name = options[:name]

  if name.nil?
    raise "No nodes search specified, and no default"
  else
    return ns.nodes[name]
  end
end

#rcp(options) {|result| ... } ⇒ RSpecSystem::Helpers::Rcp

Remotely copy files to a test host

Just specify a source path, destination path, and optionally a destination node (if the default isn't enough) and go.

The underlying implementation is actually performed by the particular node provider, however this abstraction should mean you shouldn't need to worry about that.

Examples:

Copying a path remotely

describe 'test running' do
  it 'copy my files' do
    rcp :sp => 'mydata', :dp => '/srv/data'.should be_true
  end
end

Parameters:

  • options (Hash)

    options for command execution

Options Hash (options):

  • :source_path (String)

    source to copy files from (currently only locally)

  • :sp (String)

    alias for source_path

  • :destination_path (String)

    destination for copy

  • :dp (String)

    alias for dest_path

  • :destination_node (RSpecSystem::Node) — default: default_node

    destination node to transfer files to. Optional.

  • :d (RSpecSystem::Node)

    alias for destination_node

  • :source_node (RSpecSystem::Node) — default: ''

    Reserved for future use. Patches welcome.

  • :s (RSpecSystem::Node)

    alias for source_node

  • :timeout (Fixnum)

    seconds of time to allow before timing out. Defaults to 0 (no timeout).

Yields:

  • (result)

    yields result when called as a block

Yield Parameters:

Returns:


152
153
154
# File 'lib/rspec-system/helpers.rb', line 152

def rcp(options, &block)
  RSpecSystem::Helpers::Rcp.new(options, self, &block)
end

#shell(options) ⇒ RSpecSystem::Helpers::Shell #shell(command) ⇒ RSpecSystem::Helpers::Shell

Runs a shell command on a test host.

When invoked as a block a result hash is yielded to the block as a parameter. Alternatively the result hash it is returned to the caller.

If you have only provided 1 node in your nodeset, or you have specified a a default you can avoid entering the name of the node if you wish. The method for simplicity can accept a string instead of an options hash and it knows to default everything else.

The underlying implementation is actually performed by the particular node provider, however this abstraction should mean you shouldn't need to worry about that.

Examples:

Using it as a helper

it 'test a command' do
  shell 'cat /etc/hosts' do |r|
    # Test stdout contains 'localhost'
    r.stdout.should =~ /localhost/
    # Test stderr is empty
    r.stderr.should == ''
    # Test exit_code is 0
    r.exit_code.should == 0
  end
end

Running arbitrary commands

it 'run some commands' do
  # Run a command without testing results
  shell 'echo "foobar" > /tmp/foo'

  # Now we try to cat the file, and make sure it worked
  shell 'cat /tmp/foo' do |r|
    r.stdout.should =~ /foobar/
  end
end

Overloads:

  • #shell(options) ⇒ RSpecSystem::Helpers::Shell

    Parameters:

    • options (Hash)

      options for command execution

    Options Hash (options):

    • :command (String)

      command to execute. Mandatory.

    • :c (String)

      alias for :command

    • :node (String, RSpecSystem::Node) — default: defaults to what was defined default in your YAML file, otherwise if there is only one node it uses that

      specifies node to execute command on.

    • :n (String, RSpecSystem::Node)

      alias for :node

    • :timeout (Fixnum)

      seconds of time to allow before timing out. Defaults to 0 (not timeout).

  • #shell(command) ⇒ RSpecSystem::Helpers::Shell

    Parameters:

    • command (String)

      command to execute

Yields:

  • (result)

    yields result when called as a block

Yield Parameters:

Returns:


110
111
112
113
114
115
116
117
118
# File 'lib/rspec-system/helpers.rb', line 110

def shell(options, &block)
  # If options is a string, turn the string into a command in the normal
  # options hash.
  if options.is_a?(String)
    options = {:c => options}
  end

  RSpecSystem::Helpers::Shell.new(options, self, &block)
end