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
+ module VirtualBox
2
+ # Represents the VRDP Server settings of a {VM}.
3
+ class VRDPServer < AbstractModel
4
+ attribute :parent, :readonly => true, :property => false
5
+ attribute :enabled, :boolean => true
6
+ attribute :ports
7
+ attribute :net_address
8
+ attribute :auth_type
9
+ attribute :auth_timeout
10
+ attribute :allow_multi_connection, :boolean => true
11
+ attribute :reuse_single_connection, :boolean => true
12
+
13
+ class << self
14
+ # Populates a relationship with another model.
15
+ #
16
+ # **This method typically won't be used except internally.**
17
+ #
18
+ # @return [VRDPServer]
19
+ def populate_relationship(caller, imachine)
20
+ data = new(caller, imachine.vrdp_server)
21
+ end
22
+
23
+ # Saves the relationship.
24
+ #
25
+ # **This method typically won't be used except internally.**
26
+ def save_relationship(caller, instance)
27
+ instance.save
28
+ end
29
+ end
30
+
31
+ def initialize(parent, vrdp_settings)
32
+ write_attribute(:parent, parent)
33
+
34
+ # Load the attributes and mark the whole thing as existing
35
+ load_interface_attributes(vrdp_settings)
36
+ clear_dirty!
37
+ existing_record!
38
+ end
39
+
40
+ def validate
41
+ super
42
+
43
+ validates_inclusion_of :enabled, :allow_multi_connection, :reuse_single_connection, :in => [true, false]
44
+ validates_format_of :ports, :with => /^[\d\s\-\.]+$/, :message => "must only contain numbers, spaces, dashes or periods."
45
+ validates_format_of :net_address, :with => /^[\w\d\-\.]+$/, :message => "must only contain latters, numbers, dashes or periods."
46
+ validates_inclusion_of :auth_type, :in => COM::Util.versioned_interface(:VRDPAuthType).map
47
+ validates_numericality_of :auth_timeout
48
+ end
49
+
50
+ def save
51
+ parent.with_open_session do |session|
52
+ machine = session.machine
53
+
54
+ # Save them
55
+ save_changed_interface_attributes(machine.vrdp_server)
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,18 @@
1
+ # ruby-debug, not necessary, but useful if we have it
2
+ begin
3
+ require 'ruby-debug'
4
+ rescue LoadError; end
5
+
6
+ require 'contest'
7
+ require 'mocha'
8
+ require 'virtualbox'
9
+
10
+ # Data
11
+ class Test::Unit::TestCase
12
+ end
13
+
14
+ # Initialize the FFI stuff. This is typically done dynamically when
15
+ # FFI is initialized (on non-windows machines). Since the tests test
16
+ # the FFI classes, we force initialize a specific version here. It
17
+ # doesn't matter what version, since no actual FFI calls are made.
18
+ VirtualBox::COM::FFI.setup("3.2.x") unless defined?(VirtualBox::COM::FFI::Version_3_2_X)
@@ -0,0 +1,269 @@
1
+ require File.expand_path("../../../test_helper", __FILE__)
2
+
3
+ class AttributableTest < Test::Unit::TestCase
4
+ class EmptyAttributeModel
5
+ include VirtualBox::AbstractModel::Attributable
6
+ end
7
+
8
+ class AttributeModel < EmptyAttributeModel
9
+ attribute :foo
10
+ attribute :bar
11
+ attribute :boolean_bar, :boolean => true
12
+
13
+ def initialize
14
+ super
15
+ end
16
+ end
17
+
18
+ context "subclasses" do
19
+ class SubModel < AttributeModel
20
+ attribute :baz
21
+ end
22
+
23
+ should "have foo bar and baz" do
24
+ attributes = SubModel.attributes
25
+ assert attributes.has_key?(:foo)
26
+ assert attributes.has_key?(:bar)
27
+ assert attributes.has_key?(:baz)
28
+ end
29
+ end
30
+
31
+ context "attribute scopes" do
32
+ class AttributeScopeA < EmptyAttributeModel
33
+ attribute :foo
34
+ attribute_scope(:bar => 7) do
35
+ attribute :foo2
36
+
37
+ attribute_scope(:baz => 3) do
38
+ attribute :bazzed
39
+ end
40
+ end
41
+
42
+ attribute :foo3, :bar => 10
43
+ end
44
+
45
+ setup do
46
+ @klass = AttributeScopeA
47
+ end
48
+
49
+ should "use attribute scope" do
50
+ assert_equal 7, @klass.attributes[:foo2][:bar]
51
+ end
52
+
53
+ should "not use attribute scope outside of the block" do
54
+ assert !@klass.attributes[:foo].has_key?(:bar)
55
+ assert_equal 10, @klass.attributes[:foo3][:bar]
56
+ end
57
+
58
+ should "properly nest" do
59
+ bazzed = @klass.attributes[:bazzed]
60
+ assert_equal 3, bazzed[:baz]
61
+ assert_equal 7, bazzed[:bar]
62
+ end
63
+ end
64
+
65
+ context "attribute options" do
66
+ context "custom populate keys" do
67
+ class CustomPopulateModel < AttributeModel
68
+ attribute :foo, :populate_key => :foo_key
69
+ end
70
+
71
+ setup do
72
+ @model = CustomPopulateModel.new
73
+ end
74
+
75
+ should "use the populate key instead of the attribute name" do
76
+ @model.populate_attributes({
77
+ :foo => "not me!",
78
+ :foo_key => "bar"
79
+ })
80
+
81
+ assert_equal "bar", @model.foo
82
+ end
83
+ end
84
+
85
+ context "readonly attributes" do
86
+ class ReadonlyModel < AttributeModel
87
+ attribute :foo, :readonly => :readonly
88
+
89
+ def initialize
90
+ super
91
+ populate_attributes({ :foo => "foo" })
92
+ end
93
+ end
94
+
95
+ setup do
96
+ @model = ReadonlyModel.new
97
+ end
98
+
99
+ should "be readonly" do
100
+ assert @model.readonly_attribute?(:foo)
101
+ end
102
+
103
+ should "allow reading" do
104
+ assert_equal "foo", @model.foo
105
+ end
106
+
107
+ should "not allow writing" do
108
+ assert_raises(NoMethodError) { @model.foo = "YO" }
109
+ end
110
+ end
111
+
112
+ context "default values" do
113
+ class DefaultModel < EmptyAttributeModel
114
+ attribute :foo, :default => "FOO!"
115
+ attribute :bar
116
+ end
117
+
118
+ setup do
119
+ @model = DefaultModel.new
120
+ end
121
+
122
+ should "read default values" do
123
+ assert_equal "FOO!", @model.foo
124
+ assert_nil @model.bar
125
+ end
126
+ end
127
+
128
+ context "lazy loading" do
129
+ class LazyModel < EmptyAttributeModel
130
+ attribute :foo, :lazy => true
131
+ attribute :bar
132
+
133
+ def load_attribute(attribute)
134
+ write_attribute(attribute, "foo")
135
+ end
136
+ end
137
+
138
+ setup do
139
+ @model = LazyModel.new
140
+ end
141
+
142
+ should "return proper value for lazy_attribute?" do
143
+ assert @model.lazy_attribute?(:foo)
144
+ assert !@model.lazy_attribute?(:bar)
145
+ assert !@model.lazy_attribute?(:i_dont_exist)
146
+ end
147
+
148
+ should "load the lazy attribute on read" do
149
+ assert !@model.loaded_attribute?(:foo)
150
+ assert_equal "foo", @model.foo
151
+ assert @model.loaded_attribute?(:foo)
152
+ end
153
+
154
+ should "not be loaded initially, then should be loaded after being read" do
155
+ assert !@model.loaded_attribute?(:foo)
156
+ @model.foo
157
+ assert @model.loaded_attribute?(:foo)
158
+ end
159
+
160
+ should "mark as loaded if write_attribute is called on an attribute" do
161
+ assert !@model.loaded_attribute?(:foo)
162
+ @model.write_attribute(:foo, "bar")
163
+ assert @model.loaded_attribute?(:foo)
164
+ assert_equal "bar", @model.foo
165
+ end
166
+ end
167
+ end
168
+
169
+ context "populating attributes" do
170
+ setup do
171
+ @model = AttributeModel.new
172
+ end
173
+
174
+ should "write all valid attributes" do
175
+ new_attributes = {
176
+ :foo => "zxcv",
177
+ :bar => "qwerty"
178
+ }
179
+
180
+ @model.populate_attributes(new_attributes)
181
+ new_attributes.each do |k,v|
182
+ assert_equal v, @model.send(k)
183
+ end
184
+ end
185
+
186
+ should "not load nonexistent keys" do
187
+ new_attributes = {
188
+ :foo => "zxcv"
189
+ }
190
+
191
+ @model.populate_attributes(new_attributes)
192
+ assert @model.loaded_attribute?(:foo)
193
+ assert !@model.loaded_attribute?(:bar)
194
+ end
195
+ end
196
+
197
+ context "reading and writing attributes" do
198
+ class VersionedAttributeModel < AttributeModel
199
+ attribute :ver, :version => "3.1"
200
+ end
201
+
202
+ setup do
203
+ @model = VersionedAttributeModel.new
204
+ @model.populate_attributes({
205
+ :foo => "foo",
206
+ :bar => false,
207
+ :ver => "ver"
208
+ })
209
+
210
+ @checkstring = "HEY"
211
+ end
212
+
213
+ should "be able to read an entire hash of attributes" do
214
+ atts = @model.attributes
215
+ assert atts.is_a?(Hash)
216
+ assert atts.has_key?(:foo)
217
+ assert atts.has_key?(:bar)
218
+ end
219
+
220
+ should "be able to access boolean values with a '?'" do
221
+ @model.boolean_bar = true
222
+ assert @model.boolean_bar?
223
+ @model.boolean_bar = false
224
+ assert !@model.boolean_bar?
225
+ end
226
+
227
+ should "be able to write defined attributes" do
228
+ assert_nothing_raised {
229
+ @model.foo = @check_string
230
+ }
231
+ end
232
+
233
+ should "be able to read defined attributes" do
234
+ assert_nothing_raised {
235
+ assert_equal "foo", @model.foo
236
+ }
237
+ end
238
+
239
+ should "raise an exception if version not supported" do
240
+ VirtualBox.stubs(:version).returns("3.0.14")
241
+
242
+ assert_raises(VirtualBox::Exceptions::UnsupportedVersionException) {
243
+ @model.ver
244
+ }
245
+ end
246
+
247
+ should "read value if version supported" do
248
+ VirtualBox.stubs(:version).returns("3.1.8")
249
+
250
+ assert_nothing_raised {
251
+ assert_equal "ver", @model.ver
252
+ }
253
+ end
254
+
255
+ should "understand false values" do
256
+ assert_nothing_raised {
257
+ assert_equal false, @model.bar
258
+ }
259
+ end
260
+
261
+ should "raise an error if attempting to write an undefined attribute" do
262
+ assert_raises(NoMethodError) { @model.baz = @check_string }
263
+ end
264
+
265
+ should "raise an error if attempting to read an undefined attribute" do
266
+ assert_raises(NoMethodError) { @model.baz }
267
+ end
268
+ end
269
+ end
@@ -0,0 +1,83 @@
1
+ require File.expand_path("../../../test_helper", __FILE__)
2
+
3
+ class DirtyTest < Test::Unit::TestCase
4
+ class DirtyModel
5
+ include VirtualBox::AbstractModel::Dirty
6
+
7
+ def initialize
8
+ @foo = "foo"
9
+ @bar = "bar"
10
+ end
11
+
12
+ def foo=(value)
13
+ set_dirty!("foo", @foo, value)
14
+ @foo = value
15
+ end
16
+
17
+ def bar=(value)
18
+ set_dirty!(:bar, @bar, value)
19
+ @bar = value
20
+ end
21
+ end
22
+
23
+ context "dirty attributes" do
24
+ setup do
25
+ @model = DirtyModel.new
26
+ end
27
+
28
+ should "not be dirty initially" do
29
+ assert !@model.changed?
30
+ end
31
+
32
+ should "be dirty after changing an attribute" do
33
+ assert !@model.changed? # sanity
34
+ @model.foo = "my value"
35
+ assert @model.changed?
36
+ end
37
+
38
+ should "be able to clear dirty state" do
39
+ assert !@model.changed?
40
+ @model.foo = "my value"
41
+ assert @model.changed?
42
+ @model.clear_dirty!(:foo)
43
+ assert !@model.changed?
44
+ end
45
+
46
+ should "be able to clear dirty state on entire model" do
47
+ @model.foo = "changed"
48
+ @model.bar = "changed"
49
+ assert @model.changed?
50
+ @model.clear_dirty!
51
+ assert !@model.changed?
52
+ end
53
+
54
+ should "show changes on specific field" do
55
+ assert !@model.changed?
56
+ @model.foo = "my value"
57
+ assert @model.foo_changed?
58
+ assert_equal ["foo", "my value"], @model.foo_change
59
+ assert_equal "foo", @model.foo_was
60
+ end
61
+
62
+ should "return nil for field_was if its not changed" do
63
+ assert !@model.foo_changed?
64
+ assert_nil @model.foo_was
65
+ end
66
+
67
+ should "show changes for the whole model" do
68
+ assert !@model.changed?
69
+ @model.foo = "foo2"
70
+ @model.bar = "bar2"
71
+
72
+ assert @model.changed?
73
+ changes = @model.changes
74
+ assert_equal 2, changes.length
75
+ assert_equal ["foo", "foo2"], changes[:foo]
76
+ assert_equal ["bar", "bar2"], changes[:bar]
77
+ end
78
+
79
+ should "still forward non-dirty magic methods up method_missing" do
80
+ assert_raises(NoMethodError) { @model.foobarbaz }
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,194 @@
1
+ require File.expand_path("../../../test_helper", __FILE__)
2
+
3
+ class InterfaceAttributesTest < Test::Unit::TestCase
4
+ class EmptyInterfaceAttributeModel
5
+ include VirtualBox::AbstractModel::Attributable
6
+ include VirtualBox::AbstractModel::InterfaceAttributes
7
+ end
8
+
9
+ class InterfaceAttributeModel < EmptyInterfaceAttributeModel
10
+ attribute :foo
11
+ attribute :foo2, :property_getter => :get_foo, :property_setter => :set_foo
12
+ attribute :foo3, :property => :grab_foo3, :readonly => true
13
+ attribute :foo4, :property => :put_foo4
14
+ attribute :bar, :property => false
15
+ attribute :ver, :version => "3.1.3"
16
+ end
17
+
18
+ context "converting spec to a proc" do
19
+ setup do
20
+ @instance = EmptyInterfaceAttributeModel.new
21
+ @interface = mock("interface")
22
+ end
23
+
24
+ context "symbols" do
25
+ should "convert to a proc which calls the symbol on the interface" do
26
+ result = mock("result")
27
+ proc = @instance.spec_to_proc(:foo)
28
+ @interface.expects(:foo).once.returns(result)
29
+ assert_equal result, proc.call(nil, @interface)
30
+ end
31
+
32
+ should "forward all parameters" do
33
+ result = mock("result")
34
+ proc = @instance.spec_to_proc(:foo)
35
+ @interface.expects(:foo).with(1, 2, 3).once.returns(result)
36
+ assert_equal result, proc.call(nil, @interface, :key, 1, 2, 3)
37
+ end
38
+ end
39
+
40
+ context "procs" do
41
+ should "leave proc as is" do
42
+ result = mock("result")
43
+ proc = Proc.new { |m| result }
44
+ converted = @instance.spec_to_proc(proc)
45
+ assert_equal proc, converted
46
+ assert_equal result, converted.call(@interface)
47
+ end
48
+ end
49
+ end
50
+
51
+ context "loading a single interface attribute" do
52
+ setup do
53
+ @instance = InterfaceAttributeModel.new
54
+ @interface = mock("interface")
55
+ @interface.stubs(:foo).returns("foo")
56
+ end
57
+
58
+ should "return immediately if not a valid attribute" do
59
+ @proc.expects(:call).never
60
+ @instance.load_interface_attribute(:baz, @interface)
61
+ end
62
+
63
+ should "return immediately if is marked as a non-property" do
64
+ @proc.expects(:call).never
65
+ @instance.load_interface_attribute(:bar, @interface)
66
+ end
67
+
68
+ should "return immediately if version mismatch" do
69
+ VirtualBox.stubs(:version).returns("3.2.4")
70
+ @interface.expects(:ver).never
71
+ @instance.load_interface_attribute(:ver, @interface)
72
+ end
73
+
74
+ should "load the attribute if version matches" do
75
+ VirtualBox.stubs(:version).returns("3.1.3")
76
+ @interface.expects(:ver).returns("foo")
77
+ @instance.load_interface_attribute(:ver, @interface)
78
+ end
79
+
80
+ should "use the getter specified if exists" do
81
+ key = :foo2
82
+ @interface.expects(:get_foo).returns(:bar)
83
+ @instance.expects(:write_attribute).with(key, :bar)
84
+ @instance.load_interface_attribute(key, @interface)
85
+ end
86
+
87
+ should "use the property specified first" do
88
+ key = :foo3
89
+ @interface.expects(:grab_foo3).returns(:bar)
90
+ @instance.expects(:write_attribute).with(key, :bar)
91
+ @instance.load_interface_attribute(key, @interface)
92
+ end
93
+
94
+ should "use the attribute name if no getter is specified" do
95
+ key = :foo
96
+ @interface.expects(:foo).returns(:bar)
97
+ @instance.expects(:write_attribute).with(key, :bar)
98
+ @instance.load_interface_attribute(key, @interface)
99
+ end
100
+
101
+ should "write the attribute with the value of the proc" do
102
+ key = :foo
103
+ @instance.expects(:write_attribute).with(key, "foo").once
104
+ @instance.load_interface_attribute(key, @interface)
105
+ end
106
+ end
107
+
108
+ context "saving a single interface attribute" do
109
+ setup do
110
+ @instance = InterfaceAttributeModel.new
111
+ @interface = mock("interface")
112
+
113
+ @value = :bar
114
+ @instance.stubs(:read_attribute).with(anything).returns(@value)
115
+ end
116
+
117
+ should "return immediately if not a valid attribute" do
118
+ @proc.expects(:call).never
119
+ @instance.save_interface_attribute(:baz, @interface)
120
+ end
121
+
122
+ should "return immediately if attribute doesn't have an interface setter" do
123
+ @proc.expects(:call).never
124
+ @instance.save_interface_attribute(:bar, @interface)
125
+ end
126
+
127
+ should "return immediately if version mismatch" do
128
+ VirtualBox.stubs(:version).returns("3.2.4")
129
+ @interface.expects(:ver).never
130
+ @instance.save_interface_attribute(:ver, @interface)
131
+ end
132
+
133
+ should "load the attribute if version matches" do
134
+ VirtualBox.stubs(:version).returns("3.1.3")
135
+ @interface.expects(:ver=)
136
+ @instance.save_interface_attribute(:ver, @interface)
137
+ end
138
+
139
+ should "save the attribute with the value of the proc" do
140
+ key = :foo
141
+ @interface.expects(:foo=).with(@value).once
142
+ @instance.save_interface_attribute(key, @interface)
143
+ end
144
+
145
+ should "use the property specified first" do
146
+ key = :foo4
147
+ @interface.expects(:put_foo4).returns(:bar)
148
+ @instance.save_interface_attribute(key, @interface)
149
+ end
150
+
151
+ should "use the setter if it exists" do
152
+ key = :foo2
153
+ @interface.expects(:set_foo).with(@value).once
154
+ @instance.save_interface_attribute(key, @interface)
155
+ end
156
+
157
+ should "not save readonly attributes" do
158
+ key = :foo3
159
+ @interface.expects(:foo3=).never
160
+ @instance.save_interface_attribute(key, @interface)
161
+ end
162
+ end
163
+
164
+ context "loading all interface attributes" do
165
+ setup do
166
+ @instance = InterfaceAttributeModel.new
167
+ @interface = mock('interface')
168
+ end
169
+
170
+ should "load each" do
171
+ load_seq = sequence("load_seq")
172
+ InterfaceAttributeModel.attributes.each do |key, options|
173
+ @instance.expects(:load_interface_attribute).with(key, @interface)
174
+ end
175
+
176
+ @instance.load_interface_attributes(@interface)
177
+ end
178
+ end
179
+
180
+ context "saving all interface attributes" do
181
+ setup do
182
+ @instance = InterfaceAttributeModel.new
183
+ @interface = mock('interface')
184
+ end
185
+
186
+ should "save each" do
187
+ InterfaceAttributeModel.attributes.each do |key, options|
188
+ @instance.expects(:save_interface_attribute).with(key, @interface)
189
+ end
190
+
191
+ @instance.save_interface_attributes(@interface)
192
+ end
193
+ end
194
+ end