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,93 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'test_helper')
|
|
2
|
+
|
|
3
|
+
class LibTest < Test::Unit::TestCase
|
|
4
|
+
context "the virtualbox library file path" do
|
|
5
|
+
setup do
|
|
6
|
+
VirtualBox::Lib.lib_path = nil
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
should "return the path if its set" do
|
|
10
|
+
File.expects(:expand_path).with("foo").returns("expanded_foo")
|
|
11
|
+
VirtualBox::Lib.lib_path = "foo"
|
|
12
|
+
assert_equal "expanded_foo", VirtualBox::Lib.lib_path
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
should "return Mac-path if on mac" do
|
|
16
|
+
result = ["/Applications/VirtualBox.app/Contents/MacOS/VBoxXPCOMC.dylib"]
|
|
17
|
+
VirtualBox::Platform.stubs(:mac?).returns(true)
|
|
18
|
+
|
|
19
|
+
assert_equal result, VirtualBox::Lib.lib_path
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
should "return Windows-path if on windows" do
|
|
23
|
+
result = "Unknown"
|
|
24
|
+
VirtualBox::Platform.stubs(:mac?).returns(false)
|
|
25
|
+
VirtualBox::Platform.stubs(:linux?).returns(false)
|
|
26
|
+
VirtualBox::Platform.stubs(:windows?).returns(true)
|
|
27
|
+
|
|
28
|
+
assert_equal result, VirtualBox::Lib.lib_path
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
should "return Linux-path if on linux" do
|
|
32
|
+
result = ["/opt/VirtualBox/VBoxXPCOMC.so", "/usr/lib/virtualbox/VBoxXPCOMC.so"]
|
|
33
|
+
VirtualBox::Platform.stubs(:mac?).returns(false)
|
|
34
|
+
VirtualBox::Platform.stubs(:windows?).returns(false)
|
|
35
|
+
VirtualBox::Platform.stubs(:linux?).returns(true)
|
|
36
|
+
|
|
37
|
+
assert_equal result, VirtualBox::Lib.lib_path
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
should "return 'unknown' otherwise" do
|
|
41
|
+
result = "Unknown"
|
|
42
|
+
VirtualBox::Platform.stubs(:mac?).returns(false)
|
|
43
|
+
VirtualBox::Platform.stubs(:windows?).returns(false)
|
|
44
|
+
VirtualBox::Platform.stubs(:linux?).returns(false)
|
|
45
|
+
|
|
46
|
+
assert_equal result, VirtualBox::Lib.lib_path
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
context "accessing the lib" do
|
|
51
|
+
setup do
|
|
52
|
+
@lib_path = "foo"
|
|
53
|
+
VirtualBox::Lib.stubs(:lib_path).returns(@lib_path)
|
|
54
|
+
VirtualBox::Lib.reset!
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
should "create a new Lib instance with the lib path once" do
|
|
58
|
+
instance = mock("instance")
|
|
59
|
+
VirtualBox::Lib.expects(:new).once.returns(instance)
|
|
60
|
+
assert_equal instance, VirtualBox::Lib.lib
|
|
61
|
+
assert_equal instance, VirtualBox::Lib.lib
|
|
62
|
+
assert_equal instance, VirtualBox::Lib.lib
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
context "init-ing" do
|
|
67
|
+
setup do
|
|
68
|
+
@lib_path = "foo"
|
|
69
|
+
|
|
70
|
+
@virtualbox = mock("virtualbox")
|
|
71
|
+
@session = mock("session")
|
|
72
|
+
@interface = mock("interface")
|
|
73
|
+
@interface.stubs(:virtualbox).returns(@virtualbox)
|
|
74
|
+
@interface.stubs(:session).returns(@session)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
should "call init on FFI with the lib path for mac" do
|
|
78
|
+
VirtualBox::Platform.stubs(:windows?).returns(false)
|
|
79
|
+
VirtualBox::COM::FFIInterface.expects(:create).with(@lib_path).once.returns(@interface)
|
|
80
|
+
lib = VirtualBox::Lib.new(@lib_path)
|
|
81
|
+
assert_equal @virtualbox, lib.virtualbox
|
|
82
|
+
assert_equal @session, lib.session
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
should "init MSCOM for windows" do
|
|
86
|
+
VirtualBox::Platform.stubs(:windows?).returns(true)
|
|
87
|
+
VirtualBox::COM::MSCOMInterface.expects(:new).once.returns(@interface)
|
|
88
|
+
lib = VirtualBox::Lib.new(@lib_path)
|
|
89
|
+
assert_equal @virtualbox, lib.virtualbox
|
|
90
|
+
assert_equal @session, lib.session
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'test_helper')
|
|
2
|
+
|
|
3
|
+
class MediumAttachmentTest < Test::Unit::TestCase
|
|
4
|
+
setup do
|
|
5
|
+
@interface = mock("interface")
|
|
6
|
+
@interface.stubs(:medium)
|
|
7
|
+
@parent = mock("parent")
|
|
8
|
+
|
|
9
|
+
@klass = VirtualBox::MediumAttachment
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
context "class methods" do
|
|
13
|
+
context "populating relationships" do
|
|
14
|
+
setup do
|
|
15
|
+
@instance = mock("instance")
|
|
16
|
+
|
|
17
|
+
@interface.stubs(:medium_attachments).returns([])
|
|
18
|
+
|
|
19
|
+
@klass.stubs(:device_type).returns(:all)
|
|
20
|
+
@klass.stubs(:new).returns(@instance)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
should "return a proxied collection" do
|
|
24
|
+
result = @klass.populate_relationship(nil, @interface)
|
|
25
|
+
assert result.is_a?(VirtualBox::Proxies::Collection)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
should "call new for every medium if device type is all" do
|
|
29
|
+
attachments = []
|
|
30
|
+
@interface.stubs(:medium_attachments).returns(attachments)
|
|
31
|
+
5.times { |i| attachments << mock("a#{i}") }
|
|
32
|
+
|
|
33
|
+
expected_result = []
|
|
34
|
+
new_seq = sequence("new_seq")
|
|
35
|
+
attachments.each do |attachment|
|
|
36
|
+
expected_value = "instance-#{attachment.inspect}"
|
|
37
|
+
@klass.expects(:new).with(@parent, attachment).in_sequence(new_seq).returns(expected_value)
|
|
38
|
+
expected_result << expected_value
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
assert_equal expected_result, @klass.populate_relationship(@parent, @interface)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
context "initializing" do
|
|
47
|
+
should "load attributes from the machine" do
|
|
48
|
+
@klass.any_instance.expects(:initialize_attributes).with(@interface).once
|
|
49
|
+
@klass.new(@parent, @interface)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
context "initializing attributes" do
|
|
54
|
+
setup do
|
|
55
|
+
@klass.any_instance.stubs(:load_interface_attributes)
|
|
56
|
+
@klass.any_instance.stubs(:populate_relationship)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
should "load interface attribtues" do
|
|
60
|
+
@klass.any_instance.expects(:load_interface_attributes).with(@interface).once
|
|
61
|
+
@klass.new(@parent, @interface)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
should "populate relationships" do
|
|
65
|
+
@klass.any_instance.expects(:populate_relationship).twice
|
|
66
|
+
@klass.new(@parent, @interface)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
should "not be dirty" do
|
|
70
|
+
@instance = @klass.new(@parent, @interface)
|
|
71
|
+
assert !@instance.changed?
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
should "be existing record" do
|
|
75
|
+
@instance = @klass.new(@parent, @interface)
|
|
76
|
+
assert !@instance.new_record?
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
context "instance methods" do
|
|
81
|
+
setup do
|
|
82
|
+
@klass.any_instance.stubs(:initialize_attributes)
|
|
83
|
+
|
|
84
|
+
@parent = mock("parent")
|
|
85
|
+
@interface = mock("interface")
|
|
86
|
+
@instance = @klass.new(@parent, @interface)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
context "detaching" do
|
|
90
|
+
setup do
|
|
91
|
+
@machine = mock("machine")
|
|
92
|
+
@session = mock("session")
|
|
93
|
+
@session.stubs(:machine).returns(@machine)
|
|
94
|
+
|
|
95
|
+
@sc = mock("storage_controller")
|
|
96
|
+
@sc.stubs(:name).returns("foo")
|
|
97
|
+
@instance.stubs(:storage_controller).returns(@sc)
|
|
98
|
+
@instance.stubs(:port).returns(7)
|
|
99
|
+
@instance.stubs(:device).returns(12)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
should "open session, detach, then save" do
|
|
103
|
+
det_seq = sequence("detach_seq")
|
|
104
|
+
@parent.expects(:with_open_session).yields(@session).in_sequence(det_seq)
|
|
105
|
+
@machine.expects(:detach_device).with(@sc.name, @instance.port, @instance.device).in_sequence(det_seq)
|
|
106
|
+
|
|
107
|
+
@instance.detach
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
context "destroying" do
|
|
112
|
+
setup do
|
|
113
|
+
@medium = mock("medium")
|
|
114
|
+
@instance.stubs(:medium).returns(@medium)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
should "just detach" do
|
|
118
|
+
@instance.expects(:detach).once
|
|
119
|
+
@instance.destroy
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
should "not destroy medium if nil but specified" do
|
|
123
|
+
@instance.stubs(:medium).returns(nil)
|
|
124
|
+
|
|
125
|
+
@instance.expects(:detach).once
|
|
126
|
+
@medium.expects(:destroy).with(false).never
|
|
127
|
+
assert_nothing_raised {
|
|
128
|
+
@instance.destroy(:destroy_medium => true)
|
|
129
|
+
}
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
should "destroy medium if specified" do
|
|
133
|
+
destroy_seq = sequence("destroy_seq")
|
|
134
|
+
@instance.expects(:detach).once.in_sequence(destroy_seq)
|
|
135
|
+
@medium.expects(:destroy).with(false).once.in_sequence(destroy_seq)
|
|
136
|
+
@instance.destroy(:destroy_medium => true)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
should "destroy medium and backing store if specified" do
|
|
140
|
+
destroy_seq = sequence("destroy_seq")
|
|
141
|
+
@instance.expects(:detach).once.in_sequence(destroy_seq)
|
|
142
|
+
@medium.expects(:destroy).with(true).once.in_sequence(destroy_seq)
|
|
143
|
+
@instance.destroy(:destroy_medium => :delete)
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'test_helper')
|
|
2
|
+
|
|
3
|
+
class MediumTest < Test::Unit::TestCase
|
|
4
|
+
setup do
|
|
5
|
+
@klass = VirtualBox::Medium
|
|
6
|
+
@imedium = mock("IMedium")
|
|
7
|
+
@interface = @imedium
|
|
8
|
+
@imedium.stubs(:refresh_state)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
context "class methods" do
|
|
12
|
+
context "device type" do
|
|
13
|
+
should "be all on the medium" do
|
|
14
|
+
assert_equal :all, @klass.device_type
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
context "populating relationships" do
|
|
19
|
+
setup do
|
|
20
|
+
@caller = mock("caller")
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
should "call populate_array_relationship for arrays" do
|
|
24
|
+
@klass.expects(:populate_array_relationship).with(@caller, []).once
|
|
25
|
+
@klass.populate_relationship(@caller, [])
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
should "call populate_single_relationship for non-arrays" do
|
|
29
|
+
@klass.expects(:populate_single_relationship).with(@caller, nil).once
|
|
30
|
+
@klass.populate_relationship(@caller, nil)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
context "populating array relationship" do
|
|
35
|
+
setup do
|
|
36
|
+
@instance = mock("instance")
|
|
37
|
+
|
|
38
|
+
@klass.stubs(:device_type).returns(:all)
|
|
39
|
+
@klass.stubs(:new).returns(@instance)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def mock_medium(device_type)
|
|
43
|
+
medium = mock("medium")
|
|
44
|
+
medium.stubs(:device_type).returns(device_type)
|
|
45
|
+
medium
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
should "return a proxied collection" do
|
|
49
|
+
result = @klass.populate_array_relationship(nil, [])
|
|
50
|
+
assert result.is_a?(VirtualBox::Proxies::Collection)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
should "call new for every medium if device type is all" do
|
|
54
|
+
media = []
|
|
55
|
+
5.times { |i| media << mock_medium("m#{i}") }
|
|
56
|
+
|
|
57
|
+
expected_result = []
|
|
58
|
+
new_seq = sequence("new_seq")
|
|
59
|
+
media.each do |medium|
|
|
60
|
+
expected_value = "instance-#{medium.inspect}"
|
|
61
|
+
@klass.expects(:new).with(medium).in_sequence(new_seq).returns(expected_value)
|
|
62
|
+
expected_result << expected_value
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
assert_equal expected_result, @klass.populate_array_relationship(nil, media)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
should "ignore non-matching devices if device_type is not :all" do
|
|
69
|
+
@klass.stubs(:device_type).returns(:foo)
|
|
70
|
+
|
|
71
|
+
media = [mock_medium(:foo), mock_medium(:bar)]
|
|
72
|
+
result = @klass.populate_array_relationship(nil, media)
|
|
73
|
+
assert_equal 1, result.length
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
context "populating a single relationship" do
|
|
78
|
+
setup do
|
|
79
|
+
@subclasses = []
|
|
80
|
+
@klass.stubs(:subclasses).returns(@subclasses)
|
|
81
|
+
@imedium.stubs(:get_device_type).returns(nil)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def mock_subclass(device_type)
|
|
85
|
+
subclass = mock("subclass")
|
|
86
|
+
subclass.stubs(:device_type).returns(device_type)
|
|
87
|
+
subclass
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
should "instantiate the matching subclass" do
|
|
91
|
+
type = :foo
|
|
92
|
+
result = mock("result")
|
|
93
|
+
matching = mock_subclass(type)
|
|
94
|
+
matching.expects(:new).with(@imedium).once.returns(result)
|
|
95
|
+
@subclasses << matching
|
|
96
|
+
@imedium.stubs(:device_type).returns(type)
|
|
97
|
+
|
|
98
|
+
assert_equal result, @klass.populate_single_relationship(nil, @imedium)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
should "return a Medium if nothing matches" do
|
|
102
|
+
result = mock("result")
|
|
103
|
+
@klass.expects(:new).with(@imedium).returns(result)
|
|
104
|
+
assert_equal result, @klass.populate_single_relationship(nil, @imedium)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
should "return nil if medium given is nil" do
|
|
108
|
+
@klass.expects(:new).never
|
|
109
|
+
assert_nil @klass.populate_single_relationship(nil, nil)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
context "initializing" do
|
|
115
|
+
should "load attributes from the machine" do
|
|
116
|
+
@klass.any_instance.expects(:initialize_attributes).with(@interface).once
|
|
117
|
+
@klass.new(@interface)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
should "set the interface as the interface attribute" do
|
|
121
|
+
@klass.any_instance.stubs(:initialize_attributes)
|
|
122
|
+
instance = @klass.new(@interface)
|
|
123
|
+
assert_equal @interface, instance.interface
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
context "initializing attributes" do
|
|
128
|
+
setup do
|
|
129
|
+
@interface.stubs(:refresh_state)
|
|
130
|
+
@klass.any_instance.stubs(:load_interface_attributes)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
should "refresh state then load interface attribtues" do
|
|
134
|
+
init_seq = sequence("init_seq")
|
|
135
|
+
@interface.expects(:refresh_state).in_sequence(init_seq)
|
|
136
|
+
@klass.any_instance.expects(:load_interface_attributes).with(@interface).once.in_sequence(init_seq)
|
|
137
|
+
@klass.new(@interface)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
should "not be dirty" do
|
|
141
|
+
@instance = @klass.new(@interface)
|
|
142
|
+
assert !@instance.changed?
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
should "be existing record" do
|
|
146
|
+
@instance = @klass.new(@interface)
|
|
147
|
+
assert !@instance.new_record?
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
context "with an instance" do
|
|
152
|
+
setup do
|
|
153
|
+
@klass.any_instance.stubs(:initialize_attributes)
|
|
154
|
+
@instance = @klass.new(@imedium)
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
context "filename" do
|
|
158
|
+
setup do
|
|
159
|
+
@location = "/foo/bar/baz.rb"
|
|
160
|
+
@instance.stubs(:location).returns(@location)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
should "return the basename of the location" do
|
|
164
|
+
assert_equal File.basename(@location), @instance.filename
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
context "destroy storage" do
|
|
169
|
+
should "delete the storage then wait for it to complete" do
|
|
170
|
+
progress = mock("progress")
|
|
171
|
+
|
|
172
|
+
@imedium.expects(:delete_storage).once.returns(progress)
|
|
173
|
+
progress.expects(:wait_for_completion).with(-1).once
|
|
174
|
+
|
|
175
|
+
@instance.destroy_storage
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
context "destroying" do
|
|
180
|
+
should "just close the medium if first argument is not specified" do
|
|
181
|
+
@instance.expects(:destroy_storage).never
|
|
182
|
+
@imedium.expects(:close).once
|
|
183
|
+
@instance.destroy
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
should "destroy the storage if first argument is true" do
|
|
187
|
+
@instance.expects(:destroy_storage).once
|
|
188
|
+
@instance.destroy(true)
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
end
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'test_helper')
|
|
2
|
+
|
|
3
|
+
class NetworkAdapterTest < Test::Unit::TestCase
|
|
4
|
+
setup do
|
|
5
|
+
@klass = VirtualBox::NetworkAdapter
|
|
6
|
+
@interface = mock("interface")
|
|
7
|
+
@parent = mock("parent")
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
context "initializing" do
|
|
11
|
+
should "load attributes from the machine" do
|
|
12
|
+
@klass.any_instance.expects(:initialize_attributes).with(@parent, @interface).once
|
|
13
|
+
@klass.new(@parent, @interface)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
context "initializing attributes" do
|
|
18
|
+
setup do
|
|
19
|
+
@klass.any_instance.stubs(:load_interface_attributes)
|
|
20
|
+
@klass.any_instance.stubs(:populate_relationships)
|
|
21
|
+
|
|
22
|
+
@instance = @klass.new(@parent, @interface)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
should "load interface attribtues" do
|
|
26
|
+
@klass.any_instance.expects(:load_interface_attributes).with(@interface).once
|
|
27
|
+
@klass.new(@parent, @interface)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
should "setup the parent" do
|
|
31
|
+
assert_equal @parent, @instance.parent
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
should "setup the interface" do
|
|
35
|
+
assert_equal @interface, @instance.interface
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
should "not be dirty" do
|
|
39
|
+
assert !@instance.changed?
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
should "be existing record" do
|
|
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
|
+
@klass.stubs(:new).returns(@instance)
|
|
52
|
+
|
|
53
|
+
@count = 5
|
|
54
|
+
@vbox = mock("vbox")
|
|
55
|
+
@system_properties = mock("sys_props")
|
|
56
|
+
@interface.stubs(:parent).returns(@vbox)
|
|
57
|
+
@vbox.stubs(:system_properties).returns(@system_properties)
|
|
58
|
+
@system_properties.stubs(:network_adapter_count).returns(@count)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
should "return a proxied collection" do
|
|
62
|
+
@system_properties.stubs(:network_adapter_count).returns(0)
|
|
63
|
+
result = @klass.populate_relationship(nil, @interface)
|
|
64
|
+
assert result.is_a?(VirtualBox::Proxies::Collection)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
should "call new for every shared folder" do
|
|
68
|
+
expected_result = []
|
|
69
|
+
new_seq = sequence("new_seq")
|
|
70
|
+
@count.times do |i|
|
|
71
|
+
expected_value = "instance-#{i}"
|
|
72
|
+
adapter = mock("adapter#{i}")
|
|
73
|
+
@interface.expects(:get_network_adapter).with(i).returns(adapter).in_sequence(new_seq)
|
|
74
|
+
@klass.expects(:new).with(@parent, adapter).in_sequence(new_seq).returns(expected_value)
|
|
75
|
+
expected_result << expected_value
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
assert_equal expected_result, @klass.populate_relationship(@parent, @interface)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
context "saving relationship" do
|
|
83
|
+
should "call save on each item" do
|
|
84
|
+
items = (1..5).to_a.collect do |i|
|
|
85
|
+
item = mock("item-#{i}")
|
|
86
|
+
item.expects(:save).once
|
|
87
|
+
item
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
@klass.save_relationship(nil, items)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
context "instance methods" do
|
|
96
|
+
setup do
|
|
97
|
+
@klass.any_instance.stubs(:load_interface_attributes)
|
|
98
|
+
@instance = @klass.new(@parent, @interface)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
context "saving" do
|
|
102
|
+
setup do
|
|
103
|
+
@adapter = mock("adapter")
|
|
104
|
+
@instance.stubs(:modify_adapter).yields(@adapter)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
should "save the attachment type and interface attributes on the open adapter" do
|
|
108
|
+
@instance.expects(:save_attachment_type).with(@adapter).once
|
|
109
|
+
@instance.expects(:save_changed_interface_attributes).with(@adapter).once
|
|
110
|
+
@instance.save
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
context "saving attachment type" do
|
|
115
|
+
setup do
|
|
116
|
+
@adapter = mock("adapter")
|
|
117
|
+
@instance.attachment_type = :nat
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
should "do nothing if attachment type is not changed" do
|
|
121
|
+
@instance.clear_dirty!
|
|
122
|
+
assert !@instance.attachment_type_changed?
|
|
123
|
+
@instance.expects(:attach_to_nat).never
|
|
124
|
+
|
|
125
|
+
@instance.save_attachment_type(@adapter)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
should "run the proper method if it has changed" do
|
|
129
|
+
@adapter.expects(:attach_to_nat).once
|
|
130
|
+
@instance.save_attachment_type(@adapter)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
should "clear the dirty state" do
|
|
134
|
+
@adapter.stubs(:attach_to_nat)
|
|
135
|
+
@instance.save_attachment_type(@adapter)
|
|
136
|
+
assert !@instance.attachment_type_changed?
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
context "modifying the adapter" do
|
|
141
|
+
setup do
|
|
142
|
+
@machine = mock("machine")
|
|
143
|
+
@session = mock("session")
|
|
144
|
+
@session.stubs(:machine).returns(@machine)
|
|
145
|
+
|
|
146
|
+
@adapter = mock("adapter")
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
should "open a session, yield the proper adapter, then save settings" do
|
|
150
|
+
seq = sequence("sequence")
|
|
151
|
+
@parent.expects(:with_open_session).yields(@session).in_sequence(seq)
|
|
152
|
+
@machine.expects(:get_network_adapter).with(@instance.slot).returns(@adapter).in_sequence(seq)
|
|
153
|
+
|
|
154
|
+
@instance.modify_adapter do |adapter|
|
|
155
|
+
assert_equal @adapter, adapter
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|