@Test
public void testNonDfsUsedMetricForVolume() throws Exception {

  File volDir = new File(baseDir, "volume-0");
  volDir.mkdirs();
  /*
   * Lets have the example.
   * Capacity - 1000
   * Reserved - 100G
   * DfsUsed  - 200
   * Actual Non-DfsUsed - 300 -->(expected)
   * ReservedForReplicas - 50
   */
  long diskCapacity = 1000L;
  long duReserved = 100L;
  long dfsUsage = 200L;
  long actualNonDfsUsage = 300L;
  long reservedForReplicas = 50L;
  conf.setLong(DFSConfigKeys.DFS_DATANODE_DU_RESERVED_KEY, duReserved);
  FsVolumeImpl volume = new FsVolumeImplBuilder().setDataset(dataset)
      .setStorageDirectory(
          new StorageDirectory(
              StorageLocation.parse(volDir.getPath())))
      .setStorageID("storage-id")
      .setConf(conf)
      .build();
  FsVolumeImpl spyVolume = Mockito.spy(volume);
  // Set Capacity for testing
  long testCapacity = diskCapacity - duReserved;
  spyVolume.setCapacityForTesting(testCapacity);
  // Mock volume.getDfAvailable()
  long dfAvailable = diskCapacity - dfsUsage - actualNonDfsUsage;
  Mockito.doReturn(dfAvailable).when(spyVolume).getDfAvailable();
  // Mock dfsUsage
  Mockito.doReturn(dfsUsage).when(spyVolume).getDfsUsed();
  // Mock reservedForReplcas
  Mockito.doReturn(reservedForReplicas).when(spyVolume)
      .getReservedForReplicas();
  Mockito.doReturn(actualNonDfsUsage).when(spyVolume)
      .getActualNonDfsUsed();
  long expectedNonDfsUsage =
      actualNonDfsUsage - duReserved;
  assertEquals(expectedNonDfsUsage, spyVolume.getNonDfsUsed());
}