Class: Net::SSH::Test::Channel

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

Overview

A mock channel, used for scripting actions in tests. It wraps a Net::SSH::Test::Script instance, and delegates to it for the most part. This class has little real functionality on its own, but rather acts as a convenience for scripting channel-related activity for later comparison in a unit test.

story do |session|
  channel = session.opens_channel
  channel.sends_exec "ls"
  channel.gets_data "result of ls"
  channel.gets_close
  channel.sends_close
end

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(script) ⇒ Channel

Creates a new Test::Channel instance on top of the given script (which must be a Net::SSH::Test::Script instance).



28
29
30
31
# File 'lib/net/ssh/test/channel.rb', line 28

def initialize(script)
  @script = script
  @local_id = @remote_id = nil
end

Instance Attribute Details

#local_idObject

Returns the local (client-assigned) id for this channel, or a Proc object that will return the local-id later if the local id has not yet been set. (See Net::SSH::Test::Packet#instantiate!.)



36
37
38
# File 'lib/net/ssh/test/channel.rb', line 36

def local_id
  @local_id || Proc.new { @local_id or raise "local-id has not been set yet!" }
end

#remote_idObject

Returns the remote (server-assigned) id for this channel, or a Proc object that will return the remote-id later if the remote id has not yet been set. (See Net::SSH::Test::Packet#instantiate!.)



43
44
45
# File 'lib/net/ssh/test/channel.rb', line 43

def remote_id
  @remote_id || Proc.new { @remote_id or raise "remote-id has not been set yet!" }
end

#scriptObject (readonly)

The Net::SSH::Test::Script instance employed by this mock channel.



18
19
20
# File 'lib/net/ssh/test/channel.rb', line 18

def script
  @script
end

Instance Method Details

#gets_closeObject

Scripts the reception of a “channel close” packet from the remote end.

channel.gets_close


124
125
126
# File 'lib/net/ssh/test/channel.rb', line 124

def gets_close
  script.gets_channel_close(self)
end

#gets_data(data) ⇒ Object

Scripts the reception of a channel data packet from the remote end.

channel.gets_data "bar"


103
104
105
# File 'lib/net/ssh/test/channel.rb', line 103

def gets_data(data)
  script.gets_channel_data(self, data)
end

#gets_eofObject

Scripts the reception of an EOF packet from the remote end.

channel.gets_eof


117
118
119
# File 'lib/net/ssh/test/channel.rb', line 117

def gets_eof
  script.gets_channel_eof(self)
end

#gets_exit_status(status = 0) ⇒ Object

Scripts the reception of an “exit-status” channel request packet.

channel.gets_exit_status(127)


110
111
112
# File 'lib/net/ssh/test/channel.rb', line 110

def gets_exit_status(status=0)
  script.gets_channel_request(self, "exit-status", false, status)
end

#inject_remote_delay!Object

Because adjacent calls to #gets_data will sometimes cause the data packets to be concatenated (causing expectations in tests to fail), you may need to separate those calls with calls to #inject_remote_delay! (which essentially just mimics receiving an empty data packet):

channel.gets_data "abcdefg"
channel.inject_remote_delay!
channel.gets_data "hijklmn"


55
56
57
# File 'lib/net/ssh/test/channel.rb', line 55

def inject_remote_delay!
  gets_data("")
end

#sends_closeObject

Scripts the sending of a “channel close” packet across the channel.

channel.sends_close


96
97
98
# File 'lib/net/ssh/test/channel.rb', line 96

def sends_close
  script.sends_channel_close(self)
end

#sends_data(data) ⇒ Object

Scripts the sending of a data packet across the channel.

channel.sends_data "foo"


82
83
84
# File 'lib/net/ssh/test/channel.rb', line 82

def sends_data(data)
  script.sends_channel_data(self, data)
end

#sends_eofObject

Scripts the sending of an EOF packet across the channel.

channel.sends_eof


89
90
91
# File 'lib/net/ssh/test/channel.rb', line 89

def sends_eof
  script.sends_channel_eof(self)
end

#sends_exec(command, reply = true, success = true) ⇒ Object

Scripts the sending of an “exec” channel request packet to the mock server. If reply is true, then the server is expected to reply to the request, otherwise no response to this request will be sent. If success is true, then the request will be successful, otherwise a failure will be scripted.

channel.sends_exec "ls -l"


66
67
68
# File 'lib/net/ssh/test/channel.rb', line 66

def sends_exec(command, reply=true, success=true)
  script.sends_channel_request(self, "exec", reply, command, success)
end

#sends_subsystem(subsystem, reply = true, success = true) ⇒ Object

Scripts the sending of a “subsystem” channel request packet to the mock server. See #sends_exec for a discussion of the meaning of the reply and success arguments.

channel.sends_subsystem "sftp"


75
76
77
# File 'lib/net/ssh/test/channel.rb', line 75

def sends_subsystem(subsystem, reply=true, success=true)
  script.sends_channel_request(self, "subsystem", reply, subsystem, success)
end