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

ritesh 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 a31755a085 HDDS-12315. Speed up some Freon integration tests (#7870)
a31755a085 is described below

commit a31755a08522218a7fc27eff9aebdb3220ddcbc6
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Mon Feb 24 15:52:00 2025 +0100

    HDDS-12315. Speed up some Freon integration tests (#7870)
---
 .../hadoop/fs/ozone/OzoneFileSystemTests.java      |  21 +-
 .../ozone/freon/TestHadoopDirTreeGenerator.java    | 152 ++++-----
 .../ozone/freon/TestHadoopNestedDirGenerator.java  | 116 ++-----
 .../hadoop/ozone/freon/TestHsyncGenerator.java     |  57 +---
 .../ozone/freon/TestOmBucketReadWriteFileOps.java  | 366 +++++++++++----------
 .../ozone/freon/TestOmBucketReadWriteKeyOps.java   | 282 +++++-----------
 .../hadoop/ozone/freon/TestRandomKeyGenerator.java | 121 +++----
 .../test/java/org/apache/ozone/test/AclTests.java  |   6 +-
 .../org/apache/ozone/test/ClusterForTests.java     |   6 +
 .../java/org/apache/ozone/test/FreonTests.java     | 111 +++++++
 .../test/java/org/apache/ozone/test/HATests.java   |   4 +-
 .../java/org/apache/ozone/test/NonHATests.java     |  14 -
 .../test/TestFreon.java}                           |  22 +-
 .../hadoop/ozone/freon/BaseFreonGenerator.java     |   2 +-
 .../hadoop/ozone/freon/RandomKeyGenerator.java     |   2 +-
 15 files changed, 557 insertions(+), 725 deletions(-)

diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/OzoneFileSystemTests.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/OzoneFileSystemTests.java
index cb2c97ca6d..02e81f333e 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/OzoneFileSystemTests.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/OzoneFileSystemTests.java
@@ -20,6 +20,8 @@
 import static 
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_FS_LISTING_PAGE_SIZE;
 import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_REPLICATION;
 import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_REPLICATION_TYPE;
+import static org.apache.hadoop.ozone.OzoneConsts.OZONE_OFS_URI_SCHEME;
+import static org.apache.hadoop.ozone.OzoneConsts.OZONE_URI_SCHEME;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
@@ -33,17 +35,30 @@
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.fs.RemoteIterator;
 import org.apache.hadoop.fs.contract.ContractTestUtils;
+import org.apache.hadoop.hdds.conf.ConfigurationTarget;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.ratis.util.Preconditions;
 
 /**
  * Common test cases for Ozone file systems.
  */
-final class OzoneFileSystemTests {
+public final class OzoneFileSystemTests {
 
   private OzoneFileSystemTests() {
     // no instances
   }
 
+  /**
+   * Set file system listing page size.  Also disable the file system cache to
+   * ensure new {@link FileSystem} instance reflects the updated page size.
+   */
+  public static void setPageSize(ConfigurationTarget conf, int pageSize) {
+    Preconditions.assertTrue(pageSize > 0, () -> "pageSize=" + pageSize + " <= 
0");
+    conf.setInt(OZONE_FS_LISTING_PAGE_SIZE, pageSize);
+    conf.setBoolean(String.format("fs.%s.impl.disable.cache", 
OZONE_URI_SCHEME), true);
+    conf.setBoolean(String.format("fs.%s.impl.disable.cache", 
OZONE_OFS_URI_SCHEME), true);
+  }
+
   /**
    * Tests listStatusIterator operation on directory with different
    * numbers of child directories.
@@ -60,10 +75,8 @@ public static void 
listStatusIteratorOnPageSize(OzoneConfiguration conf,
         pageSize + pageSize
     };
     OzoneConfiguration config = new OzoneConfiguration(conf);
-    config.setInt(OZONE_FS_LISTING_PAGE_SIZE, pageSize);
+    setPageSize(config, pageSize);
     URI uri = FileSystem.getDefaultUri(config);
-    config.setBoolean(
-        String.format("fs.%s.impl.disable.cache", uri.getScheme()), true);
     try (FileSystem subject = FileSystem.get(uri, config)) {
       Path dir = new Path(Objects.requireNonNull(rootPath),
           "listStatusIterator");
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestHadoopDirTreeGenerator.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestHadoopDirTreeGenerator.java
index 937d4d4f2a..483107af46 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestHadoopDirTreeGenerator.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestHadoopDirTreeGenerator.java
@@ -17,148 +17,110 @@
 
 package org.apache.hadoop.ozone.freon;
 
+import static org.apache.hadoop.ozone.OzoneConsts.OZONE_URI_SCHEME;
+import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_ADDRESS_KEY;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import org.apache.commons.io.FileUtils;
+import java.util.UUID;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.fs.ozone.OzoneFileSystemTests;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.conf.StorageSize;
 import org.apache.hadoop.hdds.conf.StorageUnit;
 import org.apache.hadoop.hdds.utils.IOUtils;
-import org.apache.hadoop.ozone.MiniOzoneCluster;
+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.OzoneClientFactory;
 import org.apache.hadoop.ozone.client.OzoneVolume;
-import org.apache.hadoop.ozone.om.OMConfigKeys;
 import org.apache.hadoop.ozone.om.helpers.BucketLayout;
-import org.apache.ozone.test.GenericTestUtils;
-import org.apache.ratis.server.RaftServer;
-import org.apache.ratis.server.raftlog.RaftLog;
+import org.apache.ozone.test.NonHATests;
+import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.io.TempDir;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EnumSource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.slf4j.event.Level;
 
 /**
  * Test for HadoopDirTreeGenerator.
  */
-public class TestHadoopDirTreeGenerator {
-  @TempDir
-  private java.nio.file.Path path;
-  private OzoneConfiguration conf = null;
-  private MiniOzoneCluster cluster = null;
+public abstract class TestHadoopDirTreeGenerator implements 
NonHATests.TestCase {
+
+  private static final int PAGE_SIZE = 10;
+
   private ObjectStore store = null;
   private static final Logger LOG =
           LoggerFactory.getLogger(TestHadoopDirTreeGenerator.class);
   private OzoneClient client;
 
   @BeforeEach
-  public void setup() {
-    GenericTestUtils.setLogLevel(RaftLog.LOG, Level.DEBUG);
-    GenericTestUtils.setLogLevel(RaftServer.LOG, Level.DEBUG);
-  }
-
-  /**
-   * Shutdown MiniDFSCluster.
-   */
-  private void shutdown() throws IOException {
-    IOUtils.closeQuietly(client);
-    if (cluster != null) {
-      cluster.shutdown();
-    }
-  }
-
-  /**
-   * Create a MiniDFSCluster for testing.
-   *
-   * @throws IOException
-   */
-  private void startCluster() throws Exception {
-    conf = getOzoneConfiguration();
-    conf.set(OMConfigKeys.OZONE_DEFAULT_BUCKET_LAYOUT,
-        BucketLayout.LEGACY.name());
-    cluster = MiniOzoneCluster.newBuilder(conf).setNumDatanodes(5).build();
-    cluster.waitForClusterToBeReady();
-    cluster.waitTobeOutOfSafeMode();
-
-    client = OzoneClientFactory.getRpcClient(conf);
+  void setup() throws Exception {
+    client = cluster().newClient();
     store = client.getObjectStore();
   }
 
-  protected OzoneConfiguration getOzoneConfiguration() {
-    return new OzoneConfiguration();
+  @AfterEach
+  void cleanup() {
+    IOUtils.closeQuietly(client);
   }
 
-  @Test
-  public void testNestedDirTreeGeneration() throws Exception {
-    try {
-      startCluster();
-      FileOutputStream out = FileUtils.openOutputStream(new 
File(path.toString(),
-          "conf"));
-      cluster.getConf().writeXml(out);
-      out.getFD().sync();
-      out.close();
-
-      verifyDirTree("vol1", "bucket1", 1,
-              1, 1, "0");
-      verifyDirTree("vol2", "bucket1", 1,
-              5, 1, "5B");
-      verifyDirTree("vol3", "bucket1", 2,
-              5, 3, "1B");
-      verifyDirTree("vol4", "bucket1", 3,
-              2, 4, "2B");
-      verifyDirTree("vol5", "bucket1", 5,
-              4, 1, "0");
-      // default page size is Constants.LISTING_PAGE_SIZE = 1024
-      verifyDirTree("vol6", "bucket1", 2,
-              1, 1100, "0");
-    } finally {
-      shutdown();
-    }
+  @ParameterizedTest
+  @EnumSource(names = {"FILE_SYSTEM_OPTIMIZED", "LEGACY"})
+  public void testNestedDirTreeGeneration(BucketLayout layout) throws 
Exception {
+    String uuid = UUID.randomUUID().toString();
+    verifyDirTree("vol1-" + uuid, "bucket1", 1, 1, 1, "0", layout);
+    verifyDirTree("vol2-" + uuid, "bucket1", 1, 5, 1, "5B", layout);
+    verifyDirTree("vol3-" + uuid, "bucket1", 2, 5, 3, "1B", layout);
+    verifyDirTree("vol4-" + uuid, "bucket1", 3, 2, 4, "2B", layout);
+    verifyDirTree("vol5-" + uuid, "bucket1", 5, 4, 1, "0", layout);
+    verifyDirTree("vol6-" + uuid, "bucket1", 2, 1, PAGE_SIZE + PAGE_SIZE / 2, 
"0", layout);
   }
 
   private void verifyDirTree(String volumeName, String bucketName, int depth,
-                             int span, int fileCount, String perFileSize)
+                             int span, int fileCount, String perFileSize, 
BucketLayout layout)
           throws IOException {
 
     store.createVolume(volumeName);
     OzoneVolume volume = store.getVolume(volumeName);
-    volume.createBucket(bucketName);
-    String rootPath = "o3fs://" + bucketName + "." + volumeName;
-    String confPath = new File(path.toString(), "conf").getAbsolutePath();
-    new Freon().execute(
-        new String[]{"-conf", confPath, "dtsg", "-d", depth + "", "-c",
-            fileCount + "", "-s", span + "", "-n", "1", "-r", rootPath,
-            "-g", perFileSize});
+    volume.createBucket(bucketName, 
BucketArgs.newBuilder().setBucketLayout(layout).build());
+    String rootPath = OZONE_URI_SCHEME + "://" + bucketName + "." + volumeName;
+    String om = cluster().getConf().get(OZONE_OM_ADDRESS_KEY);
+    new Freon().getCmd().execute(
+        "-D", OZONE_OM_ADDRESS_KEY + "=" + om,
+        "dtsg",
+        "-c", String.valueOf(fileCount),
+        "-d", String.valueOf(depth),
+        "-g", perFileSize,
+        "-n", "1",
+        "-r", rootPath,
+        "-s", String.valueOf(span)
+    );
     // verify the directory structure
     LOG.info("Started verifying the directory structure...");
-    FileSystem fileSystem = FileSystem.get(URI.create(rootPath),
-            conf);
-    Path rootDir = new Path(rootPath.concat("/"));
-    // verify root path details
-    FileStatus[] fileStatuses = fileSystem.listStatus(rootDir);
-    // verify the num of peer directories, expected span count is 1
-    // as it has only one dir at root.
-    verifyActualSpan(1, Arrays.asList(fileStatuses));
-    for (FileStatus fileStatus : fileStatuses) {
-      int actualDepth =
-          traverseToLeaf(fileSystem, fileStatus.getPath(), 1, depth, span,
-              fileCount, StorageSize.parse(perFileSize, StorageUnit.BYTES));
-      assertEquals(depth, actualDepth, "Mismatch depth in a path");
+    OzoneConfiguration conf = new OzoneConfiguration(cluster().getConf());
+    OzoneFileSystemTests.setPageSize(conf, PAGE_SIZE);
+    try (FileSystem fileSystem = FileSystem.get(URI.create(rootPath), conf)) {
+      Path rootDir = new Path(rootPath.concat("/"));
+      // verify root path details
+      FileStatus[] fileStatuses = fileSystem.listStatus(rootDir);
+      // verify the num of peer directories, expected span count is 1
+      // as it has only one dir at root.
+      verifyActualSpan(1, Arrays.asList(fileStatuses));
+      for (FileStatus fileStatus : fileStatuses) {
+        int actualDepth =
+            traverseToLeaf(fileSystem, fileStatus.getPath(), 1, depth, span,
+                fileCount, StorageSize.parse(perFileSize, StorageUnit.BYTES));
+        assertEquals(depth, actualDepth, "Mismatch depth in a path");
+      }
     }
   }
 
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestHadoopNestedDirGenerator.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestHadoopNestedDirGenerator.java
index bd178de71b..b36397896e 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestHadoopNestedDirGenerator.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestHadoopNestedDirGenerator.java
@@ -17,105 +17,55 @@
 
 package org.apache.hadoop.ozone.freon;
 
+import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_ADDRESS_KEY;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.net.URI;
 import java.util.Collections;
 import java.util.LinkedList;
-import org.apache.commons.io.FileUtils;
+import java.util.UUID;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.utils.IOUtils;
-import org.apache.hadoop.ozone.MiniOzoneCluster;
 import org.apache.hadoop.ozone.client.ObjectStore;
 import org.apache.hadoop.ozone.client.OzoneClient;
-import org.apache.hadoop.ozone.client.OzoneClientFactory;
 import org.apache.hadoop.ozone.client.OzoneVolume;
-import org.apache.hadoop.ozone.om.OMConfigKeys;
-import org.apache.ozone.test.GenericTestUtils;
-import org.apache.ratis.server.RaftServer;
-import org.apache.ratis.server.raftlog.RaftLog;
+import org.apache.ozone.test.NonHATests;
+import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.io.TempDir;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.slf4j.event.Level;
 
 /**
  * Test for HadoopNestedDirGenerator.
  */
-
-public class TestHadoopNestedDirGenerator {
-  @TempDir
-  private java.nio.file.Path path;
-  private OzoneConfiguration conf = null;
-  private MiniOzoneCluster cluster = null;
+public abstract class TestHadoopNestedDirGenerator implements 
NonHATests.TestCase {
   private ObjectStore store = null;
   private static final Logger LOG =
           LoggerFactory.getLogger(TestHadoopNestedDirGenerator.class);
   private OzoneClient client;
 
-  @BeforeEach
-    public void setup() {
-    GenericTestUtils.setLogLevel(RaftLog.LOG, Level.DEBUG);
-    GenericTestUtils.setLogLevel(RaftServer.LOG, Level.DEBUG);
-  }
-
-    /**
-     * Shutdown MiniDFSCluster.
-     */
-
-  private void shutdown() throws IOException {
+  @AfterEach
+  void shutdown() {
     IOUtils.closeQuietly(client);
-    if (cluster != null) {
-      cluster.shutdown();
-    }
   }
 
-    /**
-     * Create a MiniDFSCluster for testing.
-     *
-     * @throws IOException
-     */
-
-  private void startCluster() throws Exception {
-    conf = new OzoneConfiguration();
-    conf.set(OMConfigKeys.OZONE_DEFAULT_BUCKET_LAYOUT,
-        OMConfigKeys.OZONE_BUCKET_LAYOUT_FILE_SYSTEM_OPTIMIZED);
-    cluster = MiniOzoneCluster.newBuilder(conf).setNumDatanodes(5).build();
-    cluster.waitForClusterToBeReady();
-    cluster.waitTobeOutOfSafeMode();
-    client = OzoneClientFactory.getRpcClient(conf);
+  @BeforeEach
+  void init() throws Exception {
+    client = cluster().newClient();
     store = client.getObjectStore();
   }
 
   @Test
-    public void testNestedDirTreeGeneration() throws Exception {
-    try {
-      startCluster();
-      FileOutputStream out = FileUtils.openOutputStream(new 
File(path.toString(), "conf"));
-      cluster.getConf().writeXml(out);
-      out.getFD().sync();
-      out.close();
-      verifyDirTree("vol1",
-              "bucket1", 1, 1);
-      verifyDirTree("vol2",
-              "bucket1", 1, 5);
-      verifyDirTree("vol3",
-              "bucket1", 2, 0);
-      verifyDirTree("vol4",
-              "bucket1", 3, 2);
-      verifyDirTree("vol5",
-              "bucket1", 5, 4);
-    } finally {
-      shutdown();
-    }
+  public void testNestedDirTreeGeneration() throws Exception {
+    verifyDirTree("vol-" + UUID.randomUUID(), "bucket1", 1, 1);
+    verifyDirTree("vol-" + UUID.randomUUID(), "bucket1", 1, 5);
+    verifyDirTree("vol-" + UUID.randomUUID(), "bucket1", 2, 0);
+    verifyDirTree("vol-" + UUID.randomUUID(), "bucket1", 3, 2);
+    verifyDirTree("vol-" + UUID.randomUUID(), "bucket1", 5, 4);
   }
 
   private void verifyDirTree(String volumeName, String bucketName,
@@ -125,21 +75,27 @@ private void verifyDirTree(String volumeName, String 
bucketName,
     OzoneVolume volume = store.getVolume(volumeName);
     volume.createBucket(bucketName);
     String rootPath = "o3fs://" + bucketName + "." + volumeName;
-    String confPath = new File(path.toString(), "conf").getAbsolutePath();
-    new Freon().execute(new String[]{"-conf", confPath, "ddsg", "-d",
-        actualDepth + "", "-s", span + "", "-n", "1", "-r", rootPath});
+    String om = cluster().getConf().get(OZONE_OM_ADDRESS_KEY);
+    new Freon().getCmd().execute(
+        "-D", OZONE_OM_ADDRESS_KEY + "=" + om,
+        "ddsg",
+        "-d", String.valueOf(actualDepth),
+        "-s", String.valueOf(span),
+        "-n", "1",
+        "-r", rootPath
+    );
     // verify the directory structure
-    FileSystem fileSystem = FileSystem.get(URI.create(rootPath),
-            conf);
-    Path rootDir = new Path(rootPath.concat("/"));
-    // verify root path details
-    FileStatus[] fileStatuses = fileSystem.listStatus(rootDir);
-    Path p = null;
-    for (FileStatus fileStatus : fileStatuses) {
-      // verify the num of peer directories and span directories
-      p = depthBFS(fileSystem, fileStatuses, span, actualDepth);
-      int actualSpan = spanCheck(fileSystem, span, p);
-      assertEquals(span, actualSpan, "Mismatch span in a path");
+    try (FileSystem fileSystem = FileSystem.get(URI.create(rootPath), 
cluster().getConf())) {
+      Path rootDir = new Path(rootPath.concat("/"));
+      // verify root path details
+      FileStatus[] fileStatuses = fileSystem.listStatus(rootDir);
+      Path p = null;
+      for (FileStatus fileStatus : fileStatuses) {
+        // verify the num of peer directories and span directories
+        p = depthBFS(fileSystem, fileStatuses, span, actualDepth);
+        int actualSpan = spanCheck(fileSystem, span, p);
+        assertEquals(span, actualSpan, "Mismatch span in a path");
+      }
     }
   }
 
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestHsyncGenerator.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestHsyncGenerator.java
index 0f1836f396..bc367e19e1 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestHsyncGenerator.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestHsyncGenerator.java
@@ -17,83 +17,40 @@
 
 package org.apache.hadoop.ozone.freon;
 
-import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_FS_HSYNC_ENABLED;
 import static org.apache.hadoop.ozone.OzoneConsts.OZONE_OFS_URI_SCHEME;
 import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_ADDRESS_KEY;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.io.IOException;
-import java.time.Duration;
-import org.apache.hadoop.hdds.conf.DatanodeRatisServerConfig;
-import org.apache.hadoop.hdds.conf.OzoneConfiguration;
-import org.apache.hadoop.hdds.ratis.conf.RatisClientConfig;
-import org.apache.hadoop.ozone.MiniOzoneCluster;
+import java.util.UUID;
 import org.apache.hadoop.ozone.client.ObjectStore;
 import org.apache.hadoop.ozone.client.OzoneClient;
 import org.apache.hadoop.ozone.client.OzoneVolume;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
+import org.apache.ozone.test.NonHATests;
 import org.junit.jupiter.api.Test;
 import picocli.CommandLine;
 
 /**
  * Tests Freon HsyncGenerator with MiniOzoneCluster and validate data.
  */
-public class TestHsyncGenerator {
-  private static MiniOzoneCluster cluster = null;
-
-  private static void startCluster(OzoneConfiguration conf) throws Exception {
-    DatanodeRatisServerConfig ratisServerConfig =
-        conf.getObject(DatanodeRatisServerConfig.class);
-    ratisServerConfig.setRequestTimeOut(Duration.ofSeconds(3));
-    ratisServerConfig.setWatchTimeOut(Duration.ofSeconds(10));
-    conf.setFromObject(ratisServerConfig);
-
-    RatisClientConfig.RaftConfig raftClientConfig =
-        conf.getObject(RatisClientConfig.RaftConfig.class);
-    raftClientConfig.setRpcRequestTimeout(Duration.ofSeconds(3));
-    raftClientConfig.setRpcWatchRequestTimeout(Duration.ofSeconds(10));
-    conf.setFromObject(raftClientConfig);
-    conf.set(OZONE_FS_HSYNC_ENABLED, "true");
-
-    cluster = MiniOzoneCluster.newBuilder(conf)
-        .setNumDatanodes(5).build();
-    cluster.waitForClusterToBeReady();
-  }
-
-  static void shutdownCluster() {
-    if (cluster != null) {
-      cluster.shutdown();
-    }
-  }
-
-  @BeforeAll
-  public static void init() throws Exception {
-    OzoneConfiguration conf = new OzoneConfiguration();
-    startCluster(conf);
-  }
-
-  @AfterAll
-  public static void shutdown() {
-    shutdownCluster();
-  }
+public abstract class TestHsyncGenerator implements NonHATests.TestCase {
 
   @Test
   public void test() throws IOException {
     HsyncGenerator randomKeyGenerator =
-        new HsyncGenerator(cluster.getConf());
+        new HsyncGenerator(cluster().getConf());
     CommandLine cmd = new CommandLine(randomKeyGenerator);
 
-    String volumeName = "vol1";
+    String volumeName = "vol-" + UUID.randomUUID();
     String bucketName = "bucket1";
-    try (OzoneClient client = cluster.newClient()) {
+    try (OzoneClient client = cluster().newClient()) {
       ObjectStore store = client.getObjectStore();
       store.createVolume(volumeName);
       OzoneVolume volume = store.getVolume(volumeName);
       volume.createBucket(bucketName);
 
       String rootPath = String.format("%s://%s/%s/%s/", OZONE_OFS_URI_SCHEME,
-          cluster.getConf().get(OZONE_OM_ADDRESS_KEY), volumeName, bucketName);
+          cluster().getConf().get(OZONE_OM_ADDRESS_KEY), volumeName, 
bucketName);
 
       int exitCode = cmd.execute(
           "--path", rootPath,
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestOmBucketReadWriteFileOps.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestOmBucketReadWriteFileOps.java
index 5d0c70d026..369f577ce4 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestOmBucketReadWriteFileOps.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestOmBucketReadWriteFileOps.java
@@ -17,175 +17,134 @@
 
 package org.apache.hadoop.ozone.freon;
 
+import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_ADDRESS_KEY;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
 import java.net.URI;
-import org.apache.commons.io.FileUtils;
+import java.util.Arrays;
+import java.util.List;
+import java.util.UUID;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.hdds.conf.OzoneConfiguration;
-import org.apache.hadoop.hdds.utils.IOUtils;
-import org.apache.hadoop.ozone.MiniOzoneCluster;
 import org.apache.hadoop.ozone.OzoneConsts;
-import org.apache.hadoop.ozone.client.ObjectStore;
+import org.apache.hadoop.ozone.TestDataUtil;
+import org.apache.hadoop.ozone.client.BucketArgs;
 import org.apache.hadoop.ozone.client.OzoneClient;
-import org.apache.hadoop.ozone.client.OzoneClientFactory;
-import org.apache.hadoop.ozone.client.OzoneVolume;
-import org.apache.hadoop.ozone.om.OMConfigKeys;
-import org.apache.hadoop.ozone.om.helpers.BucketLayout;
 import org.apache.hadoop.ozone.om.lock.OMLockMetrics;
-import org.apache.ozone.test.GenericTestUtils;
-import org.apache.ratis.server.RaftServer;
-import org.apache.ratis.server.raftlog.RaftLog;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.io.TempDir;
+import org.apache.ozone.test.NonHATests;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.slf4j.event.Level;
 
 /**
  * Test for OmBucketReadWriteFileOps.
  */
-public class TestOmBucketReadWriteFileOps {
-  @TempDir
-  private java.nio.file.Path path;
-  private OzoneConfiguration conf = null;
-  private MiniOzoneCluster cluster = null;
-  private ObjectStore store = null;
+public abstract class TestOmBucketReadWriteFileOps implements 
NonHATests.TestCase {
   private static final Logger LOG =
       LoggerFactory.getLogger(TestOmBucketReadWriteFileOps.class);
-  private OzoneClient client;
 
-  @BeforeEach
-  public void setup() {
-    GenericTestUtils.setLogLevel(RaftLog.LOG, Level.DEBUG);
-    GenericTestUtils.setLogLevel(RaftServer.LOG, Level.DEBUG);
+  static List<ParameterBuilder> parameters() {
+    return Arrays.asList(
+        new ParameterBuilder()
+            .setTotalThreadCount(10)
+            .setNumOfReadOperations(10)
+            .setNumOfWriteOperations(5)
+            .setReadThreadPercentage(70)
+            .setCountForRead(10)
+            .setCountForWrite(5),
+        new ParameterBuilder()
+            .setPrefixFilePath("/dir1/dir2/dir3")
+            .setTotalThreadCount(10)
+            .setNumOfReadOperations(10)
+            .setNumOfWriteOperations(5)
+            .setReadThreadPercentage(80)
+            .setBufferSize(128)
+            .setCountForRead(10)
+            .setCountForWrite(5),
+        new ParameterBuilder()
+            .setPrefixFilePath("/")
+            .setTotalThreadCount(15)
+            .setNumOfReadOperations(5)
+            .setNumOfWriteOperations(3)
+            .setDataSize("128B")
+            .setCountForRead(5)
+            .setCountForWrite(3),
+        new ParameterBuilder()
+            .setPrefixFilePath("/dir1/")
+            .setTotalThreadCount(10)
+            .setNumOfReadOperations(5)
+            .setNumOfWriteOperations(3)
+            .setCountForRead(5)
+            .setCountForWrite(3)
+            .setDataSize("64B")
+            .setBufferSize(16),
+        new ParameterBuilder()
+            .setPrefixFilePath("/dir1/dir2/dir3")
+            .setTotalThreadCount(10)
+            .setNumOfReadOperations(5)
+            .setNumOfWriteOperations(0)
+            .setCountForRead(5),
+        new ParameterBuilder()
+            .setLength(64)
+            .setPrefixFilePath("/dir1/dir2/dir3/dir4")
+            .setTotalThreadCount(20)
+            .setNumOfReadOperations(0)
+            .setNumOfWriteOperations(5)
+            .setCountForRead(0)
+            .setCountForWrite(5)
+    );
   }
 
-  /**
-   * Shutdown MiniDFSCluster.
-   */
-  private void shutdown() throws IOException {
-    IOUtils.closeQuietly(client);
-    if (cluster != null) {
-      cluster.shutdown();
+  @ParameterizedTest
+  @MethodSource("parameters")
+  void testOmBucketReadWriteFileOps(ParameterBuilder parameterBuilder) throws 
Exception {
+    try (OzoneClient client = cluster().newClient()) {
+      TestDataUtil.createVolumeAndBucket(client,
+          parameterBuilder.getVolumeName(),
+          parameterBuilder.getBucketName(),
+          parameterBuilder.getBucketArgs().build()
+      );
     }
-  }
-
-  /**
-   * Create a MiniDFSCluster for testing.
-   *
-   * @throws IOException
-   */
-  private void startCluster() throws Exception {
-    conf = getOzoneConfiguration();
-    conf.set(OMConfigKeys.OZONE_DEFAULT_BUCKET_LAYOUT,
-        BucketLayout.LEGACY.name());
-    cluster = MiniOzoneCluster.newBuilder(conf).setNumDatanodes(5).build();
-    cluster.waitForClusterToBeReady();
-    cluster.waitTobeOutOfSafeMode();
-
-    client = OzoneClientFactory.getRpcClient(conf);
-    store = client.getObjectStore();
-  }
-
-  protected OzoneConfiguration getOzoneConfiguration() {
-    return new OzoneConfiguration();
-  }
-
-  @Test
-  public void testOmBucketReadWriteFileOps() throws Exception {
-    try {
-      startCluster();
-      FileOutputStream out = FileUtils.openOutputStream(new 
File(path.toString(), "conf"));
-      cluster.getConf().writeXml(out);
-      out.getFD().sync();
-      out.close();
-
-      verifyFreonCommand(new ParameterBuilder().setTotalThreadCount(10)
-          .setNumOfReadOperations(10).setNumOfWriteOperations(5)
-          .setFileCountForRead(10).setFileCountForWrite(5));
-      verifyFreonCommand(
-          new ParameterBuilder().setVolumeName("vol2").setBucketName("bucket1")
-              .setPrefixFilePath("/dir1/dir2/dir3").setTotalThreadCount(10)
-              .setNumOfReadOperations(10).setNumOfWriteOperations(5)
-              .setFileCountForRead(10).setFileCountForWrite(5));
-      verifyFreonCommand(
-          new ParameterBuilder().setVolumeName("vol3").setBucketName("bucket1")
-              .setPrefixFilePath("/").setTotalThreadCount(15)
-              .setNumOfReadOperations(5).setNumOfWriteOperations(3)
-              .setFileCountForRead(5).setFileCountForWrite(3));
-      verifyFreonCommand(
-          new ParameterBuilder().setVolumeName("vol4").setBucketName("bucket1")
-              .setPrefixFilePath("/dir1/").setTotalThreadCount(10)
-              .setNumOfReadOperations(5).setNumOfWriteOperations(3)
-              .setFileCountForRead(5).setFileCountForWrite(3).
-              setFileSize("64B").setBufferSize(16));
-      verifyFreonCommand(
-          new ParameterBuilder().setVolumeName("vol5").setBucketName("bucket1")
-              .setPrefixFilePath("/dir1/dir2/dir3").setTotalThreadCount(10)
-              .setNumOfReadOperations(5).setNumOfWriteOperations(0)
-              .setFileCountForRead(5));
-      verifyFreonCommand(
-          new ParameterBuilder().setVolumeName("vol6").setBucketName("bucket1")
-              
.setPrefixFilePath("/dir1/dir2/dir3/dir4").setTotalThreadCount(20)
-              .setNumOfReadOperations(0).setNumOfWriteOperations(5)
-              .setFileCountForRead(0).setFileCountForWrite(5));
-    } finally {
-      shutdown();
-    }
-  }
-
-  private void verifyFreonCommand(ParameterBuilder parameterBuilder)
-      throws IOException {
-    store.createVolume(parameterBuilder.volumeName);
-    OzoneVolume volume = store.getVolume(parameterBuilder.volumeName);
-    volume.createBucket(parameterBuilder.bucketName);
-    String rootPath = "o3fs://" + parameterBuilder.bucketName + "." +
-            parameterBuilder.volumeName + parameterBuilder.prefixFilePath;
-    String confPath = new File(path.toString(), "conf").getAbsolutePath();
-    new Freon().execute(
-        new String[]{"-conf", confPath, "obrwf", "-P", rootPath,
-            "-r", String.valueOf(parameterBuilder.fileCountForRead),
-            "-w", String.valueOf(parameterBuilder.fileCountForWrite),
-            "-g", parameterBuilder.fileSize,
-            "--buffer", String.valueOf(parameterBuilder.bufferSize),
-            "-l", String.valueOf(parameterBuilder.length),
-            "-c", String.valueOf(parameterBuilder.totalThreadCount),
-            "-T", String.valueOf(parameterBuilder.readThreadPercentage),
-            "-R", String.valueOf(parameterBuilder.numOfReadOperations),
-            "-W", String.valueOf(parameterBuilder.numOfWriteOperations),
-            "-n", String.valueOf(1)});
 
+    String rootPath = "o3fs://" + parameterBuilder.getBucketName() + "." +
+            parameterBuilder.getVolumeName() + 
parameterBuilder.getPrefixFilePath();
+    String om = cluster().getConf().get(OZONE_OM_ADDRESS_KEY);
+    new Freon().getCmd().execute(
+        "-D", OZONE_OM_ADDRESS_KEY + "=" + om,
+        "obrwf",
+        "-P", rootPath,
+        "-r", String.valueOf(parameterBuilder.getCountForRead()),
+        "-w", String.valueOf(parameterBuilder.getCountForWrite()),
+        "-g", parameterBuilder.getDataSize(),
+        "--buffer", String.valueOf(parameterBuilder.getBufferSize()),
+        "-l", String.valueOf(parameterBuilder.getLength()),
+        "-c", String.valueOf(parameterBuilder.getTotalThreadCount()),
+        "-T", String.valueOf(parameterBuilder.getReadThreadPercentage()),
+        "-R", String.valueOf(parameterBuilder.getNumOfReadOperations()),
+        "-W", String.valueOf(parameterBuilder.getNumOfWriteOperations()),
+        "-n", String.valueOf(1)
+    );
     LOG.info("Started verifying OM bucket read/write ops file generation...");
-    FileSystem fileSystem = FileSystem.get(URI.create(rootPath),
-        conf);
-    Path rootDir = new Path(rootPath.concat(OzoneConsts.OM_KEY_PREFIX));
-    FileStatus[] fileStatuses = fileSystem.listStatus(rootDir);
-    verifyFileCreation(2, fileStatuses, true);
-
-    Path readDir = new Path(rootPath.concat("/readPath"));
-    FileStatus[] readFileStatuses = fileSystem.listStatus(readDir);
-    verifyFileCreation(parameterBuilder.fileCountForRead, readFileStatuses,
-        false);
-
-    int readThreadCount = (parameterBuilder.readThreadPercentage *
-        parameterBuilder.totalThreadCount) / 100;
-    int writeThreadCount = parameterBuilder.totalThreadCount - readThreadCount;
-
-    Path writeDir = new Path(rootPath.concat("/writePath"));
-    FileStatus[] writeFileStatuses = fileSystem.listStatus(writeDir);
-    verifyFileCreation(writeThreadCount * parameterBuilder.fileCountForWrite *
-        parameterBuilder.numOfWriteOperations, writeFileStatuses, false);
-
-    
verifyOMLockMetrics(cluster.getOzoneManager().getMetadataManager().getLock()
-        .getOMLockMetrics());
+    try (FileSystem fileSystem = FileSystem.get(URI.create(rootPath), 
cluster().getConf())) {
+      Path rootDir = new Path(rootPath.concat(OzoneConsts.OM_KEY_PREFIX));
+      FileStatus[] fileStatuses = fileSystem.listStatus(rootDir);
+      verifyFileCreation(2, fileStatuses, true);
+
+      Path readDir = new Path(rootPath.concat("/readPath"));
+      FileStatus[] readFileStatuses = fileSystem.listStatus(readDir);
+      verifyFileCreation(parameterBuilder.getCountForRead(), readFileStatuses,
+          false);
+
+      Path writeDir = new Path(rootPath.concat("/writePath"));
+      FileStatus[] writeFileStatuses = fileSystem.listStatus(writeDir);
+      verifyFileCreation(parameterBuilder.getExpectedWriteCount(), 
writeFileStatuses, false);
+
+      
verifyOMLockMetrics(cluster().getOzoneManager().getMetadataManager().getLock()
+          .getOMLockMetrics());
+    }
   }
 
   private void verifyFileCreation(int expectedCount, FileStatus[] fileStatuses,
@@ -243,14 +202,16 @@ private void verifyOMLockMetrics(OMLockMetrics 
omLockMetrics) {
     assertThat(writeHeldSamples).isPositive();
   }
 
-  private static class ParameterBuilder {
+  static class ParameterBuilder {
 
-    private String volumeName = "vol1";
-    private String bucketName = "bucket1";
+    private static final String BUCKET_NAME = "bucket1";
+
+    private final String volumeName = "vol-" + UUID.randomUUID();
+    private final BucketArgs.Builder bucketArgs = BucketArgs.newBuilder();
     private String prefixFilePath = "/dir1/dir2";
-    private int fileCountForRead = 100;
-    private int fileCountForWrite = 10;
-    private String fileSize = "256B";
+    private int countForRead = 100;
+    private int countForWrite = 10;
+    private String dataSize = "256B";
     private int bufferSize = 64;
     private int length = 10;
     private int totalThreadCount = 100;
@@ -258,67 +219,112 @@ private static class ParameterBuilder {
     private int numOfReadOperations = 50;
     private int numOfWriteOperations = 10;
 
-    private ParameterBuilder setVolumeName(String volumeNameParam) {
-      volumeName = volumeNameParam;
-      return this;
+    int getExpectedWriteCount() {
+      int readThreadCount = (getReadThreadPercentage() * 
getTotalThreadCount()) / 100;
+      int writeThreadCount = getTotalThreadCount() - readThreadCount;
+      return writeThreadCount * getCountForWrite() * getNumOfWriteOperations();
     }
 
-    private ParameterBuilder setBucketName(String bucketNameParam) {
-      bucketName = bucketNameParam;
+    ParameterBuilder setPrefixFilePath(String newValue) {
+      prefixFilePath = newValue;
       return this;
     }
 
-    private ParameterBuilder setPrefixFilePath(String prefixFilePathParam) {
-      prefixFilePath = prefixFilePathParam;
+    ParameterBuilder setCountForRead(int newValue) {
+      countForRead = newValue;
       return this;
     }
 
-    private ParameterBuilder setFileCountForRead(int fileCountForReadParam) {
-      fileCountForRead = fileCountForReadParam;
+    ParameterBuilder setCountForWrite(int newValue) {
+      countForWrite = newValue;
       return this;
     }
 
-    private ParameterBuilder setFileCountForWrite(int fileCountForWriteParam) {
-      fileCountForWrite = fileCountForWriteParam;
+    ParameterBuilder setDataSize(String newValue) {
+      dataSize = newValue;
       return this;
     }
 
-    private ParameterBuilder setFileSize(String fileSizeParam) {
-      fileSize = fileSizeParam;
+    ParameterBuilder setBufferSize(int newValue) {
+      bufferSize = newValue;
       return this;
     }
 
-    private ParameterBuilder setBufferSize(int bufferSizeParam) {
-      bufferSize = bufferSizeParam;
+    ParameterBuilder setLength(int newValue) {
+      length = newValue;
       return this;
     }
 
-    private ParameterBuilder setLength(int lengthParam) {
-      length = lengthParam;
+    ParameterBuilder setTotalThreadCount(int newValue) {
+      totalThreadCount = newValue;
       return this;
     }
 
-    private ParameterBuilder setTotalThreadCount(int totalThreadCountParam) {
-      totalThreadCount = totalThreadCountParam;
+    ParameterBuilder setReadThreadPercentage(int newValue) {
+      readThreadPercentage = newValue;
       return this;
     }
 
-    private ParameterBuilder setReadThreadPercentage(
-        int readThreadPercentageParam) {
-      readThreadPercentage = readThreadPercentageParam;
+    ParameterBuilder setNumOfReadOperations(int newValue) {
+      numOfReadOperations = newValue;
       return this;
     }
 
-    private ParameterBuilder setNumOfReadOperations(
-        int numOfReadOperationsParam) {
-      numOfReadOperations = numOfReadOperationsParam;
+    ParameterBuilder setNumOfWriteOperations(int newValue) {
+      numOfWriteOperations = newValue;
       return this;
     }
 
-    private ParameterBuilder setNumOfWriteOperations(
-        int numOfWriteOperationsParam) {
-      numOfWriteOperations = numOfWriteOperationsParam;
-      return this;
+    public String getVolumeName() {
+      return volumeName;
+    }
+
+    public String getBucketName() {
+      return BUCKET_NAME;
+    }
+
+    public String getPrefixFilePath() {
+      return prefixFilePath;
+    }
+
+    public BucketArgs.Builder getBucketArgs() {
+      return bucketArgs;
+    }
+
+    public int getBufferSize() {
+      return bufferSize;
+    }
+
+    public String getDataSize() {
+      return dataSize;
+    }
+
+    public int getCountForRead() {
+      return countForRead;
+    }
+
+    public int getCountForWrite() {
+      return countForWrite;
+    }
+
+    public int getLength() {
+      return length;
+    }
+
+    public int getTotalThreadCount() {
+      return totalThreadCount;
+    }
+
+    public int getReadThreadPercentage() {
+      return readThreadPercentage;
+    }
+
+    public int getNumOfReadOperations() {
+      return numOfReadOperations;
+    }
+
+    public int getNumOfWriteOperations() {
+      return numOfWriteOperations;
     }
   }
 }
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestOmBucketReadWriteKeyOps.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestOmBucketReadWriteKeyOps.java
index d637bc1545..a3ad7c6a48 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestOmBucketReadWriteKeyOps.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestOmBucketReadWriteKeyOps.java
@@ -17,173 +17,129 @@
 
 package org.apache.hadoop.ozone.freon;
 
+import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_ADDRESS_KEY;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
-import java.nio.file.Path;
+import java.util.Arrays;
 import java.util.Iterator;
-import org.apache.commons.io.FileUtils;
-import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import java.util.List;
 import org.apache.hadoop.hdds.utils.IOUtils;
-import org.apache.hadoop.ozone.MiniOzoneCluster;
-import org.apache.hadoop.ozone.client.ObjectStore;
+import org.apache.hadoop.ozone.TestDataUtil;
 import org.apache.hadoop.ozone.client.OzoneBucket;
 import org.apache.hadoop.ozone.client.OzoneClient;
-import org.apache.hadoop.ozone.client.OzoneClientFactory;
 import org.apache.hadoop.ozone.client.OzoneKey;
-import org.apache.hadoop.ozone.client.OzoneVolume;
-import org.apache.hadoop.ozone.om.OMConfigKeys;
+import 
org.apache.hadoop.ozone.freon.TestOmBucketReadWriteFileOps.ParameterBuilder;
 import org.apache.hadoop.ozone.om.helpers.BucketLayout;
 import org.apache.hadoop.ozone.om.lock.OMLockMetrics;
-import org.apache.ozone.test.GenericTestUtils;
-import org.apache.ratis.server.RaftServer;
-import org.apache.ratis.server.raftlog.RaftLog;
+import org.apache.ozone.test.NonHATests;
+import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.io.TempDir;
 import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.ValueSource;
+import org.junit.jupiter.params.provider.MethodSource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.slf4j.event.Level;
 
 /**
  * Test for OmBucketReadWriteKeyOps.
  */
-public class TestOmBucketReadWriteKeyOps {
+public abstract class TestOmBucketReadWriteKeyOps implements 
NonHATests.TestCase {
 
-  // TODO: Remove code duplication of TestOmBucketReadWriteKeyOps with
-  //  TestOmBucketReadWriteFileOps.
-  @TempDir
-  private Path path;
-  private OzoneConfiguration conf = null;
-  private MiniOzoneCluster cluster = null;
-  private ObjectStore store = null;
   private static final Logger LOG =
       LoggerFactory.getLogger(TestOmBucketReadWriteKeyOps.class);
   private OzoneClient client;
 
   @BeforeEach
-  public void setup() {
-    GenericTestUtils.setLogLevel(RaftLog.LOG, Level.DEBUG);
-    GenericTestUtils.setLogLevel(RaftServer.LOG, Level.DEBUG);
+  void setup() throws Exception {
+    client = cluster().newClient();
   }
 
-  /**
-   * Shutdown MiniDFSCluster.
-   */
-  private void shutdown() {
+  @AfterEach
+  void cleanup() {
     IOUtils.closeQuietly(client);
-    if (cluster != null) {
-      cluster.shutdown();
-    }
   }
 
-  /**
-   * Create a MiniDFSCluster for testing.
-   *
-   * @throws IOException
-   */
-  private void startCluster(boolean fsPathsEnabled) throws Exception {
-    conf = getOzoneConfiguration();
-    conf.setBoolean(OMConfigKeys.OZONE_OM_ENABLE_FILESYSTEM_PATHS, 
fsPathsEnabled);
-    conf.set(OMConfigKeys.OZONE_DEFAULT_BUCKET_LAYOUT,
-        BucketLayout.OBJECT_STORE.name());
-    cluster = MiniOzoneCluster.newBuilder(conf).setNumDatanodes(5).build();
-    cluster.waitForClusterToBeReady();
-    cluster.waitTobeOutOfSafeMode();
-
-    client = OzoneClientFactory.getRpcClient(conf);
-    store = client.getObjectStore();
-  }
-
-  private OzoneConfiguration getOzoneConfiguration() {
-    return new OzoneConfiguration();
+  static List<ParameterBuilder> parameters() {
+    return Arrays.asList(
+        new ParameterBuilder()
+            .setLength(16)
+            .setTotalThreadCount(10)
+            .setNumOfReadOperations(10)
+            .setNumOfWriteOperations(5)
+            .setReadThreadPercentage(80)
+            .setCountForRead(10)
+            .setCountForWrite(5),
+        new ParameterBuilder()
+            .setLength(32)
+            .setTotalThreadCount(10)
+            .setNumOfReadOperations(10)
+            .setNumOfWriteOperations(5)
+            .setReadThreadPercentage(70)
+            .setCountForRead(10)
+            .setCountForWrite(5),
+        new ParameterBuilder()
+            .setTotalThreadCount(15)
+            .setNumOfReadOperations(5)
+            .setNumOfWriteOperations(3)
+            .setCountForRead(5)
+            .setCountForWrite(3),
+        new ParameterBuilder()
+            .setTotalThreadCount(10)
+            .setNumOfReadOperations(5)
+            .setNumOfWriteOperations(3)
+            .setCountForRead(5)
+            .setCountForWrite(3)
+            .setDataSize("64B")
+            .setBufferSize(16),
+        new ParameterBuilder()
+            .setTotalThreadCount(10)
+            .setNumOfReadOperations(5)
+            .setNumOfWriteOperations(0)
+            .setCountForRead(5),
+        new ParameterBuilder()
+            .setTotalThreadCount(20)
+            .setNumOfReadOperations(0)
+            .setNumOfWriteOperations(5)
+            .setCountForRead(0)
+            .setCountForWrite(5)
+    );
   }
 
   @ParameterizedTest(name = "Filesystem Paths Enabled: {0}")
-  @ValueSource(booleans = {false, true})
-  public void testOmBucketReadWriteKeyOps(boolean fsPathsEnabled) throws 
Exception {
-    try {
-      startCluster(fsPathsEnabled);
-      FileOutputStream out = FileUtils.openOutputStream(new 
File(path.toString(),
-          "conf"));
-      cluster.getConf().writeXml(out);
-      out.getFD().sync();
-      out.close();
-
-      verifyFreonCommand(new ParameterBuilder().setTotalThreadCount(10)
-          .setNumOfReadOperations(10).setNumOfWriteOperations(5)
-          .setKeyCountForRead(10).setKeyCountForWrite(5));
-      verifyFreonCommand(
-          new ParameterBuilder().setVolumeName("vol2").setBucketName("bucket1")
-              .setTotalThreadCount(10).setNumOfReadOperations(10)
-              .setNumOfWriteOperations(5).setKeyCountForRead(10)
-              .setKeyCountForWrite(5));
-      verifyFreonCommand(
-          new ParameterBuilder().setVolumeName("vol3").setBucketName("bucket1")
-              .setTotalThreadCount(15).setNumOfReadOperations(5)
-              .setNumOfWriteOperations(3).setKeyCountForRead(5)
-              .setKeyCountForWrite(3));
-      verifyFreonCommand(
-          new ParameterBuilder().setVolumeName("vol4").setBucketName("bucket1")
-              .setTotalThreadCount(10).setNumOfReadOperations(5)
-              .setNumOfWriteOperations(3).setKeyCountForRead(5)
-              .setKeyCountForWrite(3).setKeySize("64B")
-              .setBufferSize(16));
-      verifyFreonCommand(
-          new ParameterBuilder().setVolumeName("vol5").setBucketName("bucket1")
-              .setTotalThreadCount(10).setNumOfReadOperations(5)
-              .setNumOfWriteOperations(0).setKeyCountForRead(5));
-      verifyFreonCommand(
-          new ParameterBuilder().setVolumeName("vol6").setBucketName("bucket1")
-              .setTotalThreadCount(20).setNumOfReadOperations(0)
-              .setNumOfWriteOperations(5).setKeyCountForRead(0)
-              .setKeyCountForWrite(5));
-
-    } finally {
-      shutdown();
-    }
-  }
-
-  private void verifyFreonCommand(ParameterBuilder parameterBuilder)
-      throws IOException {
-    store.createVolume(parameterBuilder.volumeName);
-    OzoneVolume volume = store.getVolume(parameterBuilder.volumeName);
-    volume.createBucket(parameterBuilder.bucketName);
-    OzoneBucket bucket = volume.getBucket(parameterBuilder.bucketName);
-    String confPath = new File(path.toString(), "conf").getAbsolutePath();
+  @MethodSource("parameters")
+  void testOmBucketReadWriteKeyOps(ParameterBuilder parameterBuilder) throws 
Exception {
+    OzoneBucket bucket = TestDataUtil.createVolumeAndBucket(client,
+        parameterBuilder.getVolumeName(),
+        parameterBuilder.getBucketName(),
+        
parameterBuilder.getBucketArgs().setBucketLayout(BucketLayout.OBJECT_STORE).build()
+    );
 
     long startTime = System.currentTimeMillis();
-    new Freon().execute(
-        new String[]{"-conf", confPath, "obrwk",
-            "-v", parameterBuilder.volumeName,
-            "-b", parameterBuilder.bucketName,
-            "-k", String.valueOf(parameterBuilder.keyCountForRead),
-            "-w", String.valueOf(parameterBuilder.keyCountForWrite),
-            "-g", parameterBuilder.keySize,
-            "--buffer", String.valueOf(parameterBuilder.bufferSize),
-            "-l", String.valueOf(parameterBuilder.length),
-            "-c", String.valueOf(parameterBuilder.totalThreadCount),
-            "-T", String.valueOf(parameterBuilder.readThreadPercentage),
-            "-R", String.valueOf(parameterBuilder.numOfReadOperations),
-            "-W", String.valueOf(parameterBuilder.numOfWriteOperations),
-            "-n", String.valueOf(1)});
+    String om = cluster().getConf().get(OZONE_OM_ADDRESS_KEY);
+    new Freon().getCmd().execute(
+        "-D", OZONE_OM_ADDRESS_KEY + "=" + om,
+        "obrwk",
+        "-v", parameterBuilder.getVolumeName(),
+        "-b", parameterBuilder.getBucketName(),
+        "-k", String.valueOf(parameterBuilder.getCountForRead()),
+        "-w", String.valueOf(parameterBuilder.getCountForWrite()),
+        "-g", parameterBuilder.getDataSize(),
+        "--buffer", String.valueOf(parameterBuilder.getBufferSize()),
+        "-l", String.valueOf(parameterBuilder.getLength()),
+        "-c", String.valueOf(parameterBuilder.getTotalThreadCount()),
+        "-T", String.valueOf(parameterBuilder.getReadThreadPercentage()),
+        "-R", String.valueOf(parameterBuilder.getNumOfReadOperations()),
+        "-W", String.valueOf(parameterBuilder.getNumOfWriteOperations()),
+        "-n", String.valueOf(1));
     long totalTime = System.currentTimeMillis() - startTime;
     LOG.info("Total Execution Time: " + totalTime);
 
     LOG.info("Started verifying OM bucket read/write ops key generation...");
-    verifyKeyCreation(parameterBuilder.keyCountForRead, bucket, "/readPath/");
+    verifyKeyCreation(parameterBuilder.getCountForRead(), bucket, 
"/readPath/");
+    verifyKeyCreation(parameterBuilder.getExpectedWriteCount(), bucket, 
"/writePath/");
 
-    int readThreadCount = (parameterBuilder.readThreadPercentage *
-        parameterBuilder.totalThreadCount) / 100;
-    int writeThreadCount = parameterBuilder.totalThreadCount - readThreadCount;
-    verifyKeyCreation(writeThreadCount * parameterBuilder.keyCountForWrite *
-        parameterBuilder.numOfWriteOperations, bucket, "/writePath/");
-
-    
verifyOMLockMetrics(cluster.getOzoneManager().getMetadataManager().getLock()
+    
verifyOMLockMetrics(cluster().getOzoneManager().getMetadataManager().getLock()
         .getOMLockMetrics());
   }
 
@@ -234,76 +190,4 @@ private void verifyOMLockMetrics(OMLockMetrics 
omLockMetrics) {
     assertThat(writeHeldSamples).isGreaterThan(0);
   }
 
-  private static class ParameterBuilder {
-
-    private String volumeName = "vol1";
-    private String bucketName = "bucket1";
-    private int keyCountForRead = 100;
-    private int keyCountForWrite = 10;
-    private String keySize = "256B";
-    private int bufferSize = 64;
-    private int length = 10;
-    private int totalThreadCount = 100;
-    private int readThreadPercentage = 90;
-    private int numOfReadOperations = 50;
-    private int numOfWriteOperations = 10;
-
-    private ParameterBuilder setVolumeName(String volumeNameParam) {
-      volumeName = volumeNameParam;
-      return this;
-    }
-
-    private ParameterBuilder setBucketName(String bucketNameParam) {
-      bucketName = bucketNameParam;
-      return this;
-    }
-
-    private ParameterBuilder setKeyCountForRead(int keyCountForReadParam) {
-      keyCountForRead = keyCountForReadParam;
-      return this;
-    }
-
-    private ParameterBuilder setKeyCountForWrite(int keyCountForWriteParam) {
-      keyCountForWrite = keyCountForWriteParam;
-      return this;
-    }
-
-    private ParameterBuilder setKeySize(String keySizeParam) {
-      keySize = keySizeParam;
-      return this;
-    }
-
-    private ParameterBuilder setBufferSize(int bufferSizeParam) {
-      bufferSize = bufferSizeParam;
-      return this;
-    }
-
-    private ParameterBuilder setLength(int lengthParam) {
-      length = lengthParam;
-      return this;
-    }
-
-    private ParameterBuilder setTotalThreadCount(int totalThreadCountParam) {
-      totalThreadCount = totalThreadCountParam;
-      return this;
-    }
-
-    private ParameterBuilder setReadThreadPercentage(
-        int readThreadPercentageParam) {
-      readThreadPercentage = readThreadPercentageParam;
-      return this;
-    }
-
-    private ParameterBuilder setNumOfReadOperations(
-        int numOfReadOperationsParam) {
-      numOfReadOperations = numOfReadOperationsParam;
-      return this;
-    }
-
-    private ParameterBuilder setNumOfWriteOperations(
-        int numOfWriteOperationsParam) {
-      numOfWriteOperations = numOfWriteOperationsParam;
-      return this;
-    }
-  }
 }
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestRandomKeyGenerator.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestRandomKeyGenerator.java
index ed2be82dce..c7f5cd2355 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestRandomKeyGenerator.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestRandomKeyGenerator.java
@@ -21,13 +21,7 @@
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
-import java.time.Duration;
-import org.apache.hadoop.hdds.conf.DatanodeRatisServerConfig;
-import org.apache.hadoop.hdds.conf.OzoneConfiguration;
-import org.apache.hadoop.hdds.ratis.conf.RatisClientConfig;
-import org.apache.hadoop.ozone.MiniOzoneCluster;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
+import org.apache.ozone.test.NonHATests;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.Timeout;
 import picocli.CommandLine;
@@ -35,36 +29,7 @@
 /**
  * Tests Freon, with MiniOzoneCluster.
  */
-public class TestRandomKeyGenerator {
-
-  private static MiniOzoneCluster cluster;
-  private static OzoneConfiguration conf;
-
-  @BeforeAll
-  static void init() throws Exception {
-    conf = new OzoneConfiguration();
-    DatanodeRatisServerConfig ratisServerConfig =
-        conf.getObject(DatanodeRatisServerConfig.class);
-    ratisServerConfig.setRequestTimeOut(Duration.ofSeconds(3));
-    ratisServerConfig.setWatchTimeOut(Duration.ofSeconds(3));
-    conf.setFromObject(ratisServerConfig);
-
-    RatisClientConfig.RaftConfig raftClientConfig =
-        conf.getObject(RatisClientConfig.RaftConfig.class);
-    raftClientConfig.setRpcRequestTimeout(Duration.ofSeconds(3));
-    raftClientConfig.setRpcWatchRequestTimeout(Duration.ofSeconds(3));
-    conf.setFromObject(raftClientConfig);
-
-    cluster = MiniOzoneCluster.newBuilder(conf).setNumDatanodes(5).build();
-    cluster.waitForClusterToBeReady();
-  }
-
-  @AfterAll
-  static void shutdown() {
-    if (cluster != null) {
-      cluster.shutdown();
-    }
-  }
+public abstract class TestRandomKeyGenerator implements NonHATests.TestCase {
 
   @Test
   @Timeout(5)
@@ -84,60 +49,50 @@ void singleFailedAttempt() {
   }
 
   @Test
-  void testDefault() {
+  void testDefaultReplication() {
     RandomKeyGenerator randomKeyGenerator =
-        new RandomKeyGenerator(cluster.getConf());
+        new RandomKeyGenerator(cluster().getConf());
     CommandLine cmd = new CommandLine(randomKeyGenerator);
     cmd.execute("--num-of-volumes", "2",
-        "--num-of-buckets", "5",
-        "--num-of-keys", "10");
+        "--num-of-buckets", "3",
+        "--num-of-keys", "4",
+        "--validate-writes"
+    );
 
     assertEquals(2, randomKeyGenerator.getNumberOfVolumesCreated());
-    assertEquals(10, randomKeyGenerator.getNumberOfBucketsCreated());
-    assertEquals(100, randomKeyGenerator.getNumberOfKeysAdded());
+    assertEquals(6, randomKeyGenerator.getNumberOfBucketsCreated());
+    assertEquals(24, randomKeyGenerator.getNumberOfKeysAdded());
+    assertEquals(24, randomKeyGenerator.getTotalKeysValidated());
+    assertEquals(24, randomKeyGenerator.getSuccessfulValidationCount());
+    assertEquals(0, randomKeyGenerator.getUnsuccessfulValidationCount());
     randomKeyGenerator.printStats(System.out);
   }
 
   @Test
   void testECKey() {
     RandomKeyGenerator randomKeyGenerator =
-        new RandomKeyGenerator(cluster.getConf());
+        new RandomKeyGenerator(cluster().getConf());
     CommandLine cmd = new CommandLine(randomKeyGenerator);
-    cmd.execute("--num-of-volumes", "2",
-        "--num-of-buckets", "5",
-        "--num-of-keys", "10",
+    cmd.execute("--num-of-volumes", "1",
+        "--num-of-buckets", "1",
+        "--num-of-keys", "1",
         "--replication", "rs-3-2-1024k",
-        "--type", "EC"
+        "--type", "EC",
+        "--validate-writes"
     );
 
-    assertEquals(2, randomKeyGenerator.getNumberOfVolumesCreated());
-    assertEquals(10, randomKeyGenerator.getNumberOfBucketsCreated());
-    assertEquals(100, randomKeyGenerator.getNumberOfKeysAdded());
+    assertEquals(1, randomKeyGenerator.getNumberOfVolumesCreated());
+    assertEquals(1, randomKeyGenerator.getNumberOfBucketsCreated());
+    assertEquals(1, randomKeyGenerator.getNumberOfKeysAdded());
+    assertEquals(1, randomKeyGenerator.getTotalKeysValidated());
+    assertEquals(1, randomKeyGenerator.getSuccessfulValidationCount());
+    assertEquals(0, randomKeyGenerator.getUnsuccessfulValidationCount());
   }
 
   @Test
   void testMultiThread() {
     RandomKeyGenerator randomKeyGenerator =
-        new RandomKeyGenerator(cluster.getConf());
-    CommandLine cmd = new CommandLine(randomKeyGenerator);
-    cmd.execute("--num-of-volumes", "10",
-        "--num-of-buckets", "1",
-        "--num-of-keys", "10",
-        "--num-of-threads", "10",
-        "--key-size", "10KB",
-        "--factor", "THREE",
-        "--type", "RATIS"
-    );
-
-    assertEquals(10, randomKeyGenerator.getNumberOfVolumesCreated());
-    assertEquals(10, randomKeyGenerator.getNumberOfBucketsCreated());
-    assertEquals(100, randomKeyGenerator.getNumberOfKeysAdded());
-  }
-
-  @Test
-  void testRatisKey() {
-    RandomKeyGenerator randomKeyGenerator =
-        new RandomKeyGenerator(cluster.getConf());
+        new RandomKeyGenerator(cluster().getConf());
     CommandLine cmd = new CommandLine(randomKeyGenerator);
     cmd.execute("--num-of-volumes", "10",
         "--num-of-buckets", "1",
@@ -156,7 +111,7 @@ void testRatisKey() {
   @Test
   void testKeyLargerThan2GB() {
     RandomKeyGenerator randomKeyGenerator =
-        new RandomKeyGenerator(cluster.getConf());
+        new RandomKeyGenerator(cluster().getConf());
     CommandLine cmd = new CommandLine(randomKeyGenerator);
     cmd.execute("--num-of-volumes", "1",
         "--num-of-buckets", "1",
@@ -164,20 +119,18 @@ void testKeyLargerThan2GB() {
         "--num-of-threads", "1",
         "--key-size", "2.01GB",
         "--factor", "THREE",
-        "--type", "RATIS",
-        "--validate-writes"
+        "--type", "RATIS"
     );
 
     assertEquals(1, randomKeyGenerator.getNumberOfVolumesCreated());
     assertEquals(1, randomKeyGenerator.getNumberOfBucketsCreated());
     assertEquals(1, randomKeyGenerator.getNumberOfKeysAdded());
-    assertEquals(1, randomKeyGenerator.getSuccessfulValidationCount());
   }
 
   @Test
   void testZeroSizeKey() {
     RandomKeyGenerator randomKeyGenerator =
-        new RandomKeyGenerator(cluster.getConf());
+        new RandomKeyGenerator(cluster().getConf());
     CommandLine cmd = new CommandLine(randomKeyGenerator);
     cmd.execute("--num-of-volumes", "1",
         "--num-of-buckets", "1",
@@ -192,13 +145,15 @@ void testZeroSizeKey() {
     assertEquals(1, randomKeyGenerator.getNumberOfVolumesCreated());
     assertEquals(1, randomKeyGenerator.getNumberOfBucketsCreated());
     assertEquals(1, randomKeyGenerator.getNumberOfKeysAdded());
+    assertEquals(1, randomKeyGenerator.getTotalKeysValidated());
     assertEquals(1, randomKeyGenerator.getSuccessfulValidationCount());
+    assertEquals(0, randomKeyGenerator.getUnsuccessfulValidationCount());
   }
 
   @Test
   void testThreadPoolSize() {
     RandomKeyGenerator randomKeyGenerator =
-        new RandomKeyGenerator(cluster.getConf());
+        new RandomKeyGenerator(cluster().getConf());
     CommandLine cmd = new CommandLine(randomKeyGenerator);
     cmd.execute("--num-of-volumes", "1",
         "--num-of-buckets", "1",
@@ -215,11 +170,11 @@ void testThreadPoolSize() {
   @Test
   void cleanObjectsTest() {
     RandomKeyGenerator randomKeyGenerator =
-        new RandomKeyGenerator(cluster.getConf());
+        new RandomKeyGenerator(cluster().getConf());
     CommandLine cmd = new CommandLine(randomKeyGenerator);
     cmd.execute("--num-of-volumes", "2",
-        "--num-of-buckets", "5",
-        "--num-of-keys", "10",
+        "--num-of-buckets", "3",
+        "--num-of-keys", "2",
         "--num-of-threads", "10",
         "--factor", "THREE",
         "--type", "RATIS",
@@ -227,9 +182,9 @@ void cleanObjectsTest() {
     );
 
     assertEquals(2, randomKeyGenerator.getNumberOfVolumesCreated());
-    assertEquals(10, randomKeyGenerator.getNumberOfBucketsCreated());
-    assertEquals(100, randomKeyGenerator.getNumberOfKeysAdded());
+    assertEquals(6, randomKeyGenerator.getNumberOfBucketsCreated());
+    assertEquals(12, randomKeyGenerator.getNumberOfKeysAdded());
     assertEquals(2, randomKeyGenerator.getNumberOfVolumesCleaned());
-    assertEquals(10, randomKeyGenerator.getNumberOfBucketsCleaned());
+    assertEquals(6, randomKeyGenerator.getNumberOfBucketsCleaned());
   }
 }
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/AclTests.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/AclTests.java
index 643b249035..9136e159c6 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/AclTests.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/AclTests.java
@@ -40,9 +40,9 @@ public abstract class AclTests extends 
ClusterForTests<MiniOzoneCluster> {
   public static final UserGroupInformation ADMIN_UGI =
       UserGroupInformation.createUserForTesting(ADMIN_USER, new String[] 
{ADMIN_GROUP});
 
-  /** Hook method for subclasses. */
-  MiniOzoneCluster.Builder newClusterBuilder() {
-    return MiniOzoneCluster.newBuilder(createOzoneConfig())
+  @Override
+  protected MiniOzoneCluster.Builder newClusterBuilder() {
+    return super.newClusterBuilder()
         .setNumDatanodes(3);
   }
 
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/ClusterForTests.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/ClusterForTests.java
index dba858ad36..b9264b1c8c 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/ClusterForTests.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/ClusterForTests.java
@@ -89,6 +89,12 @@ protected C getCluster() {
     return cluster;
   }
 
+  /** Hook method for subclasses. */
+  protected MiniOzoneCluster.Builder newClusterBuilder() {
+    return MiniOzoneCluster.newBuilder(createOzoneConfig())
+        .setNumDatanodes(5);
+  }
+
   @BeforeAll
   void startCluster() throws Exception {
     cluster = createCluster();
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/FreonTests.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/FreonTests.java
new file mode 100644
index 0000000000..d0ca2a57a0
--- /dev/null
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/FreonTests.java
@@ -0,0 +1,111 @@
+/*
+ * 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.ozone.test;
+
+import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.hdds.conf.StorageUnit;
+import org.apache.hadoop.ozone.ClientConfigForTesting;
+import org.apache.hadoop.ozone.MiniOzoneCluster;
+import org.apache.hadoop.ozone.freon.TestDNRPCLoadGenerator;
+import org.apache.hadoop.ozone.freon.TestHadoopDirTreeGenerator;
+import org.apache.hadoop.ozone.freon.TestHadoopNestedDirGenerator;
+import org.apache.hadoop.ozone.freon.TestHsyncGenerator;
+import org.apache.hadoop.ozone.freon.TestOmBucketReadWriteFileOps;
+import org.apache.hadoop.ozone.freon.TestOmBucketReadWriteKeyOps;
+import org.apache.hadoop.ozone.freon.TestRandomKeyGenerator;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.TestInstance;
+
+/**
+ * Group tests that write more data than usual (e.g. Freon tests).  These are
+ * separated from {@link NonHATests}, because they tend to take a bit longer.
+ * This keeps {@link NonHATests} leaner.
+ * <p/>
+ * Specific tests are implemented in separate classes, and they are subclasses
+ * here as {@link Nested} inner classes.  This allows running all tests in the
+ * same cluster.
+ */
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+public abstract class FreonTests extends ClusterForTests<MiniOzoneCluster> {
+
+  @Override
+  protected OzoneConfiguration createOzoneConfig() {
+    OzoneConfiguration conf = super.createOzoneConfig();
+    ClientConfigForTesting.newBuilder(StorageUnit.MB)
+        .setChunkSize(4)
+        .setBlockSize(256)
+        .applyTo(conf);
+    return conf;
+  }
+
+  @Nested
+  class DNRPCLoadGenerator extends TestDNRPCLoadGenerator {
+    @Override
+    public MiniOzoneCluster cluster() {
+      return getCluster();
+    }
+  }
+
+  @Nested
+  class HadoopDirTreeGenerator extends TestHadoopDirTreeGenerator {
+    @Override
+    public MiniOzoneCluster cluster() {
+      return getCluster();
+    }
+  }
+
+  @Nested
+  class HadoopNestedDirGenerator extends TestHadoopNestedDirGenerator {
+    @Override
+    public MiniOzoneCluster cluster() {
+      return getCluster();
+    }
+  }
+
+  @Nested
+  class HsyncGenerator extends TestHsyncGenerator {
+    @Override
+    public MiniOzoneCluster cluster() {
+      return getCluster();
+    }
+  }
+
+  @Nested
+  class OmBucketReadWriteFileOps extends TestOmBucketReadWriteFileOps {
+    @Override
+    public MiniOzoneCluster cluster() {
+      return getCluster();
+    }
+  }
+
+  @Nested
+  class OmBucketReadWriteKeyOps extends TestOmBucketReadWriteKeyOps {
+    @Override
+    public MiniOzoneCluster cluster() {
+      return getCluster();
+    }
+  }
+
+  @Nested
+  class RandomKeyGenerator extends TestRandomKeyGenerator {
+    @Override
+    public MiniOzoneCluster cluster() {
+      return getCluster();
+    }
+  }
+}
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/HATests.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/HATests.java
index cf994637ab..60562aab83 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/HATests.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/HATests.java
@@ -39,8 +39,8 @@
 @TestInstance(TestInstance.Lifecycle.PER_CLASS)
 public abstract class HATests extends ClusterForTests<MiniOzoneHAClusterImpl> {
 
-  /** Hook method for subclasses. */
-  MiniOzoneHAClusterImpl.Builder newClusterBuilder() {
+  @Override
+  protected MiniOzoneHAClusterImpl.Builder newClusterBuilder() {
     return MiniOzoneCluster.newHABuilder(createOzoneConfig())
         .setOMServiceId("om-" + UUID.randomUUID())
         .setNumOfOzoneManagers(3)
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/NonHATests.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/NonHATests.java
index d3340071df..b42c569257 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/NonHATests.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/NonHATests.java
@@ -32,12 +32,6 @@
 @TestInstance(TestInstance.Lifecycle.PER_CLASS)
 public abstract class NonHATests extends ClusterForTests<MiniOzoneCluster> {
 
-  /** Hook method for subclasses. */
-  MiniOzoneCluster.Builder newClusterBuilder() {
-    return MiniOzoneCluster.newBuilder(createOzoneConfig())
-        .setNumDatanodes(5);
-  }
-
   /** Test cases for non-HA cluster should implement this. */
   public interface TestCase {
     MiniOzoneCluster cluster();
@@ -155,14 +149,6 @@ public MiniOzoneCluster cluster() {
     }
   }
 
-  @Nested
-  class DNRPCLoadGenerator extends 
org.apache.hadoop.ozone.freon.TestDNRPCLoadGenerator {
-    @Override
-    public MiniOzoneCluster cluster() {
-      return getCluster();
-    }
-  }
-
   @Nested
   class LeaseRecoverer extends 
org.apache.hadoop.ozone.admin.om.lease.TestLeaseRecoverer {
     @Override
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestHadoopDirTreeGeneratorWithFSO.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/TestFreon.java
similarity index 62%
rename from 
hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestHadoopDirTreeGeneratorWithFSO.java
rename to 
hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/TestFreon.java
index b13c248654..d41710b093 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestHadoopDirTreeGeneratorWithFSO.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/TestFreon.java
@@ -15,22 +15,18 @@
  * limitations under the License.
  */
 
-package org.apache.hadoop.ozone.freon;
+package org.apache.ozone.test;
 
-import org.apache.hadoop.hdds.conf.OzoneConfiguration;
-import org.apache.hadoop.ozone.om.request.OMRequestTestUtils;
-
-/**
- * Test for HadoopDirTreeGenerator - prefix layout.
- */
-public class TestHadoopDirTreeGeneratorWithFSO
-    extends TestHadoopDirTreeGenerator {
+import org.apache.hadoop.ozone.MiniOzoneCluster;
+import org.junit.jupiter.api.TestInstance;
 
+/** Test Freon with mini cluster. */
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+public class TestFreon extends FreonTests {
   @Override
-  protected OzoneConfiguration getOzoneConfiguration() {
-    OzoneConfiguration conf = new OzoneConfiguration();
-    OMRequestTestUtils.configureFSOptimizedPaths(conf, true);
-    return conf;
+  protected MiniOzoneCluster createCluster() throws Exception {
+    return newClusterBuilder()
+        .build();
   }
 
 }
diff --git 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/freon/BaseFreonGenerator.java
 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/freon/BaseFreonGenerator.java
index 4fd2252f85..a96e3ab95a 100644
--- 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/freon/BaseFreonGenerator.java
+++ 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/freon/BaseFreonGenerator.java
@@ -80,7 +80,7 @@ public class BaseFreonGenerator implements FreonSubcommand {
   private static final Logger LOG =
       LoggerFactory.getLogger(BaseFreonGenerator.class);
 
-  private static final int CHECK_INTERVAL_MILLIS = 1000;
+  private static final int CHECK_INTERVAL_MILLIS = 100;
 
   private static final String DIGEST_ALGORITHM = "MD5";
 
diff --git 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/freon/RandomKeyGenerator.java
 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/freon/RandomKeyGenerator.java
index ae35d12e01..cbd86de81e 100644
--- 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/freon/RandomKeyGenerator.java
+++ 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/freon/RandomKeyGenerator.java
@@ -102,7 +102,7 @@ enum FreonOps {
 
   private static final int QUANTILES = 10;
 
-  private static final int CHECK_INTERVAL_MILLIS = 5000;
+  private static final int CHECK_INTERVAL_MILLIS = 100;
 
   private byte[] keyValueBuffer = null;
 


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

Reply via email to