vaguerent/test/unit/support/dummy_communicator.rb
phinze 688bca14f5 refactoring ubuntu/debian change_host_name
there's been a lot of churn around this code, so i figure it was worth
trying to clean it up.

 - the methods were doing a lot, so make them into template methods with
   one helper per step
 - spread out /etc/hosts regexp into a couple of helper variables for
   clarity
 - remove handling for broken hostname implementations (like basing all
   of the checks on name.split('.')[0]), since it seems reasonable to
   remove code dedicated only to handling broken boxes
 - DRY up the shared code between debian/ubuntu implementations, which
   clarifies the differences as well
 - add unit tests around the behavior; this will help us in the future
   to separate flaws in our understanding from flaws in implementation
 - includes a new DummyCommunicator in tests which should be useful in
   supporting additional unit testing of this kind
 - manually tested this on squeeze, wheezy, precise, quantal, raring,
   and saucy successfully.

handles the issue in #2333
2013-11-24 11:46:12 -06:00

80 lines
1.9 KiB
Ruby

module VagrantTests
module DummyCommunicator
class Communicator < Vagrant.plugin("2", :communicator)
def ready?
true
end
attr_reader :known_commands
def initialize(machine)
@known_commands = Hash.new do |hash, key|
hash[key] = { expected: 0, received: 0, response: nil }
end
end
def expected_commands
known_commands.select do |command, info|
info[:expected] > 0
end
end
def received_commands
known_commands.select do |command, info|
info[:received] > 0
end.keys
end
def stub_command(command, response)
known_commands[command][:response] = response
end
def expect_command(command)
known_commands[command][:expected] += 1
end
def received_summary
received_commands.map { |cmd| " - #{cmd}" }.unshift('received:').join("\n")
end
def verify_expectations!
expected_commands.each do |command, info|
if info[:expected] != info[:received]
fail([
"expected to receive '#{command}' #{info[:expected]} times",
"got #{info[:received]} times instead",
received_summary
].join("\n"))
end
end
end
def execute(command, opts=nil)
known = known_commands[command]
known[:received] += 1
response = known[:response]
return unless response
if block_given?
[:stdout, :stderr].each do |type|
Array(response[type]).each do |line|
yield type, line
end
end
end
if response[:raise]
raise response[:raise]
end
response[:exit_code]
end
def sudo(command, opts=nil, &block)
execute(command, opts, &block)
end
end
end
end