This is an automated email from the ASF dual-hosted git repository.

adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new 1b26dd3a66 HDDS-9922. Migrate TestOzoneFileInterfaces to JUnit5 (#5838)
1b26dd3a66 is described below

commit 1b26dd3a66e4549526b20dce4d4cd11c8519e41a
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Fri Dec 22 09:33:32 2023 +0100

    HDDS-9922. Migrate TestOzoneFileInterfaces to JUnit5 (#5838)
---
 .../dev-support/findbugsExcludeFile.xml            |   4 -
 .../fs/ozone/AbstractOzoneFileSystemTest.java      | 402 ++++++++++++-
 .../hadoop/fs/ozone/TestOzoneFileInterfaces.java   | 647 ---------------------
 .../fs/ozone/TestOzoneFileInterfacesWithFSO.java   |  44 --
 .../hadoop/fs/ozone/OzoneFSStorageStatistics.java  |   9 +
 5 files changed, 404 insertions(+), 702 deletions(-)

diff --git a/hadoop-ozone/integration-test/dev-support/findbugsExcludeFile.xml 
b/hadoop-ozone/integration-test/dev-support/findbugsExcludeFile.xml
index 99ca98f85e..3b7a676f28 100644
--- a/hadoop-ozone/integration-test/dev-support/findbugsExcludeFile.xml
+++ b/hadoop-ozone/integration-test/dev-support/findbugsExcludeFile.xml
@@ -36,10 +36,6 @@
     <Class name="org.apache.hadoop.fs.ozone.TestOzoneFSWithObjectStoreCreate"/>
     <Bug pattern="RR_NOT_CHECKED" />
   </Match>
-  <Match>
-    <Class name="org.apache.hadoop.fs.ozone.TestOzoneFileInterfaces"/>
-    <Bug pattern="DLS_DEAD_LOCAL_STORE" />
-  </Match>
   <Match>
     <Class 
name="org.apache.hadoop.hdds.scm.container.TestContainerStateManagerIntegration"/>
     <Bug pattern="DLS_DEAD_LOCAL_STORE" />
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/AbstractOzoneFileSystemTest.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/AbstractOzoneFileSystemTest.java
index 38b0272ab3..d3eeffc9b0 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/AbstractOzoneFileSystemTest.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/AbstractOzoneFileSystemTest.java
@@ -18,14 +18,17 @@
 
 package org.apache.hadoop.fs.ozone;
 
+import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
+import org.apache.hadoop.conf.StorageUnit;
+import org.apache.hadoop.fs.BlockLocation;
 import org.apache.hadoop.fs.FSDataInputStream;
 import org.apache.hadoop.fs.FSDataOutputStream;
 import org.apache.hadoop.fs.FileAlreadyExistsException;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.InvalidPathException;
+import org.apache.hadoop.fs.LocatedFileStatus;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.fs.PathFilter;
 import org.apache.hadoop.fs.PathIsNotEmptyDirectoryException;
@@ -53,6 +56,8 @@ import org.apache.hadoop.ozone.client.OzoneClient;
 import org.apache.hadoop.ozone.client.OzoneKeyDetails;
 import org.apache.hadoop.ozone.client.OzoneVolume;
 import org.apache.hadoop.ozone.om.OMConfigKeys;
+import org.apache.hadoop.ozone.om.OMMetadataManager;
+import org.apache.hadoop.ozone.om.OMMetrics;
 import org.apache.hadoop.ozone.om.OzonePrefixPathImpl;
 import org.apache.hadoop.ozone.om.TrashPolicyOzone;
 import org.apache.hadoop.ozone.om.exceptions.OMException;
@@ -62,6 +67,7 @@ import org.apache.hadoop.ozone.om.helpers.OpenKeySession;
 import org.apache.hadoop.ozone.om.helpers.OzoneFileStatus;
 import org.apache.hadoop.ozone.om.protocol.OzoneManagerProtocol;
 import org.apache.hadoop.security.UserGroupInformation;
+import org.apache.hadoop.util.Time;
 import org.apache.ozone.test.GenericTestUtils;
 import org.apache.ozone.test.TestClock;
 import org.junit.jupiter.api.AfterEach;
@@ -84,18 +90,26 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
 import java.util.UUID;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
+import static 
org.apache.hadoop.fs.CommonConfigurationKeysPublic.FS_DEFAULT_NAME_KEY;
 import static 
org.apache.hadoop.fs.CommonConfigurationKeysPublic.FS_TRASH_CHECKPOINT_INTERVAL_KEY;
 import static 
org.apache.hadoop.fs.CommonConfigurationKeysPublic.FS_TRASH_INTERVAL_KEY;
 import static org.apache.hadoop.fs.CommonPathCapabilities.FS_ACLS;
 import static org.apache.hadoop.fs.CommonPathCapabilities.FS_CHECKSUMS;
 import static org.apache.hadoop.fs.FileSystem.TRASH_PREFIX;
+import static 
org.apache.hadoop.fs.StorageStatistics.CommonStatisticNames.OP_CREATE;
+import static 
org.apache.hadoop.fs.StorageStatistics.CommonStatisticNames.OP_GET_FILE_STATUS;
+import static 
org.apache.hadoop.fs.StorageStatistics.CommonStatisticNames.OP_MKDIRS;
+import static 
org.apache.hadoop.fs.StorageStatistics.CommonStatisticNames.OP_OPEN;
 import static 
org.apache.hadoop.fs.contract.ContractTestUtils.assertHasPathCapabilities;
 import static org.apache.hadoop.fs.ozone.Constants.LISTING_PAGE_SIZE;
+import static org.apache.hadoop.fs.ozone.Constants.OZONE_DEFAULT_USER;
 import static 
org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationFactor.ONE;
 import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ACL_ENABLED;
 import static 
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_FS_ITERATE_BATCH_SIZE;
@@ -105,8 +119,10 @@ import static 
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_
 import static 
org.apache.hadoop.ozone.om.helpers.BucketLayout.FILE_SYSTEM_OPTIMIZED;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
@@ -128,6 +144,7 @@ abstract class AbstractOzoneFileSystemTest {
 
   private static final PathFilter EXCLUDE_TRASH =
       p -> !p.toUri().getPath().startsWith(TRASH_ROOT.toString());
+  private String fsRoot;
 
   AbstractOzoneFileSystemTest(boolean setDefaultFs, boolean enableOMRatis, 
BucketLayout layout) {
     enabledFileSystemPaths = setDefaultFs;
@@ -147,10 +164,12 @@ abstract class AbstractOzoneFileSystemTest {
   private OzoneManagerProtocol writeClient;
   private FileSystem fs;
   private OzoneFileSystem o3fs;
+  private OzoneFSStorageStatistics statistics;
   private OzoneBucket ozoneBucket;
   private String volumeName;
   private String bucketName;
   private Trash trash;
+  private OMMetrics omMetrics;
 
   @BeforeAll
   void init() throws Exception {
@@ -172,6 +191,7 @@ abstract class AbstractOzoneFileSystemTest {
             .setNumDatanodes(5)
             .build();
     cluster.waitForClusterToBeReady();
+    omMetrics = cluster.getOzoneManager().getMetrics();
 
     client = cluster.newClient();
     writeClient = client.getObjectStore()
@@ -181,17 +201,20 @@ abstract class AbstractOzoneFileSystemTest {
     volumeName = ozoneBucket.getVolumeName();
     bucketName = ozoneBucket.getName();
 
-    String rootPath = String.format("%s://%s.%s/",
-            OzoneConsts.OZONE_URI_SCHEME, bucketName, volumeName);
+    fsRoot = String.format("%s://%s.%s/",
+        OzoneConsts.OZONE_URI_SCHEME, bucketName, volumeName);
 
     // Set the fs.defaultFS and start the filesystem
-    conf.set(CommonConfigurationKeysPublic.FS_DEFAULT_NAME_KEY, rootPath);
+    conf.set(FS_DEFAULT_NAME_KEY, fsRoot);
     // Set the number of keys to be processed during batch operate.
     conf.setInt(OZONE_FS_ITERATE_BATCH_SIZE, 5);
 
     fs = FileSystem.get(conf);
     trash = new Trash(conf);
-    o3fs = (OzoneFileSystem) fs;
+    o3fs = assertInstanceOf(OzoneFileSystem.class, fs);
+    statistics = (OzoneFSStorageStatistics) 
o3fs.getOzoneFSOpsCountStatistics();
+    assertEquals(OzoneConsts.OZONE_URI_SCHEME, fs.getUri().getScheme());
+    assertEquals(OzoneConsts.OZONE_URI_SCHEME, statistics.getScheme());
   }
 
   @AfterAll
@@ -1208,7 +1231,7 @@ abstract class AbstractOzoneFileSystemTest {
     assertTrue(fs.rename(file1Source, file1Destin), "Renamed failed");
     assertTrue(fs.exists(file1Destin), "Renamed failed: /root/file1");
 
-    /**
+    /*
      * Reading several times, this is to verify that OmKeyInfo#keyName cached
      * entry is not modified. While reading back, OmKeyInfo#keyName will be
      * prepared and assigned to fullkeyPath name.
@@ -1424,7 +1447,7 @@ abstract class AbstractOzoneFileSystemTest {
 
     // Set the fs.defaultFS and start the filesystem
     Configuration conf = new OzoneConfiguration(cluster.getConf());
-    conf.set(CommonConfigurationKeysPublic.FS_DEFAULT_NAME_KEY, rootPath);
+    conf.set(FS_DEFAULT_NAME_KEY, rootPath);
     // Set the number of keys to be processed during batch operate.
     OzoneFileSystem o3FS = (OzoneFileSystem) FileSystem.get(conf);
 
@@ -1749,4 +1772,369 @@ abstract class AbstractOzoneFileSystemTest {
     GenericTestUtils.setLogLevel(log, Level.INFO);
     assertNotEquals(nonZeroLines, 0);
   }
+
+  @Test
+  public void testOzFsReadWrite() throws IOException {
+    assumeFalse(FILE_SYSTEM_OPTIMIZED.equals(getBucketLayout()));
+
+    long currentTime = Time.now();
+    int stringLen = 20;
+    OMMetadataManager metadataManager = cluster.getOzoneManager()
+        .getMetadataManager();
+    String lev1dir = "l1dir";
+    Path lev1path = createPath("/" + lev1dir);
+    String lev1key = metadataManager.getOzoneDirKey(volumeName, bucketName,
+        o3fs.pathToKey(lev1path));
+    String lev2dir = "l2dir";
+    Path lev2path = createPath("/" + lev1dir + "/" + lev2dir);
+    String lev2key = metadataManager.getOzoneDirKey(volumeName, bucketName,
+        o3fs.pathToKey(lev2path));
+
+    String data = RandomStringUtils.randomAlphanumeric(stringLen);
+    String filePath = RandomStringUtils.randomAlphanumeric(5);
+
+    Path path = createPath("/" + lev1dir + "/" + lev2dir + "/" + filePath);
+    String fileKey = metadataManager.getOzoneDirKey(volumeName, bucketName,
+        o3fs.pathToKey(path));
+
+    // verify prefix directories and the file, do not already exist
+    assertNull(metadataManager.getKeyTable(getBucketLayout()).get(lev1key));
+    assertNull(metadataManager.getKeyTable(getBucketLayout()).get(lev2key));
+    assertNull(metadataManager.getKeyTable(getBucketLayout()).get(fileKey));
+
+    Map<String, Long> statsBefore = statistics.snapshot();
+    try (FSDataOutputStream stream = fs.create(path)) {
+      stream.writeBytes(data);
+    }
+
+    assertChange(statsBefore, statistics, OP_CREATE, 1);
+    assertChange(statsBefore, statistics, "objects_created", 1);
+
+    FileStatus status = fs.getFileStatus(path);
+
+    assertChange(statsBefore, statistics, OP_GET_FILE_STATUS, 1);
+    assertChange(statsBefore, statistics, "objects_query", 1);
+
+    // The timestamp of the newly created file should always be greater than
+    // the time when the test was started
+    assertTrue(status.getModificationTime() > currentTime);
+
+    assertFalse(status.isDirectory());
+    assertEquals(FsPermission.getFileDefault(), status.getPermission());
+    verifyOwnerGroup(status);
+
+    // verify prefix directories got created when creating the file.
+    assertEquals("l1dir/", 
metadataManager.getKeyTable(getBucketLayout()).get(lev1key).getKeyName());
+    assertEquals("l1dir/l2dir/", 
metadataManager.getKeyTable(getBucketLayout()).get(lev2key).getKeyName());
+    FileStatus lev1status = getDirectoryStat(lev1path);
+    assertNotNull(lev1status);
+    FileStatus lev2status = getDirectoryStat(lev2path);
+    assertNotNull(lev2status);
+
+    try (FSDataInputStream inputStream = fs.open(path)) {
+      byte[] buffer = new byte[stringLen];
+      // This read will not change the offset inside the file
+      int readBytes = inputStream.read(0, buffer, 0, buffer.length);
+      String out = new String(buffer, 0, buffer.length, UTF_8);
+      assertEquals(data, out);
+      assertEquals(readBytes, buffer.length);
+      assertEquals(0, inputStream.getPos());
+
+      // The following read will change the internal offset
+      readBytes = inputStream.read(buffer, 0, buffer.length);
+      assertEquals(data, out);
+      assertEquals(readBytes, buffer.length);
+      assertEquals(buffer.length, inputStream.getPos());
+    }
+
+    assertChange(statsBefore, statistics, OP_OPEN, 1);
+    assertChange(statsBefore, statistics, "objects_read", 1);
+  }
+
+  private static void assertChange(Map<String, Long> before, 
OzoneFSStorageStatistics after, String key, long delta) {
+    assertEquals(before.get(key) + delta, after.getLong(key));
+  }
+
+  @Test
+  public void testReplication() throws IOException {
+    assumeFalse(FILE_SYSTEM_OPTIMIZED.equals(getBucketLayout()));
+
+    int stringLen = 20;
+    String data = RandomStringUtils.randomAlphanumeric(stringLen);
+    String filePath = RandomStringUtils.randomAlphanumeric(5);
+
+    Path pathIllegal = createPath("/" + filePath + "illegal");
+    try (FSDataOutputStream streamIllegal = fs.create(pathIllegal, (short)2)) {
+      streamIllegal.writeBytes(data);
+    }
+    assertEquals(3, fs.getFileStatus(pathIllegal).getReplication());
+
+    Path pathLegal = createPath("/" + filePath + "legal");
+    try (FSDataOutputStream streamLegal = fs.create(pathLegal, (short)1)) {
+      streamLegal.writeBytes(data);
+    }
+    assertEquals(1, fs.getFileStatus(pathLegal).getReplication());
+  }
+
+  private void verifyOwnerGroup(FileStatus fileStatus) {
+    String owner = getCurrentUser();
+    assertEquals(owner, fileStatus.getOwner());
+    assertEquals(owner, fileStatus.getGroup());
+  }
+
+
+  @Test
+  public void testDirectory() throws IOException {
+    assumeFalse(FILE_SYSTEM_OPTIMIZED.equals(getBucketLayout()));
+
+    String leafName = RandomStringUtils.randomAlphanumeric(5);
+    OMMetadataManager metadataManager = cluster.getOzoneManager()
+        .getMetadataManager();
+
+    String lev1dir = "abc";
+    Path lev1path = createPath("/" + lev1dir);
+    String lev1key = metadataManager.getOzoneDirKey(volumeName, bucketName,
+        o3fs.pathToKey(lev1path));
+    String lev2dir = "def";
+    Path lev2path = createPath("/" + lev1dir + "/" + lev2dir);
+    String lev2key = metadataManager.getOzoneDirKey(volumeName, bucketName,
+        o3fs.pathToKey(lev2path));
+
+    Path leaf = createPath("/" + lev1dir + "/" + lev2dir + "/" + leafName);
+    String leafKey = metadataManager.getOzoneDirKey(volumeName, bucketName,
+        o3fs.pathToKey(leaf));
+
+    // verify prefix directories and the leaf, do not already exist
+    assertNull(metadataManager.getKeyTable(getBucketLayout()).get(lev1key));
+    assertNull(metadataManager.getKeyTable(getBucketLayout()).get(lev2key));
+    assertNull(metadataManager.getKeyTable(getBucketLayout()).get(leafKey));
+
+    assertTrue(fs.mkdirs(leaf));
+
+    // verify the leaf directory got created.
+    FileStatus leafstatus = getDirectoryStat(leaf);
+    assertNotNull(leafstatus);
+
+    // verify prefix directories got created when creating the leaf directory.
+    assertEquals("abc/", metadataManager
+        .getKeyTable(getBucketLayout())
+        .get(lev1key)
+        .getKeyName());
+    assertEquals("abc/def/", metadataManager
+        .getKeyTable(getBucketLayout())
+        .get(lev2key)
+        .getKeyName());
+    FileStatus lev1status = getDirectoryStat(lev1path);
+    assertNotNull(lev1status);
+    FileStatus lev2status = getDirectoryStat(lev2path);
+    assertNotNull(lev2status);
+
+    // check the root directory
+    FileStatus rootStatus = getDirectoryStat(createPath("/"));
+    assertNotNull(rootStatus);
+
+    // root directory listing should contain the lev1 prefix directory
+    FileStatus[] statusList = fs.listStatus(createPath("/"));
+    assertEquals(1, statusList.length);
+    assertEquals(lev1status, statusList[0]);
+  }
+
+  @Test
+  void testListStatus2() throws IOException {
+    List<Path> paths = new ArrayList<>();
+    String dirPath = RandomStringUtils.randomAlphanumeric(5);
+    Path path = createPath("/" + dirPath);
+    paths.add(path);
+
+    final Map<String, Long> initialStats = statistics.snapshot();
+    assertTrue(fs.mkdirs(path));
+    assertChange(initialStats, statistics, OP_MKDIRS, 1);
+
+    final long initialListStatusCount = omMetrics.getNumListStatus();
+    FileStatus[] statusList = fs.listStatus(createPath("/"));
+    assertEquals(1, statusList.length);
+    assertChange(initialStats, statistics, Statistic.OBJECTS_LIST.getSymbol(), 
1);
+    assertEquals(initialListStatusCount + 1, omMetrics.getNumListStatus());
+    assertEquals(fs.getFileStatus(path), statusList[0]);
+
+    dirPath = RandomStringUtils.randomAlphanumeric(5);
+    path = createPath("/" + dirPath);
+    paths.add(path);
+    assertTrue(fs.mkdirs(path));
+    assertChange(initialStats, statistics, OP_MKDIRS, 2);
+
+    statusList = fs.listStatus(createPath("/"));
+    assertEquals(2, statusList.length);
+    assertChange(initialStats, statistics, Statistic.OBJECTS_LIST.getSymbol(), 
2);
+    assertEquals(initialListStatusCount + 2, omMetrics.getNumListStatus());
+    for (Path p : paths) {
+      assertTrue(Arrays.asList(statusList).contains(fs.getFileStatus(p)));
+    }
+  }
+
+  @Test
+  void testOzoneManagerFileSystemInterface() throws IOException {
+    String dirPath = RandomStringUtils.randomAlphanumeric(5);
+
+    Path path = createPath("/" + dirPath);
+    assertTrue(fs.mkdirs(path));
+
+    long numFileStatus =
+        cluster.getOzoneManager().getMetrics().getNumGetFileStatus();
+    FileStatus status = fs.getFileStatus(path);
+
+    assertEquals(numFileStatus + 1,
+        cluster.getOzoneManager().getMetrics().getNumGetFileStatus());
+    assertTrue(status.isDirectory());
+    assertEquals(FsPermission.getDirDefault(), status.getPermission());
+    verifyOwnerGroup(status);
+
+    long currentTime = System.currentTimeMillis();
+    OmKeyArgs keyArgs = new OmKeyArgs.Builder()
+        .setVolumeName(volumeName)
+        .setBucketName(bucketName)
+        .setKeyName(o3fs.pathToKey(path))
+        .build();
+    OzoneFileStatus omStatus =
+        cluster.getOzoneManager().getFileStatus(keyArgs);
+    //Another get file status here, incremented the counter.
+    assertEquals(numFileStatus + 2,
+        cluster.getOzoneManager().getMetrics().getNumGetFileStatus());
+    assertTrue(omStatus.isDirectory());
+
+    // For directories, the time returned is the current time when the dir key
+    // doesn't actually exist on server; if it exists, it will be a fixed 
value.
+    // In this case, the dir key exists.
+    assertEquals(0, omStatus.getKeyInfo().getDataSize());
+    assertTrue(omStatus.getKeyInfo().getModificationTime() <= currentTime);
+    assertEquals(new Path(omStatus.getPath()).getName(),
+        o3fs.pathToKey(path));
+  }
+
+  @Test
+  public void testOzoneManagerLocatedFileStatus() throws IOException {
+    String data = RandomStringUtils.randomAlphanumeric(20);
+    String filePath = RandomStringUtils.randomAlphanumeric(5);
+    Path path = createPath("/" + filePath);
+    try (FSDataOutputStream stream = fs.create(path)) {
+      stream.writeBytes(data);
+    }
+    FileStatus status = fs.getFileStatus(path);
+    assertTrue(status instanceof LocatedFileStatus);
+    LocatedFileStatus locatedFileStatus = (LocatedFileStatus) status;
+    assertTrue(locatedFileStatus.getBlockLocations().length >= 1);
+
+    for (BlockLocation blockLocation : locatedFileStatus.getBlockLocations()) {
+      assertTrue(blockLocation.getNames().length >= 1);
+      assertTrue(blockLocation.getHosts().length >= 1);
+    }
+  }
+
+  @Test
+  void testBlockOffsetsWithMultiBlockFile() throws Exception {
+    // naive assumption: MiniOzoneCluster will not have larger than ~1GB
+    // block size when running this test.
+    int blockSize = (int) fs.getConf().getStorageSize(
+        OzoneConfigKeys.OZONE_SCM_BLOCK_SIZE,
+        OzoneConfigKeys.OZONE_SCM_BLOCK_SIZE_DEFAULT,
+        StorageUnit.BYTES
+    );
+    String data = RandomStringUtils.randomAlphanumeric(2 * blockSize + 837);
+    String filePath = RandomStringUtils.randomAlphanumeric(5);
+    Path path = createPath("/" + filePath);
+    try (FSDataOutputStream stream = fs.create(path)) {
+      stream.writeBytes(data);
+    }
+    FileStatus status = fs.getFileStatus(path);
+    assertTrue(status instanceof LocatedFileStatus);
+    LocatedFileStatus locatedFileStatus = (LocatedFileStatus) status;
+    BlockLocation[] blockLocations = locatedFileStatus.getBlockLocations();
+
+    assertEquals(0, blockLocations[0].getOffset());
+    assertEquals(blockSize, blockLocations[1].getOffset());
+    assertEquals(2 * blockSize, blockLocations[2].getOffset());
+    assertEquals(blockSize, blockLocations[0].getLength());
+    assertEquals(blockSize, blockLocations[1].getLength());
+    assertEquals(837, blockLocations[2].getLength());
+  }
+
+  @Test
+  void testPathToKey() {
+    assumeFalse(FILE_SYSTEM_OPTIMIZED.equals(getBucketLayout()));
+
+    assertEquals("a/b/1", o3fs.pathToKey(new Path("/a/b/1")));
+
+    assertEquals("user/" + getCurrentUser() + "/key1/key2",
+        o3fs.pathToKey(new Path("key1/key2")));
+
+    assertEquals("key1/key2",
+        o3fs.pathToKey(new Path("o3fs://test1/key1/key2")));
+  }
+
+
+  /**
+   * Verify that FS throws exception when trying to access bucket with
+   * incompatible layout.
+   */
+  @Test
+  void testFileSystemWithObjectStoreLayout() throws IOException {
+    String obsVolume = UUID.randomUUID().toString();
+
+    try (OzoneClient client = cluster.newClient()) {
+      ObjectStore store = client.getObjectStore();
+
+      // Create volume and bucket
+      store.createVolume(obsVolume);
+      OzoneVolume volume = store.getVolume(obsVolume);
+      String obsBucket = UUID.randomUUID().toString();
+      // create bucket with OBJECT_STORE bucket layout (incompatible with fs)
+      volume.createBucket(obsBucket, BucketArgs.newBuilder()
+          .setBucketLayout(BucketLayout.OBJECT_STORE)
+          .build());
+
+      String obsRootPath = String.format("%s://%s.%s/",
+          OzoneConsts.OZONE_URI_SCHEME, obsBucket, obsVolume);
+
+      OzoneConfiguration config = new OzoneConfiguration(fs.getConf());
+      config.set(FS_DEFAULT_NAME_KEY, obsRootPath);
+
+      IllegalArgumentException e = 
assertThrows(IllegalArgumentException.class, () -> FileSystem.get(config));
+      assertTrue(e.getMessage().contains("OBJECT_STORE, which does not support 
file system semantics"));
+    }
+  }
+
+  private String getCurrentUser() {
+    try {
+      return UserGroupInformation.getCurrentUser().getShortUserName();
+    } catch (IOException e) {
+      return OZONE_DEFAULT_USER;
+    }
+  }
+
+  private Path createPath(String relativePath) {
+    if (enabledFileSystemPaths) {
+      return new Path(fsRoot + (relativePath.startsWith("/") ? "" : "/") + 
relativePath);
+    } else {
+      return new Path(relativePath);
+    }
+  }
+
+  /**
+   * verify that a directory exists and is initialized correctly.
+   * @param path of the directory
+   * @return null indicates FILE_NOT_FOUND, else the FileStatus
+   */
+  private FileStatus getDirectoryStat(Path path) throws IOException {
+    FileStatus status = fs.getFileStatus(path);
+    assertTrue(status.isDirectory());
+    assertEquals(FsPermission.getDirDefault(), status.getPermission());
+    verifyOwnerGroup(status);
+    assertEquals(0, status.getLen());
+    return status;
+  }
+
+  private void assertCounter(long value, String key) {
+    assertEquals(value, statistics.getLong(key).longValue());
+  }
+
 }
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestOzoneFileInterfaces.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestOzoneFileInterfaces.java
deleted file mode 100644
index c735e312aa..0000000000
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestOzoneFileInterfaces.java
+++ /dev/null
@@ -1,647 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.hadoop.fs.ozone;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.UUID;
-
-import org.apache.hadoop.conf.StorageUnit;
-import org.apache.hadoop.fs.BlockLocation;
-import org.apache.hadoop.fs.FSDataInputStream;
-import org.apache.hadoop.fs.FSDataOutputStream;
-import org.apache.hadoop.fs.FileStatus;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.GlobalStorageStatistics;
-import org.apache.hadoop.fs.LocatedFileStatus;
-import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.fs.StorageStatistics;
-import org.apache.hadoop.fs.permission.FsPermission;
-import org.apache.hadoop.hdds.conf.OzoneConfiguration;
-import org.apache.hadoop.ozone.MiniOzoneCluster;
-import org.apache.hadoop.ozone.OzoneConfigKeys;
-import org.apache.hadoop.ozone.OzoneConsts;
-import org.apache.hadoop.ozone.TestDataUtil;
-import org.apache.hadoop.ozone.client.BucketArgs;
-import org.apache.hadoop.ozone.client.ObjectStore;
-import org.apache.hadoop.ozone.client.OzoneClient;
-import org.apache.hadoop.ozone.client.OzoneVolume;
-import org.apache.hadoop.ozone.om.OMConfigKeys;
-import org.apache.hadoop.ozone.om.OMMetadataManager;
-import org.apache.hadoop.ozone.om.OMMetrics;
-import org.apache.hadoop.ozone.om.helpers.BucketLayout;
-import org.apache.hadoop.ozone.om.helpers.OmKeyArgs;
-import org.apache.hadoop.ozone.om.helpers.OzoneFileStatus;
-import org.apache.hadoop.security.UserGroupInformation;
-import org.apache.hadoop.util.Time;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-import org.apache.hadoop.hdds.utils.IOUtils;
-import org.apache.commons.lang3.RandomStringUtils;
-
-import static 
org.apache.hadoop.fs.CommonConfigurationKeysPublic.FS_DEFAULT_NAME_KEY;
-import static org.apache.hadoop.fs.ozone.Constants.OZONE_DEFAULT_USER;
-
-import org.junit.After;
-import org.junit.AfterClass;
-
-import static 
org.apache.hadoop.ozone.om.helpers.BucketLayout.FILE_SYSTEM_OPTIMIZED;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeFalse;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-import org.junit.rules.Timeout;
-import org.apache.ozone.test.JUnit5AwareTimeout;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-/**
- * Test OzoneFileSystem Interfaces.
- *
- * This test will test the various interfaces i.e.
- * create, read, write, getFileStatus
- */
-@RunWith(Parameterized.class)
-public class TestOzoneFileInterfaces {
-
-  /**
-    * Set a timeout for each test.
-    */
-  @Rule
-  public TestRule timeout = new JUnit5AwareTimeout(Timeout.seconds(300));
-
-  private String rootPath;
-
-  /**
-   * Parameter class to set absolute url/defaultFS handling.
-   * <p>
-   * Hadoop file systems could be used in multiple ways: Using the defaultfs
-   * and file path without the schema, or use absolute url-s even with
-   * different defaultFS. This parameter matrix would test both the use cases.
-   */
-  @Parameters
-  public static Collection<Object[]> data() {
-    return Arrays.asList(new Object[][] {{false, true, true},
-        {true, false, false}});
-  }
-
-  private static boolean setDefaultFs;
-
-  private static boolean useAbsolutePath;
-
-  private static MiniOzoneCluster cluster = null;
-
-  private FileSystem fs;
-
-  private OzoneFileSystem o3fs;
-
-  private String volumeName;
-
-  private String bucketName;
-
-  private OzoneFSStorageStatistics statistics;
-
-  private OMMetrics omMetrics;
-
-  private static boolean enableFileSystemPaths;
-
-  @SuppressWarnings("checkstyle:VisibilityModifier")
-  protected boolean enableFileSystemPathsInstance;
-
-  public TestOzoneFileInterfaces(boolean setDefaultFs,
-      boolean useAbsolutePath, boolean enabledFileSystemPaths)
-      throws Exception {
-    enableFileSystemPathsInstance = enabledFileSystemPaths;
-    if (this.setDefaultFs != setDefaultFs
-        || this.useAbsolutePath != useAbsolutePath
-        || this.enableFileSystemPaths != enabledFileSystemPaths) {
-      setParameters(setDefaultFs, useAbsolutePath, enabledFileSystemPaths);
-      teardown();
-      init();
-    }
-    GlobalStorageStatistics.INSTANCE.reset();
-  }
-
-  private static void setParameters(boolean defaultFs,
-                                    boolean absolutePath,
-                                    boolean fileSystemPaths) {
-    setDefaultFs = defaultFs;
-    useAbsolutePath = absolutePath;
-    enableFileSystemPaths = fileSystemPaths;
-  }
-
-  private static void setCluster(MiniOzoneCluster newCluster) {
-    cluster = newCluster;
-  }
-
-  public void init() throws Exception {
-    OzoneConfiguration conf = getOzoneConfiguration();
-    conf.set(OMConfigKeys.OZONE_DEFAULT_BUCKET_LAYOUT,
-        BucketLayout.LEGACY.name());
-    MiniOzoneCluster newCluster = MiniOzoneCluster.newBuilder(conf)
-        .setNumDatanodes(3)
-        .build();
-    newCluster.waitForClusterToBeReady();
-    setCluster(newCluster);
-  }
-
-  @Before
-  public void setupTest() throws Exception {
-    volumeName = RandomStringUtils.randomAlphabetic(10).toLowerCase();
-    bucketName = RandomStringUtils.randomAlphabetic(10).toLowerCase();
-
-    OzoneConfiguration conf = cluster.getConf();
-
-    // create a volume and a bucket to be used by OzoneFileSystem
-    try (OzoneClient client = cluster.newClient()) {
-      TestDataUtil.createVolumeAndBucket(client, volumeName, bucketName,
-          getBucketLayout());
-    }
-
-    rootPath = String
-        .format("%s://%s.%s/", OzoneConsts.OZONE_URI_SCHEME, bucketName,
-            volumeName);
-    if (setDefaultFs) {
-      // Set the fs.defaultFS and start the filesystem
-      conf.set(FS_DEFAULT_NAME_KEY, rootPath);
-      fs = FileSystem.get(conf);
-    } else {
-      fs = FileSystem.get(new URI(rootPath + "/test.txt"), conf);
-    }
-    o3fs = (OzoneFileSystem) fs;
-    statistics = (OzoneFSStorageStatistics) 
o3fs.getOzoneFSOpsCountStatistics();
-    omMetrics = cluster.getOzoneManager().getMetrics();
-  }
-
-  protected OzoneConfiguration getOzoneConfiguration() {
-    OzoneConfiguration conf = new OzoneConfiguration();
-    conf.setBoolean(OMConfigKeys.OZONE_OM_ENABLE_FILESYSTEM_PATHS,
-        enableFileSystemPaths);
-    return conf;
-  }
-
-  @After
-  public void closeFs() throws IOException {
-    IOUtils.closeQuietly(fs);
-  }
-
-  @AfterClass
-  public static void teardown() throws IOException {
-    if (cluster != null) {
-      cluster.shutdown();
-    }
-  }
-
-  @Test
-  public void testFileSystemInit() throws IOException {
-    assumeFalse(FILE_SYSTEM_OPTIMIZED.equals(getBucketLayout()));
-
-    if (setDefaultFs) {
-      assertTrue(
-          "The initialized file system is not OzoneFileSystem but " +
-              fs.getClass(),
-          fs instanceof OzoneFileSystem);
-      assertEquals(OzoneConsts.OZONE_URI_SCHEME, fs.getUri().getScheme());
-      assertEquals(OzoneConsts.OZONE_URI_SCHEME, statistics.getScheme());
-    }
-  }
-
-  @Test
-  public void testOzFsReadWrite() throws IOException {
-    assumeFalse(FILE_SYSTEM_OPTIMIZED.equals(getBucketLayout()));
-
-    long currentTime = Time.now();
-    int stringLen = 20;
-    OMMetadataManager metadataManager = cluster.getOzoneManager()
-        .getMetadataManager();
-    String lev1dir = "l1dir";
-    Path lev1path = createPath("/" + lev1dir);
-    String lev1key = metadataManager.getOzoneDirKey(volumeName, bucketName,
-        o3fs.pathToKey(lev1path));
-    String lev2dir = "l2dir";
-    Path lev2path = createPath("/" + lev1dir + "/" + lev2dir);
-    String lev2key = metadataManager.getOzoneDirKey(volumeName, bucketName,
-        o3fs.pathToKey(lev2path));
-
-    String data = RandomStringUtils.randomAlphanumeric(stringLen);
-    String filePath = RandomStringUtils.randomAlphanumeric(5);
-
-    Path path = createPath("/" + lev1dir + "/" + lev2dir + "/" + filePath);
-    String fileKey = metadataManager.getOzoneDirKey(volumeName, bucketName,
-        o3fs.pathToKey(path));
-
-    // verify prefix directories and the file, do not already exist
-    assertTrue(
-        metadataManager.getKeyTable(getBucketLayout()).get(lev1key) == null);
-    assertTrue(
-        metadataManager.getKeyTable(getBucketLayout()).get(lev2key) == null);
-    assertTrue(
-        metadataManager.getKeyTable(getBucketLayout()).get(fileKey) == null);
-
-    try (FSDataOutputStream stream = fs.create(path)) {
-      stream.writeBytes(data);
-    }
-
-    assertEquals(statistics.getLong(
-        StorageStatistics.CommonStatisticNames.OP_CREATE).longValue(), 1);
-    assertEquals(statistics.getLong("objects_created").longValue(), 1);
-
-    FileStatus status = fs.getFileStatus(path);
-    assertEquals(statistics.getLong(
-        StorageStatistics.CommonStatisticNames.OP_GET_FILE_STATUS).longValue(),
-        1);
-    assertEquals(statistics.getLong("objects_query").longValue(), 1);
-    // The timestamp of the newly created file should always be greater than
-    // the time when the test was started
-    assertTrue("Modification time has not been recorded: " + status,
-        status.getModificationTime() > currentTime);
-
-    assertFalse(status.isDirectory());
-    assertEquals(FsPermission.getFileDefault(), status.getPermission());
-    verifyOwnerGroup(status);
-
-    FileStatus lev1status;
-    FileStatus lev2status;
-
-    // verify prefix directories got created when creating the file.
-    assertTrue(
-        
metadataManager.getKeyTable(getBucketLayout()).get(lev1key).getKeyName()
-            .equals("l1dir/"));
-    assertTrue(
-        
metadataManager.getKeyTable(getBucketLayout()).get(lev2key).getKeyName()
-            .equals("l1dir/l2dir/"));
-    lev1status = getDirectoryStat(lev1path);
-    lev2status = getDirectoryStat(lev2path);
-    assertTrue((lev1status != null) && (lev2status != null));
-
-    try (FSDataInputStream inputStream = fs.open(path)) {
-      byte[] buffer = new byte[stringLen];
-      // This read will not change the offset inside the file
-      int readBytes = inputStream.read(0, buffer, 0, buffer.length);
-      String out = new String(buffer, 0, buffer.length, UTF_8);
-      assertEquals(data, out);
-      assertEquals(readBytes, buffer.length);
-      assertEquals(0, inputStream.getPos());
-
-      // The following read will change the internal offset
-      readBytes = inputStream.read(buffer, 0, buffer.length);
-      assertEquals(data, out);
-      assertEquals(readBytes, buffer.length);
-      assertEquals(buffer.length, inputStream.getPos());
-    }
-    assertEquals(statistics.getLong(
-        StorageStatistics.CommonStatisticNames.OP_OPEN).longValue(), 1);
-    assertEquals(statistics.getLong("objects_read").longValue(), 1);
-  }
-
-  @Test
-  public void testReplication() throws IOException {
-    assumeFalse(FILE_SYSTEM_OPTIMIZED.equals(getBucketLayout()));
-
-    int stringLen = 20;
-    String data = RandomStringUtils.randomAlphanumeric(stringLen);
-    String filePath = RandomStringUtils.randomAlphanumeric(5);
-
-    Path pathIllegal = createPath("/" + filePath + "illegal");
-    try (FSDataOutputStream streamIllegal = fs.create(pathIllegal, (short)2)) {
-      streamIllegal.writeBytes(data);
-    }
-    assertEquals(3, fs.getFileStatus(pathIllegal).getReplication());
-
-    Path pathLegal = createPath("/" + filePath + "legal");
-    try (FSDataOutputStream streamLegal = fs.create(pathLegal, (short)1)) {
-      streamLegal.writeBytes(data);
-    }
-    assertEquals(1, fs.getFileStatus(pathLegal).getReplication());
-  }
-
-  private void verifyOwnerGroup(FileStatus fileStatus) {
-    String owner = getCurrentUser();
-    assertEquals(owner, fileStatus.getOwner());
-    assertEquals(owner, fileStatus.getGroup());
-  }
-
-
-  @Test
-  public void testDirectory() throws IOException {
-    assumeFalse(FILE_SYSTEM_OPTIMIZED.equals(getBucketLayout()));
-
-    String leafName = RandomStringUtils.randomAlphanumeric(5);
-    OMMetadataManager metadataManager = cluster.getOzoneManager()
-        .getMetadataManager();
-
-    String lev1dir = "abc";
-    Path lev1path = createPath("/" + lev1dir);
-    String lev1key = metadataManager.getOzoneDirKey(volumeName, bucketName,
-        o3fs.pathToKey(lev1path));
-    String lev2dir = "def";
-    Path lev2path = createPath("/" + lev1dir + "/" + lev2dir);
-    String lev2key = metadataManager.getOzoneDirKey(volumeName, bucketName,
-        o3fs.pathToKey(lev2path));
-
-    FileStatus rootChild;
-    FileStatus rootstatus;
-    FileStatus leafstatus;
-
-    Path leaf = createPath("/" + lev1dir + "/" + lev2dir + "/" + leafName);
-    String leafKey = metadataManager.getOzoneDirKey(volumeName, bucketName,
-        o3fs.pathToKey(leaf));
-
-    // verify prefix directories and the leaf, do not already exist
-    assertTrue(
-        metadataManager.getKeyTable(getBucketLayout()).get(lev1key) == null);
-    assertTrue(
-        metadataManager.getKeyTable(getBucketLayout()).get(lev2key) == null);
-    assertTrue(
-        metadataManager.getKeyTable(getBucketLayout()).get(leafKey) == null);
-
-    assertTrue("Makedirs returned with false for the path " + leaf,
-        fs.mkdirs(leaf));
-
-    // verify the leaf directory got created.
-    leafstatus = getDirectoryStat(leaf);
-    assertTrue(leafstatus != null);
-
-    FileStatus lev1status;
-    FileStatus lev2status;
-
-    // verify prefix directories got created when creating the leaf directory.
-    assertTrue(metadataManager
-        .getKeyTable(getBucketLayout())
-        .get(lev1key)
-        .getKeyName().equals("abc/"));
-    assertTrue(metadataManager
-        .getKeyTable(getBucketLayout())
-        .get(lev2key)
-        .getKeyName().equals("abc/def/"));
-    lev1status = getDirectoryStat(lev1path);
-    lev2status = getDirectoryStat(lev2path);
-    assertTrue((lev1status != null) && (lev2status != null));
-    rootChild = lev1status;
-
-    // check the root directory
-    rootstatus = getDirectoryStat(createPath("/"));
-    assertTrue(rootstatus != null);
-
-    // root directory listing should contain the lev1 prefix directory
-    FileStatus[] statusList = fs.listStatus(createPath("/"));
-    assertEquals(1, statusList.length);
-    assertEquals(rootChild, statusList[0]);
-  }
-
-  @Test
-  public void testListStatus() throws IOException {
-    List<Path> paths = new ArrayList<>();
-    String dirPath = RandomStringUtils.randomAlphanumeric(5);
-    Path path = createPath("/" + dirPath);
-    paths.add(path);
-
-    long mkdirs = statistics.getLong(
-        StorageStatistics.CommonStatisticNames.OP_MKDIRS);
-    assertTrue("Makedirs returned with false for the path " + path,
-        fs.mkdirs(path));
-    assertCounter(++mkdirs, StorageStatistics.CommonStatisticNames.OP_MKDIRS);
-
-    long listObjects = statistics.getLong(Statistic.OBJECTS_LIST.getSymbol());
-    long omListStatus = omMetrics.getNumListStatus();
-    FileStatus[] statusList = fs.listStatus(createPath("/"));
-    assertEquals(1, statusList.length);
-    assertCounter(++listObjects, Statistic.OBJECTS_LIST.getSymbol());
-    assertEquals(++omListStatus, omMetrics.getNumListStatus());
-    assertEquals(fs.getFileStatus(path), statusList[0]);
-
-    dirPath = RandomStringUtils.randomAlphanumeric(5);
-    path = createPath("/" + dirPath);
-    paths.add(path);
-    assertTrue("Makedirs returned with false for the path " + path,
-        fs.mkdirs(path));
-    assertCounter(++mkdirs, StorageStatistics.CommonStatisticNames.OP_MKDIRS);
-
-    statusList = fs.listStatus(createPath("/"));
-    assertEquals(2, statusList.length);
-    assertCounter(++listObjects, Statistic.OBJECTS_LIST.getSymbol());
-    assertEquals(++omListStatus, omMetrics.getNumListStatus());
-    for (Path p : paths) {
-      assertTrue(Arrays.asList(statusList).contains(fs.getFileStatus(p)));
-    }
-  }
-
-  @Test
-  public void testOzoneManagerFileSystemInterface() throws IOException {
-    String dirPath = RandomStringUtils.randomAlphanumeric(5);
-
-    Path path = createPath("/" + dirPath);
-    assertTrue("Makedirs returned with false for the path " + path,
-        fs.mkdirs(path));
-
-    long numFileStatus =
-        cluster.getOzoneManager().getMetrics().getNumGetFileStatus();
-    FileStatus status = fs.getFileStatus(path);
-
-    assertEquals(numFileStatus + 1,
-        cluster.getOzoneManager().getMetrics().getNumGetFileStatus());
-    assertTrue(status.isDirectory());
-    assertEquals(FsPermission.getDirDefault(), status.getPermission());
-    verifyOwnerGroup(status);
-
-    long currentTime = System.currentTimeMillis();
-    OmKeyArgs keyArgs = new OmKeyArgs.Builder()
-        .setVolumeName(volumeName)
-        .setBucketName(bucketName)
-        .setKeyName(o3fs.pathToKey(path))
-        .build();
-    OzoneFileStatus omStatus =
-        cluster.getOzoneManager().getFileStatus(keyArgs);
-    //Another get file status here, incremented the counter.
-    assertEquals(numFileStatus + 2,
-        cluster.getOzoneManager().getMetrics().getNumGetFileStatus());
-
-    assertTrue("The created path is not directory.", omStatus.isDirectory());
-
-    // For directories, the time returned is the current time when the dir key
-    // doesn't actually exist on server; if it exists, it will be a fixed 
value.
-    // In this case, the dir key exists.
-    assertEquals(0, omStatus.getKeyInfo().getDataSize());
-    assertTrue(omStatus.getKeyInfo().getModificationTime() <= currentTime);
-    assertEquals(new Path(omStatus.getPath()).getName(),
-        o3fs.pathToKey(path));
-  }
-
-  @Test
-  public void testOzoneManagerLocatedFileStatus() throws IOException {
-    String data = RandomStringUtils.randomAlphanumeric(20);
-    String filePath = RandomStringUtils.randomAlphanumeric(5);
-    Path path = createPath("/" + filePath);
-    try (FSDataOutputStream stream = fs.create(path)) {
-      stream.writeBytes(data);
-    }
-    FileStatus status = fs.getFileStatus(path);
-    assertTrue(status instanceof LocatedFileStatus);
-    LocatedFileStatus locatedFileStatus = (LocatedFileStatus) status;
-    assertTrue(locatedFileStatus.getBlockLocations().length >= 1);
-
-    for (BlockLocation blockLocation : locatedFileStatus.getBlockLocations()) {
-      assertTrue(blockLocation.getNames().length >= 1);
-      assertTrue(blockLocation.getHosts().length >= 1);
-    }
-  }
-
-  @Test
-  public void testOzoneManagerLocatedFileStatusBlockOffsetsWithMultiBlockFile()
-      throws Exception {
-    // naive assumption: MiniOzoneCluster will not have larger than ~1GB
-    // block size when running this test.
-    int blockSize = (int) fs.getConf().getStorageSize(
-        OzoneConfigKeys.OZONE_SCM_BLOCK_SIZE,
-        OzoneConfigKeys.OZONE_SCM_BLOCK_SIZE_DEFAULT,
-        StorageUnit.BYTES
-    );
-    String data = RandomStringUtils.randomAlphanumeric(2 * blockSize + 837);
-    String filePath = RandomStringUtils.randomAlphanumeric(5);
-    Path path = createPath("/" + filePath);
-    try (FSDataOutputStream stream = fs.create(path)) {
-      stream.writeBytes(data);
-    }
-    FileStatus status = fs.getFileStatus(path);
-    assertTrue(status instanceof LocatedFileStatus);
-    LocatedFileStatus locatedFileStatus = (LocatedFileStatus) status;
-    BlockLocation[] blockLocations = locatedFileStatus.getBlockLocations();
-
-    assertEquals(0, blockLocations[0].getOffset());
-    assertEquals(blockSize, blockLocations[1].getOffset());
-    assertEquals(2 * blockSize, blockLocations[2].getOffset());
-    assertEquals(blockSize, blockLocations[0].getLength());
-    assertEquals(blockSize, blockLocations[1].getLength());
-    assertEquals(837, blockLocations[2].getLength());
-  }
-
-  @Test
-  public void testPathToKey() throws Exception {
-    assumeFalse(FILE_SYSTEM_OPTIMIZED.equals(getBucketLayout()));
-
-    assertEquals("a/b/1", o3fs.pathToKey(new Path("/a/b/1")));
-
-    assertEquals("user/" + getCurrentUser() + "/key1/key2",
-        o3fs.pathToKey(new Path("key1/key2")));
-
-    assertEquals("key1/key2",
-        o3fs.pathToKey(new Path("o3fs://test1/key1/key2")));
-  }
-
-
-  /**
-   * Verify that FS throws exception when trying to access bucket with
-   * incompatible layout.
-   * @throws IOException
-   */
-  @Test
-  public void testFileSystemWithObjectStoreLayout() throws IOException {
-    String obsVolume = UUID.randomUUID().toString();
-
-    try (OzoneClient client = cluster.newClient()) {
-      ObjectStore store = client.getObjectStore();
-
-      // Create volume and bucket
-      store.createVolume(obsVolume);
-      OzoneVolume volume = store.getVolume(obsVolume);
-      String obsBucket = UUID.randomUUID().toString();
-      // create bucket with OBJECT_STORE bucket layout (incompatible with fs)
-      volume.createBucket(obsBucket,
-          BucketArgs.newBuilder().setBucketLayout(BucketLayout.OBJECT_STORE)
-              .build());
-
-      String obsRootPath = String.format("%s://%s.%s/",
-          OzoneConsts.OZONE_URI_SCHEME, obsBucket, obsVolume);
-
-      OzoneConfiguration config = (OzoneConfiguration) fs.getConf();
-      config.set(FS_DEFAULT_NAME_KEY, obsRootPath);
-
-      try {
-        fs = FileSystem.get(fs.getConf());
-        fail("Should throw Exception due incompatible bucket layout");
-      } catch (IllegalArgumentException iae) {
-        // Expected exception
-        assertTrue(iae.getMessage().contains(
-            "OBJECT_STORE, which does not support file system semantics"));
-      }
-    }
-  }
-
-  private String getCurrentUser() {
-    try {
-      return UserGroupInformation.getCurrentUser().getShortUserName();
-    } catch (IOException e) {
-      return OZONE_DEFAULT_USER;
-    }
-  }
-
-  private Path createPath(String relativePath) {
-    if (useAbsolutePath) {
-      return new Path(
-          rootPath + (relativePath.startsWith("/") ? "" : "/") + relativePath);
-    } else {
-      return new Path(relativePath);
-    }
-  }
-
-  /**
-   * verify that a directory exists and is initialized correctly.
-   * @param path of the directory
-   * @return null indicates FILE_NOT_FOUND, else the FileStatus
-   * @throws IOException
-   */
-  private FileStatus getDirectoryStat(Path path) throws IOException {
-
-    FileStatus status = null;
-
-    try {
-      status = fs.getFileStatus(path);
-    } catch (FileNotFoundException e) {
-      return null;
-    }
-    assertTrue("The created path is not directory.", status.isDirectory());
-
-    assertEquals(FsPermission.getDirDefault(), status.getPermission());
-    verifyOwnerGroup(status);
-
-    assertEquals(0, status.getLen());
-
-    return status;
-  }
-
-  private void assertCounter(long value, String key) {
-    assertEquals(value, statistics.getLong(key).longValue());
-  }
-
-  public BucketLayout getBucketLayout() {
-    return BucketLayout.DEFAULT;
-  }
-}
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestOzoneFileInterfacesWithFSO.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestOzoneFileInterfacesWithFSO.java
deleted file mode 100644
index 5a0dc6ef5a..0000000000
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestOzoneFileInterfacesWithFSO.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.hadoop.fs.ozone;
-
-import org.apache.hadoop.ozone.om.helpers.BucketLayout;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-/**
- * Test OzoneFileSystem Interfaces - prefix layout.
- *
- * This test will test the various interfaces i.e.
- * create, read, write, getFileStatus
- */
-@RunWith(Parameterized.class)
-public class TestOzoneFileInterfacesWithFSO extends TestOzoneFileInterfaces {
-
-  public TestOzoneFileInterfacesWithFSO(boolean setDefaultFs,
-      boolean useAbsolutePath, boolean enabledFileSystemPaths)
-      throws Exception {
-    super(setDefaultFs, useAbsolutePath, enabledFileSystemPaths);
-  }
-
-  @Override
-  public BucketLayout getBucketLayout() {
-    return BucketLayout.FILE_SYSTEM_OPTIMIZED;
-  }
-}
diff --git 
a/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/OzoneFSStorageStatistics.java
 
b/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/OzoneFSStorageStatistics.java
index 27b216a831..12a3570ea0 100644
--- 
a/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/OzoneFSStorageStatistics.java
+++ 
b/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/OzoneFSStorageStatistics.java
@@ -18,6 +18,7 @@
 
 package org.apache.hadoop.fs.ozone;
 
+import com.google.common.annotations.VisibleForTesting;
 import org.apache.hadoop.hdds.annotation.InterfaceAudience;
 import org.apache.hadoop.hdds.annotation.InterfaceStability;
 import org.apache.hadoop.fs.StorageStatistics;
@@ -25,6 +26,7 @@ import org.apache.hadoop.ozone.OzoneConsts;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.EnumMap;
@@ -123,4 +125,11 @@ public class OzoneFSStorageStatistics extends 
StorageStatistics
     }
   }
 
+  @VisibleForTesting
+  Map<String, Long> snapshot() {
+    Map<String, Long> snapshot = new HashMap<>();
+    opsCount.forEach((k, v) -> snapshot.put(k.getSymbol(), v.longValue()));
+    return snapshot;
+  }
+
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to