@Test(expected = IllegalArgumentException.class)
  public void testCreateAndRemoveMountedFileSystemNullResource() throws Exception {

    if (!testingPropertiesHelper.isTestFileSystemMount(testingProperties)) {
      throw new IllegalArgumentException("thrown to honor contracts");
    }

    String targetCollectionName = "testCreateAndRemoveMountedFileSystem";
    String localMountDir = "testCreateAndRemoveMountedFileSystemLocal";

    String localCollectionAbsolutePath =
        scratchFileUtils.createAndReturnAbsoluteScratchPath(
            IRODS_TEST_SUBDIR_PATH + '/' + localMountDir);

    IRODSAccount irodsAccount =
        testingPropertiesHelper.buildIRODSAccountFromTestProperties(testingProperties);

    String targetIrodsCollection =
        testingPropertiesHelper.buildIRODSCollectionAbsolutePathFromTestProperties(
            testingProperties, IRODS_TEST_SUBDIR_PATH + '/' + targetCollectionName);

    MountedCollectionAO mountedCollectionAO =
        irodsFileSystem.getIRODSAccessObjectFactory().getMountedCollectionAO(irodsAccount);

    mountedCollectionAO.createMountedFileSystemCollection(
        localCollectionAbsolutePath, targetIrodsCollection, null);
  }
  @Test(expected = CollectionNotMountedException.class)
  public void testCreateAMountedFileSystemPhyPathMissing() throws Exception {

    if (!testingPropertiesHelper.isTestFileSystemMount(testingProperties)) {
      throw new CollectionNotMountedException("thrown to honor contracts");
    }

    String targetCollectionName = "testCreateAMountedFileSystemPhyPathMissing";

    String localCollectionAbsolutePath = "/i/dont/exist";

    IRODSAccount irodsAccount =
        testingPropertiesHelper.buildIRODSAccountFromTestProperties(testingProperties);

    String targetIrodsCollection =
        testingPropertiesHelper.buildIRODSCollectionAbsolutePathFromTestProperties(
            testingProperties, IRODS_TEST_SUBDIR_PATH + '/' + targetCollectionName);

    // do an initial unmount
    MountedCollectionAO mountedCollectionAO =
        irodsFileSystem.getIRODSAccessObjectFactory().getMountedCollectionAO(irodsAccount);

    mountedCollectionAO.unmountACollection(
        targetIrodsCollection, irodsAccount.getDefaultStorageResource());

    mountedCollectionAO.createMountedFileSystemCollection(
        localCollectionAbsolutePath,
        targetIrodsCollection,
        irodsAccount.getDefaultStorageResource());
  }
  /**
   * create a soft link where the source file is a data object
   *
   * @throws Exception
   */
  @Test(expected = JargonException.class)
  public final void testCreateASoftLinkSourceIsIRODSFile() throws Exception {

    String sourceCollectionName = "testCreateASoftLinkSourceIsIRODSFile.txt";
    String targetCollectionName = "testCreateASoftLinkSourceNotExistsTarget";

    IRODSAccount irodsAccount =
        testingPropertiesHelper.buildIRODSAccountFromTestProperties(testingProperties);

    String sourceIrodsFile =
        testingPropertiesHelper.buildIRODSCollectionAbsolutePathFromTestProperties(
            testingProperties, IRODS_TEST_SUBDIR_PATH + '/' + sourceCollectionName);

    String targetIrodsCollection =
        testingPropertiesHelper.buildIRODSCollectionAbsolutePathFromTestProperties(
            testingProperties, IRODS_TEST_SUBDIR_PATH + '/' + targetCollectionName);

    IRODSFile sourceAsFile =
        irodsFileSystem.getIRODSFileFactory(irodsAccount).instanceIRODSFile(sourceIrodsFile);
    sourceAsFile.createNewFile();

    // create the soft link

    MountedCollectionAO mountedCollectionAO =
        irodsFileSystem.getIRODSAccessObjectFactory().getMountedCollectionAO(irodsAccount);
    mountedCollectionAO.createASoftLink(sourceIrodsFile, targetIrodsCollection);
  }
  /**
   * create a soft link where the target file is blank
   *
   * @throws Exception
   */
  @Test(expected = IllegalArgumentException.class)
  public final void testCreateASoftLinkTargetIsBlank() throws Exception {

    IRODSAccount irodsAccount =
        testingPropertiesHelper.buildIRODSAccountFromTestProperties(testingProperties);

    MountedCollectionAO mountedCollectionAO =
        irodsFileSystem.getIRODSAccessObjectFactory().getMountedCollectionAO(irodsAccount);
    mountedCollectionAO.createASoftLink("hello", "");
  }
  @Test(expected = IllegalArgumentException.class)
  public void testCreateAndRemoveMountedFileSystemNullTarget() throws Exception {

    if (!testingPropertiesHelper.isTestFileSystemMount(testingProperties)) {
      throw new IllegalArgumentException("thrown to honor contracts");
    }

    IRODSAccount irodsAccount =
        testingPropertiesHelper.buildIRODSAccountFromTestProperties(testingProperties);

    MountedCollectionAO mountedCollectionAO =
        irodsFileSystem.getIRODSAccessObjectFactory().getMountedCollectionAO(irodsAccount);

    mountedCollectionAO.createMountedFileSystemCollection("source", null, "resc");
  }
  /**
   * Unmount a soft link that does not exist
   *
   * @throws Exception
   */
  @Test
  public final void testUnmountSoftLinkNotExists() throws Exception {
    String targetCollectionName = "testUnmountSoftLinkNotExists";

    IRODSAccount irodsAccount =
        testingPropertiesHelper.buildIRODSAccountFromTestProperties(testingProperties);

    String targetIrodsCollection =
        testingPropertiesHelper.buildIRODSCollectionAbsolutePathFromTestProperties(
            testingProperties, IRODS_TEST_SUBDIR_PATH + '/' + targetCollectionName);

    // do an initial unmount
    MountedCollectionAO mountedCollectionAO =
        irodsFileSystem.getIRODSAccessObjectFactory().getMountedCollectionAO(irodsAccount);
    boolean success = mountedCollectionAO.unmountACollection(targetIrodsCollection, "");
    Assert.assertFalse("should get no success", success);
  }
  @Test
  public void testCreateAMountedFileSystemPhyPathMissingButUnderConfiguredPath() throws Exception {

    if (!testingPropertiesHelper.isTestFileSystemMount(testingProperties)) {
      return;
    }

    String targetCollectionName =
        "testCreateAMountedFileSystemPhyPathMissingButUnderConfiguredPath";
    String localMountDir = "testCreateAMountedFileSystemPhyPathMissingButUnderConfiguredPathLocal";

    String localCollectionAbsolutePath =
        testingProperties.getProperty(TestingPropertiesHelper.IRODS_REG_BASEDIR)
            + "/"
            + localMountDir;

    IRODSAccount irodsAccount =
        testingPropertiesHelper.buildIRODSAccountFromTestProperties(testingProperties);

    String targetIrodsCollection =
        testingPropertiesHelper.buildIRODSCollectionAbsolutePathFromTestProperties(
            testingProperties, IRODS_TEST_SUBDIR_PATH + '/' + targetCollectionName);

    // do an initial unmount
    MountedCollectionAO mountedCollectionAO =
        irodsFileSystem.getIRODSAccessObjectFactory().getMountedCollectionAO(irodsAccount);

    mountedCollectionAO.unmountACollection(
        targetIrodsCollection, irodsAccount.getDefaultStorageResource());

    mountedCollectionAO.createMountedFileSystemCollection(
        localCollectionAbsolutePath,
        targetIrodsCollection,
        irodsAccount.getDefaultStorageResource());

    // now get an objstat it should exist

    CollectionAndDataObjectListAndSearchAO searchAO =
        irodsFileSystem
            .getIRODSAccessObjectFactory()
            .getCollectionAndDataObjectListAndSearchAO(irodsAccount);
    ObjStat objStat = searchAO.retrieveObjectStatForPath(targetIrodsCollection);

    Assert.assertEquals(
        "did not get spec col in objStat", SpecColType.MOUNTED_COLL, objStat.getSpecColType());
  }
  @Test(expected = CollectionNotMountedException.class)
  public void testCreateMountedFileSystemTwice() throws Exception {

    if (!testingPropertiesHelper.isTestFileSystemMount(testingProperties)) {
      throw new CollectionNotMountedException("thrown to honor contracts");
    }

    String targetCollectionName = "testCreateMountedFileSystemTwice";
    String localMountDir = "testCreateMountedFileSystemTwiceLocal";

    String localCollectionAbsolutePath =
        scratchFileUtils.createAndReturnAbsoluteScratchPath(
            IRODS_TEST_SUBDIR_PATH + '/' + localMountDir);

    FileGenerator.generateManyFilesInParentCollectionByAbsolutePath(
        localCollectionAbsolutePath, "testCreateMountedFileSystemTwice", ".txt", 10, 1, 2);

    IRODSAccount irodsAccount =
        testingPropertiesHelper.buildIRODSAccountFromTestProperties(testingProperties);

    String targetIrodsCollection =
        testingPropertiesHelper.buildIRODSCollectionAbsolutePathFromTestProperties(
            testingProperties, IRODS_TEST_SUBDIR_PATH + '/' + targetCollectionName);

    // do an initial unmount
    MountedCollectionAO mountedCollectionAO =
        irodsFileSystem.getIRODSAccessObjectFactory().getMountedCollectionAO(irodsAccount);

    mountedCollectionAO.unmountACollection(
        targetIrodsCollection, irodsAccount.getDefaultStorageResource());

    mountedCollectionAO.createMountedFileSystemCollection(
        localCollectionAbsolutePath,
        targetIrodsCollection,
        irodsAccount.getDefaultStorageResource());

    mountedCollectionAO.createMountedFileSystemCollection(
        localCollectionAbsolutePath,
        targetIrodsCollection,
        irodsAccount.getDefaultStorageResource());

    // no errors means success. will test further in
    // listing methods

  }
  @Test(expected = IllegalArgumentException.class)
  public void testCreateAndRemoveMountedFileSystemBlankSource() throws Exception {

    if (!testingPropertiesHelper.isTestFileSystemMount(testingProperties)) {
      throw new IllegalArgumentException("thrown to honor contracts");
    }

    String targetCollectionName = "testCreateAndRemoveMountedFileSystem";

    IRODSAccount irodsAccount =
        testingPropertiesHelper.buildIRODSAccountFromTestProperties(testingProperties);

    String targetIrodsCollection =
        testingPropertiesHelper.buildIRODSCollectionAbsolutePathFromTestProperties(
            testingProperties, IRODS_TEST_SUBDIR_PATH + '/' + targetCollectionName);

    MountedCollectionAO mountedCollectionAO =
        irodsFileSystem.getIRODSAccessObjectFactory().getMountedCollectionAO(irodsAccount);

    mountedCollectionAO.createMountedFileSystemCollection("", targetIrodsCollection, "");
  }
  @Test
  public void testCreateAndRemoveMountedFileSystem() throws Exception {

    if (!testingPropertiesHelper.isTestFileSystemMount(testingProperties)) {
      return;
    }

    String targetCollectionName = "testCreateAndRemoveMountedFileSystem";
    String localMountDir = "testCreateAndRemoveMountedFileSystemLocal";

    String localCollectionAbsolutePath =
        testingProperties.getProperty(TestingPropertiesHelper.IRODS_REG_BASEDIR)
            + "/"
            + localMountDir;

    File localFile = new File(localCollectionAbsolutePath);
    localFile.mkdirs();

    FileGenerator.generateManyFilesInParentCollectionByAbsolutePath(
        localCollectionAbsolutePath, "testCreateAndRemoveMountedFileSystem", ".txt", 10, 1, 2);

    IRODSAccount irodsAccount =
        testingPropertiesHelper.buildIRODSAccountFromTestProperties(testingProperties);

    String targetIrodsCollection =
        testingPropertiesHelper.buildIRODSCollectionAbsolutePathFromTestProperties(
            testingProperties, IRODS_TEST_SUBDIR_PATH + '/' + targetCollectionName);

    // do an initial unmount
    MountedCollectionAO mountedCollectionAO =
        irodsFileSystem.getIRODSAccessObjectFactory().getMountedCollectionAO(irodsAccount);

    mountedCollectionAO.unmountACollection(
        targetIrodsCollection, irodsAccount.getDefaultStorageResource());

    mountedCollectionAO.createMountedFileSystemCollection(
        localCollectionAbsolutePath,
        targetIrodsCollection,
        irodsAccount.getDefaultStorageResource());
  }
  /**
   * Create a soft link to an iRODS collection in nominal mode, target does not exist and will be
   * created
   *
   * @throws Exception
   */
  @Test
  public final void testCreateASoftLink() throws Exception {

    String sourceCollectionName = "testCreateASoftLinkSource";
    String targetCollectionName = "testCreateASoftLinkTarget";
    String subfileName = "testCreateASoftLink.txt";

    IRODSAccount irodsAccount =
        testingPropertiesHelper.buildIRODSAccountFromTestProperties(testingProperties);

    String sourceIrodsCollection =
        testingPropertiesHelper.buildIRODSCollectionAbsolutePathFromTestProperties(
            testingProperties, IRODS_TEST_SUBDIR_PATH + '/' + sourceCollectionName);

    String targetIrodsCollection =
        testingPropertiesHelper.buildIRODSCollectionAbsolutePathFromTestProperties(
            testingProperties, IRODS_TEST_SUBDIR_PATH + '/' + targetCollectionName);

    // do an initial unmount
    MountedCollectionAO mountedCollectionAO =
        irodsFileSystem.getIRODSAccessObjectFactory().getMountedCollectionAO(irodsAccount);

    mountedCollectionAO.unmountACollection(
        targetIrodsCollection, irodsAccount.getDefaultStorageResource());

    // set up source collection
    IRODSFile sourceFile =
        irodsFileSystem.getIRODSFileFactory(irodsAccount).instanceIRODSFile(sourceIrodsCollection);
    sourceFile.mkdirs();
    IRODSFile subFile =
        irodsFileSystem
            .getIRODSFileFactory(irodsAccount)
            .instanceIRODSFile(sourceIrodsCollection, subfileName);
    subFile.createNewFile();

    // add a subfile to this collection

    // create the soft link

    mountedCollectionAO.createASoftLink(sourceIrodsCollection, targetIrodsCollection);

    IRODSFile mountedCollectionTargetFile =
        irodsFileSystem.getIRODSFileFactory(irodsAccount).instanceIRODSFile(targetIrodsCollection);
    Assert.assertTrue("target collection does not exist", mountedCollectionTargetFile.exists());
    String softLinkedSourceFileName =
        mountedCollectionTargetFile.getAbsolutePath() + "/" + subFile.getName();

    CollectionAndDataObjectListAndSearchAO listAndSearchAO =
        irodsFileSystem
            .getIRODSAccessObjectFactory()
            .getCollectionAndDataObjectListAndSearchAO(irodsAccount);

    ObjStat statForSoftLinkedFile =
        listAndSearchAO.retrieveObjectStatForPath(softLinkedSourceFileName);

    Assert.assertEquals(
        "did not set the objPath",
        targetIrodsCollection,
        statForSoftLinkedFile.getCollectionPath());
    Assert.assertEquals(
        "did not identify as a linked coll",
        ObjStat.SpecColType.LINKED_COLL,
        statForSoftLinkedFile.getSpecColType());

    Assert.assertTrue(
        "did not get the soft linked file",
        statForSoftLinkedFile.getObjectType() == ObjectType.DATA_OBJECT);
  }