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
@@ -0,0 +1,208 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper')
2
+
3
+ class COMImplementerMSCOMTest < Test::Unit::TestCase
4
+ setup do
5
+ @klass = VirtualBox::COM::Implementer::MSCOM
6
+ end
7
+
8
+ context "initializing" do
9
+ setup do
10
+ @interface = mock("interface")
11
+ @lib = mock("lib")
12
+ @object = mock("object")
13
+ end
14
+
15
+ should "make the lib base and object accessible" do
16
+ instance = @klass.new(@interface, @lib, @object)
17
+ assert_equal @lib, instance.lib
18
+ assert_equal @object, instance.object
19
+ end
20
+ end
21
+
22
+ context "with an instance" do
23
+ setup do
24
+ @lib = mock("lib")
25
+ @object = mock("object")
26
+ @instance = @klass.new(@interface, @lib, @object)
27
+ end
28
+
29
+ context "spec to formal argument list" do
30
+ should "replace primitives with their types" do
31
+ assert_equal [7], @instance.spec_to_args([:int], [7])
32
+ end
33
+
34
+ should "replace booleans with 1/0" do
35
+ bool = VirtualBox::COM::T_BOOL
36
+ assert_equal [1,0], @instance.spec_to_args([bool, bool], [true, false])
37
+ end
38
+
39
+ should "convert interfaces with nil arguments to nil" do
40
+ spec = [:Machine]
41
+ args = [nil]
42
+
43
+ assert_equal [nil], @instance.spec_to_args(spec, args)
44
+ end
45
+
46
+ should "convert enums to their property indices" do
47
+ spec = [:FirmwareType]
48
+ args = [:efi]
49
+
50
+ assert_equal [1], @instance.spec_to_args(spec, args)
51
+ end
52
+
53
+ should "ignore out parameters" do
54
+ spec = [[:out, :hey], :int]
55
+ args = [7]
56
+
57
+ assert_equal [7], @instance.spec_to_args(spec, args)
58
+ end
59
+ end
60
+
61
+ context "reading a property" do
62
+ should "read the property on the object and return it" do
63
+ name = :foo_bar
64
+ value = mock("value")
65
+ result = mock("result")
66
+ opts = { :value_type => :foo }
67
+ @object.expects(:[]).with('FooBar').once.returns(value)
68
+ @instance.expects(:returnable_value).with(value, opts[:value_type]).returns(result)
69
+
70
+ assert_equal result, @instance.read_property(name, opts)
71
+ end
72
+ end
73
+
74
+ context "writing a property" do
75
+ should "convert the args and set it on the object" do
76
+ name = :foo_bar
77
+ opts = { :value_type => :foo }
78
+ @instance.expects(:spec_to_args).with([:foo], [:value]).returns([:modified])
79
+ @object.expects(:[]=).with('FooBar', :modified).once
80
+
81
+ @instance.write_property(name, :value, opts)
82
+ end
83
+ end
84
+
85
+ context "calling a function" do
86
+ should "send the method and args to the object and return the value" do
87
+ name = :foo_bar
88
+ args = [1,2,3]
89
+ formal_args = [4,5,6]
90
+ result = mock("result")
91
+ value = mock("value")
92
+ opts = { :value_type => :foo, :spec => :foo }
93
+ @object.expects(:send).with('FooBar', *formal_args).once.returns(value)
94
+ @instance.expects(:spec_to_args).with(opts[:spec], args).returns(formal_args)
95
+ @instance.expects(:returnable_value).with(value, opts[:value_type]).returns(result)
96
+
97
+ assert_equal result, @instance.call_function(name, args, opts)
98
+ end
99
+ end
100
+
101
+ context "returnable values" do
102
+ should "just return nil if type is nil" do
103
+ assert_nil @instance.returnable_value(7, nil)
104
+ end
105
+
106
+ should "just return nil if type is void" do
107
+ assert_nil @instance.returnable_value(7, :void)
108
+ end
109
+
110
+ should "infer the type then attempt to read that type" do
111
+ @instance.expects(:infer_type).with(:bar).returns([nil, :foo])
112
+ @instance.expects(:read_foo).with(7, :bar).once
113
+ @instance.returnable_value(7, :bar)
114
+ end
115
+
116
+ should "infer type and call array method for arrays" do
117
+ @instance.expects(:infer_type).with(:bar).returns([nil, :foo])
118
+ @instance.expects(:read_array_of_foo).with(7, [:bar]).once
119
+ @instance.returnable_value(7, [:bar])
120
+ end
121
+
122
+ should "return the value of the read method" do
123
+ result = mock("result")
124
+ @instance.expects(:infer_type).with(:bar).returns([nil, :foo])
125
+ @instance.expects(:read_foo).with(7, :bar).once.returns(result)
126
+ assert_equal result, @instance.returnable_value(7, :bar)
127
+ end
128
+ end
129
+
130
+ context "reading primitive values" do
131
+ # Yes, it typically avoid meta-programming, but this is such a
132
+ # repetitive and simple case that I am doing it
133
+ [:ushort, :uint, :ulong, :int, :long].each do |prim|
134
+ should "read #{prim} and convert to int" do
135
+ assert_equal 7, @instance.send("read_#{prim}".to_sym, "7", prim)
136
+ end
137
+ end
138
+
139
+ should "return strings as is" do
140
+ assert_equal "foo", @instance.read_unicode_string("foo", :unicode_string)
141
+ end
142
+
143
+ should "read char as a boolean value" do
144
+ assert_equal true, @instance.read_char('1', :char)
145
+ assert_equal false, @instance.read_char('0', :char)
146
+ assert_equal true, @instance.read_char(1, :char)
147
+ assert_equal false, @instance.read_char(0, :char)
148
+ end
149
+ end
150
+
151
+ context "reading enums" do
152
+ setup do
153
+ @interface_klass = mock("klass")
154
+
155
+ @type = :foo
156
+ @value = :bar
157
+ @result = mock("result")
158
+ end
159
+
160
+ should "index the value on the interface class" do
161
+ @instance.expects(:interface_klass).with(@type).returns(@interface_klass)
162
+ @interface_klass.expects(:[]).with(@value).returns(@result)
163
+
164
+ assert_equal @result, @instance.read_enum(@value, @type)
165
+ end
166
+ end
167
+
168
+ context "reading interfaces" do
169
+ setup do
170
+ @interface_klass = mock("klass")
171
+
172
+ @type = :foo
173
+ @value = :bar
174
+ @result = mock("result")
175
+ end
176
+
177
+ should "instantiate the klass properly" do
178
+ @instance.expects(:interface_klass).with(@type).returns(@interface_klass)
179
+ @interface_klass.expects(:new).with(@instance.class, @instance.lib, @value).returns(@result)
180
+
181
+ assert_equal @result, @instance.read_interface(@value, @type)
182
+ end
183
+ end
184
+
185
+ context "reading an array of strings" do
186
+ should "just return as is" do
187
+ assert_equal ["foo", "bar"], @instance.read_array_of_unicode_string(["foo", "bar"], :unicode_string)
188
+ end
189
+ end
190
+
191
+ context "read array of interface" do
192
+ setup do
193
+ @interface_klass = mock("klass")
194
+
195
+ @type = :foo
196
+ @value = [:foo, nil]
197
+ @result = mock("result")
198
+ end
199
+
200
+ should "instantiate the klass properly for non-nil values" do
201
+ @instance.expects(:interface_klass).with(@type).returns(@interface_klass)
202
+ @interface_klass.expects(:new).with(@instance.class, @instance.lib, @value[0]).returns(@result)
203
+
204
+ assert_equal [@result, nil], @instance.read_array_of_interface(@value, [@type])
205
+ end
206
+ end
207
+ end
208
+ end
@@ -0,0 +1,17 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
+
3
+ class COMMSCOMInterfaceBaseTest < Test::Unit::TestCase
4
+ setup do
5
+ @klass = VirtualBox::COM::MSCOMInterface
6
+ end
7
+ context "initialization" do
8
+ should "initialize MSCOM interface" do
9
+ @klass.any_instance.expects(:initialize_mscom).once
10
+ @klass.new
11
+ end
12
+ end
13
+
14
+ context "initializing mscom interface" do
15
+ # TODO
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
+
3
+ class COMUtilTest < Test::Unit::TestCase
4
+ setup do
5
+ @klass = VirtualBox::COM::Util
6
+ end
7
+
8
+ context "checking for interfaces" do
9
+ should "return true for existing interfaces" do
10
+ assert @klass.interface?(:VirtualBox)
11
+ end
12
+
13
+ should "return false for non-existing interfaces" do
14
+ assert !@klass.interface?(:IDontExist)
15
+ end
16
+ end
17
+ end
@@ -2,51 +2,12 @@ require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
2
 
3
3
  class DVDTest < Test::Unit::TestCase
4
4
  setup do
5
- VirtualBox::Command.stubs(:execute)
5
+ @klass = VirtualBox::DVD
6
6
  end
7
7
 
8
- context "destroying a dvd" do
9
- setup do
10
- @dvd = VirtualBox::DVD.new
11
- VirtualBox::DVD.reloaded!
12
- end
13
-
14
- should "return false if attempting to destroy an empty drive" do
15
- assert !VirtualBox::DVD.empty_drive.destroy
16
- end
17
-
18
- should "call vboxmanage to destroy it" do
19
- VirtualBox::Command.expects(:vboxmanage).with("closemedium", "dvd", @dvd.uuid, "--delete")
20
- assert @dvd.destroy
21
- end
22
-
23
- should "return false if destroy failed" do
24
- VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
25
- assert !@dvd.destroy
26
- end
27
-
28
- should "raise an exception if failed and flag is set" do
29
- VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
30
- assert_raises(VirtualBox::Exceptions::CommandFailedException) {
31
- @dvd.destroy(true)
32
- }
33
- end
34
-
35
- should "mark the global class for reloading" do
36
- VirtualBox::Global.expects(:reload!)
37
- assert @dvd.destroy
38
- end
39
- end
40
-
41
- context "empty drive" do
42
- should "return an empty drive instance by calling new with :empty_drive" do
43
- dvd = VirtualBox::DVD.new(:empty_drive)
44
- assert dvd.empty_drive?
45
- end
46
-
47
- should "call new with :empty_drive with empty_drive class method" do
48
- dvd = VirtualBox::DVD.empty_drive
49
- assert dvd.empty_drive?
8
+ context "device type" do
9
+ should "be :dvd" do
10
+ assert_equal :dvd, @klass.device_type
50
11
  end
51
12
  end
52
13
 
@@ -64,56 +25,4 @@ class DVDTest < Test::Unit::TestCase
64
25
  assert result.is_a?(Array)
65
26
  end
66
27
  end
67
-
68
- context "retrieving all dvds by command" do
69
- setup do
70
- @expectations = {
71
- "d3252617-8176-4f8c-9d73-1c9c82b23960" => {
72
- :location => "/Users/mitchellh/Downloads/jeos-8.04.3-jeos-i386.iso",
73
- :accessible => "yes"
74
- },
75
-
76
- "4a08f52c-bca3-4908-8da4-4f48aaa4ebba" => {
77
- :location => "/Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso",
78
- :accessible => "yes"
79
- }
80
- }
81
-
82
- @valid = <<-valid
83
- UUID: d3252617-8176-4f8c-9d73-1c9c82b23960
84
- Path: /Users/mitchellh/Downloads/jeos-8.04.3-jeos-i386.iso
85
- Accessible: yes
86
-
87
- UUID: 4a08f52c-bca3-4908-8da4-4f48aaa4ebba
88
- Path: /Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso
89
- Accessible: yes
90
- Usage: TestJeOS (UUID: 3d0f87b4-50f7-4fc5-ad89-93375b1b32a3)
91
- valid
92
-
93
- VirtualBox::Command.expects(:vboxmanage).with("list", "dvds").returns(@valid).once
94
- end
95
-
96
- should "return an array of DVD objects" do
97
- result = VirtualBox::DVD.all_from_command
98
- assert result.is_a?(Array)
99
- assert_equal @expectations.length, result.length
100
-
101
- result.each { |v| assert v.is_a?(VirtualBox::DVD) }
102
- end
103
-
104
- should "return the proper results" do
105
- result = VirtualBox::DVD.all_from_command
106
- assert result.is_a?(Array)
107
- assert_equal @expectations.length, result.length
108
-
109
- result.each do |image|
110
- expected_image = @expectations[image.uuid]
111
- assert expected_image
112
-
113
- expected_image.each do |k,v|
114
- assert_equal v, image.read_attribute(k)
115
- end
116
- end
117
- end
118
- end
119
28
  end
@@ -28,6 +28,14 @@ class PlatformTest < Test::Unit::TestCase
28
28
  assert VirtualBox::Platform.windows?
29
29
  end
30
30
  end
31
+
32
+ should "return true if it contains cygwin" do
33
+ success = ["i386-cygwin", "i686-cygwin64", "cygwin"]
34
+ success.each do |item|
35
+ VirtualBox::Platform.stubs(:platform).returns(item)
36
+ assert VirtualBox::Platform.windows?
37
+ end
38
+ end
31
39
  end
32
40
 
33
41
  context "linux" do
@@ -2,38 +2,13 @@ require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
2
 
3
3
  class ExtraDataTest < Test::Unit::TestCase
4
4
  setup do
5
- @raw = <<-raw
6
- .
7
- Key: GUI/LastVMSelected, Value: 02573b8e-f628-43ed-b688-e488414e07ac
8
- Key: GUI/LastWindowPostion, Value: 99,457,770,550
9
- Key: GUI/SUNOnlineData, Value: triesLeft=0
10
- Key: GUI/SuppressMessages, Value: ,confirmInputCapture,remindAboutAutoCapture,confirmRemoveMedium,remindAboutInaccessibleMedia,confirmGoingFullscreen,remindAboutMouseIntegrationOn
11
- Key: GUI/UpdateCheckCount, Value: 13
12
- Key: GUI/UpdateDate, Value: 1 d, 2010-01-29, stable
13
- raw
14
-
15
- VirtualBox::Command.stubs(:execute)
16
-
17
- @ed = VirtualBox::ExtraData.new
5
+ @parent = mock("parent")
6
+ @interface = mock("interface")
7
+ @ed = VirtualBox::ExtraData.new(@parent, @interface)
18
8
  @ed["foo"] = "bar"
19
9
  @ed.clear_dirty!
20
10
  end
21
11
 
22
- context "attributes" do
23
- should "return parent name if its a VM object" do
24
- vm = mock("vm")
25
- vm.stubs(:is_a?).with(VirtualBox::VM).returns(true)
26
- vm.stubs(:name).returns("FOO")
27
-
28
- @ed.parent = vm
29
- assert_equal "FOO", @ed.parent_name
30
- end
31
-
32
- should "return default otherwise" do
33
- assert_equal "global", @ed.parent_name
34
- end
35
- end
36
-
37
12
  context "relationships" do
38
13
  setup do
39
14
  @caller = mock("caller")
@@ -41,10 +16,35 @@ raw
41
16
  end
42
17
 
43
18
  context "populating" do
19
+ setup do
20
+ @interface = mock("interface")
21
+ @interface.stubs(:get_extra_data_keys).returns([])
22
+ end
23
+
44
24
  should "return a ExtraData object" do
45
- result = VirtualBox::ExtraData.populate_relationship(@caller, mock_xml_doc)
25
+ result = VirtualBox::ExtraData.populate_relationship(@caller, @interface)
46
26
  assert result.is_a?(VirtualBox::ExtraData)
47
27
  end
28
+
29
+ should "not be dirty" do
30
+ result = VirtualBox::ExtraData.populate_relationship(@caller, @interface)
31
+ assert !result.changed?
32
+ end
33
+
34
+ should "add the value of each key to the ED hash" do
35
+ expected_hash = { :a => 1, :b => 2, :c => 4 }
36
+ @interface.expects(:get_extra_data_keys).returns(expected_hash.keys)
37
+
38
+ expected_hash.each do |k, v|
39
+ @interface.expects(:get_extra_data).with(k).returns(v)
40
+ end
41
+
42
+ result = VirtualBox::ExtraData.populate_relationship(@caller, @interface)
43
+ assert_equal expected_hash.length, result.length
44
+ result.each do |k, v|
45
+ assert_equal expected_hash[k], v
46
+ end
47
+ end
48
48
  end
49
49
 
50
50
  context "saving" do
@@ -57,75 +57,9 @@ raw
57
57
  end
58
58
  end
59
59
 
60
- context "destroying (deleting)" do
61
- setup do
62
- @key = "foo"
63
- end
64
-
65
- should "call the proper vbox command" do
66
- VirtualBox::Command.expects(:vboxmanage).with("setextradata", "global", "foo")
67
- assert @ed.delete(@key)
68
- end
69
-
70
- should "remove the key from the hash" do
71
- assert @ed.has_key?(@key)
72
- assert @ed.delete(@key)
73
- assert !@ed.has_key?(@key)
74
- end
75
-
76
- should "raise an exception if true sent to save and error occured" do
77
- VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
78
- assert_raises(VirtualBox::Exceptions::CommandFailedException) {
79
- @ed.delete(@key, true)
80
- }
81
- end
82
-
83
- should "return false if the command failed" do
84
- VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
85
- assert !@ed.delete(@key)
86
- end
87
- end
88
-
89
- context "saving" do
90
- setup do
91
- @ed["foo"] = "BAR"
92
- assert @ed.changed?
93
- end
94
-
95
- should "do nothing if there are no changes" do
96
- @ed.clear_dirty!
97
- VirtualBox::Command.expects(:vboxmanage).never
98
- assert @ed.save
99
- end
100
-
101
- should "call the proper vbox command" do
102
- VirtualBox::Command.expects(:vboxmanage).with("setextradata", "global", "foo", "BAR")
103
- assert @ed.save
104
- end
105
-
106
- should "return false if the command failed" do
107
- VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
108
- assert !@ed.save
109
- end
110
-
111
- should "raise an exception if true sent to save and error occured" do
112
- VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
113
- assert_raises(VirtualBox::Exceptions::CommandFailedException) {
114
- @ed.save(true)
115
- }
116
- end
117
-
118
- should "clear dirty state" do
119
- @ed["value"] = "rawr"
120
- assert @ed.changed?
121
- assert @ed.save
122
- assert !@ed.changed?
123
- end
124
- end
125
-
126
60
  context "setting dirty state" do
127
61
  setup do
128
- @ed = VirtualBox::ExtraData.new
62
+ @ed = VirtualBox::ExtraData.new(@parent, @interface)
129
63
  end
130
64
 
131
65
  should "not be dirty initially" do
@@ -135,7 +69,7 @@ raw
135
69
  should "be dirty when setting a value" do
136
70
  @ed["foo"] = "bar"
137
71
  assert @ed.changed?
138
- assert @ed.changes.has_key?("foo")
72
+ assert @ed.changes.has_key?(:foo)
139
73
  end
140
74
  end
141
75
 
@@ -165,14 +99,56 @@ raw
165
99
  end
166
100
 
167
101
  context "constructor" do
168
- should "set the parent with the given argument" do
169
- ed = VirtualBox::ExtraData.new("JOEY")
102
+ should "set the parent and interface with the given argument" do
103
+ ed = VirtualBox::ExtraData.new("JOEY", @interface)
170
104
  assert_equal "JOEY", ed.parent
105
+ assert_equal @interface, ed.interface
171
106
  end
107
+ end
108
+
109
+ context "saving extra data" do
110
+ setup do
111
+ @interface.stubs(:set_extra_data)
112
+ end
113
+
114
+ should "only save changed keys" do
115
+ @interface.expects(:set_extra_data).never
116
+ @interface.expects(:set_extra_data).with("bar", "baz").once
117
+
118
+ @ed["bar"] = "baz"
119
+ @ed.save
120
+ end
121
+
122
+ should "convert values to strings" do
123
+ @interface.expects(:set_extra_data).never
124
+ @interface.expects(:set_extra_data).with("bar", "7").once
125
+
126
+ @ed["bar"] = 7
127
+ @ed.save
128
+ end
129
+
130
+ should "clear the dirty status of keys" do
131
+ @ed["bar"] = "baz"
132
+ assert @ed.bar_changed?
133
+ @ed.save
134
+ assert !@ed.bar_changed?
135
+ end
136
+
137
+ should "remove nil keys from the hash" do
138
+ @ed["bar"] = "baz"
139
+ @ed.save
140
+ @ed["bar"] = nil
141
+ assert @ed.bar_changed?
142
+ @ed.save
143
+ assert !@ed.keys.include?("bar")
144
+ end
145
+ end
172
146
 
173
- should "be global by default" do
174
- ed = VirtualBox::ExtraData.new
175
- assert_equal "global", ed.parent
147
+ context "deleteting extra data" do
148
+ should "call set its value to nil" do
149
+ key = :foo
150
+ @ed.expects(:[]=).with(key, nil).once
151
+ @ed.delete(key)
176
152
  end
177
153
  end
178
154
  end