'``UnmountBlockDevice.run`` unmounts the filesystem / block device
associated with the volume passed to it (association as determined by
the deployer\'s ``IBlockDeviceAPI`` provider).'

@validate_logging((lambda self, logger: self.assertEqual(1, len(LoggedAction.of_type(logger.messages, UNMOUNT_BLOCK_DEVICE)))))
def test_run(self, logger):

    self.patch(blockdevice, '_logger', logger)
    node = u'192.0.2.1'
    dataset_id = uuid4()
    deployer = create_blockdevicedeployer(self, hostname=node)
    api = deployer.block_device_api
    volume = api.create_volume(dataset_id=dataset_id, size=LOOPBACK_MINIMUM_ALLOCATABLE_SIZE)
    volume = api.attach_volume(volume.blockdevice_id, node)
    device = api.get_device_path(volume.blockdevice_id)
    mountroot = mountroot_for_test(self)
    mountpoint = mountroot.child(unicode(dataset_id).encode('ascii'))
    mountpoint.makedirs()
    make_filesystem(device, block_device=True)
    check_output(['mount', device.path, mountpoint.path])
    change = UnmountBlockDevice(dataset_id=dataset_id, blockdevice_id=volume.blockdevice_id)
    self.successResultOf(run_state_change(change, deployer, InMemoryStatePersister()))
    self.assertNotIn(device, list((FilePath(partition.device) for partition in psutil.disk_partitions())))
