virtualbox 0.5.4 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
data/test/test_helper.rb
CHANGED
@@ -18,112 +18,4 @@ require File.join(File.dirname(__FILE__), '..', 'lib', 'virtualbox')
|
|
18
18
|
|
19
19
|
# Data
|
20
20
|
class Test::Unit::TestCase
|
21
|
-
def mock_xml_doc
|
22
|
-
Nokogiri::XML(mock_xml)
|
23
|
-
end
|
24
|
-
|
25
|
-
def mock_xml
|
26
|
-
<<-xml
|
27
|
-
<?xml version="1.0"?>
|
28
|
-
<VirtualBox xmlns="http://www.innotek.de/VirtualBox-settings" version="1.9-macosx">
|
29
|
-
<Machine uuid="{8710d3db-d96a-46ed-9004-59fa891fda90}" name="foo" OSType="Ubuntu" currentSnapshot="{f1e6edb3-6e12-4615-9642-a80a3a1ad115}" lastStateChange="2010-02-07T20:01:20Z">
|
30
|
-
<Description>This is a description</Description>
|
31
|
-
<ExtraData>
|
32
|
-
<ExtraDataItem name="GUI/AutoresizeGuest" value="on"/>
|
33
|
-
<ExtraDataItem name="GUI/Fullscreen" value="off"/>
|
34
|
-
<ExtraDataItem name="GUI/LastWindowPostion" value="1040,171,720,422"/>
|
35
|
-
<ExtraDataItem name="GUI/MiniToolBarAlignment" value="bottom"/>
|
36
|
-
<ExtraDataItem name="GUI/MiniToolBarAutoHide" value="on"/>
|
37
|
-
<ExtraDataItem name="GUI/SaveMountedAtRuntime" value="yes"/>
|
38
|
-
<ExtraDataItem name="GUI/Seamless" value="off"/>
|
39
|
-
<ExtraDataItem name="GUI/ShowMiniToolBar" value="yes"/>
|
40
|
-
<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/GuestPort" value="23"/>
|
41
|
-
<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/HostPort" value="2222"/>
|
42
|
-
<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/Protocol" value="TCP"/>
|
43
|
-
</ExtraData>
|
44
|
-
<Hardware version="2">
|
45
|
-
<CPU count="1">
|
46
|
-
<HardwareVirtEx enabled="true" exclusive="false"/>
|
47
|
-
<HardwareVirtExNestedPaging enabled="false"/>
|
48
|
-
<HardwareVirtExVPID enabled="false"/>
|
49
|
-
<PAE enabled="true"/>
|
50
|
-
</CPU>
|
51
|
-
<Memory RAMSize="360"/>
|
52
|
-
<Boot>
|
53
|
-
<Order position="1" device="Floppy"/>
|
54
|
-
<Order position="2" device="DVD"/>
|
55
|
-
<Order position="3" device="HardDisk"/>
|
56
|
-
<Order position="4" device="None"/>
|
57
|
-
</Boot>
|
58
|
-
<Display VRAMSize="12" monitorCount="1" accelerate3D="false" accelerate2DVideo="false"/>
|
59
|
-
<RemoteDisplay enabled="false" port="3389" authType="Null" authTimeout="5000"/>
|
60
|
-
<BIOS>
|
61
|
-
<ACPI enabled="true"/>
|
62
|
-
<IOAPIC enabled="false"/>
|
63
|
-
<Logo fadeIn="true" fadeOut="true" displayTime="0"/>
|
64
|
-
<BootMenu mode="MessageAndMenu"/>
|
65
|
-
<TimeOffset value="0"/>
|
66
|
-
<PXEDebug enabled="false"/>
|
67
|
-
</BIOS>
|
68
|
-
<USBController enabled="true" enabledEhci="true">
|
69
|
-
<DeviceFilter name="Apple, Inc Apple Keyboard [0069]" active="true" vendorId="05ac" productId="0220" revision="0069" manufacturer="Apple, Inc" product="Apple Keyboard" remote="no"/>
|
70
|
-
<DeviceFilter name="Micron Built-in iSight [0189]" active="false" vendorId="05ac" productId="8501" revision="0189" manufacturer="Micron" product="Built-in iSight" remote="no"/>
|
71
|
-
</USBController>
|
72
|
-
<Network>
|
73
|
-
<Adapter slot="0" enabled="true" MACAddress="0800279C2E41" cable="true" speed="0" type="Am79C973">
|
74
|
-
<NAT/>
|
75
|
-
</Adapter>
|
76
|
-
<Adapter slot="1" enabled="false" MACAddress="0800277D1707" cable="true" speed="0" type="Am79C973"/>
|
77
|
-
<Adapter slot="2" enabled="false" MACAddress="080027FB5229" cable="true" speed="0" type="Am79C973"/>
|
78
|
-
<Adapter slot="3" enabled="false" MACAddress="080027DE7343" cable="true" speed="0" type="Am79C973"/>
|
79
|
-
<Adapter slot="4" enabled="false" MACAddress="0800277989CB" cable="true" speed="0" type="Am79C973"/>
|
80
|
-
<Adapter slot="5" enabled="false" MACAddress="08002768E43B" cable="true" speed="0" type="Am79C973"/>
|
81
|
-
<Adapter slot="6" enabled="false" MACAddress="080027903DF3" cable="true" speed="0" type="Am79C973"/>
|
82
|
-
<Adapter slot="7" enabled="false" MACAddress="0800276A0A7D" cable="true" speed="0" type="Am79C973"/>
|
83
|
-
</Network>
|
84
|
-
<UART>
|
85
|
-
<Port slot="0" enabled="false" IOBase="0x3f8" IRQ="4" hostMode="Disconnected"/>
|
86
|
-
<Port slot="1" enabled="false" IOBase="0x3f8" IRQ="4" hostMode="Disconnected"/>
|
87
|
-
</UART>
|
88
|
-
<LPT>
|
89
|
-
<Port slot="0" enabled="false" IOBase="0x378" IRQ="4"/>
|
90
|
-
<Port slot="1" enabled="false" IOBase="0x378" IRQ="4"/>
|
91
|
-
</LPT>
|
92
|
-
<AudioAdapter controller="AC97" driver="CoreAudio" enabled="false"/>
|
93
|
-
<SharedFolders>
|
94
|
-
<SharedFolder name="foo" hostPath="/foo" writable="true"/>
|
95
|
-
<SharedFolder name="bar" hostPath="/bar" writable="true"/>
|
96
|
-
</SharedFolders>
|
97
|
-
<Clipboard mode="Bidirectional"/>
|
98
|
-
<Guest memoryBalloonSize="0" statisticsUpdateInterval="0"/>
|
99
|
-
<GuestProperties>
|
100
|
-
<GuestProperty name="/VirtualBox/GuestInfo/OS/Product" value="Linux" timestamp="1265440664974640000" flags=""/>
|
101
|
-
<GuestProperty name="/VirtualBox/GuestInfo/OS/Release" value="2.6.24-26-virtual" timestamp="1265440664974987000" flags=""/>
|
102
|
-
<GuestProperty name="/VirtualBox/GuestInfo/OS/Version" value="#1 SMP Tue Dec 1 20:00:30 UTC 2009" timestamp="1265440664975592000" flags=""/>
|
103
|
-
<GuestProperty name="/VirtualBox/GuestInfo/OS/ServicePack" value="" timestamp="1265440664976342000" flags=""/>
|
104
|
-
<GuestProperty name="/VirtualBox/GuestAdd/Revision" value="3.1.2" timestamp="1265440664977228000" flags=""/>
|
105
|
-
<GuestProperty name="/VirtualBox/GuestAdd/Version" value="56127" timestamp="1265440664977917000" flags=""/>
|
106
|
-
<GuestProperty name="/VirtualBox/GuestInfo/OS/LoggedInUsers" value="1" timestamp="1265441395765168000" flags=""/>
|
107
|
-
<GuestProperty name="/VirtualBox/GuestInfo/Net/Count" value="1" timestamp="1265441395765770000" flags=""/>
|
108
|
-
<GuestProperty name="/VirtualBox/GuestInfo/Net/0/V4/IP" value="10.0.2.15" timestamp="1265441395765987000" flags=""/>
|
109
|
-
<GuestProperty name="/VirtualBox/GuestInfo/Net/0/V4/Broadcast" value="10.0.2.255" timestamp="1265441395766412000" flags=""/>
|
110
|
-
<GuestProperty name="/VirtualBox/GuestInfo/Net/0/V4/Netmask" value="255.255.255.0" timestamp="1265441395766827000" flags=""/>
|
111
|
-
<GuestProperty name="/VirtualBox/GuestInfo/Net/0/Status" value="Up" timestamp="1265441395767109000" flags=""/>
|
112
|
-
<GuestProperty name="/VirtualBox/GuestInfo/OS/NoLoggedInUsers" value="false" timestamp="1265440815142014000" flags=""/>
|
113
|
-
<GuestProperty name="/VirtualBox/HostInfo/GUI/LanguageID" value="en_US" timestamp="1265440628402728000" flags=""/>
|
114
|
-
<GuestProperty name="/VirtualBox/GuestInfo/OS/LoggedInUsersList" value="hobo" timestamp="1265441395763755000" flags=""/>
|
115
|
-
</GuestProperties>
|
116
|
-
</Hardware>
|
117
|
-
<StorageControllers>
|
118
|
-
<StorageController name="foo" type="PIIX4" PortCount="2">
|
119
|
-
<AttachedDevice type="HardDisk" port="0" device="0">
|
120
|
-
<Image uuid="{2c16dd48-4cf1-497e-98fa-84ed55cfe71f}"/>
|
121
|
-
</AttachedDevice>
|
122
|
-
<AttachedDevice type="DVD" port="1" device="0"/>
|
123
|
-
</StorageController>
|
124
|
-
</StorageControllers>
|
125
|
-
</Machine>
|
126
|
-
</VirtualBox>
|
127
|
-
xml
|
128
|
-
end
|
129
21
|
end
|
@@ -164,7 +164,7 @@ class AttributableTest < Test::Unit::TestCase
|
|
164
164
|
@model = AttributeModel.new
|
165
165
|
@model.populate_attributes({
|
166
166
|
:foo => "foo",
|
167
|
-
:bar =>
|
167
|
+
:bar => false
|
168
168
|
})
|
169
169
|
|
170
170
|
@checkstring = "HEY"
|
@@ -189,6 +189,12 @@ class AttributableTest < Test::Unit::TestCase
|
|
189
189
|
}
|
190
190
|
end
|
191
191
|
|
192
|
+
should "understand false values" do
|
193
|
+
assert_nothing_raised {
|
194
|
+
assert_equal false, @model.bar
|
195
|
+
}
|
196
|
+
end
|
197
|
+
|
192
198
|
should "raise an error if attempting to write an undefined attribute" do
|
193
199
|
assert_raises(NoMethodError) { @model.baz = @check_string }
|
194
200
|
end
|
@@ -0,0 +1,169 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
|
2
|
+
|
3
|
+
class InterfaceAttributesTest < Test::Unit::TestCase
|
4
|
+
class EmptyInterfaceAttributeModel
|
5
|
+
include VirtualBox::AbstractModel::Attributable
|
6
|
+
include VirtualBox::AbstractModel::InterfaceAttributes
|
7
|
+
end
|
8
|
+
|
9
|
+
class InterfaceAttributeModel < EmptyInterfaceAttributeModel
|
10
|
+
attribute :foo
|
11
|
+
attribute :foo2, :property_getter => :get_foo, :property_setter => :set_foo
|
12
|
+
attribute :foo3, :property => :grab_foo3, :readonly => true
|
13
|
+
attribute :foo4, :property => :put_foo4
|
14
|
+
attribute :bar, :property => false
|
15
|
+
end
|
16
|
+
|
17
|
+
context "converting spec to a proc" do
|
18
|
+
setup do
|
19
|
+
@instance = EmptyInterfaceAttributeModel.new
|
20
|
+
@interface = mock("interface")
|
21
|
+
end
|
22
|
+
|
23
|
+
context "symbols" do
|
24
|
+
should "convert to a proc which calls the symbol on the interface" do
|
25
|
+
result = mock("result")
|
26
|
+
proc = @instance.spec_to_proc(:foo)
|
27
|
+
@interface.expects(:foo).once.returns(result)
|
28
|
+
assert_equal result, proc.call(@interface)
|
29
|
+
end
|
30
|
+
|
31
|
+
should "forward all parameters" do
|
32
|
+
result = mock("result")
|
33
|
+
proc = @instance.spec_to_proc(:foo)
|
34
|
+
@interface.expects(:foo).with(1, 2, 3).once.returns(result)
|
35
|
+
assert_equal result, proc.call(@interface, 1, 2, 3)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context "procs" do
|
40
|
+
should "leave proc as is" do
|
41
|
+
result = mock("result")
|
42
|
+
proc = Proc.new { |m| result }
|
43
|
+
converted = @instance.spec_to_proc(proc)
|
44
|
+
assert_equal proc, converted
|
45
|
+
assert_equal result, converted.call(@interface)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "loading a single interface attribute" do
|
51
|
+
setup do
|
52
|
+
@instance = InterfaceAttributeModel.new
|
53
|
+
@interface = mock("interface")
|
54
|
+
@interface.stubs(:foo).returns("foo")
|
55
|
+
end
|
56
|
+
|
57
|
+
should "return immediately if not a valid attribute" do
|
58
|
+
@proc.expects(:call).never
|
59
|
+
@instance.load_interface_attribute(:baz, @interface)
|
60
|
+
end
|
61
|
+
|
62
|
+
should "return immediately if is marked as a non-property" do
|
63
|
+
@proc.expects(:call).never
|
64
|
+
@instance.load_interface_attribute(:bar, @interface)
|
65
|
+
end
|
66
|
+
|
67
|
+
should "use the getter specified if exists" do
|
68
|
+
key = :foo2
|
69
|
+
@interface.expects(:get_foo).returns(:bar)
|
70
|
+
@instance.expects(:write_attribute).with(key, :bar)
|
71
|
+
@instance.load_interface_attribute(key, @interface)
|
72
|
+
end
|
73
|
+
|
74
|
+
should "use the property specified first" do
|
75
|
+
key = :foo3
|
76
|
+
@interface.expects(:grab_foo3).returns(:bar)
|
77
|
+
@instance.expects(:write_attribute).with(key, :bar)
|
78
|
+
@instance.load_interface_attribute(key, @interface)
|
79
|
+
end
|
80
|
+
|
81
|
+
should "use the attribute name if no getter is specified" do
|
82
|
+
key = :foo
|
83
|
+
@interface.expects(:foo).returns(:bar)
|
84
|
+
@instance.expects(:write_attribute).with(key, :bar)
|
85
|
+
@instance.load_interface_attribute(key, @interface)
|
86
|
+
end
|
87
|
+
|
88
|
+
should "write the attribute with the value of the proc" do
|
89
|
+
key = :foo
|
90
|
+
@instance.expects(:write_attribute).with(key, "foo").once
|
91
|
+
@instance.load_interface_attribute(key, @interface)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context "saving a single interface attribute" do
|
96
|
+
setup do
|
97
|
+
@instance = InterfaceAttributeModel.new
|
98
|
+
@interface = mock("interface")
|
99
|
+
|
100
|
+
@value = :bar
|
101
|
+
@instance.stubs(:read_attribute).with(anything).returns(@value)
|
102
|
+
end
|
103
|
+
|
104
|
+
should "return immediately if not a valid attribute" do
|
105
|
+
@proc.expects(:call).never
|
106
|
+
@instance.save_interface_attribute(:baz, @interface)
|
107
|
+
end
|
108
|
+
|
109
|
+
should "return immediately if attribute doesn't have an interface setter" do
|
110
|
+
@proc.expects(:call).never
|
111
|
+
@instance.save_interface_attribute(:bar, @interface)
|
112
|
+
end
|
113
|
+
|
114
|
+
should "save the attribute with the value of the proc" do
|
115
|
+
key = :foo
|
116
|
+
@interface.expects(:foo=).with(@value).once
|
117
|
+
@instance.save_interface_attribute(key, @interface)
|
118
|
+
end
|
119
|
+
|
120
|
+
should "use the property specified first" do
|
121
|
+
key = :foo4
|
122
|
+
@interface.expects(:put_foo4).returns(:bar)
|
123
|
+
@instance.save_interface_attribute(key, @interface)
|
124
|
+
end
|
125
|
+
|
126
|
+
should "use the setter if it exists" do
|
127
|
+
key = :foo2
|
128
|
+
@interface.expects(:set_foo).with(@value).once
|
129
|
+
@instance.save_interface_attribute(key, @interface)
|
130
|
+
end
|
131
|
+
|
132
|
+
should "not save readonly attributes" do
|
133
|
+
key = :foo3
|
134
|
+
@interface.expects(:foo3=).never
|
135
|
+
@instance.save_interface_attribute(key, @interface)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
context "loading all interface attributes" do
|
140
|
+
setup do
|
141
|
+
@instance = InterfaceAttributeModel.new
|
142
|
+
@interface = mock('interface')
|
143
|
+
end
|
144
|
+
|
145
|
+
should "load each" do
|
146
|
+
load_seq = sequence("load_seq")
|
147
|
+
InterfaceAttributeModel.attributes.each do |key, options|
|
148
|
+
@instance.expects(:load_interface_attribute).with(key, @interface)
|
149
|
+
end
|
150
|
+
|
151
|
+
@instance.load_interface_attributes(@interface)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
context "saving all interface attributes" do
|
156
|
+
setup do
|
157
|
+
@instance = InterfaceAttributeModel.new
|
158
|
+
@interface = mock('interface')
|
159
|
+
end
|
160
|
+
|
161
|
+
should "save each" do
|
162
|
+
InterfaceAttributeModel.attributes.each do |key, options|
|
163
|
+
@instance.expects(:save_interface_attribute).with(key, @interface)
|
164
|
+
end
|
165
|
+
|
166
|
+
@instance.save_interface_attributes(@interface)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
@@ -6,6 +6,7 @@ class RelatableTest < Test::Unit::TestCase
|
|
6
6
|
"FOO"
|
7
7
|
end
|
8
8
|
end
|
9
|
+
|
9
10
|
class BarRelatee
|
10
11
|
def self.set_relationship(caller, old_value, new_value)
|
11
12
|
end
|
@@ -243,6 +244,25 @@ class RelatableTest < Test::Unit::TestCase
|
|
243
244
|
end
|
244
245
|
end
|
245
246
|
|
247
|
+
context "determining the class of relationships" do
|
248
|
+
class ClassRelatableModel < EmptyRelatableModel
|
249
|
+
relationship :foo, Relatee
|
250
|
+
relationship :bar, "RelatableTest::Relatee"
|
251
|
+
end
|
252
|
+
|
253
|
+
setup do
|
254
|
+
@model = ClassRelatableModel.new
|
255
|
+
end
|
256
|
+
|
257
|
+
should "just return the class for Class types" do
|
258
|
+
assert_equal Relatee, @model.relationship_class(:foo)
|
259
|
+
end
|
260
|
+
|
261
|
+
should "turn string into class" do
|
262
|
+
assert_equal Relatee, @model.relationship_class(:bar)
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
246
266
|
context "populating relationships" do
|
247
267
|
setup do
|
248
268
|
@model = RelatableModel.new
|
@@ -13,7 +13,7 @@ class AbstractModelTest < Test::Unit::TestCase
|
|
13
13
|
class Bar; end
|
14
14
|
|
15
15
|
class FakeModel < VirtualBox::AbstractModel
|
16
|
-
attribute :foo
|
16
|
+
attribute :foo, :property => false
|
17
17
|
attribute :bar
|
18
18
|
relationship :foos, Foo
|
19
19
|
relationship :bars, Bar, :dependent => :destroy
|
@@ -109,6 +109,11 @@ class AbstractModelTest < Test::Unit::TestCase
|
|
109
109
|
@model.foo = @model.dup
|
110
110
|
assert_equal "#<AbstractModelTest::FakeModel :bar=nil, :bars=..., :foo=#<AbstractModelTest::FakeModel>, :foos=...>", @model.inspect
|
111
111
|
end
|
112
|
+
|
113
|
+
should "turn attributes which are AbstractInterfaces into classes" do
|
114
|
+
@model.foo = VirtualBox::COM::Interface::VirtualBox.new(VirtualBox::COM::Implementer::Nil)
|
115
|
+
assert_equal "#<AbstractModelTest::FakeModel :bar=nil, :bars=..., :foo=#<VirtualBox::COM::Interface::VirtualBox>, :foos=...>", @model.inspect
|
116
|
+
end
|
112
117
|
end
|
113
118
|
|
114
119
|
context "validation" do
|
@@ -323,15 +328,45 @@ class AbstractModelTest < Test::Unit::TestCase
|
|
323
328
|
end
|
324
329
|
end
|
325
330
|
|
331
|
+
context "integrating interface attributes" do
|
332
|
+
setup do
|
333
|
+
@model = FakeModel.new
|
334
|
+
end
|
335
|
+
|
336
|
+
should "clear the dirty state of an attribute after saving" do
|
337
|
+
key = :foo
|
338
|
+
interface = :bar
|
339
|
+
@model.expects(:clear_dirty!).with(key).once
|
340
|
+
@model.save_interface_attribute(key, interface)
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
326
344
|
context "integrating relatable" do
|
327
345
|
setup do
|
328
346
|
@model = FakeModel.new
|
329
347
|
end
|
330
348
|
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
349
|
+
context "saving all changed interface attributes" do
|
350
|
+
setup do
|
351
|
+
@changes = [[:a, []], [:b, []], [:c, []]]
|
352
|
+
@model.stubs(:changes).returns(@changes)
|
353
|
+
end
|
354
|
+
|
355
|
+
should "save each" do
|
356
|
+
@model.changes.each do |key, options|
|
357
|
+
@model.expects(:save_interface_attribute).with(key, @interface)
|
358
|
+
end
|
359
|
+
|
360
|
+
@model.save_changed_interface_attributes(@interface)
|
361
|
+
end
|
362
|
+
end
|
363
|
+
|
364
|
+
context "with dirty" do
|
365
|
+
should "set dirty state when a relationship is set" do
|
366
|
+
assert !@model.changed?
|
367
|
+
@model.foos = "foo"
|
368
|
+
assert @model.changed?
|
369
|
+
end
|
335
370
|
end
|
336
371
|
end
|
337
372
|
|
@@ -0,0 +1,152 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'test_helper')
|
2
|
+
|
3
|
+
class ApplianceTest < Test::Unit::TestCase
|
4
|
+
setup do
|
5
|
+
@klass = VirtualBox::Appliance
|
6
|
+
@interface = mock("interface")
|
7
|
+
@parent = mock("parent")
|
8
|
+
@path = "foo.rb"
|
9
|
+
|
10
|
+
@appliance = mock("appliance")
|
11
|
+
@virtualbox = mock("virtualbox")
|
12
|
+
@lib = mock("lib")
|
13
|
+
VirtualBox::Lib.stubs(:lib).returns(@lib)
|
14
|
+
@lib.stubs(:virtualbox).returns(@virtualbox)
|
15
|
+
@virtualbox.stubs(:create_appliance).returns(@appliance)
|
16
|
+
end
|
17
|
+
|
18
|
+
context "class methods" do
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
context "initializing" do
|
23
|
+
should "load interface attribtues" do
|
24
|
+
@klass.any_instance.expects(:initialize_from_path).with(@path).once
|
25
|
+
@klass.new(@path)
|
26
|
+
end
|
27
|
+
|
28
|
+
context "initializing from path" do
|
29
|
+
setup do
|
30
|
+
@progress = mock("progress")
|
31
|
+
@appliance.stubs(:read).returns(@progress)
|
32
|
+
@appliance.stubs(:interpret)
|
33
|
+
@appliance.stubs(:virtual_system_descriptions)
|
34
|
+
@progress.stubs(:wait_for_completion)
|
35
|
+
|
36
|
+
@klass.any_instance.stubs(:populate_relationship)
|
37
|
+
@klass.any_instance.stubs(:load_interface_attributes)
|
38
|
+
end
|
39
|
+
|
40
|
+
should "write the interface as the appliance" do
|
41
|
+
instance = @klass.new(@path)
|
42
|
+
assert_equal @appliance, instance.interface
|
43
|
+
end
|
44
|
+
|
45
|
+
should "mark as an existing record" do
|
46
|
+
instance = @klass.new(@path)
|
47
|
+
assert !instance.new_record?
|
48
|
+
end
|
49
|
+
|
50
|
+
should "read the appliance then interpret it" do
|
51
|
+
init_seq = sequence("init")
|
52
|
+
@appliance.expects(:read).with(@path).once.returns(@progress).in_sequence(init_seq)
|
53
|
+
@progress.expects(:wait_for_completion).with(-1).in_sequence(init_seq)
|
54
|
+
@appliance.expects(:interpret).once.in_sequence(init_seq)
|
55
|
+
@klass.any_instance.expects(:load_interface_attributes).with(@appliance).once.in_sequence(init_seq)
|
56
|
+
|
57
|
+
@klass.new(@path)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "initialize without path" do
|
62
|
+
setup do
|
63
|
+
@instance = @klass.new
|
64
|
+
end
|
65
|
+
|
66
|
+
should "write the interface as the appliance" do
|
67
|
+
assert_equal @appliance, @instance.interface
|
68
|
+
end
|
69
|
+
|
70
|
+
should "be new record" do
|
71
|
+
assert @instance.new_record?
|
72
|
+
end
|
73
|
+
|
74
|
+
should "not be dirty" do
|
75
|
+
assert !@instance.changed?
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context "instance methods" do
|
81
|
+
setup do
|
82
|
+
@klass.any_instance.stubs(:initialize_from_path)
|
83
|
+
@instance = @klass.new(@path)
|
84
|
+
@instance.stubs(:interface).returns(@interface)
|
85
|
+
end
|
86
|
+
|
87
|
+
context "importing" do
|
88
|
+
setup do
|
89
|
+
@progress = mock("progress")
|
90
|
+
|
91
|
+
@interface.stubs(:import_machines).returns(@progress)
|
92
|
+
end
|
93
|
+
|
94
|
+
should "call import on interface and wait for completion" do
|
95
|
+
@interface.expects(:import_machines).returns(@progress)
|
96
|
+
@progress.expects(:wait)
|
97
|
+
|
98
|
+
@instance.import
|
99
|
+
end
|
100
|
+
|
101
|
+
should "call wait with block given" do
|
102
|
+
proc = mock("proc")
|
103
|
+
@progress.expects(:wait).yields(proc)
|
104
|
+
proc.expects(:call)
|
105
|
+
|
106
|
+
@instance.import do |proc|
|
107
|
+
proc.call
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
context "exporting" do
|
113
|
+
setup do
|
114
|
+
@progress = mock("progress")
|
115
|
+
|
116
|
+
@instance.path = :foo
|
117
|
+
@interface.stubs(:write).returns(@progress)
|
118
|
+
end
|
119
|
+
|
120
|
+
should "call write on interface and wait for completion" do
|
121
|
+
@interface.expects(:write).with("ovf-1.0", @instance.path).once.returns(@progress)
|
122
|
+
@progress.expects(:wait)
|
123
|
+
|
124
|
+
@instance.export
|
125
|
+
end
|
126
|
+
|
127
|
+
should "call wait with block given" do
|
128
|
+
proc = mock("proc")
|
129
|
+
@progress.expects(:wait).yields(proc)
|
130
|
+
proc.expects(:call)
|
131
|
+
|
132
|
+
@instance.export do |proc|
|
133
|
+
proc.call
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
context "adding a machine" do
|
139
|
+
setup do
|
140
|
+
@machine = mock("machine")
|
141
|
+
@machine_interface = mock("machine_interface")
|
142
|
+
@machine.stubs(:interface).returns(@machine_interface)
|
143
|
+
@machine_interface.stubs(:export)
|
144
|
+
end
|
145
|
+
|
146
|
+
should "call export on the VM interface with the appliance" do
|
147
|
+
@machine_interface.expects(:export).with(@interface).once
|
148
|
+
@instance.add_machine(@machine)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|