virtualbox 0.5.4 → 0.6.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.
Files changed (162) hide show
  1. data/.gitignore +2 -1
  2. data/Gemfile +1 -1
  3. data/Rakefile +1 -1
  4. data/Readme.md +5 -21
  5. data/VERSION +1 -1
  6. data/docs/WhatsNew.md +9 -47
  7. data/lib/virtualbox.rb +7 -30
  8. data/lib/virtualbox/abstract_model.rb +25 -5
  9. data/lib/virtualbox/abstract_model/attributable.rb +5 -1
  10. data/lib/virtualbox/abstract_model/dirty.rb +2 -0
  11. data/lib/virtualbox/abstract_model/interface_attributes.rb +96 -0
  12. data/lib/virtualbox/abstract_model/relatable.rb +19 -8
  13. data/lib/virtualbox/appliance.rb +59 -0
  14. data/lib/virtualbox/audio_adapter.rb +44 -0
  15. data/lib/virtualbox/bios.rb +44 -0
  16. data/lib/virtualbox/com.rb +23 -0
  17. data/lib/virtualbox/com/abstract_enum.rb +42 -0
  18. data/lib/virtualbox/com/abstract_implementer.rb +43 -0
  19. data/lib/virtualbox/com/abstract_interface.rb +165 -0
  20. data/lib/virtualbox/com/ffi/interface.rb +141 -0
  21. data/lib/virtualbox/com/ffi/interfaces.rb +42 -0
  22. data/lib/virtualbox/com/ffi/util.rb +101 -0
  23. data/lib/virtualbox/com/ffi/vboxxpcomc.rb +31 -0
  24. data/lib/virtualbox/com/ffi_interface.rb +65 -0
  25. data/lib/virtualbox/com/implementer/base.rb +52 -0
  26. data/lib/virtualbox/com/implementer/ffi.rb +350 -0
  27. data/lib/virtualbox/com/implementer/mscom.rb +165 -0
  28. data/lib/virtualbox/com/implementer/nil.rb +10 -0
  29. data/lib/virtualbox/com/interface/appliance.rb +20 -0
  30. data/lib/virtualbox/com/interface/audio_adapter.rb +13 -0
  31. data/lib/virtualbox/com/interface/audio_controller_type.rb +9 -0
  32. data/lib/virtualbox/com/interface/audio_driver_type.rb +9 -0
  33. data/lib/virtualbox/com/interface/bios_boot_menu_mode.rb +9 -0
  34. data/lib/virtualbox/com/interface/bios_settings.rb +19 -0
  35. data/lib/virtualbox/com/interface/clipboard_mode.rb +9 -0
  36. data/lib/virtualbox/com/interface/console.rb +48 -0
  37. data/lib/virtualbox/com/interface/cpu_property_type.rb +9 -0
  38. data/lib/virtualbox/com/interface/device_type.rb +9 -0
  39. data/lib/virtualbox/com/interface/dhcp_server.rb +20 -0
  40. data/lib/virtualbox/com/interface/firmware_type.rb +9 -0
  41. data/lib/virtualbox/com/interface/guest_os_type.rb +21 -0
  42. data/lib/virtualbox/com/interface/host.rb +40 -0
  43. data/lib/virtualbox/com/interface/host_network_interface.rb +28 -0
  44. data/lib/virtualbox/com/interface/host_network_interface_medium_type.rb +9 -0
  45. data/lib/virtualbox/com/interface/host_network_interface_status.rb +9 -0
  46. data/lib/virtualbox/com/interface/host_network_interface_type.rb +9 -0
  47. data/lib/virtualbox/com/interface/host_usb_device.rb +11 -0
  48. data/lib/virtualbox/com/interface/host_usb_device_filter.rb +11 -0
  49. data/lib/virtualbox/com/interface/hw_virt_ex_property_type.rb +9 -0
  50. data/lib/virtualbox/com/interface/machine.rb +103 -0
  51. data/lib/virtualbox/com/interface/machine_state.rb +12 -0
  52. data/lib/virtualbox/com/interface/medium.rb +48 -0
  53. data/lib/virtualbox/com/interface/medium_attachment.rb +16 -0
  54. data/lib/virtualbox/com/interface/medium_format.rb +16 -0
  55. data/lib/virtualbox/com/interface/medium_state.rb +9 -0
  56. data/lib/virtualbox/com/interface/medium_type.rb +9 -0
  57. data/lib/virtualbox/com/interface/medium_variant.rb +9 -0
  58. data/lib/virtualbox/com/interface/network_adapter.rb +28 -0
  59. data/lib/virtualbox/com/interface/network_adapter_type.rb +9 -0
  60. data/lib/virtualbox/com/interface/network_attachment_type.rb +9 -0
  61. data/lib/virtualbox/com/interface/nsiexception.rb +21 -0
  62. data/lib/virtualbox/com/interface/nsisupports.rb +13 -0
  63. data/lib/virtualbox/com/interface/parallel_port.rb +15 -0
  64. data/lib/virtualbox/com/interface/port_mode.rb +9 -0
  65. data/lib/virtualbox/com/interface/progress.rb +58 -0
  66. data/lib/virtualbox/com/interface/serial_port.rb +17 -0
  67. data/lib/virtualbox/com/interface/session.rb +16 -0
  68. data/lib/virtualbox/com/interface/session_state.rb +9 -0
  69. data/lib/virtualbox/com/interface/session_type.rb +9 -0
  70. data/lib/virtualbox/com/interface/shared_folder.rb +15 -0
  71. data/lib/virtualbox/com/interface/snapshot.rb +18 -0
  72. data/lib/virtualbox/com/interface/storage_bus.rb +9 -0
  73. data/lib/virtualbox/com/interface/storage_controller.rb +21 -0
  74. data/lib/virtualbox/com/interface/storage_controller_type.rb +9 -0
  75. data/lib/virtualbox/com/interface/system_properties.rb +35 -0
  76. data/lib/virtualbox/com/interface/usb_controller.rb +18 -0
  77. data/lib/virtualbox/com/interface/usb_device.rb +22 -0
  78. data/lib/virtualbox/com/interface/usb_device_filter.rb +21 -0
  79. data/lib/virtualbox/com/interface/usb_device_filter_action.rb +9 -0
  80. data/lib/virtualbox/com/interface/usb_device_state.rb +9 -0
  81. data/lib/virtualbox/com/interface/virtual_box_error_info.rb +15 -0
  82. data/lib/virtualbox/com/interface/virtual_system_description.rb +17 -0
  83. data/lib/virtualbox/com/interface/virtual_system_description_type.rb +12 -0
  84. data/lib/virtualbox/com/interface/virtual_system_description_value_type.rb +9 -0
  85. data/lib/virtualbox/com/interface/virtualbox.rb +54 -0
  86. data/lib/virtualbox/com/interface/vrdp_auth_type.rb +9 -0
  87. data/lib/virtualbox/com/interface/vrdp_server.rb +17 -0
  88. data/lib/virtualbox/com/mscom_interface.rb +22 -0
  89. data/lib/virtualbox/com/util.rb +18 -0
  90. data/lib/virtualbox/dvd.rb +7 -94
  91. data/lib/virtualbox/exceptions.rb +24 -0
  92. data/lib/virtualbox/ext/glob_loader.rb +22 -0
  93. data/lib/virtualbox/ext/logger.rb +38 -0
  94. data/lib/virtualbox/ext/platform.rb +1 -1
  95. data/lib/virtualbox/extra_data.rb +25 -37
  96. data/lib/virtualbox/forwarded_port.rb +35 -13
  97. data/lib/virtualbox/global.rb +22 -80
  98. data/lib/virtualbox/hard_drive.rb +30 -97
  99. data/lib/virtualbox/lib.rb +82 -0
  100. data/lib/virtualbox/media.rb +7 -6
  101. data/lib/virtualbox/medium.rb +138 -0
  102. data/lib/virtualbox/medium_attachment.rb +61 -0
  103. data/lib/virtualbox/network_adapter.rb +134 -0
  104. data/lib/virtualbox/shared_folder.rb +53 -78
  105. data/lib/virtualbox/storage_controller.rb +76 -20
  106. data/lib/virtualbox/system_properties.rb +74 -0
  107. data/lib/virtualbox/usb_controller.rb +55 -0
  108. data/lib/virtualbox/version.rb +15 -0
  109. data/lib/virtualbox/virtual_system_description.rb +47 -0
  110. data/lib/virtualbox/vm.rb +160 -272
  111. data/test/test_helper.rb +0 -108
  112. data/test/virtualbox/abstract_model/attributable_test.rb +7 -1
  113. data/test/virtualbox/abstract_model/dirty_test.rb +1 -1
  114. data/test/virtualbox/abstract_model/interface_attributes_test.rb +169 -0
  115. data/test/virtualbox/abstract_model/relatable_test.rb +20 -0
  116. data/test/virtualbox/abstract_model_test.rb +40 -5
  117. data/test/virtualbox/appliance_test.rb +152 -0
  118. data/test/virtualbox/audio_adapter_test.rb +83 -0
  119. data/test/virtualbox/bios_test.rb +83 -0
  120. data/test/virtualbox/com/abstract_enum_test.rb +48 -0
  121. data/test/virtualbox/com/abstract_implementer_test.rb +39 -0
  122. data/test/virtualbox/com/abstract_interface_test.rb +139 -0
  123. data/test/virtualbox/com/ffi/interface_test.rb +249 -0
  124. data/test/virtualbox/com/ffi/util_test.rb +86 -0
  125. data/test/virtualbox/com/ffi_interface_test.rb +42 -0
  126. data/test/virtualbox/com/implementer/base_test.rb +37 -0
  127. data/test/virtualbox/com/implementer/ffi_test.rb +519 -0
  128. data/test/virtualbox/com/implementer/mscom_test.rb +208 -0
  129. data/test/virtualbox/com/mscom_interface_test.rb +17 -0
  130. data/test/virtualbox/com/util_test.rb +17 -0
  131. data/test/virtualbox/dvd_test.rb +4 -95
  132. data/test/virtualbox/ext/platform_test.rb +8 -0
  133. data/test/virtualbox/extra_data_test.rb +78 -102
  134. data/test/virtualbox/forwarded_port_test.rb +57 -7
  135. data/test/virtualbox/global_test.rb +25 -115
  136. data/test/virtualbox/hard_drive_test.rb +49 -212
  137. data/test/virtualbox/lib_test.rb +93 -0
  138. data/test/virtualbox/medium_attachment_test.rb +147 -0
  139. data/test/virtualbox/medium_test.rb +192 -0
  140. data/test/virtualbox/network_adapter_test.rb +160 -0
  141. data/test/virtualbox/shared_folder_test.rb +144 -160
  142. data/test/virtualbox/storage_controller_test.rb +166 -45
  143. data/test/virtualbox/system_properties_test.rb +87 -0
  144. data/test/virtualbox/usb_controller_test.rb +104 -0
  145. data/test/virtualbox/version_test.rb +34 -0
  146. data/test/virtualbox/virtual_system_description_test.rb +61 -0
  147. data/test/virtualbox/vm_test.rb +288 -322
  148. data/test/virtualbox_test.rb +1 -9
  149. data/virtualbox.gemspec +139 -23
  150. metadata +143 -27
  151. data/lib/virtualbox/attached_device.rb +0 -249
  152. data/lib/virtualbox/command.rb +0 -109
  153. data/lib/virtualbox/image.rb +0 -137
  154. data/lib/virtualbox/nic.rb +0 -111
  155. data/lib/virtualbox/system_property.rb +0 -55
  156. data/lib/virtualbox/usb.rb +0 -72
  157. data/test/virtualbox/attached_device_test.rb +0 -303
  158. data/test/virtualbox/command_test.rb +0 -152
  159. data/test/virtualbox/image_test.rb +0 -190
  160. data/test/virtualbox/nic_test.rb +0 -76
  161. data/test/virtualbox/system_property_test.rb +0 -71
  162. data/test/virtualbox/usb_test.rb +0 -35
@@ -2,223 +2,207 @@ require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
2
 
3
3
  class SharedFolderTest < Test::Unit::TestCase
4
4
  setup do
5
- @data = {
6
- :sharedfoldernamemachinemapping1 => "foofolder",
7
- :sharedfolderpathmachinemapping1 => "/foo",
8
- :sharedfoldernamemachinemapping2 => "barfolder",
9
- :sharedfolderpathmachinemapping2 => "/bar"
10
- }
5
+ @klass = VirtualBox::SharedFolder
6
+ @interface = mock("interface")
7
+ @parent = mock("parent")
8
+ end
11
9
 
12
- @caller = mock("caller")
13
- @caller.stubs(:name).returns("foo")
10
+ context "initializing" do
11
+ should "load attributes from the machine" do
12
+ @klass.any_instance.expects(:initialize_attributes).with(@parent, @interface).once
13
+ @klass.new(@parent, @interface)
14
+ end
14
15
 
15
- VirtualBox::Command.stubs(:execute)
16
+ should "not load attributes if new record" do
17
+ @klass.any_instance.expects(:initialize_attributes).never
18
+ @klass.new
19
+ end
16
20
  end
17
21
 
18
- context "validations" do
22
+ context "initializing attributes" do
19
23
  setup do
20
- @sf = VirtualBox::SharedFolder.new
21
- @sf.name = "foo"
22
- @sf.hostpath = "bar"
23
- @sf.added_to_relationship(@caller)
24
+ @klass.any_instance.stubs(:load_interface_attributes)
25
+ @klass.any_instance.stubs(:populate_relationships)
24
26
  end
25
27
 
26
- should "be valid with all fields" do
27
- assert @sf.valid?
28
+ should "load interface attribtues" do
29
+ @klass.any_instance.expects(:load_interface_attributes).with(@interface).once
30
+ @klass.new(@parent, @interface)
28
31
  end
29
32
 
30
- should "be invalid with no name" do
31
- @sf.name = nil
32
- assert !@sf.valid?
33
+ should "setup the parent" do
34
+ instance = @klass.new(@parent, @interface)
35
+ assert_equal @parent, instance.parent
33
36
  end
34
37
 
35
- should "be invalid with no hostpath" do
36
- @sf.hostpath = nil
37
- assert !@sf.valid?
38
+ should "not be dirty" do
39
+ @instance = @klass.new(@parent, @interface)
40
+ assert !@instance.changed?
38
41
  end
39
42
 
40
- should "be invalid if not in a relationship" do
41
- @sf.write_attribute(:parent, nil)
42
- assert !@sf.valid?
43
+ should "be existing record" do
44
+ @instance = @klass.new(@parent, @interface)
45
+ assert !@instance.new_record?
43
46
  end
44
47
  end
45
48
 
46
- context "saving an existing shared folder" do
47
- setup do
48
- @value = VirtualBox::SharedFolder.populate_relationship(@caller, mock_xml_doc)
49
- @value = @value[0]
50
- @value.name = "different"
51
- assert @value.changed?
52
- end
49
+ context "class methods" do
50
+ context "populating relationship" do
51
+ setup do
52
+ @instance = mock("instance")
53
53
 
54
- should "first destroy the shared folder then recreate it" do
55
- seq = sequence("create_seq")
56
- @value.expects(:destroy).in_sequence(seq)
57
- VirtualBox::Command.expects(:vboxmanage).in_sequence(seq)
58
- assert @value.save
54
+ @klass.stubs(:new).returns(@instance)
55
+
56
+ @collection = []
57
+ @interface.stubs(:shared_folders).returns(@collection)
58
+ end
59
+
60
+ should "return a proxied collection" do
61
+ result = @klass.populate_relationship(nil, @interface)
62
+ assert result.is_a?(VirtualBox::Proxies::Collection)
63
+ end
64
+
65
+ should "call new for every shared folder" do
66
+ 5.times { |i| @collection << mock("#{i}") }
67
+
68
+ expected_result = []
69
+ new_seq = sequence("new_seq")
70
+ @collection.each do |item|
71
+ expected_value = "instance-#{item.inspect}"
72
+ @klass.expects(:new).with(nil, item).in_sequence(new_seq).returns(expected_value)
73
+ expected_result << expected_value
74
+ end
75
+
76
+ assert_equal expected_result, @klass.populate_relationship(nil, @interface)
77
+ end
59
78
  end
60
79
 
61
- should "call destroy with raise errors if set" do
62
- @value.expects(:destroy).with(true).once
63
- assert @value.save(true)
80
+ context "saving relationship" do
81
+ should "call save on each item" do
82
+ items = (1..5).to_a.collect do |i|
83
+ item = mock("item-#{i}")
84
+ item.expects(:save).once
85
+ item
86
+ end
87
+
88
+ @klass.save_relationship(nil, items)
89
+ end
64
90
  end
65
91
  end
66
92
 
67
- context "creating a new shared folder" do
93
+ context "instance methods" do
68
94
  setup do
69
- @sf = VirtualBox::SharedFolder.new
70
- @sf.name = "foo"
71
- @sf.hostpath = "bar"
72
- end
95
+ @klass.any_instance.stubs(:load_interface_attributes)
96
+ @instance = @klass.new(@parent, @interface)
73
97
 
74
- should "return false and not call vboxmanage if invalid" do
75
- VirtualBox::Command.expects(:vboxmanage).never
76
- @sf.expects(:valid?).returns(false)
77
- assert !@sf.save
78
- end
98
+ @parent_interface = mock("interface")
99
+ @parent.stubs(:interface).returns(@parent_interface)
100
+
101
+ @machine = mock("machine")
102
+ @machine.stubs(:remove_shared_folder).with(@name)
79
103
 
80
- should "raise a ValidationFailedException if invalid and raise_errors is true" do
81
- @sf.expects(:valid?).returns(false)
82
- assert_raises(VirtualBox::Exceptions::ValidationFailedException) {
83
- @sf.save(true)
84
- }
104
+ @session = mock("session")
105
+ @session.stubs(:machine).returns(@machine)
106
+
107
+ @parent.stubs(:with_open_session).yields(@session)
85
108
  end
86
109
 
87
- context "has a parent" do
110
+ context "saving" do
88
111
  setup do
89
- @sf.added_to_relationship(@caller)
90
- VirtualBox::Command.stubs(:vboxmanage)
112
+ @instance.stubs(:valid?).returns(true)
91
113
  end
92
114
 
93
- should "not call destroy since its a new record" do
94
- @sf.expects(:destroy).never
95
- assert @sf.save
115
+ should "do nothing if its not a new record and its not changed" do
116
+ assert !@instance.new_record?
117
+ assert !@instance.changed?
118
+ assert @instance.save
96
119
  end
97
120
 
98
- should "call the proper vboxcommand" do
99
- VirtualBox::Command.expects(:vboxmanage).with("sharedfolder", "add", @caller.name, "--name", @sf.name, "--hostpath", @sf.hostpath)
100
- assert @sf.save
101
- end
121
+ should "raise an exception if invalid" do
122
+ @instance.name = "foo_bar" # To set the changed flag
123
+ @instance.expects(:valid?).returns(false)
102
124
 
103
- should "return false if the command failed" do
104
- VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
105
- assert !@sf.save
125
+ assert_raises(VirtualBox::Exceptions::ValidationFailedException) {
126
+ @instance.save
127
+ }
106
128
  end
107
129
 
108
- should "return true if the command was a success" do
109
- assert @sf.save
110
- end
130
+ should "destroy then create" do
131
+ @instance.name = "foo_bar"
132
+ assert !@instance.new_record? # sanity
111
133
 
112
- should "raise an exception if true sent to save and error occured" do
113
- VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
114
- assert_raises(VirtualBox::Exceptions::CommandFailedException) {
115
- @sf.save(true)
116
- }
117
- end
134
+ save_seq = sequence("save_seq")
135
+ @instance.expects(:destroy).once.in_sequence(save_seq)
136
+ @instance.expects(:create).once.in_sequence(save_seq)
118
137
 
119
- should "not be a new record after saving" do
120
- assert @sf.new_record?
121
- assert @sf.save
122
- assert !@sf.new_record?
138
+ @instance.save
123
139
  end
124
140
 
125
- should "not be changed after saving" do
126
- assert @sf.changed?
127
- assert @sf.save
128
- assert !@sf.changed?
129
- end
130
- end
131
- end
141
+ should "just create (not destroy) if its a new record" do
142
+ @instance.new_record!
132
143
 
133
- context "constructor" do
134
- should "call initialize_for_relationship if 3 args are given" do
135
- VirtualBox::SharedFolder.any_instance.expects(:initialize_for_relationship).with(1,2,3).once
136
- VirtualBox::SharedFolder.new(1,2,3)
137
- end
144
+ @instance.expects(:destroy).never
145
+ @instance.expects(:create).once
138
146
 
139
- should "raise a NoMethodError if anything other than 0,1,or 3 arguments" do
140
- 2.upto(9) do |i|
141
- next if i == 3
142
- args = Array.new(i, "A")
143
-
144
- assert_raises(NoMethodError) {
145
- VirtualBox::SharedFolder.new(*args)
146
- }
147
+ @instance.save
147
148
  end
148
149
  end
149
150
 
150
- should "populate from a hash if one argument is given" do
151
- VirtualBox::SharedFolder.any_instance.expects(:initialize_for_data).with("HI").once
152
- VirtualBox::SharedFolder.new("HI")
153
- end
154
-
155
- context "initializing from data" do
151
+ context "creating" do
156
152
  setup do
157
- @sf = VirtualBox::SharedFolder.new({:name => "foo", :hostpath => "bar"})
158
- end
153
+ @instance.new_record!
159
154
 
160
- should "allow the use of :name and :hostpath in the hash" do
161
- assert_equal "foo", @sf.name
162
- assert_equal "bar", @sf.hostpath
163
- end
155
+ @instance.name = "foo"
156
+ @instance.host_path = "/bar"
157
+ @instance.writable = true
164
158
 
165
- should "keep the record new" do
166
- assert @sf.new_record?
159
+ @machine.stubs(:create_shared_folder)
167
160
  end
168
- end
169
- end
170
161
 
171
- context "destroying" do
172
- setup do
173
- @value = VirtualBox::SharedFolder.populate_relationship(@caller, mock_xml_doc)
174
- @value = @value[0]
175
- end
176
-
177
- should "call the proper command" do
178
- VirtualBox::Command.expects(:vboxmanage).with("sharedfolder", "remove", @caller.name, "--name", @value.name).once
179
- assert @value.destroy
180
- end
181
-
182
- should "return false if destroy failed" do
183
- VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
184
- assert !@value.destroy
185
- end
162
+ should "do nothing if its an existing record" do
163
+ @instance.existing_record!
164
+ @machine.expects(:create_shared_folder).never
165
+ @instance.create
166
+ end
186
167
 
187
- should "raise an exception if destroy failed and an error occured" do
188
- VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
189
- assert_raises(VirtualBox::Exceptions::CommandFailedException) {
190
- @value.destroy(true)
191
- }
192
- end
168
+ should "create the shared folder" do
169
+ create_seq = sequence("create_seq")
170
+ @machine.expects(:create_shared_folder).with(@instance.name, @instance.host_path, @instance.writable).once.in_sequence(create_seq)
171
+ @instance.create
172
+ end
193
173
 
194
- should "use the old name if it was changed" do
195
- @value.name = "DIFFERENT"
196
- VirtualBox::Command.expects(:vboxmanage)
197
- assert @value.destroy
198
- end
199
- end
174
+ should "not be a new record after saving" do
175
+ assert @instance.new_record?
176
+ @instance.create
177
+ assert !@instance.new_record?
178
+ end
200
179
 
201
- context "populating relationships" do
202
- setup do
203
- @value = VirtualBox::SharedFolder.populate_relationship(@caller, mock_xml_doc)
180
+ should "not be dirty after saving" do
181
+ assert @instance.changed?
182
+ @instance.create
183
+ assert !@instance.changed?
184
+ end
204
185
  end
205
186
 
206
- should "be a 'collection'" do
207
- assert @value.is_a?(VirtualBox::Proxies::Collection)
208
- end
187
+ context "destroying" do
188
+ setup do
189
+ @name = "foo"
190
+ @instance.stubs(:name).returns(@name)
191
+ @machine.stubs(:remove_shared_folder).with(@name)
192
+ end
209
193
 
210
- should "create the correct amount of objects" do
211
- assert_equal 2, @value.length
212
- end
194
+ should "destroy the shared folder on the parent" do
195
+ destroy_seq = sequence("destroy_seq")
196
+ @machine.expects(:remove_shared_folder).with(@name).in_sequence(destroy_seq)
213
197
 
214
- should "parse the proper data" do
215
- value = @value[0]
216
- assert_equal "foo", value.name
217
- assert_equal "/foo", value.hostpath
198
+ @instance.destroy
199
+ end
218
200
 
219
- value = @value[1]
220
- assert_equal "bar", value.name
221
- assert_equal "/bar", value.hostpath
201
+ should "mark as a new record" do
202
+ assert !@instance.new_record?
203
+ @instance.destroy
204
+ assert @instance.new_record?
205
+ end
222
206
  end
223
207
  end
224
208
  end
@@ -2,75 +2,196 @@ require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
2
 
3
3
  class StorageControllerTest < Test::Unit::TestCase
4
4
  setup do
5
- @data = {
6
- :storagecontrollername0 => "foo",
7
- :storagecontrollermaxportcount0 => 7,
8
- :storagecontrollername1 => "bar",
9
- :storagecontrollermaxportcount1 => 4,
10
- :"foo-0-0" => "yay",
11
- :"foo-1-0" => "again",
12
- :"bar-0-0" => "rawr"
13
- }
14
-
15
- @caller = mock("caller")
5
+ @interface = mock("interface")
6
+ @parent = mock("parent")
7
+
8
+ @klass = VirtualBox::StorageController
16
9
  end
17
10
 
18
- context "saving" do
19
- setup do
20
- @value = VirtualBox::StorageController.populate_relationship(@caller, mock_xml_doc)
21
- @value = @value[0]
11
+ context "class methods" do
12
+ context "populating relationship" do
13
+ setup do
14
+ # Defaulting for non-specified parameters
15
+ @interface.stubs(:is_a?).returns(false)
16
+ end
17
+
18
+ should "populate array relationship if IMachine is given" do
19
+ @interface.expects(:is_a?).with(VirtualBox::COM::Interface::Machine).returns(true)
20
+ @klass.expects(:populate_array_relationship).once.with(@parent, @interface)
21
+ @klass.populate_relationship(@parent, @interface)
22
+ end
23
+
24
+ should "populate attachment relationship if MediumAttachment is given" do
25
+ @interface.expects(:is_a?).with(VirtualBox::MediumAttachment).returns(true)
26
+ @klass.expects(:populate_attachment_relationship).once.with(@parent, @interface)
27
+ @klass.populate_relationship(@parent, @interface)
28
+ end
29
+ end
30
+
31
+ context "populating array (has many) relationship" do
32
+ setup do
33
+ @instance = mock("instance")
34
+
35
+ @interface.stubs(:storage_controllers).returns([])
36
+
37
+ @klass.stubs(:device_type).returns(:all)
38
+ @klass.stubs(:new).returns(@instance)
39
+ end
40
+
41
+ def mock_controller(name)
42
+ controller = mock(name)
43
+ controller
44
+ end
45
+
46
+ should "return a proxied collection" do
47
+ result = @klass.populate_array_relationship(nil, @interface)
48
+ assert result.is_a?(VirtualBox::Proxies::Collection)
49
+ end
50
+
51
+ should "call new for every medium if device type is all" do
52
+ controllers = []
53
+ @interface.stubs(:storage_controllers).returns(controllers)
54
+ 5.times { |i| controllers << mock_controller("c#{i}") }
55
+
56
+ expected_result = []
57
+ new_seq = sequence("new_seq")
58
+ controllers.each do |controller|
59
+ expected_value = "instance-#{controller.inspect}"
60
+ @klass.expects(:new).with(@parent, controller).in_sequence(new_seq).returns(expected_value)
61
+ expected_result << expected_value
62
+ end
63
+
64
+ assert_equal expected_result, @klass.populate_array_relationship(@parent, @interface)
65
+ end
66
+ end
67
+
68
+ context "populating relationship for a MediumAttachment" do
69
+ setup do
70
+ @controllers = []
71
+
72
+ @machine = mock("machine")
73
+ @machine.stubs(:storage_controllers).returns(@controllers)
74
+
75
+ @interface.stubs(:parent).returns(@machine)
76
+ end
77
+
78
+ should "return nil if no controllers match" do
79
+ assert_nil @klass.populate_attachment_relationship(@parent, @interface)
80
+ end
81
+
82
+ should "return the controller with matching name" do
83
+ name = :foo
84
+ @interface.stubs(:controller_name).returns(name)
85
+
86
+ controller = mock("controller")
87
+ controller.stubs(:name).returns(:foo)
88
+ @controllers << controller
89
+
90
+ assert_equal controller, @klass.populate_attachment_relationship(@parent, @interface)
91
+ end
22
92
  end
23
93
 
24
- should "save relationship" do
25
- VirtualBox::AttachedDevice.expects(:save_relationship).once
26
- @value.save
94
+ context "saving relationship" do
95
+ should "call save on each item" do
96
+ items = (1..5).to_a.collect do |i|
97
+ item = mock("item-#{i}")
98
+ item.expects(:save).once
99
+ item
100
+ end
101
+
102
+ @klass.save_relationship(nil, items)
103
+ end
27
104
  end
28
105
  end
29
106
 
30
- context "destroying" do
107
+ context "initializing" do
31
108
  setup do
32
- @value = VirtualBox::StorageController.populate_relationship(@caller, mock_xml_doc)
33
- @value = @value[0]
109
+ @klass.any_instance.stubs(:load_interface_attributes)
34
110
  end
35
111
 
36
- should "simply call destroy on each object when destroying the relationship" do
37
- obj_one = mock("one")
38
- obj_two = mock("two")
112
+ should "load interface attribtues" do
113
+ @klass.any_instance.expects(:load_interface_attributes).with(@interface).once
114
+ @klass.new(@parent, @interface)
115
+ end
39
116
 
40
- obj_one.expects(:destroy).with("HELLO").once
41
- obj_two.expects(:destroy).with("HELLO").once
117
+ should "not be dirty" do
118
+ @instance = @klass.new(@parent, @interface)
119
+ assert !@instance.changed?
120
+ end
42
121
 
43
- VirtualBox::StorageController.destroy_relationship(self, [obj_one, obj_two], "HELLO")
122
+ should "be existing record" do
123
+ @instance = @klass.new(@parent, @interface)
124
+ assert !@instance.new_record?
44
125
  end
45
126
 
46
- should "call destroy_relationship on AttachedDevices when destroyed" do
47
- assert !@value.devices.empty?
127
+ should "setup parent" do
128
+ @instance = @klass.new(@parent, @interface)
129
+ assert_equal @parent, @instance.parent
130
+ end
48
131
 
49
- VirtualBox::AttachedDevice.expects(:destroy_relationship).once
50
- @value.destroy
132
+ should "setup interface" do
133
+ @instance = @klass.new(@parent, @interface)
134
+ assert_equal @interface, @instance.interface
51
135
  end
52
136
  end
53
137
 
54
- context "populating relationships" do
138
+ context "instance methods" do
55
139
  setup do
56
- @sc = mock_xml_doc.css("StorageControllers StorageController").first
57
- end
140
+ @klass.any_instance.stubs(:load_interface_attributes)
58
141
 
59
- should "create a collection proxy" do
60
- value = VirtualBox::StorageController.populate_relationship(@caller, mock_xml_doc)
61
- assert value.is_a?(VirtualBox::Proxies::Collection)
142
+ @parent = mock("parent")
143
+ @interface = mock("interface")
144
+ @instance = @klass.new(@parent, @interface)
62
145
  end
63
146
 
64
- should "create the correct amount of objects" do
65
- value = VirtualBox::StorageController.populate_relationship(@caller, mock_xml_doc)
66
- assert_equal 1, value.length
147
+ context "medium attachments" do
148
+ setup do
149
+ @medium_attachments = []
150
+ @parent.stubs(:medium_attachments).returns(@medium_attachments)
151
+ end
152
+
153
+ def mock_medium_attachment(sc)
154
+ ma = mock("ma-#{sc.inspect}")
155
+ ma.stubs(:storage_controller).returns(sc)
156
+ ma
157
+ end
158
+
159
+ should "return all medium attachments which match the storage controller" do
160
+ foo_ma = mock_medium_attachment(@instance)
161
+ @medium_attachments << foo_ma
162
+ @medium_attachments << mock_medium_attachment(:bar)
163
+
164
+ assert_equal [foo_ma], @instance.medium_attachments
165
+ end
67
166
  end
68
167
 
69
- should "use populate keys when extracting keys" do
70
- value = VirtualBox::StorageController.new(0, @caller, @sc)
71
- assert_equal "foo", value.name
72
- assert_equal "2", value.ports
73
- assert_equal "PIIX4", value.type
168
+ context "destroying" do
169
+ setup do
170
+ @ma = []
171
+ @instance.stubs(:medium_attachments).returns(@ma)
172
+
173
+ @machine = mock("machine")
174
+ @session = mock("session")
175
+ @session.stubs(:machine).returns(@machine)
176
+ @parent.stubs(:with_open_session).yields(@session)
177
+ end
178
+
179
+ should "remove all the attachments" do
180
+ ma = mock("medium_attachment")
181
+ @ma << ma
182
+
183
+ destroy_seq = sequence("destroy_seq")
184
+ ma.expects(:destroy).with(1,2,3).once.in_sequence(destroy_seq)
185
+ @machine.expects(:remove_storage_controller).with(@instance.name).in_sequence(destroy_seq)
186
+
187
+ @instance.destroy(1,2,3)
188
+ end
189
+
190
+ should "remove from the parent and save" do
191
+ destroy_seq = sequence("destroy_seq")
192
+ @machine.expects(:remove_storage_controller).with(@instance.name).in_sequence(destroy_seq)
193
+ @instance.destroy
194
+ end
74
195
  end
75
196
  end
76
197
  end