bbrowning-virtualbox 0.7.6.dev

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 (281) hide show
  1. data/.gitignore +8 -0
  2. data/.yardopts +3 -0
  3. data/Gemfile +16 -0
  4. data/LICENSE +19 -0
  5. data/Rakefile +33 -0
  6. data/Readme.md +70 -0
  7. data/docs/GettingStarted.md +196 -0
  8. data/docs/WhatsNew.md +12 -0
  9. data/features/README.md +33 -0
  10. data/features/global.feature +19 -0
  11. data/features/global_extra_data.feature +27 -0
  12. data/features/step_definitions/abstract_model_steps.rb +39 -0
  13. data/features/step_definitions/extra_data_steps.rb +36 -0
  14. data/features/step_definitions/global_steps.rb +29 -0
  15. data/features/step_definitions/nat_engine_steps.rb +76 -0
  16. data/features/step_definitions/network_adapter_steps.rb +38 -0
  17. data/features/step_definitions/shared_folder_steps.rb +76 -0
  18. data/features/step_definitions/snapshot_steps.rb +74 -0
  19. data/features/step_definitions/storage_controller_steps.rb +16 -0
  20. data/features/step_definitions/virtualbox_steps.rb +17 -0
  21. data/features/step_definitions/vm_steps.rb +50 -0
  22. data/features/support/env.rb +61 -0
  23. data/features/support/helpers.rb +38 -0
  24. data/features/support/hooks.rb +30 -0
  25. data/features/support/ordered_hash.rb +49 -0
  26. data/features/support/vboxmanage.rb +191 -0
  27. data/features/version.feature +16 -0
  28. data/features/vm.feature +13 -0
  29. data/features/vm_bios.feature +29 -0
  30. data/features/vm_cpu.feature +29 -0
  31. data/features/vm_extra_data.feature +35 -0
  32. data/features/vm_hw_virt.feature +29 -0
  33. data/features/vm_nat_engine.feature +57 -0
  34. data/features/vm_network_adapters.feature +27 -0
  35. data/features/vm_shared_folders.feature +42 -0
  36. data/features/vm_snapshots.feature +29 -0
  37. data/features/vm_storage_controllers.feature +11 -0
  38. data/lib/virtualbox.rb +11 -0
  39. data/lib/virtualbox/abstract_model.rb +281 -0
  40. data/lib/virtualbox/abstract_model/attributable.rb +290 -0
  41. data/lib/virtualbox/abstract_model/dirty.rb +177 -0
  42. data/lib/virtualbox/abstract_model/interface_attributes.rb +98 -0
  43. data/lib/virtualbox/abstract_model/relatable.rb +332 -0
  44. data/lib/virtualbox/abstract_model/validatable.rb +167 -0
  45. data/lib/virtualbox/abstract_model/version_matcher.rb +35 -0
  46. data/lib/virtualbox/appliance.rb +62 -0
  47. data/lib/virtualbox/audio_adapter.rb +52 -0
  48. data/lib/virtualbox/bios.rb +50 -0
  49. data/lib/virtualbox/com.rb +23 -0
  50. data/lib/virtualbox/com/abstract_enum.rb +43 -0
  51. data/lib/virtualbox/com/abstract_implementer.rb +45 -0
  52. data/lib/virtualbox/com/abstract_interface.rb +167 -0
  53. data/lib/virtualbox/com/base_interface.rb +38 -0
  54. data/lib/virtualbox/com/ffi/interface.rb +150 -0
  55. data/lib/virtualbox/com/ffi/interfaces.rb +54 -0
  56. data/lib/virtualbox/com/ffi/util.rb +119 -0
  57. data/lib/virtualbox/com/ffi/vboxxpcomc.rb +31 -0
  58. data/lib/virtualbox/com/ffi_interface.rb +96 -0
  59. data/lib/virtualbox/com/implementer/base.rb +59 -0
  60. data/lib/virtualbox/com/implementer/ffi.rb +361 -0
  61. data/lib/virtualbox/com/implementer/mscom.rb +175 -0
  62. data/lib/virtualbox/com/implementer/nil.rb +10 -0
  63. data/lib/virtualbox/com/interface/3.1.x/access_mode.rb +11 -0
  64. data/lib/virtualbox/com/interface/3.1.x/appliance.rb +22 -0
  65. data/lib/virtualbox/com/interface/3.1.x/audio_adapter.rb +15 -0
  66. data/lib/virtualbox/com/interface/3.1.x/audio_controller_type.rb +11 -0
  67. data/lib/virtualbox/com/interface/3.1.x/audio_driver_type.rb +11 -0
  68. data/lib/virtualbox/com/interface/3.1.x/bios_boot_menu_mode.rb +11 -0
  69. data/lib/virtualbox/com/interface/3.1.x/bios_settings.rb +21 -0
  70. data/lib/virtualbox/com/interface/3.1.x/clipboard_mode.rb +11 -0
  71. data/lib/virtualbox/com/interface/3.1.x/console.rb +50 -0
  72. data/lib/virtualbox/com/interface/3.1.x/cpu_property_type.rb +11 -0
  73. data/lib/virtualbox/com/interface/3.1.x/device_type.rb +11 -0
  74. data/lib/virtualbox/com/interface/3.1.x/dhcp_server.rb +22 -0
  75. data/lib/virtualbox/com/interface/3.1.x/firmware_type.rb +11 -0
  76. data/lib/virtualbox/com/interface/3.1.x/guest_os_type.rb +23 -0
  77. data/lib/virtualbox/com/interface/3.1.x/host.rb +42 -0
  78. data/lib/virtualbox/com/interface/3.1.x/host_network_interface.rb +30 -0
  79. data/lib/virtualbox/com/interface/3.1.x/host_network_interface_medium_type.rb +11 -0
  80. data/lib/virtualbox/com/interface/3.1.x/host_network_interface_status.rb +11 -0
  81. data/lib/virtualbox/com/interface/3.1.x/host_network_interface_type.rb +11 -0
  82. data/lib/virtualbox/com/interface/3.1.x/host_usb_device.rb +13 -0
  83. data/lib/virtualbox/com/interface/3.1.x/host_usb_device_filter.rb +13 -0
  84. data/lib/virtualbox/com/interface/3.1.x/hw_virt_ex_property_type.rb +11 -0
  85. data/lib/virtualbox/com/interface/3.1.x/machine.rb +105 -0
  86. data/lib/virtualbox/com/interface/3.1.x/machine_state.rb +14 -0
  87. data/lib/virtualbox/com/interface/3.1.x/medium.rb +50 -0
  88. data/lib/virtualbox/com/interface/3.1.x/medium_attachment.rb +18 -0
  89. data/lib/virtualbox/com/interface/3.1.x/medium_format.rb +18 -0
  90. data/lib/virtualbox/com/interface/3.1.x/medium_state.rb +11 -0
  91. data/lib/virtualbox/com/interface/3.1.x/medium_type.rb +11 -0
  92. data/lib/virtualbox/com/interface/3.1.x/medium_variant.rb +11 -0
  93. data/lib/virtualbox/com/interface/3.1.x/network_adapter.rb +30 -0
  94. data/lib/virtualbox/com/interface/3.1.x/network_adapter_type.rb +11 -0
  95. data/lib/virtualbox/com/interface/3.1.x/network_attachment_type.rb +11 -0
  96. data/lib/virtualbox/com/interface/3.1.x/nsiexception.rb +23 -0
  97. data/lib/virtualbox/com/interface/3.1.x/nsisupports.rb +15 -0
  98. data/lib/virtualbox/com/interface/3.1.x/parallel_port.rb +17 -0
  99. data/lib/virtualbox/com/interface/3.1.x/port_mode.rb +11 -0
  100. data/lib/virtualbox/com/interface/3.1.x/progress.rb +63 -0
  101. data/lib/virtualbox/com/interface/3.1.x/serial_port.rb +19 -0
  102. data/lib/virtualbox/com/interface/3.1.x/session.rb +18 -0
  103. data/lib/virtualbox/com/interface/3.1.x/session_state.rb +11 -0
  104. data/lib/virtualbox/com/interface/3.1.x/session_type.rb +11 -0
  105. data/lib/virtualbox/com/interface/3.1.x/shared_folder.rb +17 -0
  106. data/lib/virtualbox/com/interface/3.1.x/snapshot.rb +20 -0
  107. data/lib/virtualbox/com/interface/3.1.x/storage_bus.rb +11 -0
  108. data/lib/virtualbox/com/interface/3.1.x/storage_controller.rb +23 -0
  109. data/lib/virtualbox/com/interface/3.1.x/storage_controller_type.rb +11 -0
  110. data/lib/virtualbox/com/interface/3.1.x/system_properties.rb +37 -0
  111. data/lib/virtualbox/com/interface/3.1.x/usb_controller.rb +20 -0
  112. data/lib/virtualbox/com/interface/3.1.x/usb_device.rb +24 -0
  113. data/lib/virtualbox/com/interface/3.1.x/usb_device_filter.rb +23 -0
  114. data/lib/virtualbox/com/interface/3.1.x/usb_device_filter_action.rb +11 -0
  115. data/lib/virtualbox/com/interface/3.1.x/usb_device_state.rb +11 -0
  116. data/lib/virtualbox/com/interface/3.1.x/virtual_box_error_info.rb +17 -0
  117. data/lib/virtualbox/com/interface/3.1.x/virtual_system_description.rb +19 -0
  118. data/lib/virtualbox/com/interface/3.1.x/virtual_system_description_type.rb +14 -0
  119. data/lib/virtualbox/com/interface/3.1.x/virtual_system_description_value_type.rb +11 -0
  120. data/lib/virtualbox/com/interface/3.1.x/virtualbox.rb +67 -0
  121. data/lib/virtualbox/com/interface/3.1.x/vrdp_auth_type.rb +11 -0
  122. data/lib/virtualbox/com/interface/3.1.x/vrdp_server.rb +19 -0
  123. data/lib/virtualbox/com/interface/3.2.x/access_mode.rb +11 -0
  124. data/lib/virtualbox/com/interface/3.2.x/appliance.rb +22 -0
  125. data/lib/virtualbox/com/interface/3.2.x/audio_adapter.rb +15 -0
  126. data/lib/virtualbox/com/interface/3.2.x/audio_controller_type.rb +11 -0
  127. data/lib/virtualbox/com/interface/3.2.x/audio_driver_type.rb +11 -0
  128. data/lib/virtualbox/com/interface/3.2.x/bios_boot_menu_mode.rb +11 -0
  129. data/lib/virtualbox/com/interface/3.2.x/bios_settings.rb +21 -0
  130. data/lib/virtualbox/com/interface/3.2.x/clipboard_mode.rb +11 -0
  131. data/lib/virtualbox/com/interface/3.2.x/console.rb +50 -0
  132. data/lib/virtualbox/com/interface/3.2.x/cpu_property_type.rb +11 -0
  133. data/lib/virtualbox/com/interface/3.2.x/device_type.rb +11 -0
  134. data/lib/virtualbox/com/interface/3.2.x/dhcp_server.rb +22 -0
  135. data/lib/virtualbox/com/interface/3.2.x/firmware_type.rb +11 -0
  136. data/lib/virtualbox/com/interface/3.2.x/guest.rb +13 -0
  137. data/lib/virtualbox/com/interface/3.2.x/guest_os_type.rb +33 -0
  138. data/lib/virtualbox/com/interface/3.2.x/host.rb +43 -0
  139. data/lib/virtualbox/com/interface/3.2.x/host_network_interface.rb +30 -0
  140. data/lib/virtualbox/com/interface/3.2.x/host_network_interface_medium_type.rb +11 -0
  141. data/lib/virtualbox/com/interface/3.2.x/host_network_interface_status.rb +11 -0
  142. data/lib/virtualbox/com/interface/3.2.x/host_network_interface_type.rb +11 -0
  143. data/lib/virtualbox/com/interface/3.2.x/host_usb_device.rb +13 -0
  144. data/lib/virtualbox/com/interface/3.2.x/host_usb_device_filter.rb +13 -0
  145. data/lib/virtualbox/com/interface/3.2.x/hw_virt_ex_property_type.rb +11 -0
  146. data/lib/virtualbox/com/interface/3.2.x/keyboard_hid_type.rb +11 -0
  147. data/lib/virtualbox/com/interface/3.2.x/machine.rb +118 -0
  148. data/lib/virtualbox/com/interface/3.2.x/machine_state.rb +14 -0
  149. data/lib/virtualbox/com/interface/3.2.x/medium.rb +51 -0
  150. data/lib/virtualbox/com/interface/3.2.x/medium_attachment.rb +18 -0
  151. data/lib/virtualbox/com/interface/3.2.x/medium_format.rb +18 -0
  152. data/lib/virtualbox/com/interface/3.2.x/medium_state.rb +11 -0
  153. data/lib/virtualbox/com/interface/3.2.x/medium_type.rb +11 -0
  154. data/lib/virtualbox/com/interface/3.2.x/medium_variant.rb +11 -0
  155. data/lib/virtualbox/com/interface/3.2.x/nat_alias_mode.rb +11 -0
  156. data/lib/virtualbox/com/interface/3.2.x/nat_engine.rb +27 -0
  157. data/lib/virtualbox/com/interface/3.2.x/nat_protocol.rb +11 -0
  158. data/lib/virtualbox/com/interface/3.2.x/network_adapter.rb +34 -0
  159. data/lib/virtualbox/com/interface/3.2.x/network_adapter_type.rb +11 -0
  160. data/lib/virtualbox/com/interface/3.2.x/network_attachment_type.rb +11 -0
  161. data/lib/virtualbox/com/interface/3.2.x/nsiexception.rb +23 -0
  162. data/lib/virtualbox/com/interface/3.2.x/nsisupports.rb +15 -0
  163. data/lib/virtualbox/com/interface/3.2.x/parallel_port.rb +17 -0
  164. data/lib/virtualbox/com/interface/3.2.x/pointing_hid_type.rb +11 -0
  165. data/lib/virtualbox/com/interface/3.2.x/port_mode.rb +11 -0
  166. data/lib/virtualbox/com/interface/3.2.x/progress.rb +63 -0
  167. data/lib/virtualbox/com/interface/3.2.x/serial_port.rb +19 -0
  168. data/lib/virtualbox/com/interface/3.2.x/session.rb +18 -0
  169. data/lib/virtualbox/com/interface/3.2.x/session_state.rb +11 -0
  170. data/lib/virtualbox/com/interface/3.2.x/session_type.rb +11 -0
  171. data/lib/virtualbox/com/interface/3.2.x/shared_folder.rb +17 -0
  172. data/lib/virtualbox/com/interface/3.2.x/snapshot.rb +20 -0
  173. data/lib/virtualbox/com/interface/3.2.x/storage_bus.rb +11 -0
  174. data/lib/virtualbox/com/interface/3.2.x/storage_controller.rb +24 -0
  175. data/lib/virtualbox/com/interface/3.2.x/storage_controller_type.rb +11 -0
  176. data/lib/virtualbox/com/interface/3.2.x/system_properties.rb +42 -0
  177. data/lib/virtualbox/com/interface/3.2.x/usb_controller.rb +21 -0
  178. data/lib/virtualbox/com/interface/3.2.x/usb_device.rb +24 -0
  179. data/lib/virtualbox/com/interface/3.2.x/usb_device_filter.rb +23 -0
  180. data/lib/virtualbox/com/interface/3.2.x/usb_device_filter_action.rb +11 -0
  181. data/lib/virtualbox/com/interface/3.2.x/usb_device_state.rb +11 -0
  182. data/lib/virtualbox/com/interface/3.2.x/virtual_box_error_info.rb +17 -0
  183. data/lib/virtualbox/com/interface/3.2.x/virtual_system_description.rb +19 -0
  184. data/lib/virtualbox/com/interface/3.2.x/virtual_system_description_type.rb +14 -0
  185. data/lib/virtualbox/com/interface/3.2.x/virtual_system_description_value_type.rb +11 -0
  186. data/lib/virtualbox/com/interface/3.2.x/virtualbox.rb +67 -0
  187. data/lib/virtualbox/com/interface/3.2.x/vrdp_auth_type.rb +11 -0
  188. data/lib/virtualbox/com/interface/3.2.x/vrdp_server.rb +21 -0
  189. data/lib/virtualbox/com/mscom_interface.rb +44 -0
  190. data/lib/virtualbox/com/nil_interface.rb +7 -0
  191. data/lib/virtualbox/com/util.rb +32 -0
  192. data/lib/virtualbox/cpu.rb +61 -0
  193. data/lib/virtualbox/dhcp_server.rb +89 -0
  194. data/lib/virtualbox/dvd.rb +27 -0
  195. data/lib/virtualbox/exceptions.rb +39 -0
  196. data/lib/virtualbox/ext/byte_normalizer.rb +17 -0
  197. data/lib/virtualbox/ext/glob_loader.rb +22 -0
  198. data/lib/virtualbox/ext/logger.rb +38 -0
  199. data/lib/virtualbox/ext/platform.rb +27 -0
  200. data/lib/virtualbox/ext/subclass_listing.rb +24 -0
  201. data/lib/virtualbox/extra_data.rb +127 -0
  202. data/lib/virtualbox/forwarded_port.rb +222 -0
  203. data/lib/virtualbox/global.rb +102 -0
  204. data/lib/virtualbox/guest_property.rb +116 -0
  205. data/lib/virtualbox/hard_drive.rb +246 -0
  206. data/lib/virtualbox/host.rb +71 -0
  207. data/lib/virtualbox/host_network_interface.rb +137 -0
  208. data/lib/virtualbox/hw_virtualization.rb +63 -0
  209. data/lib/virtualbox/lib.rb +84 -0
  210. data/lib/virtualbox/media.rb +20 -0
  211. data/lib/virtualbox/medium.rb +145 -0
  212. data/lib/virtualbox/medium_attachment.rb +61 -0
  213. data/lib/virtualbox/nat_engine.rb +71 -0
  214. data/lib/virtualbox/nat_forwarded_port.rb +171 -0
  215. data/lib/virtualbox/network_adapter.rb +166 -0
  216. data/lib/virtualbox/proxies/collection.rb +57 -0
  217. data/lib/virtualbox/shared_folder.rb +220 -0
  218. data/lib/virtualbox/snapshot.rb +185 -0
  219. data/lib/virtualbox/storage_controller.rb +160 -0
  220. data/lib/virtualbox/system_properties.rb +74 -0
  221. data/lib/virtualbox/usb_controller.rb +59 -0
  222. data/lib/virtualbox/usb_device_filter.rb +74 -0
  223. data/lib/virtualbox/version.rb +36 -0
  224. data/lib/virtualbox/virtual_system_description.rb +47 -0
  225. data/lib/virtualbox/vm.rb +684 -0
  226. data/lib/virtualbox/vrdp_server.rb +59 -0
  227. data/test/test_helper.rb +18 -0
  228. data/test/virtualbox/abstract_model/attributable_test.rb +269 -0
  229. data/test/virtualbox/abstract_model/dirty_test.rb +83 -0
  230. data/test/virtualbox/abstract_model/interface_attributes_test.rb +194 -0
  231. data/test/virtualbox/abstract_model/relatable_test.rb +348 -0
  232. data/test/virtualbox/abstract_model/validatable_test.rb +308 -0
  233. data/test/virtualbox/abstract_model/version_matcher_test.rb +41 -0
  234. data/test/virtualbox/abstract_model_test.rb +462 -0
  235. data/test/virtualbox/appliance_test.rb +159 -0
  236. data/test/virtualbox/audio_adapter_test.rb +83 -0
  237. data/test/virtualbox/bios_test.rb +83 -0
  238. data/test/virtualbox/com/abstract_enum_test.rb +49 -0
  239. data/test/virtualbox/com/abstract_implementer_test.rb +40 -0
  240. data/test/virtualbox/com/abstract_interface_test.rb +140 -0
  241. data/test/virtualbox/com/ffi/interface_test.rb +249 -0
  242. data/test/virtualbox/com/ffi/util_test.rb +108 -0
  243. data/test/virtualbox/com/ffi_interface_test.rb +42 -0
  244. data/test/virtualbox/com/implementer/base_test.rb +38 -0
  245. data/test/virtualbox/com/implementer/ffi_test.rb +527 -0
  246. data/test/virtualbox/com/implementer/mscom_test.rb +247 -0
  247. data/test/virtualbox/com/mscom_interface_test.rb +17 -0
  248. data/test/virtualbox/com/util_test.rb +17 -0
  249. data/test/virtualbox/cpu_test.rb +103 -0
  250. data/test/virtualbox/dhcp_server_test.rb +165 -0
  251. data/test/virtualbox/dvd_test.rb +28 -0
  252. data/test/virtualbox/ext/byte_normalizer_test.rb +34 -0
  253. data/test/virtualbox/ext/platform_test.rb +50 -0
  254. data/test/virtualbox/ext/subclass_listing_test.rb +25 -0
  255. data/test/virtualbox/extra_data_test.rb +155 -0
  256. data/test/virtualbox/forwarded_port_test.rb +286 -0
  257. data/test/virtualbox/global_test.rb +46 -0
  258. data/test/virtualbox/hard_drive_test.rb +141 -0
  259. data/test/virtualbox/host_network_interface_test.rb +254 -0
  260. data/test/virtualbox/host_test.rb +94 -0
  261. data/test/virtualbox/hw_virtualization_test.rb +103 -0
  262. data/test/virtualbox/lib_test.rb +93 -0
  263. data/test/virtualbox/medium_attachment_test.rb +147 -0
  264. data/test/virtualbox/medium_test.rb +192 -0
  265. data/test/virtualbox/nat_engine_test.rb +106 -0
  266. data/test/virtualbox/nat_forwarded_port_test.rb +222 -0
  267. data/test/virtualbox/network_adapter_test.rb +191 -0
  268. data/test/virtualbox/proxies/collection_test.rb +102 -0
  269. data/test/virtualbox/shared_folder_test.rb +219 -0
  270. data/test/virtualbox/snapshot_test.rb +231 -0
  271. data/test/virtualbox/storage_controller_test.rb +197 -0
  272. data/test/virtualbox/system_properties_test.rb +87 -0
  273. data/test/virtualbox/usb_controller_test.rb +112 -0
  274. data/test/virtualbox/usb_device_filter_test.rb +93 -0
  275. data/test/virtualbox/version_test.rb +59 -0
  276. data/test/virtualbox/virtual_system_description_test.rb +61 -0
  277. data/test/virtualbox/vm_test.rb +637 -0
  278. data/test/virtualbox/vrdp_server_test.rb +83 -0
  279. data/test/virtualbox_test.rb +11 -0
  280. data/virtualbox.gemspec +25 -0
  281. metadata +397 -0
@@ -0,0 +1,59 @@
1
+ require File.expand_path("../../test_helper", __FILE__)
2
+
3
+ class VersionTest < Test::Unit::TestCase
4
+ module VersionTestMod
5
+ extend VirtualBox::Version
6
+ end
7
+
8
+ setup do
9
+ @lib = mock("lib")
10
+ @vbox = mock("vbox")
11
+
12
+ VirtualBox::Lib.stubs(:lib).returns(@lib)
13
+ @lib.stubs(:virtualbox).returns(@vbox)
14
+
15
+ @module = VersionTestMod
16
+ end
17
+
18
+ context "checking if supported version of VirtualBox" do
19
+ should "return true if version is not nil" do
20
+ @module.stubs(:version).returns(:foo)
21
+ assert @module.supported?
22
+ end
23
+
24
+ should "return false if version is nil" do
25
+ @module.stubs(:version).returns(nil)
26
+ assert !@module.supported?
27
+ end
28
+ end
29
+
30
+ should "return the version" do
31
+ version = mock("version")
32
+ @vbox.expects(:version).returns(version)
33
+ assert_equal version, @module.version(true)
34
+ end
35
+
36
+ should "cache the version" do
37
+ @vbox.expects(:version).once.returns("v")
38
+ assert_equal "v", @module.version(true)
39
+ assert_equal "v", @module.version
40
+ assert_equal "v", @module.version
41
+ end
42
+
43
+ should "return nil if an error occurs" do
44
+ @vbox.expects(:version).raises(LoadError)
45
+ assert @module.version(true).nil?
46
+ end
47
+
48
+ should "return the revision" do
49
+ @vbox.expects(:revision).returns(7)
50
+ assert_equal "7", @module.revision(true)
51
+ end
52
+
53
+ should "cache the revision" do
54
+ @vbox.expects(:revision).once.returns(7)
55
+ assert_equal "7", @module.revision(true)
56
+ assert_equal "7", @module.revision
57
+ assert_equal "7", @module.revision
58
+ end
59
+ end
@@ -0,0 +1,61 @@
1
+ require File.expand_path("../../test_helper", __FILE__)
2
+
3
+ class VirtualSystemDescriptionTest < Test::Unit::TestCase
4
+ setup do
5
+ @klass = VirtualBox::VirtualSystemDescription
6
+ @interface = mock("interface")
7
+ end
8
+
9
+ context "class methods" do
10
+ context "populating relationship" do
11
+ setup do
12
+ @instance = mock("instance")
13
+
14
+ @klass.stubs(:new).returns(@instance)
15
+ end
16
+
17
+ should "return a proxied collection" do
18
+ result = @klass.populate_relationship(nil, [])
19
+ assert result.is_a?(VirtualBox::Proxies::Collection)
20
+ end
21
+
22
+ should "call new for every description" do
23
+ interfaces = []
24
+ 5.times { |i| interfaces << mock("i#{i}") }
25
+
26
+ expected_result = []
27
+ new_seq = sequence("new_seq")
28
+ interfaces.each do |interface|
29
+ expected_value = "instance-#{interface.inspect}"
30
+ @klass.expects(:new).with(interface).in_sequence(new_seq).returns(expected_value)
31
+ expected_result << expected_value
32
+ end
33
+
34
+ assert_equal expected_result, @klass.populate_relationship(nil, interfaces)
35
+ end
36
+ end
37
+ end
38
+
39
+ context "initializing" do
40
+ should "load attributes from the machine" do
41
+ @klass.any_instance.expects(:initialize_attributes).with(@interface).once
42
+ @klass.new(@interface)
43
+ end
44
+ end
45
+
46
+ context "initializing attributes" do
47
+ setup do
48
+ @interface.stubs(:get_values_by_type).returns(nil)
49
+ end
50
+
51
+ should "not be dirty" do
52
+ @instance = @klass.new(@interface)
53
+ assert !@instance.changed?
54
+ end
55
+
56
+ should "be existing record" do
57
+ @instance = @klass.new(@interface)
58
+ assert !@instance.new_record?
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,637 @@
1
+ require File.expand_path("../../test_helper", __FILE__)
2
+
3
+ class VMTest < Test::Unit::TestCase
4
+ setup do
5
+ @klass = VirtualBox::VM
6
+ @interface = mock("interface")
7
+ @parent = mock("parent")
8
+ end
9
+
10
+ context "class methods" do
11
+ context "retrieving all machines" do
12
+ should "return an array of VM objects" do
13
+ vms = mock("vms")
14
+ global = mock("global")
15
+ global.expects(:vms).returns(vms)
16
+ VirtualBox::Global.expects(:global).returns(global)
17
+ assert_equal vms, VirtualBox::VM.all
18
+ end
19
+ end
20
+
21
+ context "finding a VM" do
22
+ setup do
23
+ @all = []
24
+ @klass.stubs(:all).returns(@all)
25
+ end
26
+
27
+ def mock_vm(uuid, name=nil)
28
+ vm = mock("vm-#{uuid}")
29
+ vm.stubs(:uuid).returns(uuid)
30
+ vm.stubs(:name).returns(name)
31
+ vm
32
+ end
33
+
34
+ should "return nil if it doesn't exist" do
35
+ @all << mock_vm("foo")
36
+ assert_nil @klass.find("bar")
37
+ end
38
+
39
+ should "return the matching vm if it is found" do
40
+ vm = mock_vm("foo")
41
+ @all << mock_vm("bar")
42
+ @all << vm
43
+ assert_equal vm, @klass.find("foo")
44
+ end
45
+
46
+ should "return if matching name is found" do
47
+ vm = mock_vm(nil, "foo")
48
+ @all << vm
49
+ assert_equal vm, @klass.find("foo")
50
+ end
51
+ end
52
+
53
+ context "importing" do
54
+ setup do
55
+ @path = "foo.rb"
56
+ @appliance = mock("appliance")
57
+ @virtual_system = mock("virtual_system")
58
+ @appliance.stubs(:virtual_systems).returns([@virtual_system])
59
+
60
+ @name = :foo
61
+ @virtual_system.stubs(:descriptions).returns({
62
+ :name => { :auto => @name }
63
+ })
64
+ end
65
+
66
+ should "create a new appliance with path, import, and return VM" do
67
+ result = mock("result")
68
+ proc = mock("proc")
69
+ VirtualBox::Appliance.expects(:new).with(@path).returns(@appliance)
70
+ @appliance.expects(:import).yields(proc)
71
+ @klass.expects(:find).with(@name).returns(result)
72
+ proc.expects(:call)
73
+
74
+ value = @klass.import(@path) do |proc|
75
+ proc.call
76
+ end
77
+
78
+ assert_equal result, value
79
+ end
80
+ end
81
+
82
+ context "populating relationships" do
83
+ setup do
84
+ @caller = mock("caller")
85
+ end
86
+
87
+ should "call populate_array_relationship for arrays" do
88
+ @klass.expects(:populate_array_relationship).with(@caller, []).once
89
+ @klass.populate_relationship(@caller, [])
90
+ end
91
+
92
+ should "call populate_single_relationship for non-arrays" do
93
+ @klass.expects(:populate_single_relationship).with(@caller, nil).once
94
+ @klass.populate_relationship(@caller, nil)
95
+ end
96
+ end
97
+
98
+ context "populating single relationships" do
99
+ setup do
100
+ @machine = mock("interface")
101
+ end
102
+
103
+ should "return a new machine" do
104
+ result = mock("result")
105
+ @klass.expects(:new).with(@machine).returns(result)
106
+ assert_equal result, @klass.populate_single_relationship(nil, @machine)
107
+ end
108
+ end
109
+
110
+ context "populating array relationship" do
111
+ setup do
112
+ @instance = mock("instance")
113
+
114
+ @klass.stubs(:new).returns(@instance)
115
+ end
116
+
117
+ should "return a proxied collection" do
118
+ result = @klass.populate_array_relationship(nil, [])
119
+ assert result.is_a?(VirtualBox::Proxies::Collection)
120
+ end
121
+
122
+ should "call new for every machine" do
123
+ machines = []
124
+ 5.times { |i| machines << mock("m#{i}") }
125
+
126
+ expected_result = []
127
+ new_seq = sequence("new_seq")
128
+ machines.each do |machine|
129
+ expected_value = "instance-#{machine.inspect}"
130
+ @klass.expects(:new).with(machine).in_sequence(new_seq).returns(expected_value)
131
+ expected_result << expected_value
132
+ end
133
+
134
+ assert_equal expected_result, @klass.populate_array_relationship(nil, machines)
135
+ end
136
+ end
137
+ end
138
+
139
+ context "initializing" do
140
+ should "load attributes from the machine" do
141
+ @klass.any_instance.expects(:initialize_attributes).with(@interface).once
142
+ @klass.new(@interface)
143
+ end
144
+ end
145
+
146
+ context "initializing attributes" do
147
+ setup do
148
+ @klass.any_instance.stubs(:load_interface_attributes)
149
+ @klass.any_instance.stubs(:populate_relationships)
150
+ end
151
+
152
+ should "load interface attribtues" do
153
+ @klass.any_instance.expects(:load_interface_attributes).with(@interface).once
154
+ @klass.new(@interface)
155
+ end
156
+
157
+ should "populate relationships" do
158
+ @klass.any_instance.expects(:populate_relationships).with(@interface).once
159
+ @klass.new(@interface)
160
+ end
161
+
162
+ should "not be dirty" do
163
+ @instance = @klass.new(@interface)
164
+ assert !@instance.changed?
165
+ end
166
+
167
+ should "be existing record" do
168
+ @instance = @klass.new(@interface)
169
+ assert !@instance.new_record?
170
+ end
171
+ end
172
+
173
+ context "instance methods" do
174
+ setup do
175
+ @klass.any_instance.stubs(:initialize_attributes)
176
+ @instance = @klass.new(@interface)
177
+ end
178
+
179
+ def setup_session_mocks
180
+ @parent = mock("parent")
181
+ @session = mock("session")
182
+ @lib = mock("lib")
183
+ @progress = mock("progress")
184
+
185
+ @session.stubs(:close)
186
+ @progress.stubs(:wait_for_completion)
187
+ @lib.stubs(:session).returns(@session)
188
+ @uuid = :foo
189
+
190
+ VirtualBox::Lib.stubs(:lib).returns(@lib)
191
+ @interface.stubs(:parent).returns(@parent)
192
+ @instance.stubs(:imachine).returns(@interface)
193
+ @instance.stubs(:uuid).returns(@uuid)
194
+ @instance.stubs(:running).returns(false)
195
+ end
196
+
197
+ context "reloading" do
198
+ setup do
199
+ @instance.stubs(:initialize_attributes)
200
+ end
201
+
202
+ should "just reload the attributes" do
203
+ @instance.expects(:initialize_attributes).with(@interface).once
204
+ @instance.reload
205
+ end
206
+
207
+ should "return itself" do
208
+ assert @instance.equal?(@instance.reload)
209
+ end
210
+ end
211
+
212
+ context "destroying" do
213
+ setup do
214
+ @instance.stubs(:uuid).returns(:foo)
215
+
216
+ @interface_parent = mock("interface_parent")
217
+ @interface.stubs(:parent).returns(@interface_parent)
218
+ end
219
+
220
+ should "destroy snapshots, relationships, then the machine" do
221
+ destroy_seq = sequence("destroy_seq")
222
+ snapshot = mock("snapshot")
223
+ snapshot.stubs(:children).returns([])
224
+ @instance.stubs(:root_snapshot).returns(snapshot)
225
+ snapshot.expects(:destroy).once.in_sequence(destroy_seq)
226
+ @instance.expects(:reload).once.in_sequence(destroy_seq)
227
+ VirtualBox::StorageController.expects(:destroy_relationship).in_sequence(destroy_seq)
228
+ @interface_parent.expects(:unregister_machine).with(@instance.uuid).in_sequence(destroy_seq)
229
+ @interface.expects(:delete_settings).once.in_sequence(destroy_seq)
230
+
231
+ @instance.destroy
232
+ end
233
+ end
234
+
235
+ context "state" do
236
+ setup do
237
+ @state = mock("state")
238
+ @interface = mock("interface")
239
+ @instance.stubs(:read_attribute).with(:state).returns(@state)
240
+ @instance.stubs(:interface).returns(@interface)
241
+ end
242
+
243
+ should "reload and return the state" do
244
+ @instance.expects(:load_interface_attribute).with(:state, @instance.interface).once
245
+ assert_equal @state, @instance.state
246
+ end
247
+
248
+ should "not reload the state if suppress is given" do
249
+ @instance.expects(:load_interface_attribute).never
250
+ assert_equal @state, @instance.state(true)
251
+ end
252
+ end
253
+
254
+ context "starting" do
255
+ setup do
256
+ setup_session_mocks
257
+
258
+ @instance.stubs(:running?).returns(false)
259
+ @session.stubs(:state).returns(:open)
260
+ end
261
+
262
+ should "open remote session using the given mode, wait for completion, then close" do
263
+ start_seq = sequence('start_seq')
264
+ mode = "foo"
265
+ @parent.expects(:open_remote_session).with(@session, @uuid, mode, "").once.returns(@progress).in_sequence(start_seq)
266
+ @progress.expects(:wait_for_completion).with(-1).in_sequence(start_seq)
267
+ @session.expects(:close).in_sequence(start_seq)
268
+ assert @instance.start(mode)
269
+ end
270
+
271
+ should "return false if state is running" do
272
+ @instance.expects(:running?).returns(true)
273
+ assert !@instance.start(nil)
274
+ end
275
+ end
276
+
277
+ context "controlling" do
278
+ setup do
279
+ setup_session_mocks
280
+
281
+ @parent.stubs(:open_existing_session)
282
+
283
+ @console = mock("console")
284
+ @console.stubs(:send)
285
+ @session.stubs(:console).returns(@console)
286
+ @session.stubs(:state).returns(:open)
287
+
288
+ @method = :foo
289
+ end
290
+
291
+ should "get an existing, session, send the command, and close" do
292
+ method = :foo
293
+ control_seq = sequence("control_seq")
294
+ @parent.expects(:open_existing_session).with(@session, @uuid).once.in_sequence(control_seq)
295
+ @console.expects(:send).with(@method).once.in_sequence(control_seq)
296
+ @session.expects(:close).in_sequence(control_seq)
297
+
298
+ @instance.control(@method)
299
+ end
300
+
301
+ should "wait for completion if an IProgress is returned" do
302
+ progress = mock("IProgress")
303
+ progress.stubs(:is_a?).with(VirtualBox::COM::Util.versioned_interface(:Progress)).returns(true)
304
+ progress.expects(:wait_for_completion).with(-1).once
305
+ @console.expects(:send).with(@method).returns(progress)
306
+ @instance.control(@method)
307
+ end
308
+
309
+ should "forward other args" do
310
+ @console.expects(:send).with(@method, 1, 2, 3).once
311
+ @instance.control(@method, 1, 2, 3)
312
+ end
313
+ end
314
+
315
+ context "control helpers" do
316
+ should "call the proper control method" do
317
+ methods = {
318
+ :shutdown => :power_button,
319
+ :stop => :power_down,
320
+ :pause => :pause,
321
+ :resume => :resume,
322
+ :save_state => :save_state
323
+ }
324
+
325
+ methods.each do |method, control|
326
+ control = [control] unless control.is_a?(Array)
327
+ @instance.expects(:control).with(*control).once
328
+ @instance.send(method)
329
+ end
330
+ end
331
+
332
+ context "discard state" do
333
+ setup do
334
+ @session = mock("session")
335
+ @console = mock("console")
336
+ @session.stubs(:console).returns(@console)
337
+ @instance.stubs(:with_open_session)
338
+ end
339
+
340
+ should "discard the session in an open state" do
341
+ @instance.expects(:with_open_session).yields(@session)
342
+ @console.expects(:forget_saved_state).with(true).once
343
+ @instance.discard_state
344
+ end
345
+ end
346
+ end
347
+
348
+ context "saving" do
349
+ setup do
350
+ @session = mock("session")
351
+ @session.stubs(:machine).returns(@parent)
352
+
353
+ @locked_interface = mock("locked_interface")
354
+
355
+ @instance.stubs(:saved?).returns(false)
356
+ @instance.stubs(:valid?).returns(true)
357
+ @instance.stubs(:with_open_session)
358
+ end
359
+
360
+ should "open the session, save, and close" do
361
+ save_seq = sequence("save_seq")
362
+ @instance.expects(:with_open_session).once.yields(@session).in_sequence(save_seq)
363
+ @session.expects(:machine).returns(@locked_interface).in_sequence(save_seq)
364
+ @instance.expects(:save_interface_attribute).with(:boot_order, @locked_interface).in_sequence(save_seq)
365
+ @instance.expects(:save_changed_interface_attributes).with(@locked_interface).in_sequence(save_seq)
366
+ @instance.expects(:save_relationships).in_sequence(save_seq)
367
+
368
+ @instance.save
369
+ end
370
+
371
+ should "raise an exception if saved" do
372
+ @instance.stubs(:saved?).returns(true)
373
+
374
+ assert_raises(VirtualBox::Exceptions::ReadonlyVMStateException) {
375
+ @instance.save
376
+ }
377
+ end
378
+
379
+ should "return false if not valid" do
380
+ @instance.stubs(:valid?).returns(false)
381
+ assert !@instance.save
382
+ end
383
+
384
+ should "return true if save succeeds" do
385
+ assert @instance.save
386
+ end
387
+ end
388
+
389
+ context "opening a session [direct]" do
390
+ setup do
391
+ setup_session_mocks
392
+
393
+ @locked_interface = mock("locked_interface")
394
+ @locked_interface.stubs(:state).returns(:powered_off)
395
+ @session.stubs(:machine).returns(@locked_interface)
396
+ @session.stubs(:state).returns(:closed)
397
+ @parent.stubs(:open_session)
398
+ end
399
+
400
+ should "close the session if an exception is raised" do
401
+ @locked_interface.expects(:save_settings).raises(Exception)
402
+ @session.expects(:close).once
403
+
404
+ assert_raises(Exception) do
405
+ @instance.with_open_session do
406
+ # After this point, state should be open
407
+ @session.stubs(:state).returns(:open)
408
+ end
409
+ end
410
+ end
411
+
412
+ should "open the session, save, and close" do
413
+ save_seq = sequence("save_seq")
414
+ @proc = Proc.new {}
415
+
416
+ @parent.expects(:open_session).with(@session, @uuid).in_sequence(save_seq)
417
+ @proc.expects(:call).with(@session).once.in_sequence(save_seq)
418
+ @locked_interface.expects(:save_settings).once.in_sequence(save_seq)
419
+ @session.expects(:close).in_sequence(save_seq)
420
+
421
+ @instance.with_open_session do |session|
422
+ @proc.call(session)
423
+ end
424
+ end
425
+
426
+ should "not save settings when the state is saved" do
427
+ @locked_interface.stubs(:state).returns(:saved)
428
+
429
+ save_seq = sequence("save_seq")
430
+ @parent.expects(:open_session).with(@session, @uuid).in_sequence(save_seq)
431
+ @locked_interface.expects(:save_settings).never
432
+ @session.expects(:close).in_sequence(save_seq)
433
+
434
+ @instance.with_open_session { |session| }
435
+ end
436
+
437
+ should "only open the session and close once" do
438
+ open_seq = sequence("open_seq")
439
+
440
+ @parent.expects(:open_session).with(@session, @uuid).in_sequence(open_seq)
441
+ @locked_interface.expects(:save_settings).once.in_sequence(open_seq)
442
+ @session.expects(:close).once.in_sequence(open_seq)
443
+
444
+ @instance.with_open_session do |session|
445
+ session.stubs(:state).returns(:open)
446
+
447
+ @instance.with_open_session do |subsession|
448
+ assert_equal session, subsession
449
+ end
450
+ end
451
+ end
452
+ end
453
+
454
+ context "state methods" do
455
+ should "check the proper results" do
456
+ methods = {
457
+ :starting? => :starting,
458
+ :running? => :running,
459
+ :powered_off? => :powered_off,
460
+ :paused? => :paused,
461
+ :saved? => :saved,
462
+ :aborted? => :aborted
463
+ }
464
+
465
+ methods.each do |method, value|
466
+ @instance.stubs(:state).returns(value)
467
+ assert @instance.send(method)
468
+
469
+ @instance.stubs(:state).returns(:nope)
470
+ assert !@instance.send(method)
471
+ end
472
+ end
473
+ end
474
+
475
+ context "exporting" do
476
+ setup do
477
+ @path = "foo.rb"
478
+ @appliance = mock("appliance")
479
+ @appliance.stubs(:path=)
480
+ @appliance.stubs(:add_machine)
481
+
482
+ VirtualBox::Appliance.stubs(:new).returns(@appliance)
483
+ end
484
+
485
+ should "create a new appliance with path and export" do
486
+ result = mock("result")
487
+ options = mock("options")
488
+ VirtualBox::Appliance.expects(:new).returns(@appliance)
489
+ @appliance.expects(:path=).with(@path)
490
+ @appliance.expects(:add_machine).with(@instance, options)
491
+ @appliance.expects(:export)
492
+
493
+ @instance.export(@path, options)
494
+ end
495
+
496
+ should "forward any block to the appliance export method" do
497
+ proc = mock("proc")
498
+ @appliance.expects(:export).yields(proc)
499
+ proc.expects(:call)
500
+
501
+ @instance.export(@path) do |yielded_proc|
502
+ yielded_proc.call
503
+ end
504
+ end
505
+ end
506
+
507
+ context "taking a snapshot" do
508
+ setup do
509
+ setup_session_mocks
510
+
511
+ @progress = mock("progress")
512
+ @progress.stubs(:wait)
513
+
514
+ @console = mock("console")
515
+ @console.stubs(:take_snapshot).returns(@progress)
516
+ @session.stubs(:console).returns(@console)
517
+
518
+ @instance.stubs(:with_open_session).yields(@session)
519
+ end
520
+
521
+ should "take a snapshot on the console and wait" do
522
+ name = "foo"
523
+ description = "baz"
524
+ @console.expects(:take_snapshot).with(name, description).returns(@progress)
525
+ @instance.take_snapshot(name, description)
526
+ end
527
+
528
+ should "wait and pass in the given block, if given" do
529
+ foo = mock("foo")
530
+ @progress.expects(:wait).yields(foo)
531
+ foo.expects(:called).once
532
+
533
+ @instance.take_snapshot(nil, nil) do |obj|
534
+ obj.called
535
+ end
536
+ end
537
+ end
538
+
539
+ context "root snapshot" do
540
+ should "return nil if the current snapshot is nil" do
541
+ @instance.stubs(:current_snapshot).returns(nil)
542
+ assert_nil @instance.root_snapshot
543
+ end
544
+
545
+ should "return the proper root snapshot" do
546
+ root = mock("root_snapshot")
547
+ root.stubs(:parent).returns(nil)
548
+
549
+ parent = mock("parent")
550
+ parent.stubs(:parent).returns(root)
551
+
552
+ snapshot = mock("snapshot")
553
+ snapshot.stubs(:parent).returns(parent)
554
+
555
+ @instance.stubs(:current_snapshot).returns(snapshot)
556
+ assert_equal root, @instance.root_snapshot
557
+ end
558
+ end
559
+
560
+ context "finding a snapshot" do
561
+ should "return nil if there is no root snapshot" do
562
+ @instance.stubs(:current_snapshot).returns(nil)
563
+ assert_nil @instance.find_snapshot("foo")
564
+ end
565
+
566
+ should "return nil if the snapshot is not found" do
567
+ snapshot = mock("snapshot")
568
+ snapshot.stubs(:name).returns("wrong")
569
+ snapshot.stubs(:uuid).returns(nil)
570
+ snapshot.stubs(:children).returns([])
571
+ @instance.stubs(:root_snapshot).returns(snapshot)
572
+
573
+ assert_nil @instance.find_snapshot("bar")
574
+ end
575
+
576
+ # TODO: Testing traversing the snapshot tree. Too many mocks :S
577
+ end
578
+
579
+ context "getting the boot order" do
580
+ setup do
581
+ @max = 4
582
+ @global = mock("global")
583
+ @sys_props = mock("system_properties")
584
+
585
+ @sys_props.stubs(:max_boot_position).returns(@max)
586
+ @global.stubs(:system_properties).returns(@sys_props)
587
+ VirtualBox::Global.stubs(:global).returns(@global)
588
+ end
589
+
590
+ should "get the boot order for each up to max" do
591
+ expected = (1..@max).inject([]) do |acc, pos|
592
+ result = mock("p#{pos}")
593
+ @interface.expects(:get_boot_order).with(pos).returns(result)
594
+ acc << result
595
+ acc
596
+ end
597
+
598
+ assert_equal expected, @instance.get_boot_order(@interface, nil)
599
+ end
600
+ end
601
+
602
+ context "setting the boot order" do
603
+ setup do
604
+ @max = 4
605
+ @global = mock("global")
606
+ @sys_props = mock("system_properties")
607
+
608
+ @sys_props.stubs(:max_boot_position).returns(@max)
609
+ @global.stubs(:system_properties).returns(@sys_props)
610
+ VirtualBox::Global.stubs(:global).returns(@global)
611
+ end
612
+
613
+ should "set the boot order for each up to max" do
614
+ expected = (1..@max).inject([]) do |acc, pos|
615
+ result = mock("p#{pos}")
616
+ @interface.expects(:set_boot_order).with(pos, result)
617
+ acc << result
618
+ acc
619
+ end
620
+
621
+ @instance.set_boot_order(@interface, nil, expected)
622
+ end
623
+
624
+ should "set the boot order for max items even if value has less than the proper amount" do
625
+ items = [1, 2]
626
+ items.concat(Array.new(@max - items.size))
627
+ items.each_with_index do |item, i|
628
+ @interface.expects(:set_boot_order).with(i + 1, item).once
629
+ end
630
+
631
+ assert_equal @max, items.size # sanity
632
+
633
+ @instance.set_boot_order(@interface, nil, items)
634
+ end
635
+ end
636
+ end
637
+ end