lib/cucumber/chef/steps/ssh_steps.rb in cucumber-chef-2.0.3.pre vs lib/cucumber/chef/steps/ssh_steps.rb in cucumber-chef-2.0.3

- old
+ new

@@ -92,37 +92,90 @@ else @output.should_not =~ /#{$servers[name][key.downcase.to_sym]}/i end end -Then /^path "([^\"]*)" should exist$/ do |dir| - parent = File.dirname dir - child = File.basename dir +Then /^(path|directory|file|symlink) "([^\"]*)" should exist$/ do |type, path| + parent = File.dirname path + child = File.basename path command = "ls %s" % [ parent ] @output = @connection.exec!(command) @output.should =~ /#{child}/ + +# if a specific type (directory|file) was specified, test for it + command = "stat -c %%F %s" % [ + path + ] + @output = @connection.exec!(command) + types = { + "file" => /regular file/, + "directory" => /directory/, + "symlink" => /symbolic link/ + } + + if types.keys.include? type + @output.should =~ types[type] + end +# if type == "file" +# @output.should =~ /regular file/ +# end +# if type == "directory" +# @output.should =~ /directory/ +# end +# if type == "symlink" +# @output.should =~ /symbolic link/ +# end end -Then /^path "([^\"]*)" should be owned by "([^\"]*)"$/ do |path, owner| +Then /^(?:path|directory|file) "([^\"]*)" should be owned by "([^\"]*)"$/ do |path, owner| command = "stat -c %%U:%%G %s" % [ path ] @output = @connection.exec!(command) @output.should =~ /#{owner}/ end -Then /^file "([^\"]*)" should( not)? contain "([^\"]*)"$/ do |path, boolean, content| +# we can now match multi-line strings. We want to match *contiguous lines* +Then /^file "([^\"]*)" should( not)? contain/ do |path, boolean, content| command = "cat %s" % [ path ] - @output = @connection.exec!(command) + +# turn the command-line output and the expectation string into Arrays and strip +# leading and trailing cruft from members + @output = @connection.exec!(command).split("\n").map{ |i| i.strip } + content = content.split("\n").map{ |i| i.strip } + +# assume no match + match = false + count = 0 + +# step through the command output array + while count < @output.length + current = @output[count] + +# if we get a match with the start of the expectation + if @output[count] == content[0] + +# take a slice of the same size as that expectation + slice = @output[count..count + content.length - 1] + +# and see if they match + if content == slice + match = true + end + end + count += 1 + end + +# there's a neater way to express this logic, but it's 17:30 and I'm going home if (!boolean) - @output.should =~ /#{content}/ + match.should == true else - @output.should_not =~ /#{content}/ + match.should == false end end Then /^package "([^\"]*)" should be installed$/ do |package| command = "" @@ -133,6 +186,28 @@ # could easily add more cases here, if I knew what they were :) end @output = @connection.exec!(command) @output.should =~ /#{package}/ +end + +# This regex is a little ugly, but it's so we can accept any of these +# +# * "foo" is running +# * service "foo" is running +# * application "foo" is running +# * process "foo" is running +# +# basically because I couldn't decide what they should be called. Maybe there's +# an Official Cucumber-chef Opinion on this. Still, Rubular is fun :) + +# TiL that in Ruby regexes, "?:" marks a non-capturing group, which is how this +# works +Then /^(?:(?:service|application|process)? )?"([^\"]*)" should( not)? be running$/ do |service, boolean| + command = "ps ax" + @output = @connection.exec!(command) + if (!boolean) + @output.should =~ /#{service}/ + else + @output.should_not =~ /#{service}/ + end end