@Test
  public void canDoActionSpaceValidationSucceeds() {
    Guid storageId = Guid.newGuid();
    initializeCommand(storageId, VolumeType.Preallocated);

    mockVm();
    mockEntities(storageId);
    doReturn(mockStorageDomainValidatorWithSpace()).when(command).createStorageDomainValidator();

    assertTrue(command.canDoAction());
  }
  @Test
  public void canDoActionSucceedsOnDiskDomainCheckWhenStorageGuidInParamsMismatches()
      throws Exception {
    Guid storageId = Guid.newGuid();
    initializeCommand(storageId);

    mockVmWithDisk(Guid.newGuid());
    mockStorageDomain(storageId);
    mockStoragePoolIsoMap();
    mockInterfaceList();
    mockMaxPciSlots();

    assertTrue(command.canDoAction());
  }
  /** CanDoAction should fail when the requested disk space is larger than 'MaxBlockDiskSize' */
  @Test
  public void canDoActionMaxBlockDiskSizeCheckFails() {
    Guid storageId = Guid.newGuid();
    AddDiskParameters parameters = createParameters();
    parameters.setDiskInfo(createDiskImage(MAX_BLOCK_SIZE * 2));
    initializeCommand(storageId, parameters);

    mockVm();
    mockStorageDomain(storageId, StorageType.ISCSI);
    mockStoragePoolIsoMap();
    mockMaxPciSlots();

    assertFalse(command.canDoAction());
    assertTrue(
        command
            .getReturnValue()
            .getCanDoActionMessages()
            .contains(EngineMessage.ACTION_TYPE_FAILED_DISK_MAX_SIZE_EXCEEDED.toString()));
  }
  @Test
  public void canDoActionSpaceValidationFails() {
    Guid storageId = Guid.newGuid();
    initializeCommand(storageId, VolumeType.Sparse);

    mockVm();
    mockStorageDomain(storageId);
    mockStoragePoolIsoMap();
    mockMaxPciSlots();
    doReturn(mockStorageDomainValidatorWithoutSpace()).when(command).createStorageDomainValidator();

    assertFalse(command.canDoAction());
    assertTrue(
        command
            .getReturnValue()
            .getCanDoActionMessages()
            .contains(
                EngineMessage.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN.toString()));
  }
  /** CanDoAction should fail when creating a Shareable Disk with COW volume format */
  @Test
  public void canDoActionShareableDiskVolumeFormatFails() {
    DiskImage image = createShareableDiskImage();
    image.setvolumeFormat(VolumeFormat.COW);

    AddDiskParameters parameters = createParameters();
    parameters.setDiskInfo(image);
    Guid storageId = Guid.newGuid();
    initializeCommand(storageId, parameters);

    mockVm();
    mockStorageDomain(storageId, Version.v3_1);
    mockStoragePoolIsoMap();
    mockMaxPciSlots();

    assertFalse(command.canDoAction());
    assertTrue(
        command
            .getReturnValue()
            .getCanDoActionMessages()
            .contains(EngineMessage.SHAREABLE_DISK_IS_NOT_SUPPORTED_BY_VOLUME_FORMAT.toString()));
  }
  @Test
  public void canDoActionFailWithUnsupportedDiskInterface() throws Exception {
    Guid storageId = Guid.newGuid();
    initializeCommand(storageId);

    mockVm();
    mockStorageDomain(storageId);
    mockStoragePoolIsoMap();
    mockMaxPciSlots();
    when(diskValidator.isReadOnlyPropertyCompatibleWithInterface())
        .thenReturn(ValidationResult.VALID);
    when(diskValidator.isDiskInterfaceSupported(any(VM.class)))
        .thenReturn(new ValidationResult(EngineMessage.ACTION_TYPE_DISK_INTERFACE_UNSUPPORTED));
    when(diskValidator.isVirtIoScsiValid(any(VM.class))).thenReturn(ValidationResult.VALID);
    when(command.getDiskValidator(any(Disk.class))).thenReturn(diskValidator);

    assertFalse(command.canDoAction());
    assertTrue(
        command
            .getReturnValue()
            .getCanDoActionMessages()
            .contains(EngineMessage.ACTION_TYPE_DISK_INTERFACE_UNSUPPORTED.toString()));
  }
  @Test
  public void canDoActionShareableDiskOnGlusterFails() {
    DiskImage image = createShareableDiskImage();
    image.setvolumeFormat(VolumeFormat.RAW);

    AddDiskParameters parameters = createParameters();
    parameters.setDiskInfo(image);

    Guid storageId = Guid.newGuid();
    initializeCommand(storageId, parameters);
    mockVm();
    mockStorageDomain(storageId, StorageType.GLUSTERFS, Version.v3_1);
    mockStoragePoolIsoMap();
    mockMaxPciSlots();

    assertFalse(command.canDoAction());
    assertTrue(
        command
            .getReturnValue()
            .getCanDoActionMessages()
            .contains(
                EngineMessage.ACTION_TYPE_FAILED_SHAREABLE_DISKS_NOT_SUPPORTED_ON_GLUSTER_DOMAIN
                    .toString()));
  }
 /** Run the canDoAction and assert that it succeeds */
 private void runAndAssertCanDoActionSuccess() {
   boolean canDoAction = command.canDoAction();
   log.info("{}", command.getReturnValue().getCanDoActionMessages());
   assertTrue(canDoAction);
 }