class Net::SSH::Test::Script

  1. lib/net/ssh/test/script.rb
Parent: Test

Represents a sequence of scripted events that identify the behavior that a test expects. Methods named "sends_*" create events for packets being sent from the local to the remote host, and methods named "gets_*" create events for packets being received by the local from the remote host.

A reference to a script. is generally obtained in a unit test via the Net::SSH::Test#story helper method:

story do |script|
  channel = script.opens_channel
  ...
end

Attributes

events [R]

The list of scripted events. These will be Net::SSH::Test::LocalPacket and Net::SSH::Test::RemotePacket instances.

Public Class methods

new ()

Create a new, empty script.

[show source]
# File lib/net/ssh/test/script.rb, line 25
def initialize
  @events = []
end

Public Instance methods

gets (type, *args)

A convenience method for adding an arbitrary remote packet to the events list.

[show source]
# File lib/net/ssh/test/script.rb, line 56
def gets(type, *args)
  events << RemotePacket.new(type, *args)
end
gets_channel_close (channel)

Scripts the reception of a channel close packet from the remote host by the given Net::SSH::Test::Channel channel. This will typically be called via Net::SSH::Test::Channel#gets_close.

[show source]
# File lib/net/ssh/test/script.rb, line 140
def gets_channel_close(channel)
  events << RemotePacket.new(:channel_close, channel.local_id)
end
gets_channel_data (channel, data)

Scripts the reception of a channel data packet from the remote host by the given Net::SSH::Test::Channel channel. This will typically be called via Net::SSH::Test::Channel#gets_data.

[show source]
# File lib/net/ssh/test/script.rb, line 110
def gets_channel_data(channel, data)
  events << RemotePacket.new(:channel_data, channel.local_id, data)
end
gets_channel_eof (channel)

Scripts the reception of a channel EOF packet from the remote host by the given Net::SSH::Test::Channel channel. This will typically be called via Net::SSH::Test::Channel#gets_eof.

[show source]
# File lib/net/ssh/test/script.rb, line 133
def gets_channel_eof(channel)
  events << RemotePacket.new(:channel_eof, channel.local_id)
end
gets_channel_extended_data (channel, data)

Scripts the reception of a channel extended data packet from the remote host by the given Net::SSH::Test::Channel channel. This will typically be called via Net::SSH::Test::Channel#gets_extended_data.

Currently the only extended data type is stderr == 1.

[show source]
# File lib/net/ssh/test/script.rb, line 119
def gets_channel_extended_data(channel, data)
  events << RemotePacket.new(:channel_extended_data, channel.local_id, 1, data)
end
gets_channel_request (channel, request, reply, data)

Scripts the reception of a channel request packet from the remote host by the given Net::SSH::Test::Channel channel. This will typically be called via Net::SSH::Test::Channel#gets_exit_status.

[show source]
# File lib/net/ssh/test/script.rb, line 126
def gets_channel_request(channel, request, reply, data)
  events << RemotePacket.new(:channel_request, channel.local_id, request, reply, data)
end
next (mode=:shift)

By default, removes the next event in the list and returns it. However, this can also be used to non-destructively peek at the next event in the list, by passing :first as the argument.

# remove the next event and return it
event = script.next
# peek at the next event
event = script.next(:first)
[show source]
# File lib/net/ssh/test/script.rb, line 153
def next(mode=:shift)
  events.send(mode)
end
opens_channel (confirm=true)

Scripts the opening of a channel by adding a local packet sending the channel open request, and if confirm is true (the default), also adding a remote packet confirming the new channel.

A new Net::SSH::Test::Channel instance is returned, which can be used to script additional channel operations.

[show source]
# File lib/net/ssh/test/script.rb, line 35
def opens_channel(confirm=true)
  channel = Channel.new(self)
  channel.remote_id = 5555

  events << LocalPacket.new(:channel_open) { |p| channel.local_id = p[:remote_id] }

  if confirm
    events << RemotePacket.new(:channel_open_confirmation, channel.local_id, channel.remote_id, 0x20000, 0x10000)
  end

  channel
end
process (packet)

Compare the given packet against the next event in the list. If there is no next event, an exception will be raised. This is called by Net::SSH::Test::Extensions::PacketStream#test_enqueue_packet.

[show source]
# File lib/net/ssh/test/script.rb, line 160
def process(packet)
  event = events.shift or raise "end of script reached, but got a packet type #{packet.read_byte}"
  event.process(packet)
end
sends (type, *args, &block)

A convenience method for adding an arbitrary local packet to the events list.

[show source]
# File lib/net/ssh/test/script.rb, line 50
def sends(type, *args, &block)
  events << LocalPacket.new(type, *args, &block)
end
sends_channel_close (channel)

Scripts the sending of a channel close packet from the given Net::SSH::Test::Channel channel. This will typically be called via Net::SSH::Test::Channel#sends_close.

[show source]
# File lib/net/ssh/test/script.rb, line 103
def sends_channel_close(channel)
  events << LocalPacket.new(:channel_close, channel.remote_id)
end
sends_channel_data (channel, data)

Scripts the sending of a channel data packet. channel must be a Net::SSH::Test::Channel object, and data is the (string) data to expect will be sent.

This will typically be called via Net::SSH::Test::Channel#sends_data.

[show source]
# File lib/net/ssh/test/script.rb, line 89
def sends_channel_data(channel, data)
  events << LocalPacket.new(:channel_data, channel.remote_id, data)
end
sends_channel_eof (channel)

Scripts the sending of a channel EOF packet from the given Net::SSH::Test::Channel channel. This will typically be called via Net::SSH::Test::Channel#sends_eof.

[show source]
# File lib/net/ssh/test/script.rb, line 96
def sends_channel_eof(channel)
  events << LocalPacket.new(:channel_eof, channel.remote_id)
end
sends_channel_request (channel, request, reply, data, success=true)

Scripts the sending of a new channel request packet to the remote host. channel should be an instance of Net::SSH::Test::Channel. request is a string naming the request type to send, reply is a boolean indicating whether a response to this packet is required , and data is any additional request-specific data that this packet should send. success indicates whether the response (if one is required) should be success or failure.

If a reply is desired, a remote packet will also be queued, :channel_success if success is true, or :channel_failure if success is false.

This will typically be called via Net::SSH::Test::Channel#sends_exec or Net::SSH::Test::Channel#sends_subsystem.

[show source]
# File lib/net/ssh/test/script.rb, line 73
def sends_channel_request(channel, request, reply, data, success=true)
  events << LocalPacket.new(:channel_request, channel.remote_id, request, reply, data)
  if reply
    if success
      events << RemotePacket.new(:channel_success, channel.local_id)
    else
      events << RemotePacket.new(:channel_failure, channel.local_id)
    end
  end
end