virtualbox 0.4.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. data/Readme.md +9 -9
  2. data/VERSION +1 -1
  3. data/docs/GettingStarted.md +11 -11
  4. data/docs/WhatsNew.md +1 -1
  5. data/lib/virtualbox.rb +10 -1
  6. data/lib/virtualbox/abstract_model.rb +47 -29
  7. data/lib/virtualbox/abstract_model/attributable.rb +16 -16
  8. data/lib/virtualbox/abstract_model/dirty.rb +10 -10
  9. data/lib/virtualbox/abstract_model/relatable.rb +22 -22
  10. data/lib/virtualbox/abstract_model/validatable.rb +4 -4
  11. data/lib/virtualbox/attached_device.rb +23 -23
  12. data/lib/virtualbox/command.rb +9 -9
  13. data/lib/virtualbox/dvd.rb +7 -7
  14. data/lib/virtualbox/ext/subclass_listing.rb +1 -1
  15. data/lib/virtualbox/extra_data.rb +17 -17
  16. data/lib/virtualbox/forwarded_port.rb +23 -23
  17. data/lib/virtualbox/hard_drive.rb +27 -27
  18. data/lib/virtualbox/image.rb +25 -18
  19. data/lib/virtualbox/nic.rb +22 -22
  20. data/lib/virtualbox/proxies/collection.rb +4 -4
  21. data/lib/virtualbox/shared_folder.rb +25 -25
  22. data/lib/virtualbox/storage_controller.rb +16 -16
  23. data/lib/virtualbox/vm.rb +95 -42
  24. data/test/virtualbox/abstract_model/attributable_test.rb +28 -28
  25. data/test/virtualbox/abstract_model/dirty_test.rb +13 -13
  26. data/test/virtualbox/abstract_model/relatable_test.rb +36 -36
  27. data/test/virtualbox/abstract_model/validatable_test.rb +22 -22
  28. data/test/virtualbox/abstract_model_test.rb +46 -36
  29. data/test/virtualbox/attached_device_test.rb +47 -47
  30. data/test/virtualbox/command_test.rb +12 -12
  31. data/test/virtualbox/dvd_test.rb +15 -19
  32. data/test/virtualbox/ext/subclass_listing_test.rb +2 -2
  33. data/test/virtualbox/extra_data_test.rb +37 -37
  34. data/test/virtualbox/forwarded_port_test.rb +31 -31
  35. data/test/virtualbox/hard_drive_test.rb +40 -48
  36. data/test/virtualbox/image_test.rb +36 -33
  37. data/test/virtualbox/nic_test.rb +22 -22
  38. data/test/virtualbox/proxies/collection_test.rb +6 -6
  39. data/test/virtualbox/shared_folder_test.rb +36 -36
  40. data/test/virtualbox/storage_controller_test.rb +14 -14
  41. data/test/virtualbox/vm_test.rb +121 -70
  42. data/test/virtualbox_test.rb +19 -0
  43. data/virtualbox.gemspec +5 -3
  44. metadata +4 -2
@@ -7,51 +7,51 @@ class NicTest < Test::Unit::TestCase
7
7
  :nic2 => "foo",
8
8
  :nic3 => "bar"
9
9
  }
10
-
10
+
11
11
  @caller = mock("caller")
12
12
  @caller.stubs(:name).returns("foo")
13
-
13
+
14
14
  VirtualBox::VM.stubs(:human_info).returns(<<-raw)
15
15
  NIC 1: MAC: 08002745B49F, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: Am79C973, Reported speed: 0 Mbps
16
16
  NIC 2: MAC: 08002745B49F, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: Am79C973, Reported speed: 0 Mbps
17
17
  NIC 3: MAC: 08002745B49F, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: Am79C973, Reported speed: 0 Mbps
18
18
  raw
19
19
  end
20
-
20
+
21
21
  context "saving" do
22
22
  setup do
23
23
  @nic = VirtualBox::Nic.populate_relationship(@caller, @data)
24
24
  @vmname = "myvm"
25
25
  end
26
-
26
+
27
27
  should "use the vmname strung through the save" do
28
28
  VirtualBox::Command.expects(:vboxmanage).with("modifyvm #{@vmname} --nic1 foo")
29
-
29
+
30
30
  nic = @nic[0]
31
31
  nic.nic = "foo"
32
32
  nic.save(@vmname)
33
33
  end
34
-
34
+
35
35
  should "use the proper index" do
36
36
  VirtualBox::Command.expects(:vboxmanage).with("modifyvm #{@vmname} --nic2 far")
37
-
37
+
38
38
  nic = @nic[1]
39
39
  nic.nic = "far"
40
40
  nic.save(@vmname)
41
41
  end
42
-
42
+
43
43
  should "save the nictype" do
44
44
  VirtualBox::Command.expects(:vboxmanage).with("modifyvm #{@vmname} --nictype1 ZOO")
45
-
45
+
46
46
  nic = @nic[0]
47
47
  nic.nictype = "ZOO"
48
48
  assert nic.nictype_changed?
49
49
  nic.save(@vmname)
50
50
  end
51
-
51
+
52
52
  should "raise a CommandFailedException if it fails" do
53
53
  VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
54
-
54
+
55
55
  nic = @nic[0]
56
56
  nic.nictype = "ZOO"
57
57
  assert_raises(VirtualBox::Exceptions::CommandFailedException) {
@@ -59,7 +59,7 @@ raw
59
59
  }
60
60
  end
61
61
  end
62
-
62
+
63
63
  context "populating relationships" do
64
64
  setup do
65
65
  @value = VirtualBox::Nic.populate_relationship(@caller, @data)
@@ -68,16 +68,16 @@ raw
68
68
  should "create the correct amount of objects" do
69
69
  assert_equal 3, @value.length
70
70
  end
71
-
71
+
72
72
  should "parse the type" do
73
73
  assert_equal "Am79C973", @value[0].nictype
74
74
  end
75
75
  end
76
-
76
+
77
77
  context "parsing nic data from human readable output" do
78
78
  setup do
79
79
  @raw = "NIC 1: MAC: 08002745B49F, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: Am79C973, Reported speed: 0 Mbps"
80
-
80
+
81
81
  @multiline_raw = <<-raw
82
82
  Storage Controller Port Count (0): 2
83
83
  Storage Controller Name (1): Floppy Controller
@@ -89,21 +89,21 @@ IDE Controller (0, 0): /Users/mitchellh/Library/VirtualBox/HardDisks/HoboBase.vm
89
89
  IDE Controller (1, 0): Empty
90
90
  Floppy Controller (0, 0): Empty
91
91
  NIC 1: MAC: 08002745B49F, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: Am79C973, Reported speed: 0 Mbps
92
- NIC 2: disabled
92
+ NIC 2: disabled
93
93
  raw
94
94
  end
95
-
95
+
96
96
  should "only return valid objects in hash" do
97
97
  VirtualBox::VM.expects(:human_info).returns(@multiline_raw)
98
98
  result = VirtualBox::Nic.nic_data("foo")
99
99
  assert result.is_a?(Hash)
100
100
  assert_equal 1, result.length
101
101
  end
102
-
102
+
103
103
  should "return nil if its an invalid string" do
104
104
  assert_nil VirtualBox::Nic.parse_nic("FOO")
105
105
  end
106
-
106
+
107
107
  should "return proper data for valid string" do
108
108
  @name = :nic1
109
109
  @expected = {
@@ -112,16 +112,16 @@ raw
112
112
  :trace => "off (file: none)",
113
113
  :type => "Am79C973"
114
114
  }
115
-
115
+
116
116
  name, result = VirtualBox::Nic.parse_nic(@raw)
117
117
  assert_equal @name, name
118
118
  assert result.is_a?(Hash)
119
-
119
+
120
120
  @expected.each do |k,v|
121
121
  assert_equal v, result[k]
122
122
  end
123
123
  end
124
-
124
+
125
125
  should "ignore nics that are disabled" do
126
126
  assert_nil VirtualBox::Nic.parse_nic("NIC 1: disabled")
127
127
  end
@@ -9,32 +9,32 @@ class CollectionTest < Test::Unit::TestCase
9
9
  should "be a subclass of Array" do
10
10
  assert @collection.is_a?(Array)
11
11
  end
12
-
12
+
13
13
  context "element callbacks" do
14
14
  setup do
15
15
  @item = mock("item")
16
16
  end
17
-
17
+
18
18
  should "not call added_to_relationship if it doesn't exist" do
19
19
  assert_nothing_raised { @collection << @item }
20
20
  end
21
-
21
+
22
22
  should "not call removed_from_relationship if it doesn't exist" do
23
23
  @collection << @item
24
24
  assert_nothing_raised { @collection.delete(@item) }
25
25
  end
26
-
26
+
27
27
  should "call added_to_relationship on the item when its added to a collection" do
28
28
  @item.expects(:added_to_relationship).with(@parent).once
29
29
  @collection << @item
30
30
  end
31
-
31
+
32
32
  should "call removed_from_relationship on the item when its deleted" do
33
33
  @collection << @item
34
34
  @item.expects(:removed_from_relationship).with(@parent).once
35
35
  @collection.delete(@item)
36
36
  end
37
-
37
+
38
38
  should "call removed_from_relationship if clear is called" do
39
39
  @collection << @item
40
40
  @item.expects(:removed_from_relationship).with(@parent).once
@@ -8,13 +8,13 @@ class SharedFolderTest < Test::Unit::TestCase
8
8
  :sharedfoldernamemachinemapping2 => "barfolder",
9
9
  :sharedfolderpathmachinemapping2 => "/bar"
10
10
  }
11
-
11
+
12
12
  @caller = mock("caller")
13
13
  @caller.stubs(:name).returns("foo")
14
-
14
+
15
15
  VirtualBox::Command.stubs(:execute)
16
16
  end
17
-
17
+
18
18
  context "validations" do
19
19
  setup do
20
20
  @sf = VirtualBox::SharedFolder.new
@@ -22,27 +22,27 @@ class SharedFolderTest < Test::Unit::TestCase
22
22
  @sf.hostpath = "bar"
23
23
  @sf.added_to_relationship(@caller)
24
24
  end
25
-
25
+
26
26
  should "be valid with all fields" do
27
27
  assert @sf.valid?
28
28
  end
29
-
29
+
30
30
  should "be invalid with no name" do
31
31
  @sf.name = nil
32
32
  assert !@sf.valid?
33
33
  end
34
-
34
+
35
35
  should "be invalid with no hostpath" do
36
36
  @sf.hostpath = nil
37
37
  assert !@sf.valid?
38
38
  end
39
-
39
+
40
40
  should "be invalid if not in a relationship" do
41
41
  @sf.write_attribute(:parent, nil)
42
42
  assert !@sf.valid?
43
43
  end
44
44
  end
45
-
45
+
46
46
  context "saving an existing shared folder" do
47
47
  setup do
48
48
  @value = VirtualBox::SharedFolder.populate_relationship(@caller, @data)
@@ -50,46 +50,46 @@ class SharedFolderTest < Test::Unit::TestCase
50
50
  @value.name = "different"
51
51
  assert @value.changed?
52
52
  end
53
-
53
+
54
54
  should "first destroy the shared folder then recreate it" do
55
55
  seq = sequence("create_seq")
56
56
  @value.expects(:destroy).in_sequence(seq)
57
57
  VirtualBox::Command.expects(:vboxmanage).in_sequence(seq)
58
58
  assert @value.save
59
59
  end
60
-
60
+
61
61
  should "call destroy with raise errors if set" do
62
62
  @value.expects(:destroy).with(true).once
63
63
  assert @value.save(true)
64
64
  end
65
65
  end
66
-
66
+
67
67
  context "creating a new shared folder" do
68
68
  setup do
69
69
  @sf = VirtualBox::SharedFolder.new
70
70
  @sf.name = "foo"
71
71
  @sf.hostpath = "bar"
72
72
  end
73
-
73
+
74
74
  should "return false and not call vboxmanage if invalid" do
75
75
  VirtualBox::Command.expects(:vboxmanage).never
76
76
  @sf.expects(:valid?).returns(false)
77
77
  assert !@sf.save
78
78
  end
79
-
79
+
80
80
  should "raise a ValidationFailedException if invalid and raise_errors is true" do
81
81
  @sf.expects(:valid?).returns(false)
82
82
  assert_raises(VirtualBox::Exceptions::ValidationFailedException) {
83
83
  @sf.save(true)
84
84
  }
85
85
  end
86
-
86
+
87
87
  context "has a parent" do
88
88
  setup do
89
89
  @sf.added_to_relationship(@caller)
90
90
  VirtualBox::Command.stubs(:vboxmanage)
91
91
  end
92
-
92
+
93
93
  should "not call destroy since its a new record" do
94
94
  @sf.expects(:destroy).never
95
95
  assert @sf.save
@@ -108,20 +108,20 @@ class SharedFolderTest < Test::Unit::TestCase
108
108
  should "return true if the command was a success" do
109
109
  assert @sf.save
110
110
  end
111
-
111
+
112
112
  should "raise an exception if true sent to save and error occured" do
113
113
  VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
114
114
  assert_raises(VirtualBox::Exceptions::CommandFailedException) {
115
115
  @sf.save(true)
116
116
  }
117
117
  end
118
-
118
+
119
119
  should "not be a new record after saving" do
120
120
  assert @sf.new_record?
121
121
  assert @sf.save
122
122
  assert !@sf.new_record?
123
123
  end
124
-
124
+
125
125
  should "not be changed after saving" do
126
126
  assert @sf.changed?
127
127
  assert @sf.save
@@ -129,56 +129,56 @@ class SharedFolderTest < Test::Unit::TestCase
129
129
  end
130
130
  end
131
131
  end
132
-
132
+
133
133
  context "constructor" do
134
134
  should "call initialize_for_relationship if 3 args are given" do
135
135
  VirtualBox::SharedFolder.any_instance.expects(:initialize_for_relationship).with(1,2,3).once
136
136
  VirtualBox::SharedFolder.new(1,2,3)
137
137
  end
138
-
138
+
139
139
  should "raise a NoMethodError if anything other than 0,1,or 3 arguments" do
140
140
  2.upto(9) do |i|
141
141
  next if i == 3
142
142
  args = Array.new(i, "A")
143
-
143
+
144
144
  assert_raises(NoMethodError) {
145
145
  VirtualBox::SharedFolder.new(*args)
146
146
  }
147
147
  end
148
148
  end
149
-
149
+
150
150
  should "populate from a hash if one argument is given" do
151
151
  VirtualBox::SharedFolder.any_instance.expects(:initialize_for_data).with("HI").once
152
152
  VirtualBox::SharedFolder.new("HI")
153
153
  end
154
-
154
+
155
155
  context "initializing from data" do
156
156
  setup do
157
157
  @sf = VirtualBox::SharedFolder.new({:name => "foo", :hostpath => "bar"})
158
158
  end
159
-
159
+
160
160
  should "allow the use of :name and :hostpath in the hash" do
161
161
  assert_equal "foo", @sf.name
162
162
  assert_equal "bar", @sf.hostpath
163
163
  end
164
-
164
+
165
165
  should "keep the record new" do
166
166
  assert @sf.new_record?
167
167
  end
168
168
  end
169
169
  end
170
-
170
+
171
171
  context "destroying" do
172
172
  setup do
173
173
  @value = VirtualBox::SharedFolder.populate_relationship(@caller, @data)
174
174
  @value = @value[0]
175
175
  end
176
-
176
+
177
177
  should "call the proper command" do
178
178
  VirtualBox::Command.expects(:vboxmanage).with("sharedfolder remove #{@caller.name} --name #{@value.name}").once
179
179
  assert @value.destroy
180
180
  end
181
-
181
+
182
182
  should "shell escape VM name and storage controller name" do
183
183
  shell_seq = sequence("shell_seq")
184
184
  VirtualBox::Command.expects(:shell_escape).with(@caller.name).in_sequence(shell_seq)
@@ -186,20 +186,20 @@ class SharedFolderTest < Test::Unit::TestCase
186
186
  VirtualBox::Command.expects(:vboxmanage).in_sequence(shell_seq)
187
187
  assert @value.destroy
188
188
  end
189
-
189
+
190
190
  should "return false if destroy failed" do
191
191
  VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
192
192
  assert !@value.destroy
193
193
  end
194
-
194
+
195
195
  should "raise an exception if destroy failed and an error occured" do
196
196
  VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
197
197
  assert_raises(VirtualBox::Exceptions::CommandFailedException) {
198
198
  @value.destroy(true)
199
199
  }
200
200
  end
201
-
202
- should "use the old name if it was changed" do
201
+
202
+ should "use the old name if it was changed" do
203
203
  @value.name = "DIFFERENT"
204
204
  shell_seq = sequence("shell_seq")
205
205
  VirtualBox::Command.expects(:shell_escape).with(@caller.name).in_sequence(shell_seq)
@@ -208,12 +208,12 @@ class SharedFolderTest < Test::Unit::TestCase
208
208
  assert @value.destroy
209
209
  end
210
210
  end
211
-
211
+
212
212
  context "populating relationships" do
213
213
  setup do
214
214
  @value = VirtualBox::SharedFolder.populate_relationship(@caller, @data)
215
215
  end
216
-
216
+
217
217
  should "be a 'collection'" do
218
218
  assert @value.is_a?(VirtualBox::Proxies::Collection)
219
219
  end
@@ -221,12 +221,12 @@ class SharedFolderTest < Test::Unit::TestCase
221
221
  should "create the correct amount of objects" do
222
222
  assert_equal 2, @value.length
223
223
  end
224
-
224
+
225
225
  should "parse the proper data" do
226
226
  value = @value[0]
227
227
  assert_equal "foofolder", value.name
228
228
  assert_equal "/foo", value.hostpath
229
-
229
+
230
230
  value = @value[1]
231
231
  assert_equal "barfolder", value.name
232
232
  assert_equal "/bar", value.hostpath
@@ -11,77 +11,77 @@ class StorageControllerTest < Test::Unit::TestCase
11
11
  :"foo-1-0" => "again",
12
12
  :"bar-0-0" => "rawr"
13
13
  }
14
-
14
+
15
15
  @caller = mock("caller")
16
16
  end
17
-
17
+
18
18
  context "saving" do
19
19
  setup do
20
20
  @value = VirtualBox::StorageController.populate_relationship(@caller, @data)
21
21
  @value = @value[0]
22
22
  end
23
-
23
+
24
24
  should "save relationship" do
25
25
  VirtualBox::AttachedDevice.expects(:save_relationship).once
26
26
  @value.save
27
27
  end
28
28
  end
29
-
29
+
30
30
  context "destroying" do
31
31
  setup do
32
32
  @value = VirtualBox::StorageController.populate_relationship(@caller, @data)
33
33
  @value = @value[0]
34
34
  end
35
-
35
+
36
36
  should "simply call destroy on each object when destroying the relationship" do
37
37
  obj_one = mock("one")
38
38
  obj_two = mock("two")
39
-
39
+
40
40
  obj_one.expects(:destroy).with("HELLO").once
41
41
  obj_two.expects(:destroy).with("HELLO").once
42
-
42
+
43
43
  VirtualBox::StorageController.destroy_relationship(self, [obj_one, obj_two], "HELLO")
44
44
  end
45
45
 
46
46
  should "call destroy_relationship on AttachedDevices when destroyed" do
47
47
  assert !@value.devices.empty?
48
-
48
+
49
49
  VirtualBox::AttachedDevice.expects(:destroy_relationship).once
50
50
  @value.destroy
51
51
  end
52
52
  end
53
-
53
+
54
54
  context "populating relationships" do
55
55
  should "create the correct amount of objects" do
56
56
  value = VirtualBox::StorageController.populate_relationship(@caller, @data)
57
57
  assert_equal 2, value.length
58
58
  end
59
-
59
+
60
60
  should "use populate keys when extracting keys" do
61
61
  value = VirtualBox::StorageController.new(0, @caller, @data)
62
62
  assert_equal "foo", value.name
63
63
  assert_equal 7, value.max_ports
64
64
  end
65
-
65
+
66
66
  should "call populate attributes with the merged populate data" do
67
67
  VirtualBox::StorageController.any_instance.expects(:extract_devices).returns({ :name => "BAR" })
68
68
  value = VirtualBox::StorageController.new(0, @caller, @data)
69
69
  assert_equal "BAR", value.name
70
70
  end
71
71
  end
72
-
72
+
73
73
  context "extracting related device info" do
74
74
  setup do
75
75
  @controller = VirtualBox::StorageController.new(0, @caller, @data)
76
76
  end
77
-
77
+
78
78
  should "extract only those keys related to current controller name" do
79
79
  data = @controller.extract_devices(0, @data)
80
80
  assert data
81
81
  assert data.has_key?(:"foo-0-0")
82
82
  assert data.has_key?(:"foo-1-0")
83
83
  assert !data.has_key?(:"bar-0-0")
84
-
84
+
85
85
  data = @controller.extract_devices(1, @data)
86
86
  assert data
87
87
  assert !data.has_key?(:"foo-0-0")