rspec-system 1.2.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,6 +3,7 @@ require 'rspec'
3
3
  # Root module namespace for +rspec-system+
4
4
  module RSpecSystem; end
5
5
 
6
+ require 'rspec-system/util'
6
7
  require 'rspec-system/log'
7
8
  require 'rspec-system/helpers'
8
9
  require 'rspec-system/node_set'
@@ -6,6 +6,7 @@ module RSpecSystem
6
6
  # A NodeSet implementation for Vagrant.
7
7
  class NodeSet::Vagrant < RSpecSystem::NodeSet::Base
8
8
  include RSpecSystem::Log
9
+ include RSpecSystem::Util
9
10
 
10
11
  ENV_TYPE = 'vagrant'
11
12
 
@@ -68,7 +69,7 @@ module RSpecSystem
68
69
  ssh_channels = RSpec.configuration.ssh_channels
69
70
  puts "-----------------"
70
71
  puts "#{dest}$ #{cmd}"
71
- result = ssh_exec!(ssh_channels[dest], "cd /tmp && sudo sh -c '#{cmd}'")
72
+ result = ssh_exec!(ssh_channels[dest], "cd /tmp && sudo sh -c #{shellescape(cmd)}")
72
73
  puts "-----------------"
73
74
  result
74
75
  end
@@ -122,7 +123,7 @@ module RSpecSystem
122
123
  log.info "[Vagrant#create_vagrantfile] Creating vagrant file here: #{@vagrant_path}"
123
124
  FileUtils.mkdir_p(@vagrant_path)
124
125
  File.open(File.expand_path(File.join(@vagrant_path, "Vagrantfile")), 'w') do |f|
125
- f.write('Vagrant::Config.run do |c|')
126
+ f.write("Vagrant::Config.run do |c|\n")
126
127
  nodes.each do |k,v|
127
128
  log.debug "Filling in content for #{k}"
128
129
 
@@ -0,0 +1,26 @@
1
+ # A set of utilities that can be used as a mixin.
2
+ module RSpecSystem::Util
3
+ # This is the shellescape method from shellwords from ruby-2.0.0
4
+ #
5
+ # @param str [String] string to escape
6
+ # @return [String] returns escaped string
7
+ def shellescape(str)
8
+ str = str.to_s
9
+
10
+ # An empty argument will be skipped, so return empty quotes.
11
+ return "''" if str.empty?
12
+
13
+ str = str.dup
14
+
15
+ # Treat multibyte characters as is. It is caller's responsibility
16
+ # to encode the string in the right encoding for the shell
17
+ # environment.
18
+ str.gsub!(/([^A-Za-z0-9_\-.,:\/@\n])/, "\\\\\\1")
19
+
20
+ # A LF cannot be escaped with a backslash because a backslash + LF
21
+ # combo is regarded as line continuation and simply ignored.
22
+ str.gsub!(/\n/, "'\n'")
23
+
24
+ return str
25
+ end
26
+ end
@@ -2,7 +2,7 @@
2
2
  Gem::Specification.new do |s|
3
3
  # Metadata
4
4
  s.name = "rspec-system"
5
- s.version = "1.2.0"
5
+ s.version = "1.2.1"
6
6
  s.authors = ["Ken Barber"]
7
7
  s.email = ["ken@bob.sh"]
8
8
  s.homepage = "https://github.com/puppetlabs/rspec-system"
@@ -17,13 +17,13 @@ describe "system_run:" do
17
17
 
18
18
  it 'piping should be preserved' do
19
19
  system_run('rm -f /tmp/foo')
20
- system_run('echo "foo" > /tmp/foo') do |r|
20
+ system_run('echo "foo bar baz" > /tmp/foo') do |r|
21
21
  r.stderr.should == ''
22
22
  r.exit_code.should == 0
23
23
  end
24
24
 
25
25
  system_run('cat /tmp/foo') do |r|
26
- r.stdout.should =~ /foo/
26
+ r.stdout.should =~ /foo bar baz/
27
27
  r.exit_code.should == 0
28
28
  end
29
29
  system_run('rm -f /tmp/foo')
@@ -31,15 +31,40 @@ describe "system_run:" do
31
31
 
32
32
  it 'escape single quotes properly' do
33
33
  system_run('rm -f /tmp/foo')
34
- system_run("echo 'foo' > /tmp/foo") do |r|
34
+ system_run("echo 'foo bar baz' > /tmp/foo") do |r|
35
35
  r.stderr.should == ''
36
36
  r.exit_code.should == 0
37
37
  end
38
38
 
39
39
  system_run('cat /tmp/foo') do |r|
40
- r.stdout.should =~ /foo/
40
+ r.stdout.should =~ /foo bar baz/
41
41
  r.exit_code.should == 0
42
42
  end
43
43
  system_run('rm -f /tmp/foo')
44
44
  end
45
+
46
+ it 'escape all quotes properly' do
47
+ system_run('rm -f ~vagrant/foo')
48
+ system_run("su - vagrant -c 'echo \"foo bar baz\" > ~/foo'") do |r|
49
+ r.stderr.should == ''
50
+ r.exit_code.should == 0
51
+ end
52
+
53
+ system_run('cat ~vagrant/foo') do |r|
54
+ r.stdout.should =~ /foo bar baz/
55
+ r.exit_code.should == 0
56
+ end
57
+ system_run('rm -f ~vagrant/foo')
58
+ end
59
+
60
+ it 'a string of commands should succeed' do
61
+ r = system_run(<<-EOS.gsub(/^ {6}/, ''))
62
+ rm /tmp/foo
63
+ echo 'foo bar baz' > /tmp/foo
64
+ cat /tmp/foo
65
+ rm /tmp/foo
66
+ EOS
67
+ r.stdout.should =~ /foo bar baz/
68
+ r.exit_code.should == 0
69
+ end
45
70
  end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+ require 'rspec-system/util'
3
+
4
+ describe RSpecSystem::Util do
5
+ let(:cls) do
6
+ cls = Object.new
7
+ cls.extend(RSpecSystem::Util)
8
+ end
9
+
10
+ describe '#shellescape' do
11
+ it 'should escape strings' do
12
+ cls.shellescape('echo "foo" > /tmp/baz').should == 'echo\ \\"foo\\"\ \>\ /tmp/baz'
13
+ end
14
+ end
15
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-system
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-22 00:00:00.000000000 Z
12
+ date: 2013-05-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -144,6 +144,7 @@ files:
144
144
  - lib/rspec-system/rake_task.rb
145
145
  - lib/rspec-system/result.rb
146
146
  - lib/rspec-system/spec_helper.rb
147
+ - lib/rspec-system/util.rb
147
148
  - resources/kwalify-schemas/nodeset_schema.yml
148
149
  - resources/kwalify-schemas/prefabs_schema.yml
149
150
  - resources/prefabs.yml
@@ -158,6 +159,7 @@ files:
158
159
  - spec/unit/kwalify-schemas/nodeset_schema_spec.rb
159
160
  - spec/unit/kwalify-schemas/prefabs_schema_spec.rb
160
161
  - spec/unit/result_spec.rb
162
+ - spec/unit/utils_spec.rb
161
163
  homepage: https://github.com/puppetlabs/rspec-system
162
164
  licenses: []
163
165
  post_install_message:
@@ -189,3 +191,4 @@ test_files:
189
191
  - spec/unit/kwalify-schemas/nodeset_schema_spec.rb
190
192
  - spec/unit/kwalify-schemas/prefabs_schema_spec.rb
191
193
  - spec/unit/result_spec.rb
194
+ - spec/unit/utils_spec.rb