summaryrefslogtreecommitdiff
path: root/features/steps/packages.rb
blob: d0403dd14312c550cd6dc06a456143884637da34 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
def debian_compatible?
  (ohai[:platform] == 'debian') || (ohai[:platform] == "ubuntu")
end

def chef_test_dpkg_installed?
  shell_out("dpkg -l chef-integration-test").status.success?
end

def purge_chef_integration_debs
  if debian_compatible? && chef_test_dpkg_installed?
    shell_out!("dpkg -r chef-integration-test")
    shell_out("dpkg --clear-avail")
  end
end

Given /^I have configured my apt sources for integration tests$/ do
  File.open("/etc/apt/sources.list.d/chef-integration-test.list", "w+") do |f|
    f.puts "deb http://localhost:9000/ sid main"
  end
end

def remove_integration_test_apt_source
  FileUtils.rm("/etc/apt/sources.list.d/chef-integration-test.list")  
rescue Errno::ENOENT
  Chef::Log.info("Attempted to remove integration test from /etc/apt/sources.list.d but it didn't exist")
end

After("@apt") do
  remove_integration_test_apt_source
  purge_chef_integration_debs
  shell_out! "apt-get clean"
end

Before('@dpkg') do
  purge_chef_integration_debs
end

Before('@apt') do
  purge_chef_integration_debs
  shell_out! "apt-get clean"
end

After('@dpkg') do
  purge_chef_integration_debs
end

Given "I am running on a debian compatible OS" do
  unless debian_compatible?
    pending("This test can only run on debian or ubuntu, but you have #{ohai[:platform]}")
  end
end

Given "my dpkg architecture is 'amd64'" do
  unless `dpkg --print-architecture`.strip == "amd64"
    pending("This scenario can only run on an amd64 system")
  end
end

Given "the deb package '$pkg_name' is available" do |pkg_name|
  source = File.expand_path(File.dirname(__FILE__) + "/../data/apt/#{pkg_name}-1_amd64.deb")
  dest = File.join(tmpdir, File.basename(source))
  FileUtils.cp(source, dest)
end

Given "the apt server is running" do
  self.apt_server_thread = Thread.new do
    trap("INT") do
      apt_server.shutdown
      apt_server_thread.join
    end
    
    apt_server.start
  end

  Chef::Log.debug "Waiting for apt server to start"
  until tcp_test_port("localhost", 9000) do
    Chef::Log.debug "."
    sleep 1
  end
  Chef::Log.debug "done"
end

Given "I have updated my apt cache" do
  shell_out!("apt-get update")
end

Given /^the gems server is running$/ do
  self.gemserver_thread = Thread.new do
    trap("INT") do 
      gemserver.shutdown
      gemserver_thread.join
    end
    
    gemserver.start
  end
end

Given /^that I have the (.+) package system installed$/ do |package_system|
  unless package_system_available?(package_system)
    pending "This Cucumber feature will not execute, as it is missing the #{package_system} packaging system."
  end
end

Then /^there should be a binary on the path called '(.+)'$/ do |binary_name|
  binary_name.strip!
  result = `which #{binary_name}`
  result.should_not =~ /not found/
end

Then /^there should not be a binary on the path called '(.+)'$/ do |binary_name|
  binary_name.strip!
  result = `which #{binary_name}`.strip

  unless result.empty?
    result.should =~ /not found/
  end
end

Then /^the gem '(.+)' version '(.+)' should be installed$/ do |gem_name, version|
  Then "a file named 'installed-gems/gems/#{gem_name}-#{version}' should exist"
end

Then "the gem '$gem_name' version '$version' should not be installed" do |gem_name, version|
  Then "a file named 'installed-gems/gems/#{gem_name}-#{version}' should not exist"
end

def dpkg_should_be_installed(pkg_name)
  shell_out!("dpkg -l #{pkg_name}")
end

Then "the dpkg package '$package_name' should be installed" do |package_name|
  dpkg_should_be_installed(package_name)
end

def tcp_test_port(hostname, port)
  tcp_socket = TCPSocket.new(hostname, port)
  true
rescue Errno::ETIMEDOUT
  false
rescue Errno::ECONNREFUSED
  false
ensure
  tcp_socket && tcp_socket.close
end