Class: Net::SSH::Test::Script

Inherits:
Object
  • Object
show all
Defined in:
lib/net/ssh/test/script.rb

Overview

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeScript

Create a new, empty script.


25
26
27
# File 'lib/net/ssh/test/script.rb', line 25

def initialize
  @events = []
end

Instance Attribute Details

#eventsObject (readonly)

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


22
23
24
# File 'lib/net/ssh/test/script.rb', line 22

def events
  @events
end

Instance Method Details

#gets(type, *args) ⇒ Object

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


56
57
58
# File 'lib/net/ssh/test/script.rb', line 56

def gets(type, *args)
  events << RemotePacket.new(type, *args)
end

#gets_channel_close(channel) ⇒ Object

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.


140
141
142
# 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) ⇒ Object

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.


110
111
112
# 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) ⇒ Object

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.


133
134
135
# 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) ⇒ Object

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.


119
120
121
# 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) ⇒ Object

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.


126
127
128
# 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) ⇒ Object

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)

153
154
155
# File 'lib/net/ssh/test/script.rb', line 153

def next(mode=:shift)
  events.send(mode)
end

#opens_channel(confirm = true) ⇒ Object

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.


35
36
37
38
39
40
41
42
43
44
45
46
# 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) ⇒ Object

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.


160
161
162
163
# 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) ⇒ Object

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


50
51
52
# 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) ⇒ Object

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.


103
104
105
# 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) ⇒ Object

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.


89
90
91
# 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) ⇒ Object

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.


96
97
98
# 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) ⇒ Object

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.


73
74
75
76
77
78
79
80
81
82
# 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