Class: Net::SSH::Test::Script
- Inherits:
-
Object
- Object
- Net::SSH::Test::Script
- 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
-
#events ⇒ Object
readonly
The list of scripted events.
Instance Method Summary collapse
-
#gets(type, *args) ⇒ Object
A convenience method for adding an arbitrary remote packet to the events list.
-
#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
. -
#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
. -
#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
. -
#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
. -
#initialize ⇒ Script
constructor
Create a new, empty script.
-
#next(mode = :shift) ⇒ Object
By default, removes the next event in the list and returns it.
-
#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. -
#process(packet) ⇒ Object
Compare the given packet against the next event in the list.
-
#sends(type, *args, &block) ⇒ Object
A convenience method for adding an arbitrary local packet to the events list.
-
#sends_channel_close(channel) ⇒ Object
Scripts the sending of a channel close packet from the given Net::SSH::Test::Channel
channel
. -
#sends_channel_data(channel, data) ⇒ Object
Scripts the sending of a channel data packet.
-
#sends_channel_eof(channel) ⇒ Object
Scripts the sending of a channel EOF packet from the given Net::SSH::Test::Channel
channel
. -
#sends_channel_request(channel, request, reply, data, success = true) ⇒ Object
Scripts the sending of a new channel request packet to the remote host.
Constructor Details
#initialize ⇒ Script
Create a new, empty script.
25 26 27 |
# File 'lib/net/ssh/test/script.rb', line 25 def initialize @events = [] end |
Instance Attribute Details
#events ⇒ Object (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.
131 132 133 |
# File 'lib/net/ssh/test/script.rb', line 131 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.
124 125 126 |
# File 'lib/net/ssh/test/script.rb', line 124 def gets_channel_eof(channel) events << RemotePacket.new(:channel_eof, channel.local_id) 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.
117 118 119 |
# File 'lib/net/ssh/test/script.rb', line 117 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)
144 145 146 |
# File 'lib/net/ssh/test/script.rb', line 144 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.
151 152 153 154 |
# File 'lib/net/ssh/test/script.rb', line 151 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 |