virtualbox 0.1.1 → 0.2.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/.yardopts +3 -0
- data/Rakefile +15 -1
- data/Readme.md +3 -0
- data/TODO +0 -3
- data/VERSION +1 -1
- data/docs/GettingStarted.md +196 -0
- data/lib/virtualbox/abstract_model/attributable.rb +15 -16
- data/lib/virtualbox/abstract_model/dirty.rb +13 -2
- data/lib/virtualbox/abstract_model/relatable.rb +59 -10
- data/lib/virtualbox/abstract_model.rb +23 -1
- data/lib/virtualbox/attached_device.rb +144 -19
- data/lib/virtualbox/command.rb +11 -2
- data/lib/virtualbox/dvd.rb +52 -4
- data/lib/virtualbox/exceptions.rb +13 -0
- data/lib/virtualbox/hard_drive.rb +37 -8
- data/lib/virtualbox/image.rb +37 -0
- data/lib/virtualbox/nic.rb +1 -1
- data/lib/virtualbox/proxies/collection.rb +29 -0
- data/lib/virtualbox/storage_controller.rb +11 -0
- data/lib/virtualbox/vm.rb +105 -5
- data/lib/virtualbox.rb +2 -1
- data/test/virtualbox/abstract_model/dirty_test.rb +17 -0
- data/test/virtualbox/abstract_model/relatable_test.rb +49 -1
- data/test/virtualbox/abstract_model_test.rb +32 -1
- data/test/virtualbox/attached_device_test.rb +184 -2
- data/test/virtualbox/command_test.rb +36 -0
- data/test/virtualbox/dvd_test.rb +43 -0
- data/test/virtualbox/hard_drive_test.rb +52 -1
- data/test/virtualbox/image_test.rb +79 -0
- data/test/virtualbox/nic_test.rb +10 -0
- data/test/virtualbox/proxies/collection_test.rb +45 -0
- data/test/virtualbox/storage_controller_test.rb +12 -0
- data/test/virtualbox/vm_test.rb +118 -10
- data/virtualbox.gemspec +8 -3
- metadata +8 -3
- data/lib/virtualbox/errors.rb +0 -7
| @@ -19,6 +19,161 @@ class AttachedDeviceTest < Test::Unit::TestCase | |
| 19 19 | 
             
                VirtualBox::Command.stubs(:execute).returns('')
         | 
| 20 20 | 
             
              end
         | 
| 21 21 |  | 
| 22 | 
            +
              context "medium" do
         | 
| 23 | 
            +
                setup do
         | 
| 24 | 
            +
                  @ad = VirtualBox::AttachedDevice.new
         | 
| 25 | 
            +
                  @hd = VirtualBox::HardDrive.new
         | 
| 26 | 
            +
                  @hd.write_attribute(:uuid, @uuid)
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
                
         | 
| 29 | 
            +
                should "be 'none' when image is nil" do
         | 
| 30 | 
            +
                  assert_equal "none", @ad.medium
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
                
         | 
| 33 | 
            +
                should "be the uuid of the image if its not nil" do
         | 
| 34 | 
            +
                  @ad.image = @hd
         | 
| 35 | 
            +
                  assert_equal @hd.uuid, @ad.medium
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
                
         | 
| 38 | 
            +
                should "be 'emptydrive' if the image is an empty drive" do
         | 
| 39 | 
            +
                  @ad.image = VirtualBox::DVD.empty_drive
         | 
| 40 | 
            +
                  assert_equal "emptydrive", @ad.medium
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
              
         | 
| 44 | 
            +
              context "saving an existing device" do
         | 
| 45 | 
            +
                setup do
         | 
| 46 | 
            +
                  @value = VirtualBox::AttachedDevice.populate_relationship(@caller, @data)
         | 
| 47 | 
            +
                  @value = @value[0]
         | 
| 48 | 
            +
                  @value.image = VirtualBox::DVD.empty_drive
         | 
| 49 | 
            +
                  assert @value.changed?
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
                
         | 
| 52 | 
            +
                should "not do anything if the device isn't change" do
         | 
| 53 | 
            +
                  @value.clear_dirty!
         | 
| 54 | 
            +
                  assert !@value.changed?
         | 
| 55 | 
            +
                  
         | 
| 56 | 
            +
                  VirtualBox::Command.expects(:vboxmanage).never
         | 
| 57 | 
            +
                  @value.save
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
                
         | 
| 60 | 
            +
                should "call vboxmanage" do
         | 
| 61 | 
            +
                  VirtualBox::Command.expects(:vboxmanage).once
         | 
| 62 | 
            +
                  @value.save
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
                
         | 
| 65 | 
            +
                should "not call destroy if the port didn't change" do
         | 
| 66 | 
            +
                  @value.expects(:destroy).never
         | 
| 67 | 
            +
                  assert !@value.port_changed?
         | 
| 68 | 
            +
                  assert @value.save
         | 
| 69 | 
            +
                end
         | 
| 70 | 
            +
                
         | 
| 71 | 
            +
                should "call destroy with the old port if the port changed" do
         | 
| 72 | 
            +
                  @value.expects(:destroy).with({:port => @value.port}, false)
         | 
| 73 | 
            +
                  @value.port = 7
         | 
| 74 | 
            +
                  assert @value.port_changed?
         | 
| 75 | 
            +
                  assert @value.save
         | 
| 76 | 
            +
                end
         | 
| 77 | 
            +
                
         | 
| 78 | 
            +
                should "call destroy with the raise errors flag" do
         | 
| 79 | 
            +
                  @value.expects(:destroy).with(anything, true).once
         | 
| 80 | 
            +
                  @value.port = 7
         | 
| 81 | 
            +
                  @value.save(true)
         | 
| 82 | 
            +
                end
         | 
| 83 | 
            +
              end
         | 
| 84 | 
            +
              
         | 
| 85 | 
            +
              context "creating a new attached device" do
         | 
| 86 | 
            +
                setup do
         | 
| 87 | 
            +
                  @image = VirtualBox::HardDrive.new
         | 
| 88 | 
            +
                  @ad = VirtualBox::AttachedDevice.new
         | 
| 89 | 
            +
                  @ad.image = @image
         | 
| 90 | 
            +
                  @ad.port = 3
         | 
| 91 | 
            +
                end
         | 
| 92 | 
            +
                
         | 
| 93 | 
            +
                should "raise a NoParentException if it wasn't added to a relationship" do
         | 
| 94 | 
            +
                  assert_raises(VirtualBox::Exceptions::NoParentException) {
         | 
| 95 | 
            +
                    @ad.save
         | 
| 96 | 
            +
                  }
         | 
| 97 | 
            +
                end
         | 
| 98 | 
            +
                
         | 
| 99 | 
            +
                context "has a parent" do
         | 
| 100 | 
            +
                  setup do
         | 
| 101 | 
            +
                    @ad.added_to_relationship(@caller)
         | 
| 102 | 
            +
                    VirtualBox::Command.stubs(:vboxmanage)
         | 
| 103 | 
            +
                  end
         | 
| 104 | 
            +
                  
         | 
| 105 | 
            +
                  should "not call destroy since its a new record" do
         | 
| 106 | 
            +
                    @ad.expects(:destroy).never
         | 
| 107 | 
            +
                    assert @ad.save
         | 
| 108 | 
            +
                  end
         | 
| 109 | 
            +
                  
         | 
| 110 | 
            +
                  should "not raise an InvalidObjectException if no image is set" do
         | 
| 111 | 
            +
                    @ad.image = nil
         | 
| 112 | 
            +
                    assert_raises(VirtualBox::Exceptions::InvalidObjectException) {
         | 
| 113 | 
            +
                      @ad.save
         | 
| 114 | 
            +
                    }
         | 
| 115 | 
            +
                  end
         | 
| 116 | 
            +
             | 
| 117 | 
            +
                  should "call the proper vboxcommand" do
         | 
| 118 | 
            +
                    VirtualBox::Command.expects(:vboxmanage).with("storageattach #{@vm.name} --storagectl #{VirtualBox::Command.shell_escape(@caller.name)} --port #{@ad.port} --device 0 --type #{@image.image_type} --medium #{@ad.medium}")
         | 
| 119 | 
            +
                    @ad.save
         | 
| 120 | 
            +
                  end
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                  should "return false if the command failed" do
         | 
| 123 | 
            +
                    VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
         | 
| 124 | 
            +
                    assert !@ad.save
         | 
| 125 | 
            +
                  end
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                  should "return true if the command was a success" do
         | 
| 128 | 
            +
                    assert @ad.save
         | 
| 129 | 
            +
                  end
         | 
| 130 | 
            +
                  
         | 
| 131 | 
            +
                  should "raise an exception if true sent to save and error occured" do
         | 
| 132 | 
            +
                    VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
         | 
| 133 | 
            +
                    assert_raises(VirtualBox::Exceptions::CommandFailedException) {
         | 
| 134 | 
            +
                      @ad.save(true)
         | 
| 135 | 
            +
                    }
         | 
| 136 | 
            +
                  end
         | 
| 137 | 
            +
                  
         | 
| 138 | 
            +
                  should "not be a new record after saving" do
         | 
| 139 | 
            +
                    assert @ad.new_record?
         | 
| 140 | 
            +
                    assert @ad.save
         | 
| 141 | 
            +
                    assert !@ad.new_record?
         | 
| 142 | 
            +
                  end
         | 
| 143 | 
            +
                  
         | 
| 144 | 
            +
                  should "not be changed after saving" do
         | 
| 145 | 
            +
                    assert @ad.changed?
         | 
| 146 | 
            +
                    assert @ad.save
         | 
| 147 | 
            +
                    assert !@ad.changed?
         | 
| 148 | 
            +
                  end
         | 
| 149 | 
            +
                end
         | 
| 150 | 
            +
              end
         | 
| 151 | 
            +
              
         | 
| 152 | 
            +
              context "constructor" do
         | 
| 153 | 
            +
                should "call populate_from_data if 3 args are given" do
         | 
| 154 | 
            +
                  VirtualBox::AttachedDevice.any_instance.expects(:populate_from_data).with(1,2,3).once
         | 
| 155 | 
            +
                  VirtualBox::AttachedDevice.new(1,2,3)
         | 
| 156 | 
            +
                end
         | 
| 157 | 
            +
                
         | 
| 158 | 
            +
                should "call populate_attributes if 1 arg is given" do
         | 
| 159 | 
            +
                  VirtualBox::AttachedDevice.any_instance.expects(:populate_attributes).with(1).once
         | 
| 160 | 
            +
                  ad = VirtualBox::AttachedDevice.new(1)
         | 
| 161 | 
            +
                  assert ad.new_record?
         | 
| 162 | 
            +
                end
         | 
| 163 | 
            +
                
         | 
| 164 | 
            +
                should "raise a NoMethodError if anything other than 0,1,or 3 arguments" do
         | 
| 165 | 
            +
                  # 9 seems like a reasonable max (maybe just a bit unreasonable!)
         | 
| 166 | 
            +
                  2.upto(9) do |i|
         | 
| 167 | 
            +
                    next if i == 3
         | 
| 168 | 
            +
                    args = Array.new(i, "A")
         | 
| 169 | 
            +
                    
         | 
| 170 | 
            +
                    assert_raises(NoMethodError) {
         | 
| 171 | 
            +
                      VirtualBox::AttachedDevice.new(*args)
         | 
| 172 | 
            +
                    }
         | 
| 173 | 
            +
                  end
         | 
| 174 | 
            +
                end
         | 
| 175 | 
            +
              end
         | 
| 176 | 
            +
              
         | 
| 22 177 | 
             
              context "destroying" do
         | 
| 23 178 | 
             
                setup do
         | 
| 24 179 | 
             
                  @value = VirtualBox::AttachedDevice.populate_relationship(@caller, @data)
         | 
| @@ -48,6 +203,16 @@ class AttachedDeviceTest < Test::Unit::TestCase | |
| 48 203 | 
             
                  @value.destroy
         | 
| 49 204 | 
             
                end
         | 
| 50 205 |  | 
| 206 | 
            +
                should "destroy with the specified port if set" do
         | 
| 207 | 
            +
                  VirtualBox::Command.expects(:vboxmanage).with("storageattach #{VirtualBox::Command.shell_escape(@vm.name)} --storagectl #{VirtualBox::Command.shell_escape(@caller.name)} --port 80 --device 0 --medium none")
         | 
| 208 | 
            +
                  @value.destroy(:port => 80)
         | 
| 209 | 
            +
                end
         | 
| 210 | 
            +
                
         | 
| 211 | 
            +
                should "destroy with the default port if not other port is specified" do
         | 
| 212 | 
            +
                  VirtualBox::Command.expects(:vboxmanage).with("storageattach #{VirtualBox::Command.shell_escape(@vm.name)} --storagectl #{VirtualBox::Command.shell_escape(@caller.name)} --port #{@value.port} --device 0 --medium none")
         | 
| 213 | 
            +
                  @value.destroy
         | 
| 214 | 
            +
                end
         | 
| 215 | 
            +
                
         | 
| 51 216 | 
             
                should "not destroy image by default" do
         | 
| 52 217 | 
             
                  @image.expects(:destroy).never
         | 
| 53 218 | 
             
                  @value.destroy
         | 
| @@ -66,6 +231,23 @@ class AttachedDeviceTest < Test::Unit::TestCase | |
| 66 231 | 
             
                    :destroy_image => true
         | 
| 67 232 | 
             
                  })
         | 
| 68 233 | 
             
                end
         | 
| 234 | 
            +
                
         | 
| 235 | 
            +
                should "return false if destroy failed" do
         | 
| 236 | 
            +
                  VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
         | 
| 237 | 
            +
                  assert !@value.destroy
         | 
| 238 | 
            +
                end
         | 
| 239 | 
            +
                
         | 
| 240 | 
            +
                should "raise an exception if destroy failed and an error occured" do
         | 
| 241 | 
            +
                  VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
         | 
| 242 | 
            +
                  assert_raises(VirtualBox::Exceptions::CommandFailedException) {
         | 
| 243 | 
            +
                    @value.destroy({}, true)
         | 
| 244 | 
            +
                  }
         | 
| 245 | 
            +
                end
         | 
| 246 | 
            +
                
         | 
| 247 | 
            +
                should "forward raise_errors flag to image.destroy" do
         | 
| 248 | 
            +
                  @image.expects(:destroy).with(true).once
         | 
| 249 | 
            +
                  @value.destroy({:destroy_image => true}, true)
         | 
| 250 | 
            +
                end
         | 
| 69 251 | 
             
              end
         | 
| 70 252 |  | 
| 71 253 | 
             
              context "populating relationships" do
         | 
| @@ -79,12 +261,12 @@ class AttachedDeviceTest < Test::Unit::TestCase | |
| 79 261 |  | 
| 80 262 | 
             
                should "create objects with proper values" do
         | 
| 81 263 | 
             
                  obj = @value[0]
         | 
| 82 | 
            -
                  assert_equal " | 
| 264 | 
            +
                  assert_equal "none", obj.medium
         | 
| 83 265 | 
             
                  assert_equal "322f79fd-7da6-416f-a16f-e70066ccf165", obj.uuid
         | 
| 84 266 | 
             
                  assert_equal 0, obj.port
         | 
| 85 267 |  | 
| 86 268 | 
             
                  obj = @value[1]
         | 
| 87 | 
            -
                  assert_equal " | 
| 269 | 
            +
                  assert_equal "none", obj.medium
         | 
| 88 270 | 
             
                  assert_nil obj.uuid
         | 
| 89 271 | 
             
                  assert_equal 1, obj.port
         | 
| 90 272 | 
             
                end
         | 
| @@ -9,6 +9,42 @@ class CommandTest < Test::Unit::TestCase | |
| 9 9 | 
             
                end
         | 
| 10 10 | 
             
              end
         | 
| 11 11 |  | 
| 12 | 
            +
              context "executing commands" do
         | 
| 13 | 
            +
                should "use backticks to execute the command" do
         | 
| 14 | 
            +
                  VirtualBox::Command.expects(:`).with("foo").once
         | 
| 15 | 
            +
                  VirtualBox::Command.execute("foo")
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
                
         | 
| 18 | 
            +
                should "return the result of the execution" do
         | 
| 19 | 
            +
                  VirtualBox::Command.expects(:`).with("foo").returns("bar").once
         | 
| 20 | 
            +
                  assert_equal "bar", VirtualBox::Command.execute("foo")
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
              
         | 
| 24 | 
            +
              context "vbox commands" do
         | 
| 25 | 
            +
                should "call 'vboxmanage' followed by command" do
         | 
| 26 | 
            +
                  VirtualBox::Command.expects(:execute).with("VBoxManage foo")
         | 
| 27 | 
            +
                  VirtualBox::Command.stubs(:success?).returns(true)
         | 
| 28 | 
            +
                  VirtualBox::Command.vboxmanage("foo")
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
                
         | 
| 31 | 
            +
                should "call the custom vboxmanage executable if set" do
         | 
| 32 | 
            +
                  VirtualBox::Command.vboxmanage = "barf"
         | 
| 33 | 
            +
                  VirtualBox::Command.expects(:execute).with("barf foo")
         | 
| 34 | 
            +
                  VirtualBox::Command.stubs(:success?).returns(true)
         | 
| 35 | 
            +
                  VirtualBox::Command.vboxmanage("foo")
         | 
| 36 | 
            +
                  VirtualBox::Command.vboxmanage = "VBoxManage"
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
                
         | 
| 39 | 
            +
                should "raise a CommandFailedException if it failed" do
         | 
| 40 | 
            +
                  VirtualBox::Command.expects(:execute).with("VBoxManage foo")
         | 
| 41 | 
            +
                  VirtualBox::Command.stubs(:success?).returns(false)
         | 
| 42 | 
            +
                  assert_raises(VirtualBox::Exceptions::CommandFailedException) {
         | 
| 43 | 
            +
                    VirtualBox::Command.vboxmanage("foo")
         | 
| 44 | 
            +
                  }
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
              end
         | 
| 47 | 
            +
              
         | 
| 12 48 | 
             
              context "testing command results" do
         | 
| 13 49 | 
             
                setup do
         | 
| 14 50 | 
             
                  @command = "foo"
         | 
    
        data/test/virtualbox/dvd_test.rb
    CHANGED
    
    | @@ -1,6 +1,49 @@ | |
| 1 1 | 
             
            require File.join(File.dirname(__FILE__), '..', 'test_helper')
         | 
| 2 2 |  | 
| 3 3 | 
             
            class DVDTest < Test::Unit::TestCase
         | 
| 4 | 
            +
              setup do
         | 
| 5 | 
            +
                VirtualBox::Command.stubs(:execute)
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
              
         | 
| 8 | 
            +
              context "destroying a dvd" do
         | 
| 9 | 
            +
                setup do
         | 
| 10 | 
            +
                  @dvd = VirtualBox::DVD.new
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
                
         | 
| 13 | 
            +
                should "return false if attempting to destroy an empty drive" do
         | 
| 14 | 
            +
                  assert !VirtualBox::DVD.empty_drive.destroy
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
                
         | 
| 17 | 
            +
                should "call vboxmanage to destroy it" do
         | 
| 18 | 
            +
                  VirtualBox::Command.expects(:vboxmanage).with("closemedium dvd #{@dvd.uuid} --delete")
         | 
| 19 | 
            +
                  assert @dvd.destroy
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
                
         | 
| 22 | 
            +
                should "return false if destroy failed" do
         | 
| 23 | 
            +
                  VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
         | 
| 24 | 
            +
                  assert !@dvd.destroy
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
                
         | 
| 27 | 
            +
                should "raise an exception if failed and flag is set" do
         | 
| 28 | 
            +
                  VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
         | 
| 29 | 
            +
                  assert_raises(VirtualBox::Exceptions::CommandFailedException) {
         | 
| 30 | 
            +
                    @dvd.destroy(true)
         | 
| 31 | 
            +
                  }
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
              
         | 
| 35 | 
            +
              context "empty drive" do
         | 
| 36 | 
            +
                should "return an empty drive instance by calling new with :empty_drive" do
         | 
| 37 | 
            +
                  dvd = VirtualBox::DVD.new(:empty_drive)
         | 
| 38 | 
            +
                  assert dvd.empty_drive?
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
                
         | 
| 41 | 
            +
                should "call new with :empty_drive with empty_drive class method" do
         | 
| 42 | 
            +
                  dvd = VirtualBox::DVD.empty_drive
         | 
| 43 | 
            +
                  assert dvd.empty_drive?
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
              
         | 
| 4 47 | 
             
              context "retrieving all dvds" do
         | 
| 5 48 | 
             
                setup do
         | 
| 6 49 | 
             
                  @expectations = {
         | 
| @@ -23,10 +23,33 @@ raw | |
| 23 23 | 
             
                VirtualBox::Command.stubs(:vboxmanage).with("showhdinfo #{@name}").returns(@find_raw)
         | 
| 24 24 | 
             
              end
         | 
| 25 25 |  | 
| 26 | 
            +
              context "destroying a hard drive" do
         | 
| 27 | 
            +
                setup do
         | 
| 28 | 
            +
                  @hd = VirtualBox::HardDrive.find(@name)
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
                
         | 
| 31 | 
            +
                should "call vboxmanage to destroy it" do
         | 
| 32 | 
            +
                  VirtualBox::Command.expects(:vboxmanage).with("closemedium disk #{@hd.uuid} --delete")
         | 
| 33 | 
            +
                  assert @hd.destroy
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
                
         | 
| 36 | 
            +
                should "return false if destroy failed" do
         | 
| 37 | 
            +
                  VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
         | 
| 38 | 
            +
                  assert !@hd.destroy
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
                
         | 
| 41 | 
            +
                should "raise an exception if failed and flag is set" do
         | 
| 42 | 
            +
                  VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
         | 
| 43 | 
            +
                  assert_raises(VirtualBox::Exceptions::CommandFailedException) {
         | 
| 44 | 
            +
                    @hd.destroy(true)
         | 
| 45 | 
            +
                  }
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
              
         | 
| 26 49 | 
             
              context "cloning a hard drive" do
         | 
| 27 50 | 
             
                setup do
         | 
| 28 51 | 
             
                  @hd = VirtualBox::HardDrive.find(@name)
         | 
| 29 | 
            -
                  VirtualBox::Command. | 
| 52 | 
            +
                  VirtualBox::Command.stubs(:vboxmanage).with("clonehd #{@hd.uuid} bar --format VDI --remember").returns(@find_raw)
         | 
| 30 53 | 
             
                end
         | 
| 31 54 |  | 
| 32 55 | 
             
                should "call vboxmanage with the clone command" do
         | 
| @@ -39,6 +62,18 @@ raw | |
| 39 62 | 
             
                  VirtualBox::HardDrive.expects(:find).returns(@new_hd)
         | 
| 40 63 | 
             
                  assert_equal @new_hd, @hd.clone("bar")
         | 
| 41 64 | 
             
                end
         | 
| 65 | 
            +
                
         | 
| 66 | 
            +
                should "return false on failure" do
         | 
| 67 | 
            +
                  VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
         | 
| 68 | 
            +
                  assert @hd.clone("bar").nil?
         | 
| 69 | 
            +
                end
         | 
| 70 | 
            +
                
         | 
| 71 | 
            +
                should "raise an exception if raise_errors is true and failed" do
         | 
| 72 | 
            +
                  VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
         | 
| 73 | 
            +
                  assert_raises(VirtualBox::Exceptions::CommandFailedException) {
         | 
| 74 | 
            +
                    @hd.clone("bar", "VDI", true)
         | 
| 75 | 
            +
                  }
         | 
| 76 | 
            +
                end
         | 
| 42 77 | 
             
              end
         | 
| 43 78 |  | 
| 44 79 | 
             
              context "creating a hard drive" do
         | 
| @@ -85,6 +120,22 @@ raw | |
| 85 120 |  | 
| 86 121 | 
             
                  assert_equal "foo", @hd.uuid
         | 
| 87 122 | 
             
                end
         | 
| 123 | 
            +
                
         | 
| 124 | 
            +
                should "return true if the command was a success" do
         | 
| 125 | 
            +
                  assert @hd.save
         | 
| 126 | 
            +
                end
         | 
| 127 | 
            +
                
         | 
| 128 | 
            +
                should "return failure if the command failed" do
         | 
| 129 | 
            +
                  VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
         | 
| 130 | 
            +
                  assert !@hd.save
         | 
| 131 | 
            +
                end
         | 
| 132 | 
            +
                
         | 
| 133 | 
            +
                should "raise an exception if flag is set" do
         | 
| 134 | 
            +
                  VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
         | 
| 135 | 
            +
                  assert_raises(VirtualBox::Exceptions::CommandFailedException) {
         | 
| 136 | 
            +
                    @hd.save(true)
         | 
| 137 | 
            +
                  }
         | 
| 138 | 
            +
                end
         | 
| 88 139 | 
             
              end
         | 
| 89 140 |  | 
| 90 141 | 
             
              context "finding a single hard drive" do
         | 
| @@ -1,6 +1,85 @@ | |
| 1 1 | 
             
            require File.join(File.dirname(__FILE__), '..', 'test_helper')
         | 
| 2 2 |  | 
| 3 3 | 
             
            class ImageTest < Test::Unit::TestCase
         | 
| 4 | 
            +
              context "image type and empty drive" do
         | 
| 5 | 
            +
                setup do
         | 
| 6 | 
            +
                  @image = VirtualBox::Image.new
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
                
         | 
| 9 | 
            +
                should "raise an exception if image_type is called on Image" do
         | 
| 10 | 
            +
                  assert_raises(RuntimeError) { @image.image_type }
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
                
         | 
| 13 | 
            +
                should "return false by default on empty_drive?" do
         | 
| 14 | 
            +
                  assert !@image.empty_drive?
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
              
         | 
| 18 | 
            +
              context "in a relationship" do
         | 
| 19 | 
            +
                class ImageRelationshipModel < VirtualBox::AbstractModel
         | 
| 20 | 
            +
                  relationship :image, VirtualBox::Image
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
                
         | 
| 23 | 
            +
                setup do
         | 
| 24 | 
            +
                  @model = ImageRelationshipModel.new
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
                
         | 
| 27 | 
            +
                context "populating a relationship" do
         | 
| 28 | 
            +
                  should "return 'emptydrive' if the medium is an empty drive" do
         | 
| 29 | 
            +
                    result = VirtualBox::Image.populate_relationship(@model, {
         | 
| 30 | 
            +
                      :medium => "emptydrive"
         | 
| 31 | 
            +
                    })
         | 
| 32 | 
            +
                    
         | 
| 33 | 
            +
                    assert result.is_a?(VirtualBox::DVD)
         | 
| 34 | 
            +
                    assert result.empty_drive?
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
                  
         | 
| 37 | 
            +
                  should "return nil if uuid is nil and medium isn't empty" do
         | 
| 38 | 
            +
                    result = VirtualBox::Image.populate_relationship(@model, {})
         | 
| 39 | 
            +
                    assert result.nil?
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
                  
         | 
| 42 | 
            +
                  should "result a matching image from subclasses if uuid" do
         | 
| 43 | 
            +
                    uuid = "foo'"
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                    subobject = mock("subobject")
         | 
| 46 | 
            +
                    subobject.stubs(:uuid).returns(uuid)
         | 
| 47 | 
            +
                    
         | 
| 48 | 
            +
                    subclass = mock("subclass")
         | 
| 49 | 
            +
                    subclass.stubs(:all).returns([subobject])
         | 
| 50 | 
            +
                    
         | 
| 51 | 
            +
                    VirtualBox::Image.expects(:subclasses).returns([subclass])
         | 
| 52 | 
            +
                    
         | 
| 53 | 
            +
                    result = VirtualBox::Image.populate_relationship(@model, { :uuid => uuid })
         | 
| 54 | 
            +
                    assert_equal subobject, result
         | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
                  
         | 
| 57 | 
            +
                  should "result in nil if suboject can't be found" do
         | 
| 58 | 
            +
                    VirtualBox::Image.expects(:subclasses).returns([])
         | 
| 59 | 
            +
                    assert_nil VirtualBox::Image.populate_relationship(@model, { :uuid => "foo" })
         | 
| 60 | 
            +
                  end
         | 
| 61 | 
            +
                end
         | 
| 62 | 
            +
                
         | 
| 63 | 
            +
                context "setting relationship object" do
         | 
| 64 | 
            +
                  should "raise an InvalidRelationshipObjectException if new value is not an image" do
         | 
| 65 | 
            +
                    assert_raises(VirtualBox::Exceptions::InvalidRelationshipObjectException) {
         | 
| 66 | 
            +
                      @model.image = "foo"
         | 
| 67 | 
            +
                    }
         | 
| 68 | 
            +
                  end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                  should "not raise an exception if setting to nil" do
         | 
| 71 | 
            +
                    assert_nothing_raised { @model.image = nil }
         | 
| 72 | 
            +
                  end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                  should "just return the new value if it is an image" do
         | 
| 75 | 
            +
                    image = VirtualBox::Image.new
         | 
| 76 | 
            +
                    assert_nil @model.image
         | 
| 77 | 
            +
                    assert_nothing_raised { @model.image = image }
         | 
| 78 | 
            +
                    assert_equal image, @model.image
         | 
| 79 | 
            +
                  end
         | 
| 80 | 
            +
                end
         | 
| 81 | 
            +
              end
         | 
| 82 | 
            +
              
         | 
| 4 83 | 
             
              context "recording subclasses" do
         | 
| 5 84 | 
             
                should "list all subclasses" do
         | 
| 6 85 | 
             
                  assert_nothing_raised { VirtualBox::Image.subclasses }
         | 
    
        data/test/virtualbox/nic_test.rb
    CHANGED
    
    | @@ -48,6 +48,16 @@ raw | |
| 48 48 | 
             
                  assert nic.nictype_changed?
         | 
| 49 49 | 
             
                  nic.save(@vmname)
         | 
| 50 50 | 
             
                end
         | 
| 51 | 
            +
                
         | 
| 52 | 
            +
                should "raise a CommandFailedException if it fails" do
         | 
| 53 | 
            +
                  VirtualBox::Command.stubs(:vboxmanage).raises(VirtualBox::Exceptions::CommandFailedException)
         | 
| 54 | 
            +
                  
         | 
| 55 | 
            +
                  nic = @nic[0]
         | 
| 56 | 
            +
                  nic.nictype = "ZOO"
         | 
| 57 | 
            +
                  assert_raises(VirtualBox::Exceptions::CommandFailedException) {
         | 
| 58 | 
            +
                    nic.save(@vmname)
         | 
| 59 | 
            +
                  }
         | 
| 60 | 
            +
                end
         | 
| 51 61 | 
             
              end
         | 
| 52 62 |  | 
| 53 63 | 
             
              context "populating relationships" do
         | 
| @@ -0,0 +1,45 @@ | |
| 1 | 
            +
            require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class CollectionTest < Test::Unit::TestCase
         | 
| 4 | 
            +
              setup do
         | 
| 5 | 
            +
                @parent = mock("parent")
         | 
| 6 | 
            +
                @collection = VirtualBox::Proxies::Collection.new(@parent)
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              should "be a subclass of Array" do
         | 
| 10 | 
            +
                assert @collection.is_a?(Array)
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
              
         | 
| 13 | 
            +
              context "element callbacks" do
         | 
| 14 | 
            +
                setup do
         | 
| 15 | 
            +
                  @item = mock("item")
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
                
         | 
| 18 | 
            +
                should "not call added_to_relationship if it doesn't exist" do
         | 
| 19 | 
            +
                  assert_nothing_raised { @collection << @item }
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
                
         | 
| 22 | 
            +
                should "not call removed_from_relationship if it doesn't exist" do
         | 
| 23 | 
            +
                  @collection << @item
         | 
| 24 | 
            +
                  assert_nothing_raised { @collection.delete(@item) }
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
                
         | 
| 27 | 
            +
                should "call added_to_relationship on the item when its added to a collection" do
         | 
| 28 | 
            +
                  @item.expects(:added_to_relationship).with(@parent).once
         | 
| 29 | 
            +
                  @collection << @item
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
                
         | 
| 32 | 
            +
                should "call removed_from_relationship on the item when its deleted" do
         | 
| 33 | 
            +
                  @collection << @item
         | 
| 34 | 
            +
                  @item.expects(:removed_from_relationship).with(@parent).once
         | 
| 35 | 
            +
                  @collection.delete(@item)
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
                
         | 
| 38 | 
            +
                should "call removed_from_relationship if clear is called" do
         | 
| 39 | 
            +
                  @collection << @item
         | 
| 40 | 
            +
                  @item.expects(:removed_from_relationship).with(@parent).once
         | 
| 41 | 
            +
                  @collection.clear
         | 
| 42 | 
            +
                  assert @collection.empty?
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
              end
         | 
| 45 | 
            +
            end
         | 
| @@ -15,6 +15,18 @@ class StorageControllerTest < Test::Unit::TestCase | |
| 15 15 | 
             
                @caller = mock("caller")
         | 
| 16 16 | 
             
              end
         | 
| 17 17 |  | 
| 18 | 
            +
              context "saving" do
         | 
| 19 | 
            +
                setup do
         | 
| 20 | 
            +
                  @value = VirtualBox::StorageController.populate_relationship(@caller, @data)
         | 
| 21 | 
            +
                  @value = @value[0]
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
                
         | 
| 24 | 
            +
                should "save relationship" do
         | 
| 25 | 
            +
                  VirtualBox::AttachedDevice.expects(:save_relationship).once
         | 
| 26 | 
            +
                  @value.save
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
              
         | 
| 18 30 | 
             
              context "destroying" do
         | 
| 19 31 | 
             
                setup do
         | 
| 20 32 | 
             
                  @value = VirtualBox::StorageController.populate_relationship(@caller, @data)
         |