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.
- data/.gitignore +2 -1
- data/Gemfile +1 -1
- data/Rakefile +1 -1
- data/Readme.md +5 -21
- data/VERSION +1 -1
- data/docs/WhatsNew.md +9 -47
- data/lib/virtualbox.rb +7 -30
- data/lib/virtualbox/abstract_model.rb +25 -5
- data/lib/virtualbox/abstract_model/attributable.rb +5 -1
- data/lib/virtualbox/abstract_model/dirty.rb +2 -0
- data/lib/virtualbox/abstract_model/interface_attributes.rb +96 -0
- data/lib/virtualbox/abstract_model/relatable.rb +19 -8
- data/lib/virtualbox/appliance.rb +59 -0
- data/lib/virtualbox/audio_adapter.rb +44 -0
- data/lib/virtualbox/bios.rb +44 -0
- data/lib/virtualbox/com.rb +23 -0
- data/lib/virtualbox/com/abstract_enum.rb +42 -0
- data/lib/virtualbox/com/abstract_implementer.rb +43 -0
- data/lib/virtualbox/com/abstract_interface.rb +165 -0
- data/lib/virtualbox/com/ffi/interface.rb +141 -0
- data/lib/virtualbox/com/ffi/interfaces.rb +42 -0
- data/lib/virtualbox/com/ffi/util.rb +101 -0
- data/lib/virtualbox/com/ffi/vboxxpcomc.rb +31 -0
- data/lib/virtualbox/com/ffi_interface.rb +65 -0
- data/lib/virtualbox/com/implementer/base.rb +52 -0
- data/lib/virtualbox/com/implementer/ffi.rb +350 -0
- data/lib/virtualbox/com/implementer/mscom.rb +165 -0
- data/lib/virtualbox/com/implementer/nil.rb +10 -0
- data/lib/virtualbox/com/interface/appliance.rb +20 -0
- data/lib/virtualbox/com/interface/audio_adapter.rb +13 -0
- data/lib/virtualbox/com/interface/audio_controller_type.rb +9 -0
- data/lib/virtualbox/com/interface/audio_driver_type.rb +9 -0
- data/lib/virtualbox/com/interface/bios_boot_menu_mode.rb +9 -0
- data/lib/virtualbox/com/interface/bios_settings.rb +19 -0
- data/lib/virtualbox/com/interface/clipboard_mode.rb +9 -0
- data/lib/virtualbox/com/interface/console.rb +48 -0
- data/lib/virtualbox/com/interface/cpu_property_type.rb +9 -0
- data/lib/virtualbox/com/interface/device_type.rb +9 -0
- data/lib/virtualbox/com/interface/dhcp_server.rb +20 -0
- data/lib/virtualbox/com/interface/firmware_type.rb +9 -0
- data/lib/virtualbox/com/interface/guest_os_type.rb +21 -0
- data/lib/virtualbox/com/interface/host.rb +40 -0
- data/lib/virtualbox/com/interface/host_network_interface.rb +28 -0
- data/lib/virtualbox/com/interface/host_network_interface_medium_type.rb +9 -0
- data/lib/virtualbox/com/interface/host_network_interface_status.rb +9 -0
- data/lib/virtualbox/com/interface/host_network_interface_type.rb +9 -0
- data/lib/virtualbox/com/interface/host_usb_device.rb +11 -0
- data/lib/virtualbox/com/interface/host_usb_device_filter.rb +11 -0
- data/lib/virtualbox/com/interface/hw_virt_ex_property_type.rb +9 -0
- data/lib/virtualbox/com/interface/machine.rb +103 -0
- data/lib/virtualbox/com/interface/machine_state.rb +12 -0
- data/lib/virtualbox/com/interface/medium.rb +48 -0
- data/lib/virtualbox/com/interface/medium_attachment.rb +16 -0
- data/lib/virtualbox/com/interface/medium_format.rb +16 -0
- data/lib/virtualbox/com/interface/medium_state.rb +9 -0
- data/lib/virtualbox/com/interface/medium_type.rb +9 -0
- data/lib/virtualbox/com/interface/medium_variant.rb +9 -0
- data/lib/virtualbox/com/interface/network_adapter.rb +28 -0
- data/lib/virtualbox/com/interface/network_adapter_type.rb +9 -0
- data/lib/virtualbox/com/interface/network_attachment_type.rb +9 -0
- data/lib/virtualbox/com/interface/nsiexception.rb +21 -0
- data/lib/virtualbox/com/interface/nsisupports.rb +13 -0
- data/lib/virtualbox/com/interface/parallel_port.rb +15 -0
- data/lib/virtualbox/com/interface/port_mode.rb +9 -0
- data/lib/virtualbox/com/interface/progress.rb +58 -0
- data/lib/virtualbox/com/interface/serial_port.rb +17 -0
- data/lib/virtualbox/com/interface/session.rb +16 -0
- data/lib/virtualbox/com/interface/session_state.rb +9 -0
- data/lib/virtualbox/com/interface/session_type.rb +9 -0
- data/lib/virtualbox/com/interface/shared_folder.rb +15 -0
- data/lib/virtualbox/com/interface/snapshot.rb +18 -0
- data/lib/virtualbox/com/interface/storage_bus.rb +9 -0
- data/lib/virtualbox/com/interface/storage_controller.rb +21 -0
- data/lib/virtualbox/com/interface/storage_controller_type.rb +9 -0
- data/lib/virtualbox/com/interface/system_properties.rb +35 -0
- data/lib/virtualbox/com/interface/usb_controller.rb +18 -0
- data/lib/virtualbox/com/interface/usb_device.rb +22 -0
- data/lib/virtualbox/com/interface/usb_device_filter.rb +21 -0
- data/lib/virtualbox/com/interface/usb_device_filter_action.rb +9 -0
- data/lib/virtualbox/com/interface/usb_device_state.rb +9 -0
- data/lib/virtualbox/com/interface/virtual_box_error_info.rb +15 -0
- data/lib/virtualbox/com/interface/virtual_system_description.rb +17 -0
- data/lib/virtualbox/com/interface/virtual_system_description_type.rb +12 -0
- data/lib/virtualbox/com/interface/virtual_system_description_value_type.rb +9 -0
- data/lib/virtualbox/com/interface/virtualbox.rb +54 -0
- data/lib/virtualbox/com/interface/vrdp_auth_type.rb +9 -0
- data/lib/virtualbox/com/interface/vrdp_server.rb +17 -0
- data/lib/virtualbox/com/mscom_interface.rb +22 -0
- data/lib/virtualbox/com/util.rb +18 -0
- data/lib/virtualbox/dvd.rb +7 -94
- data/lib/virtualbox/exceptions.rb +24 -0
- data/lib/virtualbox/ext/glob_loader.rb +22 -0
- data/lib/virtualbox/ext/logger.rb +38 -0
- data/lib/virtualbox/ext/platform.rb +1 -1
- data/lib/virtualbox/extra_data.rb +25 -37
- data/lib/virtualbox/forwarded_port.rb +35 -13
- data/lib/virtualbox/global.rb +22 -80
- data/lib/virtualbox/hard_drive.rb +30 -97
- data/lib/virtualbox/lib.rb +82 -0
- data/lib/virtualbox/media.rb +7 -6
- data/lib/virtualbox/medium.rb +138 -0
- data/lib/virtualbox/medium_attachment.rb +61 -0
- data/lib/virtualbox/network_adapter.rb +134 -0
- data/lib/virtualbox/shared_folder.rb +53 -78
- data/lib/virtualbox/storage_controller.rb +76 -20
- data/lib/virtualbox/system_properties.rb +74 -0
- data/lib/virtualbox/usb_controller.rb +55 -0
- data/lib/virtualbox/version.rb +15 -0
- data/lib/virtualbox/virtual_system_description.rb +47 -0
- data/lib/virtualbox/vm.rb +160 -272
- data/test/test_helper.rb +0 -108
- data/test/virtualbox/abstract_model/attributable_test.rb +7 -1
- data/test/virtualbox/abstract_model/dirty_test.rb +1 -1
- data/test/virtualbox/abstract_model/interface_attributes_test.rb +169 -0
- data/test/virtualbox/abstract_model/relatable_test.rb +20 -0
- data/test/virtualbox/abstract_model_test.rb +40 -5
- data/test/virtualbox/appliance_test.rb +152 -0
- data/test/virtualbox/audio_adapter_test.rb +83 -0
- data/test/virtualbox/bios_test.rb +83 -0
- data/test/virtualbox/com/abstract_enum_test.rb +48 -0
- data/test/virtualbox/com/abstract_implementer_test.rb +39 -0
- data/test/virtualbox/com/abstract_interface_test.rb +139 -0
- data/test/virtualbox/com/ffi/interface_test.rb +249 -0
- data/test/virtualbox/com/ffi/util_test.rb +86 -0
- data/test/virtualbox/com/ffi_interface_test.rb +42 -0
- data/test/virtualbox/com/implementer/base_test.rb +37 -0
- data/test/virtualbox/com/implementer/ffi_test.rb +519 -0
- data/test/virtualbox/com/implementer/mscom_test.rb +208 -0
- data/test/virtualbox/com/mscom_interface_test.rb +17 -0
- data/test/virtualbox/com/util_test.rb +17 -0
- data/test/virtualbox/dvd_test.rb +4 -95
- data/test/virtualbox/ext/platform_test.rb +8 -0
- data/test/virtualbox/extra_data_test.rb +78 -102
- data/test/virtualbox/forwarded_port_test.rb +57 -7
- data/test/virtualbox/global_test.rb +25 -115
- data/test/virtualbox/hard_drive_test.rb +49 -212
- data/test/virtualbox/lib_test.rb +93 -0
- data/test/virtualbox/medium_attachment_test.rb +147 -0
- data/test/virtualbox/medium_test.rb +192 -0
- data/test/virtualbox/network_adapter_test.rb +160 -0
- data/test/virtualbox/shared_folder_test.rb +144 -160
- data/test/virtualbox/storage_controller_test.rb +166 -45
- data/test/virtualbox/system_properties_test.rb +87 -0
- data/test/virtualbox/usb_controller_test.rb +104 -0
- data/test/virtualbox/version_test.rb +34 -0
- data/test/virtualbox/virtual_system_description_test.rb +61 -0
- data/test/virtualbox/vm_test.rb +288 -322
- data/test/virtualbox_test.rb +1 -9
- data/virtualbox.gemspec +139 -23
- metadata +143 -27
- data/lib/virtualbox/attached_device.rb +0 -249
- data/lib/virtualbox/command.rb +0 -109
- data/lib/virtualbox/image.rb +0 -137
- data/lib/virtualbox/nic.rb +0 -111
- data/lib/virtualbox/system_property.rb +0 -55
- data/lib/virtualbox/usb.rb +0 -72
- data/test/virtualbox/attached_device_test.rb +0 -303
- data/test/virtualbox/command_test.rb +0 -152
- data/test/virtualbox/image_test.rb +0 -190
- data/test/virtualbox/nic_test.rb +0 -76
- data/test/virtualbox/system_property_test.rb +0 -71
- data/test/virtualbox/usb_test.rb +0 -35
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'test_helper')
|
|
2
|
+
|
|
3
|
+
class SystemPropertiesTest < Test::Unit::TestCase
|
|
4
|
+
setup do
|
|
5
|
+
@klass = VirtualBox::SystemProperties
|
|
6
|
+
@interface = mock("interface")
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
context "initializing" do
|
|
10
|
+
should "load attributes from the machine" do
|
|
11
|
+
@klass.any_instance.expects(:initialize_attributes).with(@interface).once
|
|
12
|
+
@klass.new(@interface)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
context "initializing attributes" do
|
|
17
|
+
setup do
|
|
18
|
+
@klass.any_instance.stubs(:load_interface_attributes)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
should "load interface attribtues" do
|
|
22
|
+
@klass.any_instance.expects(:load_interface_attributes).with(@interface).once
|
|
23
|
+
@klass.new(@interface)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
should "setup the interface" do
|
|
27
|
+
instance = @klass.new(@interface)
|
|
28
|
+
assert_equal @interface, instance.interface
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
should "not be dirty" do
|
|
32
|
+
@instance = @klass.new(@interface)
|
|
33
|
+
assert !@instance.changed?
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
should "be existing record" do
|
|
37
|
+
@instance = @klass.new(@interface)
|
|
38
|
+
assert !@instance.new_record?
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
context "class methods" do
|
|
43
|
+
context "populating relationship" do
|
|
44
|
+
setup do
|
|
45
|
+
@instance = mock("instance")
|
|
46
|
+
|
|
47
|
+
@klass.stubs(:new).returns(@instance)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
should "return a SystemProperties instance" do
|
|
51
|
+
result = @klass.populate_relationship(nil, @interface)
|
|
52
|
+
assert_equal @instance, result
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
should "call new for every shared folder" do
|
|
56
|
+
@klass.expects(:new).with(@interface).returns(@instance)
|
|
57
|
+
result = @klass.populate_relationship(nil, @interface)
|
|
58
|
+
assert_equal @instance, result
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
context "saving relationship" do
|
|
63
|
+
setup do
|
|
64
|
+
@item = mock("item")
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
should "just call save on the item" do
|
|
68
|
+
@item.expects(:save)
|
|
69
|
+
@klass.save_relationship(nil, @item)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
context "instance methods" do
|
|
75
|
+
setup do
|
|
76
|
+
@klass.any_instance.stubs(:load_interface_attributes)
|
|
77
|
+
@instance = @klass.new(@interface)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
context "saving" do
|
|
81
|
+
should "save changed interface attributes" do
|
|
82
|
+
@instance.expects(:save_changed_interface_attributes).with(@interface)
|
|
83
|
+
@instance.save
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'test_helper')
|
|
2
|
+
|
|
3
|
+
class USBControllerTest < Test::Unit::TestCase
|
|
4
|
+
setup do
|
|
5
|
+
@klass = VirtualBox::USBController
|
|
6
|
+
@interface = mock("interface")
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
context "initializing" do
|
|
10
|
+
should "load attributes from the machine" do
|
|
11
|
+
@klass.any_instance.expects(:initialize_attributes).with(@parent, @interface).once
|
|
12
|
+
@klass.new(@parent, @interface)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
context "initializing attributes" do
|
|
17
|
+
setup do
|
|
18
|
+
@klass.any_instance.stubs(:load_interface_attributes)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
should "load interface attribtues" do
|
|
22
|
+
@klass.any_instance.expects(:load_interface_attributes).with(@interface).once
|
|
23
|
+
@klass.new(@parent, @interface)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
should "setup the parent" do
|
|
27
|
+
instance = @klass.new(@parent, @interface)
|
|
28
|
+
assert_equal @parent, instance.parent
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
should "setup the interface" do
|
|
32
|
+
instance = @klass.new(@parent, @interface)
|
|
33
|
+
assert_equal @interface, instance.interface
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
should "not be dirty" do
|
|
37
|
+
@instance = @klass.new(@parent, @interface)
|
|
38
|
+
assert !@instance.changed?
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
should "be existing record" do
|
|
42
|
+
@instance = @klass.new(@parent, @interface)
|
|
43
|
+
assert !@instance.new_record?
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
context "class methods" do
|
|
48
|
+
context "populating relationship" do
|
|
49
|
+
setup do
|
|
50
|
+
@instance = mock("instance")
|
|
51
|
+
|
|
52
|
+
@klass.stubs(:new).returns(@instance)
|
|
53
|
+
|
|
54
|
+
@controller_interface = mock("controller_interface")
|
|
55
|
+
@interface.stubs(:usb_controller).returns(@controller_interface)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
should "return a USBController instance" do
|
|
59
|
+
result = @klass.populate_relationship(nil, @interface)
|
|
60
|
+
assert_equal @instance, result
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
should "call new with the interface" do
|
|
64
|
+
@klass.expects(:new).with(@parent, @controller_interface).returns(@instance)
|
|
65
|
+
result = @klass.populate_relationship(nil, @interface)
|
|
66
|
+
assert_equal @instance, result
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
context "saving relationship" do
|
|
71
|
+
setup do
|
|
72
|
+
@item = mock("item")
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
should "just call save on the item" do
|
|
76
|
+
@item.expects(:save)
|
|
77
|
+
@klass.save_relationship(nil, @item)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
context "instance methods" do
|
|
83
|
+
setup do
|
|
84
|
+
@klass.any_instance.stubs(:load_interface_attributes)
|
|
85
|
+
@instance = @klass.new(@parent, @interface)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
context "saving" do
|
|
89
|
+
setup do
|
|
90
|
+
@session = mock("session")
|
|
91
|
+
@machine = mock("machine")
|
|
92
|
+
@usb_controller = mock("usb_controller")
|
|
93
|
+
@session.stubs(:machine).returns(@machine)
|
|
94
|
+
@machine.stubs(:usb_controller).returns(@usb_controller)
|
|
95
|
+
@parent.stubs(:with_open_session).yields(@session)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
should "save on the locked interface" do
|
|
99
|
+
@instance.expects(:save_changed_interface_attributes).with(@usb_controller).once
|
|
100
|
+
@instance.save
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'test_helper')
|
|
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
|
+
should "return the version" do
|
|
19
|
+
version = mock("version")
|
|
20
|
+
@vbox.expects(:version).returns(version)
|
|
21
|
+
assert_equal version, @module.version
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
should "return nil if an error occurs" do
|
|
25
|
+
@vbox.expects(:version).raises(LoadError)
|
|
26
|
+
assert @module.version.nil?
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
should "return the revision" do
|
|
30
|
+
revision = mock("revision")
|
|
31
|
+
@vbox.expects(:revision).returns(revision)
|
|
32
|
+
assert_equal revision, @module.revision
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'test_helper')
|
|
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
|
data/test/virtualbox/vm_test.rb
CHANGED
|
@@ -2,421 +2,387 @@ require File.join(File.dirname(__FILE__), '..', 'test_helper')
|
|
|
2
2
|
|
|
3
3
|
class VMTest < Test::Unit::TestCase
|
|
4
4
|
setup do
|
|
5
|
-
@
|
|
6
|
-
@
|
|
7
|
-
|
|
8
|
-
@name = "foo"
|
|
9
|
-
|
|
10
|
-
# Just to be sure nothing is executed
|
|
11
|
-
VirtualBox::Command.stubs(:execute).returns('')
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def create_vm
|
|
15
|
-
VirtualBox::Command.expects(:parse_xml).returns(@raw_xml_doc)
|
|
16
|
-
vm = VirtualBox::VM.load_from_xml(@name)
|
|
17
|
-
assert vm
|
|
18
|
-
vm
|
|
5
|
+
@klass = VirtualBox::VM
|
|
6
|
+
@interface = mock("interface")
|
|
19
7
|
end
|
|
20
8
|
|
|
21
|
-
context "
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
should "reload the state if true is passed as a parameter" do
|
|
32
|
-
VirtualBox::VM.expects(:raw_info).returns({ :vmstate => "on" })
|
|
33
|
-
assert_equal "on", @vm.state(true)
|
|
34
|
-
assert_equal "on", @vm.state
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
should "never have state as dirty" do
|
|
38
|
-
VirtualBox::VM.expects(:raw_info).returns({ :vmstate => "on" })
|
|
39
|
-
@vm.expects(:clear_dirty!).with(:state).once
|
|
40
|
-
@vm.state(true)
|
|
9
|
+
context "class methods" do
|
|
10
|
+
context "retrieving all machines" do
|
|
11
|
+
should "return an array of VM objects" do
|
|
12
|
+
vms = mock("vms")
|
|
13
|
+
global = mock("global")
|
|
14
|
+
global.expects(:vms).returns(vms)
|
|
15
|
+
VirtualBox::Global.expects(:global).returns(global)
|
|
16
|
+
assert_equal vms, VirtualBox::VM.all
|
|
17
|
+
end
|
|
41
18
|
end
|
|
42
19
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
VirtualBox::VM.expects(:raw_info).returns({ :vmstate => "running" })
|
|
49
|
-
assert_equal "running", @vm.state(true)
|
|
50
|
-
assert @vm.running?
|
|
51
|
-
|
|
52
|
-
VirtualBox::VM.expects(:raw_info).returns({ :vmstate => "paused" })
|
|
53
|
-
assert_equal "paused", @vm.state(true)
|
|
54
|
-
assert @vm.paused?
|
|
55
|
-
|
|
56
|
-
VirtualBox::VM.expects(:raw_info).returns({ :vmstate => "saved" })
|
|
57
|
-
assert_equal "saved", @vm.state(true)
|
|
58
|
-
assert @vm.saved?
|
|
59
|
-
|
|
60
|
-
VirtualBox::VM.expects(:raw_info).returns({ :vmstate => "aborted" })
|
|
61
|
-
assert_equal "aborted", @vm.state(true)
|
|
62
|
-
assert @vm.aborted?
|
|
63
|
-
end
|
|
64
|
-
end
|
|
20
|
+
context "finding a VM" do
|
|
21
|
+
setup do
|
|
22
|
+
@all = []
|
|
23
|
+
@klass.stubs(:all).returns(@all)
|
|
24
|
+
end
|
|
65
25
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
26
|
+
def mock_vm(uuid, name=nil)
|
|
27
|
+
vm = mock("vm-#{uuid}")
|
|
28
|
+
vm.stubs(:uuid).returns(uuid)
|
|
29
|
+
vm.stubs(:name).returns(name)
|
|
30
|
+
vm
|
|
31
|
+
end
|
|
70
32
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
33
|
+
should "return nil if it doesn't exist" do
|
|
34
|
+
@all << mock_vm("foo")
|
|
35
|
+
assert_nil @klass.find("bar")
|
|
36
|
+
end
|
|
75
37
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
38
|
+
should "return the matching vm if it is found" do
|
|
39
|
+
vm = mock_vm("foo")
|
|
40
|
+
@all << mock_vm("bar")
|
|
41
|
+
@all << vm
|
|
42
|
+
assert_equal vm, @klass.find("foo")
|
|
43
|
+
end
|
|
80
44
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
45
|
+
should "return if matching name is found" do
|
|
46
|
+
vm = mock_vm(nil, "foo")
|
|
47
|
+
@all << vm
|
|
48
|
+
assert_equal vm, @klass.find("foo")
|
|
49
|
+
end
|
|
84
50
|
end
|
|
85
51
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
52
|
+
context "importing" do
|
|
53
|
+
setup do
|
|
54
|
+
@path = "foo.rb"
|
|
55
|
+
@appliance = mock("appliance")
|
|
56
|
+
@virtual_system = mock("virtual_system")
|
|
57
|
+
@appliance.stubs(:virtual_systems).returns([@virtual_system])
|
|
58
|
+
|
|
59
|
+
@name = :foo
|
|
60
|
+
@virtual_system.stubs(:descriptions).returns({
|
|
61
|
+
:name => { :auto => @name }
|
|
62
|
+
})
|
|
63
|
+
end
|
|
90
64
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
65
|
+
should "create a new appliance with path, import, and return VM" do
|
|
66
|
+
result = mock("result")
|
|
67
|
+
proc = mock("proc")
|
|
68
|
+
VirtualBox::Appliance.expects(:new).with(@path).returns(@appliance)
|
|
69
|
+
@appliance.expects(:import).yields(proc)
|
|
70
|
+
@klass.expects(:find).with(@name).returns(result)
|
|
71
|
+
proc.expects(:call)
|
|
95
72
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
@vm.export("foo", {}, true)
|
|
100
|
-
}
|
|
101
|
-
end
|
|
102
|
-
end
|
|
73
|
+
value = @klass.import(@path) do |proc|
|
|
74
|
+
proc.call
|
|
75
|
+
end
|
|
103
76
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
@vm = create_vm
|
|
77
|
+
assert_equal result, value
|
|
78
|
+
end
|
|
107
79
|
end
|
|
108
80
|
|
|
109
|
-
context "
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
assert @vm.control(:foo)
|
|
113
|
-
end
|
|
81
|
+
context "populating relationship" do
|
|
82
|
+
setup do
|
|
83
|
+
@instance = mock("instance")
|
|
114
84
|
|
|
115
|
-
|
|
116
|
-
VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
|
|
117
|
-
assert !@vm.control(:foo)
|
|
85
|
+
@klass.stubs(:new).returns(@instance)
|
|
118
86
|
end
|
|
119
87
|
|
|
120
|
-
should "
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
@vm.control(:foo, true)
|
|
124
|
-
}
|
|
88
|
+
should "return a proxied collection" do
|
|
89
|
+
result = @klass.populate_relationship(nil, [])
|
|
90
|
+
assert result.is_a?(VirtualBox::Proxies::Collection)
|
|
125
91
|
end
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
should "start a VM with the given type" do
|
|
129
|
-
VirtualBox::Command.expects(:vboxmanage).with("startvm", @name, "--type", :FOO)
|
|
130
|
-
assert @vm.start(:FOO)
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
should "return false if start failed" do
|
|
134
|
-
VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
|
|
135
|
-
assert !@vm.start
|
|
136
|
-
end
|
|
137
92
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
@vm.start(:foo, true)
|
|
142
|
-
}
|
|
143
|
-
end
|
|
93
|
+
should "call new for every machine" do
|
|
94
|
+
machines = []
|
|
95
|
+
5.times { |i| machines << mock("m#{i}") }
|
|
144
96
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
97
|
+
expected_result = []
|
|
98
|
+
new_seq = sequence("new_seq")
|
|
99
|
+
machines.each do |machine|
|
|
100
|
+
expected_value = "instance-#{machine.inspect}"
|
|
101
|
+
@klass.expects(:new).with(machine).in_sequence(new_seq).returns(expected_value)
|
|
102
|
+
expected_result << expected_value
|
|
103
|
+
end
|
|
149
104
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
assert @vm.stop
|
|
105
|
+
assert_equal expected_result, @klass.populate_relationship(nil, machines)
|
|
106
|
+
end
|
|
153
107
|
end
|
|
108
|
+
end
|
|
154
109
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
110
|
+
context "initializing" do
|
|
111
|
+
should "load attributes from the machine" do
|
|
112
|
+
@klass.any_instance.expects(:initialize_attributes).with(@interface).once
|
|
113
|
+
@klass.new(@interface)
|
|
158
114
|
end
|
|
115
|
+
end
|
|
159
116
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
117
|
+
context "initializing attributes" do
|
|
118
|
+
setup do
|
|
119
|
+
@klass.any_instance.stubs(:load_interface_attributes)
|
|
120
|
+
@klass.any_instance.stubs(:populate_relationships)
|
|
163
121
|
end
|
|
164
122
|
|
|
165
|
-
should "
|
|
166
|
-
@
|
|
167
|
-
|
|
123
|
+
should "load interface attribtues" do
|
|
124
|
+
@klass.any_instance.expects(:load_interface_attributes).with(@interface).once
|
|
125
|
+
@klass.new(@interface)
|
|
168
126
|
end
|
|
169
127
|
|
|
170
|
-
should "
|
|
171
|
-
|
|
172
|
-
|
|
128
|
+
should "populate relationships" do
|
|
129
|
+
@klass.any_instance.expects(:populate_relationships).with(@interface).once
|
|
130
|
+
@klass.new(@interface)
|
|
173
131
|
end
|
|
174
132
|
|
|
175
|
-
should "
|
|
176
|
-
|
|
177
|
-
assert !@
|
|
133
|
+
should "not be dirty" do
|
|
134
|
+
@instance = @klass.new(@interface)
|
|
135
|
+
assert !@instance.changed?
|
|
178
136
|
end
|
|
179
137
|
|
|
180
|
-
should "
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
@vm.discard_state(true)
|
|
184
|
-
}
|
|
138
|
+
should "be existing record" do
|
|
139
|
+
@instance = @klass.new(@interface)
|
|
140
|
+
assert !@instance.new_record?
|
|
185
141
|
end
|
|
186
142
|
end
|
|
187
143
|
|
|
188
|
-
context "
|
|
144
|
+
context "instance methods" do
|
|
189
145
|
setup do
|
|
190
|
-
@
|
|
146
|
+
@klass.any_instance.stubs(:initialize_attributes)
|
|
147
|
+
@instance = @klass.new(@interface)
|
|
191
148
|
end
|
|
192
149
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
@
|
|
198
|
-
end
|
|
150
|
+
def setup_session_mocks
|
|
151
|
+
@parent = mock("parent")
|
|
152
|
+
@session = mock("session")
|
|
153
|
+
@lib = mock("lib")
|
|
154
|
+
@progress = mock("progress")
|
|
199
155
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
@
|
|
156
|
+
@session.stubs(:close)
|
|
157
|
+
@progress.stubs(:wait_for_completion)
|
|
158
|
+
@lib.stubs(:session).returns(@session)
|
|
159
|
+
@uuid = :foo
|
|
160
|
+
|
|
161
|
+
VirtualBox::Lib.stubs(:lib).returns(@lib)
|
|
162
|
+
@interface.stubs(:parent).returns(@parent)
|
|
163
|
+
@instance.stubs(:imachine).returns(@interface)
|
|
164
|
+
@instance.stubs(:uuid).returns(@uuid)
|
|
165
|
+
@instance.stubs(:running).returns(false)
|
|
203
166
|
end
|
|
204
|
-
end
|
|
205
167
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
168
|
+
context "destroying" do
|
|
169
|
+
setup do
|
|
170
|
+
@instance.stubs(:uuid).returns(:foo)
|
|
209
171
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
172
|
+
@interface_parent = mock("interface_parent")
|
|
173
|
+
@interface.stubs(:parent).returns(@interface_parent)
|
|
174
|
+
end
|
|
213
175
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
176
|
+
should "destroy relationships first, then the machine" do
|
|
177
|
+
destroy_seq = sequence("destroy_seq")
|
|
178
|
+
VirtualBox::StorageController.expects(:destroy_relationship).in_sequence(destroy_seq)
|
|
179
|
+
@interface_parent.expects(:unregister_machine).with(@instance.uuid).in_sequence(destroy_seq)
|
|
180
|
+
@interface.expects(:delete_settings).once.in_sequence(destroy_seq)
|
|
218
181
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
VirtualBox::VM.all(true)
|
|
182
|
+
@instance.destroy
|
|
183
|
+
end
|
|
222
184
|
end
|
|
223
185
|
|
|
224
|
-
context "
|
|
186
|
+
context "state" do
|
|
225
187
|
setup do
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
"bar" {zefaldf}
|
|
229
|
-
raw
|
|
188
|
+
@state = mock("state")
|
|
189
|
+
@instance.stubs(:read_attribute).with(:state).returns(@state)
|
|
230
190
|
end
|
|
231
191
|
|
|
232
|
-
should "
|
|
233
|
-
|
|
192
|
+
should "just return the state" do
|
|
193
|
+
assert_equal @state, @instance.state
|
|
234
194
|
end
|
|
235
195
|
|
|
236
|
-
should "
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
parse_seq = sequence("parse")
|
|
240
|
-
VirtualBox::VM.expects(:find).with("foo").returns(vm_foo).in_sequence(parse_seq)
|
|
241
|
-
VirtualBox::VM.expects(:find).with("bar").returns(vm_bar).in_sequence(parse_seq)
|
|
242
|
-
|
|
243
|
-
result = VirtualBox::VM.parse_vm_list(@raw)
|
|
244
|
-
assert !result.empty?
|
|
245
|
-
assert_equal 2, result.length
|
|
246
|
-
assert_equal vm_foo, result[0]
|
|
247
|
-
assert_equal vm_bar, result[1]
|
|
196
|
+
should "reload the state if reload is set" do
|
|
197
|
+
@instance.expects(:load_interface_attribute).with(:state).once
|
|
198
|
+
assert_equal @state, @instance.state(true)
|
|
248
199
|
end
|
|
249
200
|
end
|
|
250
|
-
end
|
|
251
201
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
Interpreting /Users/mitchellh/base.ovf...
|
|
257
|
-
OK.
|
|
258
|
-
Disks: vmdisk1 21474836480 -1 http://www.vmware.com/specifications/vmdk.html#sparse HoboBase.vmdk 379268096 -1 <NULL>
|
|
259
|
-
Virtual system 0:
|
|
260
|
-
0: Suggested OS type: "Ubuntu"
|
|
261
|
-
(change with "--vsys 0 --ostype <type>"; use "list ostypes" to list all possible values)
|
|
262
|
-
1: Suggested VM name "Base_1"
|
|
263
|
-
(change with "--vsys 0 --vmname <name>")
|
|
264
|
-
2: Number of CPUs: 1
|
|
265
|
-
raw
|
|
266
|
-
end
|
|
202
|
+
context "starting" do
|
|
203
|
+
setup do
|
|
204
|
+
setup_session_mocks
|
|
205
|
+
end
|
|
267
206
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
207
|
+
should "open remote session using the given mode, wait for completion, then close" do
|
|
208
|
+
start_seq = sequence('start_seq')
|
|
209
|
+
mode = "foo"
|
|
210
|
+
@parent.expects(:open_remote_session).with(@session, @uuid, mode, "").once.returns(@progress).in_sequence(start_seq)
|
|
211
|
+
@progress.expects(:wait_for_completion).with(-1).in_sequence(start_seq)
|
|
212
|
+
@session.expects(:close).in_sequence(start_seq)
|
|
213
|
+
assert @instance.start(mode)
|
|
214
|
+
end
|
|
273
215
|
|
|
274
|
-
|
|
275
|
-
|
|
216
|
+
should "return false if state is running" do
|
|
217
|
+
@instance.expects(:running?).returns(true)
|
|
218
|
+
assert !@instance.start(nil)
|
|
219
|
+
end
|
|
276
220
|
end
|
|
277
221
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
end
|
|
222
|
+
context "controlling" do
|
|
223
|
+
setup do
|
|
224
|
+
setup_session_mocks
|
|
282
225
|
|
|
283
|
-
|
|
284
|
-
setup do
|
|
285
|
-
@vm = create_vm
|
|
286
|
-
VirtualBox::AttachedDevice.any_instance.stubs(:save)
|
|
287
|
-
end
|
|
226
|
+
@parent.stubs(:open_existing_session)
|
|
288
227
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
228
|
+
@console = mock("console")
|
|
229
|
+
@console.stubs(:send)
|
|
230
|
+
@session.stubs(:console).returns(@console)
|
|
292
231
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
assert @vm.save
|
|
296
|
-
end
|
|
232
|
+
@method = :foo
|
|
233
|
+
end
|
|
297
234
|
|
|
298
|
-
|
|
299
|
-
|
|
235
|
+
should "get an existing, session, send the command, and close" do
|
|
236
|
+
method = :foo
|
|
237
|
+
control_seq = sequence("control_seq")
|
|
238
|
+
@parent.expects(:open_existing_session).with(@session, @uuid).once.in_sequence(control_seq)
|
|
239
|
+
@console.expects(:send).with(@method).once.in_sequence(control_seq)
|
|
240
|
+
@session.expects(:close).in_sequence(control_seq)
|
|
300
241
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
end
|
|
242
|
+
@instance.control(@method)
|
|
243
|
+
end
|
|
304
244
|
|
|
305
|
-
|
|
306
|
-
|
|
245
|
+
should "wait for completion if an IProgress is returned" do
|
|
246
|
+
progress = mock("IProgress")
|
|
247
|
+
progress.stubs(:is_a?).with(VirtualBox::COM::Interface::Progress).returns(true)
|
|
248
|
+
progress.expects(:wait_for_completion).with(-1).once
|
|
249
|
+
@console.expects(:send).with(@method).returns(progress)
|
|
250
|
+
@instance.control(@method)
|
|
251
|
+
end
|
|
307
252
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
@
|
|
311
|
-
|
|
253
|
+
should "forward other args" do
|
|
254
|
+
@console.expects(:send).with(@method, 1, 2, 3).once
|
|
255
|
+
@instance.control(@method, 1, 2, 3)
|
|
256
|
+
end
|
|
312
257
|
end
|
|
313
258
|
|
|
314
|
-
|
|
315
|
-
|
|
259
|
+
context "control helpers" do
|
|
260
|
+
should "call the proper control method" do
|
|
261
|
+
methods = {
|
|
262
|
+
:shutdown => :power_button,
|
|
263
|
+
:stop => :power_down,
|
|
264
|
+
:pause => :pause,
|
|
265
|
+
:resume => :resume,
|
|
266
|
+
:save_state => :save_state,
|
|
267
|
+
:discard_state => [:forget_saved_state, true]
|
|
268
|
+
}
|
|
316
269
|
|
|
317
|
-
|
|
318
|
-
|
|
270
|
+
methods.each do |method, control|
|
|
271
|
+
control = [control] unless control.is_a?(Array)
|
|
272
|
+
@instance.expects(:control).with(*control).once
|
|
273
|
+
@instance.send(method)
|
|
274
|
+
end
|
|
275
|
+
end
|
|
319
276
|
end
|
|
320
277
|
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
end
|
|
278
|
+
context "saving" do
|
|
279
|
+
setup do
|
|
280
|
+
@session = mock("session")
|
|
281
|
+
@session.stubs(:machine).returns(@parent)
|
|
326
282
|
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
283
|
+
@locked_interface = mock("locked_interface")
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
should "open the session, save, and close" do
|
|
287
|
+
save_seq = sequence("save_seq")
|
|
288
|
+
@instance.expects(:with_open_session).once.yields(@session).in_sequence(save_seq)
|
|
289
|
+
@session.expects(:machine).returns(@locked_interface).in_sequence(save_seq)
|
|
290
|
+
@instance.expects(:save_changed_interface_attributes).with(@locked_interface).in_sequence(save_seq)
|
|
291
|
+
@instance.expects(:save_relationships).in_sequence(save_seq)
|
|
330
292
|
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
assert @vm.save
|
|
293
|
+
@instance.save
|
|
294
|
+
end
|
|
334
295
|
end
|
|
335
296
|
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
297
|
+
context "opening a session [direct]" do
|
|
298
|
+
setup do
|
|
299
|
+
setup_session_mocks
|
|
339
300
|
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
301
|
+
@locked_interface = mock("locked_interface")
|
|
302
|
+
@session.stubs(:machine).returns(@locked_interface)
|
|
303
|
+
@session.stubs(:state).returns(:closed)
|
|
304
|
+
end
|
|
344
305
|
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
VirtualBox::SharedFolder.expects(:save_relationship).once
|
|
349
|
-
VirtualBox::ExtraData.expects(:save_relationship).once
|
|
350
|
-
VirtualBox::ForwardedPort.expects(:save_relationship).once
|
|
351
|
-
assert @vm.save
|
|
352
|
-
end
|
|
353
|
-
end
|
|
306
|
+
should "open the session, save, and close" do
|
|
307
|
+
save_seq = sequence("save_seq")
|
|
308
|
+
@proc = Proc.new {}
|
|
354
309
|
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
VirtualBox::VM.load_from_xml("foo")
|
|
360
|
-
end
|
|
310
|
+
@parent.expects(:open_session).with(@session, @uuid).in_sequence(save_seq)
|
|
311
|
+
@proc.expects(:call).with(@session).once.in_sequence(save_seq)
|
|
312
|
+
@locked_interface.expects(:save_settings).once.in_sequence(save_seq)
|
|
313
|
+
@session.expects(:close).in_sequence(save_seq)
|
|
361
314
|
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
end
|
|
315
|
+
@instance.with_open_session do |session|
|
|
316
|
+
@proc.call(session)
|
|
317
|
+
end
|
|
318
|
+
end
|
|
367
319
|
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
end
|
|
320
|
+
should "only open the session and close once" do
|
|
321
|
+
open_seq = sequence("open_seq")
|
|
371
322
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
:name => "foo",
|
|
376
|
-
:ostype => "Ubuntu",
|
|
377
|
-
:uuid => "8710d3db-d96a-46ed-9004-59fa891fda90"
|
|
378
|
-
}
|
|
379
|
-
end
|
|
323
|
+
@parent.expects(:open_session).with(@session, @uuid).in_sequence(open_seq)
|
|
324
|
+
@locked_interface.expects(:save_settings).once.in_sequence(open_seq)
|
|
325
|
+
@session.expects(:close).once.in_sequence(open_seq)
|
|
380
326
|
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
vm = VirtualBox::VM.find(@name)
|
|
384
|
-
assert vm
|
|
327
|
+
@instance.with_open_session do |session|
|
|
328
|
+
session.stubs(:state).returns(:open)
|
|
385
329
|
|
|
386
|
-
|
|
387
|
-
|
|
330
|
+
@instance.with_open_session do |subsession|
|
|
331
|
+
assert_equal session, subsession
|
|
332
|
+
end
|
|
333
|
+
end
|
|
388
334
|
end
|
|
389
335
|
end
|
|
390
336
|
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
337
|
+
context "state methods" do
|
|
338
|
+
should "check the proper results" do
|
|
339
|
+
methods = {
|
|
340
|
+
:running? => :running,
|
|
341
|
+
:powered_off? => :powered_off,
|
|
342
|
+
:paused? => :paused,
|
|
343
|
+
:saved? => :saved,
|
|
344
|
+
:aborted? => :aborted
|
|
345
|
+
}
|
|
396
346
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
assert_equal 1, result.length
|
|
401
|
-
assert_equal "Zam", result[:zing]
|
|
402
|
-
end
|
|
347
|
+
methods.each do |method, value|
|
|
348
|
+
@instance.stubs(:state).returns(value)
|
|
349
|
+
assert @instance.send(method)
|
|
403
350
|
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
351
|
+
@instance.stubs(:state).returns(:nope)
|
|
352
|
+
assert !@instance.send(method)
|
|
353
|
+
end
|
|
354
|
+
end
|
|
408
355
|
end
|
|
409
356
|
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
357
|
+
context "exporting" do
|
|
358
|
+
setup do
|
|
359
|
+
@path = "foo.rb"
|
|
360
|
+
@appliance = mock("appliance")
|
|
361
|
+
@appliance.stubs(:path=)
|
|
362
|
+
@appliance.stubs(:add_machine)
|
|
363
|
+
|
|
364
|
+
VirtualBox::Appliance.stubs(:new).returns(@appliance)
|
|
365
|
+
end
|
|
414
366
|
|
|
415
|
-
|
|
416
|
-
|
|
367
|
+
should "create a new appliance with path and export" do
|
|
368
|
+
result = mock("result")
|
|
369
|
+
VirtualBox::Appliance.expects(:new).returns(@appliance)
|
|
370
|
+
@appliance.expects(:path=).with(@path)
|
|
371
|
+
@appliance.expects(:add_machine).with(@instance)
|
|
372
|
+
@appliance.expects(:export)
|
|
417
373
|
|
|
418
|
-
|
|
419
|
-
|
|
374
|
+
@instance.export(@path)
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
should "forward any block to the appliance export method" do
|
|
378
|
+
proc = mock("proc")
|
|
379
|
+
@appliance.expects(:export).yields(proc)
|
|
380
|
+
proc.expects(:call)
|
|
381
|
+
|
|
382
|
+
@instance.export(@path) do |yielded_proc|
|
|
383
|
+
yielded_proc.call
|
|
384
|
+
end
|
|
385
|
+
end
|
|
420
386
|
end
|
|
421
387
|
end
|
|
422
388
|
end
|