virtualbox 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +2 -1
- data/.yardopts +3 -0
- data/Rakefile +15 -1
- data/Readme.md +3 -0
- data/TODO +0 -3
- data/VERSION +1 -1
- data/docs/GettingStarted.md +196 -0
- data/lib/virtualbox/abstract_model/attributable.rb +15 -16
- data/lib/virtualbox/abstract_model/dirty.rb +13 -2
- data/lib/virtualbox/abstract_model/relatable.rb +59 -10
- data/lib/virtualbox/abstract_model.rb +23 -1
- data/lib/virtualbox/attached_device.rb +144 -19
- data/lib/virtualbox/command.rb +11 -2
- data/lib/virtualbox/dvd.rb +52 -4
- data/lib/virtualbox/exceptions.rb +13 -0
- data/lib/virtualbox/hard_drive.rb +37 -8
- data/lib/virtualbox/image.rb +37 -0
- data/lib/virtualbox/nic.rb +1 -1
- data/lib/virtualbox/proxies/collection.rb +29 -0
- data/lib/virtualbox/storage_controller.rb +11 -0
- data/lib/virtualbox/vm.rb +105 -5
- data/lib/virtualbox.rb +2 -1
- data/test/virtualbox/abstract_model/dirty_test.rb +17 -0
- data/test/virtualbox/abstract_model/relatable_test.rb +49 -1
- data/test/virtualbox/abstract_model_test.rb +32 -1
- data/test/virtualbox/attached_device_test.rb +184 -2
- data/test/virtualbox/command_test.rb +36 -0
- data/test/virtualbox/dvd_test.rb +43 -0
- data/test/virtualbox/hard_drive_test.rb +52 -1
- data/test/virtualbox/image_test.rb +79 -0
- data/test/virtualbox/nic_test.rb +10 -0
- data/test/virtualbox/proxies/collection_test.rb +45 -0
- data/test/virtualbox/storage_controller_test.rb +12 -0
- data/test/virtualbox/vm_test.rb +118 -10
- data/virtualbox.gemspec +8 -3
- metadata +8 -3
- data/lib/virtualbox/errors.rb +0 -7
@@ -19,6 +19,161 @@ class AttachedDeviceTest < Test::Unit::TestCase
|
|
19
19
|
VirtualBox::Command.stubs(:execute).returns('')
|
20
20
|
end
|
21
21
|
|
22
|
+
context "medium" do
|
23
|
+
setup do
|
24
|
+
@ad = VirtualBox::AttachedDevice.new
|
25
|
+
@hd = VirtualBox::HardDrive.new
|
26
|
+
@hd.write_attribute(:uuid, @uuid)
|
27
|
+
end
|
28
|
+
|
29
|
+
should "be 'none' when image is nil" do
|
30
|
+
assert_equal "none", @ad.medium
|
31
|
+
end
|
32
|
+
|
33
|
+
should "be the uuid of the image if its not nil" do
|
34
|
+
@ad.image = @hd
|
35
|
+
assert_equal @hd.uuid, @ad.medium
|
36
|
+
end
|
37
|
+
|
38
|
+
should "be 'emptydrive' if the image is an empty drive" do
|
39
|
+
@ad.image = VirtualBox::DVD.empty_drive
|
40
|
+
assert_equal "emptydrive", @ad.medium
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "saving an existing device" do
|
45
|
+
setup do
|
46
|
+
@value = VirtualBox::AttachedDevice.populate_relationship(@caller, @data)
|
47
|
+
@value = @value[0]
|
48
|
+
@value.image = VirtualBox::DVD.empty_drive
|
49
|
+
assert @value.changed?
|
50
|
+
end
|
51
|
+
|
52
|
+
should "not do anything if the device isn't change" do
|
53
|
+
@value.clear_dirty!
|
54
|
+
assert !@value.changed?
|
55
|
+
|
56
|
+
VirtualBox::Command.expects(:vboxmanage).never
|
57
|
+
@value.save
|
58
|
+
end
|
59
|
+
|
60
|
+
should "call vboxmanage" do
|
61
|
+
VirtualBox::Command.expects(:vboxmanage).once
|
62
|
+
@value.save
|
63
|
+
end
|
64
|
+
|
65
|
+
should "not call destroy if the port didn't change" do
|
66
|
+
@value.expects(:destroy).never
|
67
|
+
assert !@value.port_changed?
|
68
|
+
assert @value.save
|
69
|
+
end
|
70
|
+
|
71
|
+
should "call destroy with the old port if the port changed" do
|
72
|
+
@value.expects(:destroy).with({:port => @value.port}, false)
|
73
|
+
@value.port = 7
|
74
|
+
assert @value.port_changed?
|
75
|
+
assert @value.save
|
76
|
+
end
|
77
|
+
|
78
|
+
should "call destroy with the raise errors flag" do
|
79
|
+
@value.expects(:destroy).with(anything, true).once
|
80
|
+
@value.port = 7
|
81
|
+
@value.save(true)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context "creating a new attached device" do
|
86
|
+
setup do
|
87
|
+
@image = VirtualBox::HardDrive.new
|
88
|
+
@ad = VirtualBox::AttachedDevice.new
|
89
|
+
@ad.image = @image
|
90
|
+
@ad.port = 3
|
91
|
+
end
|
92
|
+
|
93
|
+
should "raise a NoParentException if it wasn't added to a relationship" do
|
94
|
+
assert_raises(VirtualBox::Exceptions::NoParentException) {
|
95
|
+
@ad.save
|
96
|
+
}
|
97
|
+
end
|
98
|
+
|
99
|
+
context "has a parent" do
|
100
|
+
setup do
|
101
|
+
@ad.added_to_relationship(@caller)
|
102
|
+
VirtualBox::Command.stubs(:vboxmanage)
|
103
|
+
end
|
104
|
+
|
105
|
+
should "not call destroy since its a new record" do
|
106
|
+
@ad.expects(:destroy).never
|
107
|
+
assert @ad.save
|
108
|
+
end
|
109
|
+
|
110
|
+
should "not raise an InvalidObjectException if no image is set" do
|
111
|
+
@ad.image = nil
|
112
|
+
assert_raises(VirtualBox::Exceptions::InvalidObjectException) {
|
113
|
+
@ad.save
|
114
|
+
}
|
115
|
+
end
|
116
|
+
|
117
|
+
should "call the proper vboxcommand" do
|
118
|
+
VirtualBox::Command.expects(:vboxmanage).with("storageattach #{@vm.name} --storagectl #{VirtualBox::Command.shell_escape(@caller.name)} --port #{@ad.port} --device 0 --type #{@image.image_type} --medium #{@ad.medium}")
|
119
|
+
@ad.save
|
120
|
+
end
|
121
|
+
|
122
|
+
should "return false if the command failed" do
|
123
|
+
VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
|
124
|
+
assert !@ad.save
|
125
|
+
end
|
126
|
+
|
127
|
+
should "return true if the command was a success" do
|
128
|
+
assert @ad.save
|
129
|
+
end
|
130
|
+
|
131
|
+
should "raise an exception if true sent to save and error occured" do
|
132
|
+
VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
|
133
|
+
assert_raises(VirtualBox::Exceptions::CommandFailedException) {
|
134
|
+
@ad.save(true)
|
135
|
+
}
|
136
|
+
end
|
137
|
+
|
138
|
+
should "not be a new record after saving" do
|
139
|
+
assert @ad.new_record?
|
140
|
+
assert @ad.save
|
141
|
+
assert !@ad.new_record?
|
142
|
+
end
|
143
|
+
|
144
|
+
should "not be changed after saving" do
|
145
|
+
assert @ad.changed?
|
146
|
+
assert @ad.save
|
147
|
+
assert !@ad.changed?
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
context "constructor" do
|
153
|
+
should "call populate_from_data if 3 args are given" do
|
154
|
+
VirtualBox::AttachedDevice.any_instance.expects(:populate_from_data).with(1,2,3).once
|
155
|
+
VirtualBox::AttachedDevice.new(1,2,3)
|
156
|
+
end
|
157
|
+
|
158
|
+
should "call populate_attributes if 1 arg is given" do
|
159
|
+
VirtualBox::AttachedDevice.any_instance.expects(:populate_attributes).with(1).once
|
160
|
+
ad = VirtualBox::AttachedDevice.new(1)
|
161
|
+
assert ad.new_record?
|
162
|
+
end
|
163
|
+
|
164
|
+
should "raise a NoMethodError if anything other than 0,1,or 3 arguments" do
|
165
|
+
# 9 seems like a reasonable max (maybe just a bit unreasonable!)
|
166
|
+
2.upto(9) do |i|
|
167
|
+
next if i == 3
|
168
|
+
args = Array.new(i, "A")
|
169
|
+
|
170
|
+
assert_raises(NoMethodError) {
|
171
|
+
VirtualBox::AttachedDevice.new(*args)
|
172
|
+
}
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
22
177
|
context "destroying" do
|
23
178
|
setup do
|
24
179
|
@value = VirtualBox::AttachedDevice.populate_relationship(@caller, @data)
|
@@ -48,6 +203,16 @@ class AttachedDeviceTest < Test::Unit::TestCase
|
|
48
203
|
@value.destroy
|
49
204
|
end
|
50
205
|
|
206
|
+
should "destroy with the specified port if set" do
|
207
|
+
VirtualBox::Command.expects(:vboxmanage).with("storageattach #{VirtualBox::Command.shell_escape(@vm.name)} --storagectl #{VirtualBox::Command.shell_escape(@caller.name)} --port 80 --device 0 --medium none")
|
208
|
+
@value.destroy(:port => 80)
|
209
|
+
end
|
210
|
+
|
211
|
+
should "destroy with the default port if not other port is specified" do
|
212
|
+
VirtualBox::Command.expects(:vboxmanage).with("storageattach #{VirtualBox::Command.shell_escape(@vm.name)} --storagectl #{VirtualBox::Command.shell_escape(@caller.name)} --port #{@value.port} --device 0 --medium none")
|
213
|
+
@value.destroy
|
214
|
+
end
|
215
|
+
|
51
216
|
should "not destroy image by default" do
|
52
217
|
@image.expects(:destroy).never
|
53
218
|
@value.destroy
|
@@ -66,6 +231,23 @@ class AttachedDeviceTest < Test::Unit::TestCase
|
|
66
231
|
:destroy_image => true
|
67
232
|
})
|
68
233
|
end
|
234
|
+
|
235
|
+
should "return false if destroy failed" do
|
236
|
+
VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
|
237
|
+
assert !@value.destroy
|
238
|
+
end
|
239
|
+
|
240
|
+
should "raise an exception if destroy failed and an error occured" do
|
241
|
+
VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
|
242
|
+
assert_raises(VirtualBox::Exceptions::CommandFailedException) {
|
243
|
+
@value.destroy({}, true)
|
244
|
+
}
|
245
|
+
end
|
246
|
+
|
247
|
+
should "forward raise_errors flag to image.destroy" do
|
248
|
+
@image.expects(:destroy).with(true).once
|
249
|
+
@value.destroy({:destroy_image => true}, true)
|
250
|
+
end
|
69
251
|
end
|
70
252
|
|
71
253
|
context "populating relationships" do
|
@@ -79,12 +261,12 @@ class AttachedDeviceTest < Test::Unit::TestCase
|
|
79
261
|
|
80
262
|
should "create objects with proper values" do
|
81
263
|
obj = @value[0]
|
82
|
-
assert_equal "
|
264
|
+
assert_equal "none", obj.medium
|
83
265
|
assert_equal "322f79fd-7da6-416f-a16f-e70066ccf165", obj.uuid
|
84
266
|
assert_equal 0, obj.port
|
85
267
|
|
86
268
|
obj = @value[1]
|
87
|
-
assert_equal "
|
269
|
+
assert_equal "none", obj.medium
|
88
270
|
assert_nil obj.uuid
|
89
271
|
assert_equal 1, obj.port
|
90
272
|
end
|
@@ -9,6 +9,42 @@ class CommandTest < Test::Unit::TestCase
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
+
context "executing commands" do
|
13
|
+
should "use backticks to execute the command" do
|
14
|
+
VirtualBox::Command.expects(:`).with("foo").once
|
15
|
+
VirtualBox::Command.execute("foo")
|
16
|
+
end
|
17
|
+
|
18
|
+
should "return the result of the execution" do
|
19
|
+
VirtualBox::Command.expects(:`).with("foo").returns("bar").once
|
20
|
+
assert_equal "bar", VirtualBox::Command.execute("foo")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "vbox commands" do
|
25
|
+
should "call 'vboxmanage' followed by command" do
|
26
|
+
VirtualBox::Command.expects(:execute).with("VBoxManage foo")
|
27
|
+
VirtualBox::Command.stubs(:success?).returns(true)
|
28
|
+
VirtualBox::Command.vboxmanage("foo")
|
29
|
+
end
|
30
|
+
|
31
|
+
should "call the custom vboxmanage executable if set" do
|
32
|
+
VirtualBox::Command.vboxmanage = "barf"
|
33
|
+
VirtualBox::Command.expects(:execute).with("barf foo")
|
34
|
+
VirtualBox::Command.stubs(:success?).returns(true)
|
35
|
+
VirtualBox::Command.vboxmanage("foo")
|
36
|
+
VirtualBox::Command.vboxmanage = "VBoxManage"
|
37
|
+
end
|
38
|
+
|
39
|
+
should "raise a CommandFailedException if it failed" do
|
40
|
+
VirtualBox::Command.expects(:execute).with("VBoxManage foo")
|
41
|
+
VirtualBox::Command.stubs(:success?).returns(false)
|
42
|
+
assert_raises(VirtualBox::Exceptions::CommandFailedException) {
|
43
|
+
VirtualBox::Command.vboxmanage("foo")
|
44
|
+
}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
12
48
|
context "testing command results" do
|
13
49
|
setup do
|
14
50
|
@command = "foo"
|
data/test/virtualbox/dvd_test.rb
CHANGED
@@ -1,6 +1,49 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), '..', 'test_helper')
|
2
2
|
|
3
3
|
class DVDTest < Test::Unit::TestCase
|
4
|
+
setup do
|
5
|
+
VirtualBox::Command.stubs(:execute)
|
6
|
+
end
|
7
|
+
|
8
|
+
context "destroying a dvd" do
|
9
|
+
setup do
|
10
|
+
@dvd = VirtualBox::DVD.new
|
11
|
+
end
|
12
|
+
|
13
|
+
should "return false if attempting to destroy an empty drive" do
|
14
|
+
assert !VirtualBox::DVD.empty_drive.destroy
|
15
|
+
end
|
16
|
+
|
17
|
+
should "call vboxmanage to destroy it" do
|
18
|
+
VirtualBox::Command.expects(:vboxmanage).with("closemedium dvd #{@dvd.uuid} --delete")
|
19
|
+
assert @dvd.destroy
|
20
|
+
end
|
21
|
+
|
22
|
+
should "return false if destroy failed" do
|
23
|
+
VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
|
24
|
+
assert !@dvd.destroy
|
25
|
+
end
|
26
|
+
|
27
|
+
should "raise an exception if failed and flag is set" do
|
28
|
+
VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
|
29
|
+
assert_raises(VirtualBox::Exceptions::CommandFailedException) {
|
30
|
+
@dvd.destroy(true)
|
31
|
+
}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "empty drive" do
|
36
|
+
should "return an empty drive instance by calling new with :empty_drive" do
|
37
|
+
dvd = VirtualBox::DVD.new(:empty_drive)
|
38
|
+
assert dvd.empty_drive?
|
39
|
+
end
|
40
|
+
|
41
|
+
should "call new with :empty_drive with empty_drive class method" do
|
42
|
+
dvd = VirtualBox::DVD.empty_drive
|
43
|
+
assert dvd.empty_drive?
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
4
47
|
context "retrieving all dvds" do
|
5
48
|
setup do
|
6
49
|
@expectations = {
|
@@ -23,10 +23,33 @@ raw
|
|
23
23
|
VirtualBox::Command.stubs(:vboxmanage).with("showhdinfo #{@name}").returns(@find_raw)
|
24
24
|
end
|
25
25
|
|
26
|
+
context "destroying a hard drive" do
|
27
|
+
setup do
|
28
|
+
@hd = VirtualBox::HardDrive.find(@name)
|
29
|
+
end
|
30
|
+
|
31
|
+
should "call vboxmanage to destroy it" do
|
32
|
+
VirtualBox::Command.expects(:vboxmanage).with("closemedium disk #{@hd.uuid} --delete")
|
33
|
+
assert @hd.destroy
|
34
|
+
end
|
35
|
+
|
36
|
+
should "return false if destroy failed" do
|
37
|
+
VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
|
38
|
+
assert !@hd.destroy
|
39
|
+
end
|
40
|
+
|
41
|
+
should "raise an exception if failed and flag is set" do
|
42
|
+
VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
|
43
|
+
assert_raises(VirtualBox::Exceptions::CommandFailedException) {
|
44
|
+
@hd.destroy(true)
|
45
|
+
}
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
26
49
|
context "cloning a hard drive" do
|
27
50
|
setup do
|
28
51
|
@hd = VirtualBox::HardDrive.find(@name)
|
29
|
-
VirtualBox::Command.
|
52
|
+
VirtualBox::Command.stubs(:vboxmanage).with("clonehd #{@hd.uuid} bar --format VDI --remember").returns(@find_raw)
|
30
53
|
end
|
31
54
|
|
32
55
|
should "call vboxmanage with the clone command" do
|
@@ -39,6 +62,18 @@ raw
|
|
39
62
|
VirtualBox::HardDrive.expects(:find).returns(@new_hd)
|
40
63
|
assert_equal @new_hd, @hd.clone("bar")
|
41
64
|
end
|
65
|
+
|
66
|
+
should "return false on failure" do
|
67
|
+
VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
|
68
|
+
assert @hd.clone("bar").nil?
|
69
|
+
end
|
70
|
+
|
71
|
+
should "raise an exception if raise_errors is true and failed" do
|
72
|
+
VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
|
73
|
+
assert_raises(VirtualBox::Exceptions::CommandFailedException) {
|
74
|
+
@hd.clone("bar", "VDI", true)
|
75
|
+
}
|
76
|
+
end
|
42
77
|
end
|
43
78
|
|
44
79
|
context "creating a hard drive" do
|
@@ -85,6 +120,22 @@ raw
|
|
85
120
|
|
86
121
|
assert_equal "foo", @hd.uuid
|
87
122
|
end
|
123
|
+
|
124
|
+
should "return true if the command was a success" do
|
125
|
+
assert @hd.save
|
126
|
+
end
|
127
|
+
|
128
|
+
should "return failure if the command failed" do
|
129
|
+
VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
|
130
|
+
assert !@hd.save
|
131
|
+
end
|
132
|
+
|
133
|
+
should "raise an exception if flag is set" do
|
134
|
+
VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
|
135
|
+
assert_raises(VirtualBox::Exceptions::CommandFailedException) {
|
136
|
+
@hd.save(true)
|
137
|
+
}
|
138
|
+
end
|
88
139
|
end
|
89
140
|
|
90
141
|
context "finding a single hard drive" do
|
@@ -1,6 +1,85 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), '..', 'test_helper')
|
2
2
|
|
3
3
|
class ImageTest < Test::Unit::TestCase
|
4
|
+
context "image type and empty drive" do
|
5
|
+
setup do
|
6
|
+
@image = VirtualBox::Image.new
|
7
|
+
end
|
8
|
+
|
9
|
+
should "raise an exception if image_type is called on Image" do
|
10
|
+
assert_raises(RuntimeError) { @image.image_type }
|
11
|
+
end
|
12
|
+
|
13
|
+
should "return false by default on empty_drive?" do
|
14
|
+
assert !@image.empty_drive?
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context "in a relationship" do
|
19
|
+
class ImageRelationshipModel < VirtualBox::AbstractModel
|
20
|
+
relationship :image, VirtualBox::Image
|
21
|
+
end
|
22
|
+
|
23
|
+
setup do
|
24
|
+
@model = ImageRelationshipModel.new
|
25
|
+
end
|
26
|
+
|
27
|
+
context "populating a relationship" do
|
28
|
+
should "return 'emptydrive' if the medium is an empty drive" do
|
29
|
+
result = VirtualBox::Image.populate_relationship(@model, {
|
30
|
+
:medium => "emptydrive"
|
31
|
+
})
|
32
|
+
|
33
|
+
assert result.is_a?(VirtualBox::DVD)
|
34
|
+
assert result.empty_drive?
|
35
|
+
end
|
36
|
+
|
37
|
+
should "return nil if uuid is nil and medium isn't empty" do
|
38
|
+
result = VirtualBox::Image.populate_relationship(@model, {})
|
39
|
+
assert result.nil?
|
40
|
+
end
|
41
|
+
|
42
|
+
should "result a matching image from subclasses if uuid" do
|
43
|
+
uuid = "foo'"
|
44
|
+
|
45
|
+
subobject = mock("subobject")
|
46
|
+
subobject.stubs(:uuid).returns(uuid)
|
47
|
+
|
48
|
+
subclass = mock("subclass")
|
49
|
+
subclass.stubs(:all).returns([subobject])
|
50
|
+
|
51
|
+
VirtualBox::Image.expects(:subclasses).returns([subclass])
|
52
|
+
|
53
|
+
result = VirtualBox::Image.populate_relationship(@model, { :uuid => uuid })
|
54
|
+
assert_equal subobject, result
|
55
|
+
end
|
56
|
+
|
57
|
+
should "result in nil if suboject can't be found" do
|
58
|
+
VirtualBox::Image.expects(:subclasses).returns([])
|
59
|
+
assert_nil VirtualBox::Image.populate_relationship(@model, { :uuid => "foo" })
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context "setting relationship object" do
|
64
|
+
should "raise an InvalidRelationshipObjectException if new value is not an image" do
|
65
|
+
assert_raises(VirtualBox::Exceptions::InvalidRelationshipObjectException) {
|
66
|
+
@model.image = "foo"
|
67
|
+
}
|
68
|
+
end
|
69
|
+
|
70
|
+
should "not raise an exception if setting to nil" do
|
71
|
+
assert_nothing_raised { @model.image = nil }
|
72
|
+
end
|
73
|
+
|
74
|
+
should "just return the new value if it is an image" do
|
75
|
+
image = VirtualBox::Image.new
|
76
|
+
assert_nil @model.image
|
77
|
+
assert_nothing_raised { @model.image = image }
|
78
|
+
assert_equal image, @model.image
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
4
83
|
context "recording subclasses" do
|
5
84
|
should "list all subclasses" do
|
6
85
|
assert_nothing_raised { VirtualBox::Image.subclasses }
|
data/test/virtualbox/nic_test.rb
CHANGED
@@ -48,6 +48,16 @@ raw
|
|
48
48
|
assert nic.nictype_changed?
|
49
49
|
nic.save(@vmname)
|
50
50
|
end
|
51
|
+
|
52
|
+
should "raise a CommandFailedException if it fails" do
|
53
|
+
VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
|
54
|
+
|
55
|
+
nic = @nic[0]
|
56
|
+
nic.nictype = "ZOO"
|
57
|
+
assert_raises(VirtualBox::Exceptions::CommandFailedException) {
|
58
|
+
nic.save(@vmname)
|
59
|
+
}
|
60
|
+
end
|
51
61
|
end
|
52
62
|
|
53
63
|
context "populating relationships" do
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
|
2
|
+
|
3
|
+
class CollectionTest < Test::Unit::TestCase
|
4
|
+
setup do
|
5
|
+
@parent = mock("parent")
|
6
|
+
@collection = VirtualBox::Proxies::Collection.new(@parent)
|
7
|
+
end
|
8
|
+
|
9
|
+
should "be a subclass of Array" do
|
10
|
+
assert @collection.is_a?(Array)
|
11
|
+
end
|
12
|
+
|
13
|
+
context "element callbacks" do
|
14
|
+
setup do
|
15
|
+
@item = mock("item")
|
16
|
+
end
|
17
|
+
|
18
|
+
should "not call added_to_relationship if it doesn't exist" do
|
19
|
+
assert_nothing_raised { @collection << @item }
|
20
|
+
end
|
21
|
+
|
22
|
+
should "not call removed_from_relationship if it doesn't exist" do
|
23
|
+
@collection << @item
|
24
|
+
assert_nothing_raised { @collection.delete(@item) }
|
25
|
+
end
|
26
|
+
|
27
|
+
should "call added_to_relationship on the item when its added to a collection" do
|
28
|
+
@item.expects(:added_to_relationship).with(@parent).once
|
29
|
+
@collection << @item
|
30
|
+
end
|
31
|
+
|
32
|
+
should "call removed_from_relationship on the item when its deleted" do
|
33
|
+
@collection << @item
|
34
|
+
@item.expects(:removed_from_relationship).with(@parent).once
|
35
|
+
@collection.delete(@item)
|
36
|
+
end
|
37
|
+
|
38
|
+
should "call removed_from_relationship if clear is called" do
|
39
|
+
@collection << @item
|
40
|
+
@item.expects(:removed_from_relationship).with(@parent).once
|
41
|
+
@collection.clear
|
42
|
+
assert @collection.empty?
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -15,6 +15,18 @@ class StorageControllerTest < Test::Unit::TestCase
|
|
15
15
|
@caller = mock("caller")
|
16
16
|
end
|
17
17
|
|
18
|
+
context "saving" do
|
19
|
+
setup do
|
20
|
+
@value = VirtualBox::StorageController.populate_relationship(@caller, @data)
|
21
|
+
@value = @value[0]
|
22
|
+
end
|
23
|
+
|
24
|
+
should "save relationship" do
|
25
|
+
VirtualBox::AttachedDevice.expects(:save_relationship).once
|
26
|
+
@value.save
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
18
30
|
context "destroying" do
|
19
31
|
setup do
|
20
32
|
@value = VirtualBox::StorageController.populate_relationship(@caller, @data)
|