boxgrinder-build 0.10.0 → 0.10.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/CHANGELOG +11 -0
  2. data/Manifest +6 -7
  3. data/Rakefile +11 -6
  4. data/bash_completion +37 -0
  5. data/bin/boxgrinder-build +20 -5
  6. data/boxgrinder-build.gemspec +4 -4
  7. data/lib/boxgrinder-build.rb +2 -1
  8. data/lib/boxgrinder-build/appliance.rb +26 -24
  9. data/lib/boxgrinder-build/helpers/augeas-helper.rb +1 -1
  10. data/lib/boxgrinder-build/helpers/ec2-helper.rb +2 -2
  11. data/lib/boxgrinder-build/helpers/guestfs-helper.rb +1 -1
  12. data/lib/boxgrinder-build/helpers/s3-helper.rb +2 -2
  13. data/lib/boxgrinder-build/managers/plugin-manager.rb +1 -1
  14. data/lib/boxgrinder-build/plugins/delivery/ebs/ebs-plugin.rb +1 -1
  15. data/lib/boxgrinder-build/plugins/delivery/elastichosts/elastichosts-plugin.rb +2 -2
  16. data/lib/boxgrinder-build/plugins/delivery/openstack/openstack-plugin.rb +3 -3
  17. data/lib/boxgrinder-build/plugins/delivery/s3/s3-plugin.rb +16 -10
  18. data/lib/boxgrinder-build/plugins/os/centos/centos-plugin.rb +1 -1
  19. data/lib/boxgrinder-build/plugins/os/fedora/fedora-plugin.rb +1 -1
  20. data/lib/boxgrinder-build/plugins/os/rhel/rhel-plugin.rb +1 -1
  21. data/lib/boxgrinder-build/plugins/os/rpm-based/kickstart.rb +5 -1
  22. data/lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb +8 -3
  23. data/lib/boxgrinder-build/plugins/os/rpm-based/rpm-dependency-validator.rb +1 -1
  24. data/lib/boxgrinder-build/plugins/os/sl/sl-plugin.rb +1 -1
  25. data/lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb +1 -1
  26. data/lib/boxgrinder-build/util/concurrent/get_set.rb +46 -0
  27. data/lib/boxgrinder-build/util/permissions/fs-monitor.rb +182 -0
  28. data/lib/boxgrinder-build/util/permissions/fs-observer.rb +82 -0
  29. data/lib/boxgrinder-build/util/permissions/user-switcher.rb +42 -0
  30. data/rubygem-boxgrinder-build.spec +25 -3
  31. data/spec/appliance-spec.rb +69 -82
  32. data/spec/helpers/augeas-helper-spec.rb +0 -2
  33. data/spec/helpers/guestfs-helper-spec.rb +1 -3
  34. data/spec/helpers/image-helper-spec.rb +0 -2
  35. data/spec/helpers/linux-helper-spec.rb +0 -2
  36. data/spec/helpers/package-helper-spec.rb +0 -2
  37. data/spec/helpers/plugin-helper-spec.rb +0 -2
  38. data/spec/helpers/s3-helper-spec.rb +0 -2
  39. data/spec/managers/plugin-manager-spec.rb +0 -2
  40. data/spec/plugins/base-plugin-spec.rb +0 -2
  41. data/spec/plugins/delivery/ebs/ebs-plugin-spec.rb +0 -2
  42. data/spec/plugins/delivery/elastichosts/elastichosts-plugin-spec.rb +3 -5
  43. data/spec/plugins/delivery/libvirt/libvirt-plugin-spec.rb +19 -17
  44. data/spec/plugins/delivery/local/local-plugin-spec.rb +0 -2
  45. data/spec/plugins/delivery/s3/s3-plugin-spec.rb +6 -8
  46. data/spec/plugins/delivery/sftp/sftp-plugin-spec.rb +0 -2
  47. data/spec/plugins/os/centos/centos-plugin-spec.rb +0 -2
  48. data/spec/plugins/os/fedora/fedora-plugin-spec.rb +0 -2
  49. data/spec/plugins/os/rhel/rhel-plugin-spec.rb +0 -2
  50. data/spec/plugins/os/rpm-based/kickstart-spec.rb +0 -2
  51. data/spec/plugins/os/rpm-based/rpm-based-os-plugin-spec.rb +16 -4
  52. data/spec/plugins/os/rpm-based/rpm-dependency-validator-spec.rb +0 -2
  53. data/spec/plugins/platform/ec2/ec2-plugin-spec.rb +0 -2
  54. data/spec/plugins/platform/virtualbox/virtualbox-plugin-spec.rb +1 -3
  55. data/spec/plugins/platform/virtualpc/virtualpc-plugin-spec.rb +0 -1
  56. data/spec/plugins/platform/vmware/vmware-plugin-spec.rb +25 -24
  57. data/spec/rcov_helper.rb +2 -0
  58. data/spec/spec_helper.rb +9 -0
  59. data/spec/util/concurrent/get-set-spec.rb +43 -0
  60. data/spec/util/permissions/fs-monitor-spec.rb +233 -0
  61. data/spec/util/permissions/fs-observer-spec.rb +141 -0
  62. data/spec/util/permissions/user-switcher-spec.rb +69 -0
  63. metadata +20 -5
@@ -16,8 +16,6 @@
16
16
  # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
17
17
  # 02110-1301 USA, or see the FSF site: http://www.fsf.org.
18
18
 
19
- require 'rubygems'
20
- require 'rspec'
21
19
  require 'boxgrinder-build/plugins/delivery/local/local-plugin'
22
20
  require 'hashery/opencascade'
23
21
 
@@ -16,8 +16,6 @@
16
16
  # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
17
17
  # 02110-1301 USA, or see the FSF site: http://www.fsf.org.
18
18
 
19
- require 'rubygems'
20
- require 'rspec'
21
19
  require 'boxgrinder-build/plugins/delivery/s3/s3-plugin'
22
20
  require 'hashery/opencascade'
23
21
  require 'boxgrinder-core/models/config'
@@ -109,10 +107,10 @@ module BoxGrinder
109
107
  @key1.should_receive(:exists?).and_return(true)
110
108
  @key2.should_receive(:exists?).and_return(false)
111
109
 
112
- @s3helper.should_receive(:stub_s3obj).with(@bucket, 'name/fedora/14/1.0-SNAPSHOT-1/x86_64/').and_return(@key1)
113
- @s3helper.should_receive(:stub_s3obj).with(@bucket, 'name/fedora/14/1.0-SNAPSHOT-2/x86_64/').and_return(@key2)
110
+ @s3helper.should_receive(:stub_s3obj).with(@bucket, 'name/fedora/14/1.0-snapshot-1/x86_64/').and_return(@key1)
111
+ @s3helper.should_receive(:stub_s3obj).with(@bucket, 'name/fedora/14/1.0-snapshot-2/x86_64/').and_return(@key2)
114
112
 
115
- @plugin.ami_key("name", "/").should == "name/fedora/14/1.0-SNAPSHOT-2/x86_64"
113
+ @plugin.ami_key("name", "/").should == "name/fedora/14/1.0-snapshot-2/x86_64"
116
114
  end
117
115
 
118
116
  it "should return valid ami_key with snapshot and overwrite enabled" do
@@ -121,10 +119,10 @@ module BoxGrinder
121
119
  @key1.should_receive(:exists?).and_return(true)
122
120
  @key2.should_receive(:exists?).and_return(false)
123
121
 
124
- @s3helper.should_receive(:stub_s3obj).with(@bucket, 'name/fedora/14/1.0-SNAPSHOT-1/x86_64/').and_return(@key1)
125
- @s3helper.should_receive(:stub_s3obj).with(@bucket, 'name/fedora/14/1.0-SNAPSHOT-2/x86_64/').and_return(@key2)
122
+ @s3helper.should_receive(:stub_s3obj).with(@bucket, 'name/fedora/14/1.0-snapshot-1/x86_64/').and_return(@key1)
123
+ @s3helper.should_receive(:stub_s3obj).with(@bucket, 'name/fedora/14/1.0-snapshot-2/x86_64/').and_return(@key2)
126
124
 
127
- @plugin.ami_key("name", "/").should == "name/fedora/14/1.0-SNAPSHOT-1/x86_64"
125
+ @plugin.ami_key("name", "/").should == "name/fedora/14/1.0-snapshot-1/x86_64"
128
126
  end
129
127
  end
130
128
 
@@ -16,8 +16,6 @@
16
16
  # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
17
17
  # 02110-1301 USA, or see the FSF site: http://www.fsf.org.
18
18
 
19
- require 'rubygems'
20
- require 'rspec'
21
19
  require 'boxgrinder-build/plugins/delivery/sftp/sftp-plugin'
22
20
 
23
21
  module BoxGrinder
@@ -16,8 +16,6 @@
16
16
  # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
17
17
  # 02110-1301 USA, or see the FSF site: http://www.fsf.org.
18
18
 
19
- require 'rubygems'
20
- require 'rspec'
21
19
  require 'boxgrinder-build/plugins/os/centos/centos-plugin'
22
20
  require 'hashery/opencascade'
23
21
 
@@ -16,8 +16,6 @@
16
16
  # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
17
17
  # 02110-1301 USA, or see the FSF site: http://www.fsf.org.
18
18
 
19
- require 'rubygems'
20
- require 'rspec'
21
19
  require 'boxgrinder-build/plugins/os/fedora/fedora-plugin'
22
20
  require 'hashery/opencascade'
23
21
 
@@ -16,8 +16,6 @@
16
16
  # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
17
17
  # 02110-1301 USA, or see the FSF site: http://www.fsf.org.
18
18
 
19
- require 'rubygems'
20
- require 'rspec'
21
19
  require 'boxgrinder-build/plugins/os/rhel/rhel-plugin'
22
20
  require 'hashery/opencascade'
23
21
 
@@ -16,8 +16,6 @@
16
16
  # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
17
17
  # 02110-1301 USA, or see the FSF site: http://www.fsf.org.
18
18
 
19
- require 'rubygems'
20
- require 'rspec'
21
19
  require 'boxgrinder-build/plugins/os/rpm-based/kickstart'
22
20
  require 'hashery/opencascade'
23
21
 
@@ -16,8 +16,6 @@
16
16
  # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
17
17
  # 02110-1301 USA, or see the FSF site: http://www.fsf.org.
18
18
 
19
- require 'rubygems'
20
- require 'rspec'
21
19
  require 'boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin'
22
20
  require 'hashery/opencascade'
23
21
 
@@ -51,6 +49,19 @@ module BoxGrinder
51
49
  @log = @plugin.instance_variable_get(:@log)
52
50
  end
53
51
 
52
+ it "should create the /etc/yum.repos.d directory if it does not exist" do
53
+ @appliance_config.stub!(:repos).and_return([
54
+ {'name' => 'cirras', 'baseurl' => "http://repo.boxgrinder.org/packages/fedora/11/RPMS/x86_64"}
55
+ ])
56
+
57
+ guestfs = mock("guestfs").as_null_object
58
+
59
+ guestfs.stub!(:exists).and_return(0)
60
+ guestfs.should_receive(:mkdir_p).with("/etc/yum.repos.d/")
61
+
62
+ @plugin.install_repos(guestfs)
63
+ end
64
+
54
65
  it "should install repos" do
55
66
  @appliance_config.should_receive(:repos).and_return(
56
67
  [
@@ -58,7 +69,8 @@ module BoxGrinder
58
69
  {'name' => 'abc', 'baseurl' => 'http://abc', 'mirrorlist' => "http://abc.org/packages/fedora/11/RPMS/x86_64"},
59
70
  ])
60
71
 
61
- guestfs = mock("guestfs")
72
+ guestfs = mock("guestfs").as_null_object
73
+
62
74
  guestfs.should_receive(:write_file).with("/etc/yum.repos.d/cirras.repo", "[cirras]\nname=cirras\nenabled=1\ngpgcheck=0\nbaseurl=http://repo.boxgrinder.org/packages/fedora/11/RPMS/x86_64\n", 0)
63
75
  guestfs.should_receive(:write_file).with("/etc/yum.repos.d/abc.repo", "[abc]\nname=abc\nenabled=1\ngpgcheck=0\nbaseurl=http://abc\nmirrorlist=http://abc.org/packages/fedora/11/RPMS/x86_64\n", 0)
64
76
 
@@ -72,7 +84,7 @@ module BoxGrinder
72
84
  {'name' => 'cirras', 'baseurl' => "http://repo.boxgrinder.org/packages/fedora/11/RPMS/x86_64", 'ephemeral' => true}
73
85
  ])
74
86
 
75
- guestfs = mock("guestfs")
87
+ guestfs = mock("guestfs").as_null_object
76
88
  guestfs.should_receive(:write_file).with("/etc/yum.repos.d/abc.repo", "[abc]\nname=abc\nenabled=1\ngpgcheck=0\nbaseurl=http://abc\nmirrorlist=http://abc.org/packages/fedora/11/RPMS/x86_64\n", 0)
77
89
 
78
90
  @plugin.install_repos(guestfs)
@@ -16,8 +16,6 @@
16
16
  # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
17
17
  # 02110-1301 USA, or see the FSF site: http://www.fsf.org.
18
18
 
19
- require 'rubygems'
20
- require 'rspec'
21
19
  require 'boxgrinder-build/plugins/os/rpm-based/rpm-dependency-validator'
22
20
  require 'hashery/opencascade'
23
21
 
@@ -16,8 +16,6 @@
16
16
  # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
17
17
  # 02110-1301 USA, or see the FSF site: http://www.fsf.org.
18
18
 
19
- require 'rubygems'
20
- require 'rspec'
21
19
  require 'boxgrinder-build/plugins/platform/ec2/ec2-plugin'
22
20
  require 'boxgrinder-core/helpers/log-helper'
23
21
  require 'hashery/opencascade'
@@ -16,11 +16,9 @@
16
16
  # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
17
17
  # 02110-1301 USA, or see the FSF site: http://www.fsf.org.
18
18
 
19
- require 'rubygems'
20
- require 'rspec'
21
19
  require 'boxgrinder-build/plugins/platform/virtualbox/virtualbox-plugin'
22
20
  require 'hashery/opencascade'
23
- require 'spec/rspec-plugin-helper.rb'
21
+ require 'rspec-plugin-helper'
24
22
 
25
23
  module BoxGrinder
26
24
  describe VirtualBoxPlugin do
@@ -16,7 +16,6 @@
16
16
  # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
17
17
  # 02110-1301 USA, or see the FSF site: http://www.fsf.org.
18
18
 
19
- require 'rubygems'
20
19
  require 'boxgrinder-build/plugins/platform/virtualpc/virtualpc-plugin.rb'
21
20
 
22
21
  module BoxGrinder
@@ -16,8 +16,6 @@
16
16
  # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
17
17
  # 02110-1301 USA, or see the FSF site: http://www.fsf.org.
18
18
 
19
- require 'rubygems'
20
- require 'rspec'
21
19
  require 'boxgrinder-build/plugins/platform/vmware/vmware-plugin'
22
20
  require 'hashery/opencascade'
23
21
 
@@ -122,7 +120,7 @@ module BoxGrinder
122
120
 
123
121
  vmdk_image = @plugin.change_vmdk_values("vmfs")
124
122
 
125
- vmdk_image.scan(/^createType="(.*)"\s?$/).to_s.should == "vmfs"
123
+ vmdk_image.match(/^createType="(.*)"\s?$/)[1].should == "vmfs"
126
124
 
127
125
  disk_attributes = vmdk_image.scan(/^RW (.*) (.*) "(.*).raw" (.*)\s?$/)[0]
128
126
 
@@ -131,11 +129,11 @@ module BoxGrinder
131
129
  disk_attributes[2].should == "full"
132
130
  disk_attributes[3].should == ""
133
131
 
134
- vmdk_image.scan(/^ddb.geometry.cylinders = "(.*)"\s?$/).to_s.should == "652"
135
- vmdk_image.scan(/^ddb.geometry.heads = "(.*)"\s?$/).to_s.should == "255"
136
- vmdk_image.scan(/^ddb.geometry.sectors = "(.*)"\s?$/).to_s.should == "63"
132
+ vmdk_image.match(/^ddb.geometry.cylinders = "(.*)"\s?$/)[1].should == "652"
133
+ vmdk_image.match(/^ddb.geometry.heads = "(.*)"\s?$/)[1].should == "255"
134
+ vmdk_image.match(/^ddb.geometry.sectors = "(.*)"\s?$/)[1].should == "63"
137
135
 
138
- vmdk_image.scan(/^ddb.virtualHWVersion = "(.*)"\s?$/).to_s.should == "7"
136
+ vmdk_image.match(/^ddb.virtualHWVersion = "(.*)"\s?$/)[1].should == "7"
139
137
  end
140
138
 
141
139
  it "should change vmdk data (flat)" do
@@ -145,7 +143,7 @@ module BoxGrinder
145
143
 
146
144
  vmdk_image = @plugin.change_vmdk_values("monolithicFlat")
147
145
 
148
- vmdk_image.scan(/^createType="(.*)"\s?$/).to_s.should == "monolithicFlat"
146
+ vmdk_image.match(/^createType="(.*)"\s?$/)[1].should == "monolithicFlat"
149
147
 
150
148
  disk_attributes = vmdk_image.scan(/^RW (.*) (.*) "(.*).raw" (.*)\s?$/)[0]
151
149
 
@@ -154,12 +152,12 @@ module BoxGrinder
154
152
  disk_attributes[2].should == "full"
155
153
  disk_attributes[3].should == "0"
156
154
 
157
- vmdk_image.scan(/^ddb.geometry.cylinders = "(.*)"\s?$/).to_s.should == "652"
158
- vmdk_image.scan(/^ddb.geometry.heads = "(.*)"\s?$/).to_s.should == "255"
159
- vmdk_image.scan(/^ddb.geometry.sectors = "(.*)"\s?$/).to_s.should == "63"
155
+ vmdk_image.match(/^ddb.geometry.cylinders = "(.*)"\s?$/)[1].should == "652"
156
+ vmdk_image.match(/^ddb.geometry.heads = "(.*)"\s?$/)[1].should == "255"
157
+ vmdk_image.match(/^ddb.geometry.sectors = "(.*)"\s?$/)[1].should == "63"
160
158
 
161
- vmdk_image.scan(/^ddb.virtualHWVersion = "(.*)"\s?$/).to_s.should == "7"
162
- vmdk_image.scan(/^ddb.thinProvisioned = "(.*)"\s?$/).to_s.should == "0"
159
+ vmdk_image.match(/^ddb.virtualHWVersion = "(.*)"\s?$/)[1].should == "7"
160
+ vmdk_image.match(/^ddb.thinProvisioned = "(.*)"\s?$/)[1].should == "0"
163
161
  end
164
162
 
165
163
  it "should change vmdk data (flat) enabling thin disk" do
@@ -169,7 +167,7 @@ module BoxGrinder
169
167
 
170
168
  vmdk_image = @plugin.change_vmdk_values("monolithicFlat")
171
169
 
172
- vmdk_image.scan(/^ddb.thinProvisioned = "(.*)"\s?$/).to_s.should == "1"
170
+ vmdk_image.match(/^ddb.thinProvisioned = "(.*)"\s?$/)[1].should == "1"
173
171
  end
174
172
  end
175
173
 
@@ -177,16 +175,19 @@ module BoxGrinder
177
175
  prepare_image({'thin_disk' => false, 'type' => 'enterprise'})
178
176
 
179
177
  vmx_file = @plugin.change_common_vmx_values
180
-
181
- vmx_file.scan(/^guestOS = "(.*)"\s?$/).to_s.should == "linux"
182
- vmx_file.scan(/^displayName = "(.*)"\s?$/).to_s.should == "full"
183
- vmx_file.scan(/^annotation = "(.*)"\s?$/).to_s.scan(/^full | Version: 1\.0 | Built by: BoxGrinder 1\.0\.0/).should_not == nil
184
- vmx_file.scan(/^guestinfo.vmware.product.long = "(.*)"\s?$/).to_s.should == "full"
185
- vmx_file.scan(/^guestinfo.vmware.product.url = "(.*)"\s?$/).to_s.should == "http://boxgrinder.org"
186
- vmx_file.scan(/^numvcpus = "(.*)"\s?$/).to_s.should == "1"
187
- vmx_file.scan(/^memsize = "(.*)"\s?$/).to_s.should == "256"
188
- vmx_file.scan(/^log.fileName = "(.*)"\s?$/).to_s.should == "full.log"
189
- vmx_file.scan(/^scsi0:0.fileName = "(.*)"\s?$/).to_s.should == "full.vmdk"
178
+
179
+ vmx_file.match(/^guestOS = "(.*)"\s?$/)[1].should == "linux"
180
+ vmx_file.match(/^displayName = "(.*)"\s?$/)[1].should == "full"
181
+
182
+ vmx_file.match(/^annotation = "(.*)"\s?$/)[1].
183
+ match(/^full | Version: 1\.0 | Built by: BoxGrinder 1\.0\.0/).should_not == nil
184
+
185
+ vmx_file.match(/^guestinfo.vmware.product.long = "(.*)"\s?$/)[1].should == "full"
186
+ vmx_file.match(/^guestinfo.vmware.product.url = "(.*)"\s?$/)[1].should == "http://boxgrinder.org"
187
+ vmx_file.match(/^numvcpus = "(.*)"\s?$/)[1].should == "1"
188
+ vmx_file.match(/^memsize = "(.*)"\s?$/)[1].should == "256"
189
+ vmx_file.match(/^log.fileName = "(.*)"\s?$/)[1].should == "full.log"
190
+ vmx_file.match(/^scsi0:0.fileName = "(.*)"\s?$/)[1].should == "full.vmdk"
190
191
  end
191
192
 
192
193
  describe ".build_vmware_personal" do
@@ -0,0 +1,2 @@
1
+ require 'rubygems'
2
+ require 'rspec'
@@ -0,0 +1,9 @@
1
+ if ENV['COVERAGE']
2
+ require 'simplecov'
3
+
4
+ FILTER_DIRS = ['spec']
5
+
6
+ SimpleCov.start do
7
+ FILTER_DIRS.each{ |f| add_filter f }
8
+ end
9
+ end
@@ -0,0 +1,43 @@
1
+ require "rspec"
2
+
3
+ require 'boxgrinder-build/util/concurrent/get_set'
4
+
5
+ describe GetSet do
6
+ subject{ GetSet.new }
7
+ its(:get_set){ should be_false }
8
+
9
+ context "#initialize" do
10
+ it "should have a value of true with default init" do
11
+ GetSet.new.get_set.should be_false
12
+ end
13
+
14
+ it "should have an arbitrary value after setting initial_state" do
15
+ GetSet.new(:boxgrinder).get_set.should equal(:boxgrinder)
16
+ end
17
+ end
18
+
19
+ context "#get_set" do
20
+ context "without block" do
21
+ it "should return the existing value when none is set" do
22
+ subject.get_set(:some_value)
23
+ subject.get_set.should equal(:some_value)
24
+ end
25
+
26
+ it "should return the set non-nil value when explicitly provided" do
27
+ subject.get_set(:boxgrinder).should equal(:boxgrinder)
28
+ end
29
+ end
30
+
31
+ context "with block" do
32
+ it "yield existing the value and set block return as the new value" do
33
+ expect{ subject.get_set(:blah){|v| :boo} }.
34
+ to change(subject, :get_set).from(false).to(:boo)
35
+ end
36
+
37
+ it "parameter should be ignored" do
38
+ expect{ subject.get_set(:blah){|v| v} }.
39
+ not_to change(subject, :get_set)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,233 @@
1
+ #
2
+ # Copyright 2012 Red Hat, Inc.
3
+ #
4
+ # This is free software; you can redistribute it and/or modify it
5
+ # under the terms of the GNU Lesser General Public License as
6
+ # published by the Free Software Foundation; either version 3 of
7
+ # the License, or (at your option) any later version.
8
+ #
9
+ # This software is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # Lesser General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Lesser General Public
15
+ # License along with this software; if not, write to the Free
16
+ # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
17
+ # 02110-1301 USA, or see the FSF site: http://www.fsf.org.
18
+
19
+ require 'boxgrinder-build/util/permissions/fs-monitor'
20
+
21
+ module BoxGrinder
22
+ describe FSMonitor do
23
+
24
+ before(:each) do
25
+ # Singleton
26
+ @fs_monitor = FSMonitor.instance
27
+ end
28
+
29
+ after(:each) do
30
+ # Reset the singleton to avoid tests being serial
31
+ @fs_monitor.reset
32
+ end
33
+
34
+ subject{ @fs_monitor }
35
+
36
+ let(:observer){ mock('FSObserver-mock-1', :respond_to? => true) }
37
+ let(:observer_2){ mock('FSObserver-mock-2', :respond_to? => true) }
38
+
39
+ context "after singleton #initialize" do
40
+ its(:reset){ should be_nil }
41
+ its(:stop){ should be_false }
42
+ its(:trigger){ should be_false }
43
+
44
+ it "should insert wrappers for File{#open, #new, #rename, #symlink, #link},
45
+ Dir#mkdir." do
46
+ File.should respond_to(:__alias_open, :__alias_new, :__alias_rename,
47
+ :__alias_symlink, :__alias_link)
48
+ File.should respond_to(:open, :new, :rename, :symlink, :link)
49
+ Dir.should respond_to(:__alias_mkdir)
50
+ Dir.should respond_to(:mkdir)
51
+ end
52
+ end
53
+
54
+ context "#capture" do
55
+ let(:mock_return){ mock('mock_return_value') }
56
+ let(:dumb_observer){ mock('dumb_observer').as_null_object }
57
+ let(:dumb_observer_2){ mock('dumb_observer_2').as_null_object }
58
+
59
+ before(:each) do
60
+ # Just reflect the path back so we can differentiate the paths
61
+ subject.stub(:realpath){ |reflect| reflect }
62
+ end
63
+
64
+ it "should add observers to its observer set" do
65
+ expect {
66
+ subject.capture(dumb_observer, dumb_observer_2){}
67
+ }.to change(subject, :count_observers).
68
+ from(0).to(2)
69
+ end
70
+
71
+ def basic_capture_test_setup(klazz=File, meth_s=:open, &blk)
72
+ klazz.stub("__alias_#{meth_s}").and_return(mock_return)
73
+
74
+ observer.should_receive(:update).twice.ordered.
75
+ with({ :command => :stop_capture })
76
+
77
+ blk.call(observer)
78
+ end
79
+
80
+ it "should not capture outside of #capture block{}" do
81
+ basic_capture_test_setup do |observer|
82
+ # Ignore unscoped operations
83
+ observer.should_receive(:update).once.
84
+ with({ :data => '/a/y/r/s', :command => :add_path })
85
+
86
+ File.open('/m/a/s', 'w+')
87
+
88
+ subject.capture(observer) do
89
+ File.open('/a/y/r/s', 'a')
90
+ end
91
+
92
+ File.open('/c/y/s', 'w')
93
+ end
94
+ end
95
+
96
+ it "should capture with manual #start, #stop delimiters" do
97
+ basic_capture_test_setup do |observer|
98
+ observer.should_receive(:update).once.
99
+ with({ :data => '/m/a/w', :command => :add_path })
100
+
101
+ File.open('no-capture', 'w+')
102
+
103
+ # Note: without block, hence no auto-stop
104
+ subject.capture(observer)
105
+ File.open('/m/a/w', 'a')
106
+ subject.stop
107
+
108
+ File.open('capture-no', 'w')
109
+ end
110
+ end
111
+
112
+ def wrapper_spec_builder(klazz, method, pnum, include, exclude=[], &blk)
113
+ basic_capture_test_setup(klazz, method) do |observer|
114
+
115
+ include.each do |arg|
116
+ observer.should_receive(:update).once.
117
+ with({ :data => arg[pnum], :command => :add_path})
118
+ end
119
+
120
+ subject.capture(observer) do
121
+ (include+exclude).each{ |arg| klazz.send(method, *arg) }
122
+ end
123
+ end
124
+ end
125
+
126
+ let(:mode_new_inc) do
127
+ [['/ham/jam', 'a+'], ['/ham/jam', 'a'],
128
+ ['/spam', 'w+'], ['/spam', 'w']]
129
+ end
130
+
131
+ let(:mode_new_exc){ [['/nocapture', 'r']] }
132
+
133
+ it "should capture File#new when mode=/^(t|b)?((w|a)[+]?)(t|b)?$/" do
134
+ wrapper_spec_builder(File, :new, 0, mode_new_inc,
135
+ mode_new_exc)
136
+ end
137
+
138
+ it "should capture File#open when mode=/^(t|b)?((w|a)[+]?)(t|b)?$/" do
139
+ wrapper_spec_builder(File, :open, 0, mode_new_inc,
140
+ mode_new_exc)
141
+ end
142
+
143
+ it "should capture File#rename new path" do
144
+ wrapper_spec_builder(File, :rename, 1,
145
+ # original -> expectation
146
+ [['/old/path', '/new/path']])
147
+ end
148
+
149
+ it "should capture File#symlink" do
150
+ wrapper_spec_builder(File, :symlink, 1,
151
+ [['/some/file', '/the/symlink']])
152
+ end
153
+
154
+ it "should capture File#link" do
155
+ wrapper_spec_builder(File, :link, 1,
156
+ [['/some/file', '/the/hardlink']])
157
+ end
158
+
159
+ it "should capture Dir#mkdir" do
160
+ basic_capture_test_setup(Dir, :mkdir) do |observer|
161
+ observer.should_receive(:update).once.
162
+ with({ :data => '/a_new_dir/', :command => :add_path })
163
+
164
+ subject.capture(observer) do
165
+ Dir.mkdir('/a_new_dir/and/other/junk')
166
+ end
167
+ end
168
+ end
169
+ end
170
+
171
+ context "#add" do
172
+ context "valid usage" do
173
+ before(:each) do
174
+ subject.stub(:realpath).and_return('/custard/creme')
175
+ # Stub the 'real' method, use generated wrapper.
176
+ Dir.stub(:__alias_mkdir).and_return(0)
177
+ end
178
+
179
+ context "no observers provided" do
180
+ it "should return false, but most not raise any errors" do
181
+ subject.add_path('/exploding/sausage').should be_false
182
+ end
183
+ end
184
+
185
+ # NOTE: Normally #stop would only be received once, but due to
186
+ # resetting in after(:each) it is received twice in these
187
+ # specs.
188
+ it "should send captured paths to observers when capturing stopped" do
189
+ observer.should_receive(:update).once.
190
+ with({ :data => '/custard/creme', :command => :add_path })
191
+
192
+ observer.should_receive(:update).twice.
193
+ with({ :command => :stop_capture })
194
+
195
+ subject.capture(observer){ Dir.mkdir('custard/creme') }
196
+ end
197
+
198
+ it "should accept and update multiple observers" do
199
+ [observer, observer_2].each do |o|
200
+ o.should_receive(:update).once.
201
+ with({ :data => '/custard/creme', :command => :add_path })
202
+ end
203
+
204
+ [observer, observer_2].each do |o|
205
+ o.should_receive(:update).twice.
206
+ with({ :command => :stop_capture })
207
+ end
208
+
209
+ subject.capture(observer, observer_2) do
210
+ Dir.mkdir('custard/creme')
211
+ end
212
+ end
213
+ end
214
+ end
215
+
216
+ context "#trigger" do
217
+ before(:each) do
218
+ subject.stub(:_stop)
219
+ end
220
+
221
+ it "should return false when there are no observers, but *not* fail" do
222
+ expect{ subject.trigger }.to be_true
223
+ end
224
+
225
+ it "should send a :chown update to observers" do
226
+ observer.should_receive(:update).with({:command => :chown})
227
+
228
+ subject.send(:add_observer, observer)
229
+ subject.trigger
230
+ end
231
+ end
232
+ end
233
+ end