This is an automated email from the ASF dual-hosted git repository.
haonan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 77b41310f55 Allows for unit tests to be run in parallel (#12980)
77b41310f55 is described below
commit 77b41310f55ec602f8cba96cca9529f5f0792f24
Author: Brian Demers <[email protected]>
AuthorDate: Tue Jul 23 02:30:28 2024 -0400
Allows for unit tests to be run in parallel (#12980)
NOTE: This does NOT set Surefire's `forkCount` property, that will be done
on an isolated commit
This is to ensure these changes don't negatively affect the existing build.
Details on changes:
- Change to test working directory
The working directory was changed from `${project.build.directory}` to
`${project.build.directory}/fork_${surefire.forkNumber}` (single fork builds
would be `<module_name>/target/fork_1`),
This isolates any test output written to relative paths. Long term tests
may want to be more explicit where they write output to, (e.g. using JUnit 5's
`@TempDir` annotation)
- IOTDB_CONF property
Becuse the working directory change, the IOTDB_CONF directory needs to
resolve differently, however, even without parallel tests, this property
_should_ use an absolute path
- Test run `mkdirs`
The tests assumed that the `./target` directory was always present
(relative to the working directory), a change to the working directory
invalidated this assumption, so any directories a test uses should be created.
This is probably a good idea even without the parallel test concern. (but
in the future this could be replaced with something like JUnit 5's `@TempDir`
annotation)
- Hardcoded Ports
TestUtils, was using a hardcodes sequentially from `6001`, it now uses
free JUnit 5's `@TempDir` annotation ports
Fixes: #12979
---
.../test/java/org/apache/iotdb/tool/WriteDataFileTest.java | 14 ++++++++++++++
.../java/org/apache/iotdb/consensus/ratis/TestUtils.java | 11 ++++++++++-
iotdb-core/datanode/pom.xml | 2 +-
.../org/apache/iotdb/db/utils/constant/TestConstant.java | 8 +++++++-
.../db/storageengine/dataregion/wal/io/WALFileTest.java | 2 ++
pom.xml | 2 ++
6 files changed, 36 insertions(+), 3 deletions(-)
diff --git
a/iotdb-client/cli/src/test/java/org/apache/iotdb/tool/WriteDataFileTest.java
b/iotdb-client/cli/src/test/java/org/apache/iotdb/tool/WriteDataFileTest.java
index c198b530c4e..eb9e01d2937 100644
---
a/iotdb-client/cli/src/test/java/org/apache/iotdb/tool/WriteDataFileTest.java
+++
b/iotdb-client/cli/src/test/java/org/apache/iotdb/tool/WriteDataFileTest.java
@@ -19,8 +19,10 @@
package org.apache.iotdb.tool;
+import org.junit.Before;
import org.junit.Test;
+import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -28,6 +30,18 @@ import java.util.List;
import static org.junit.Assert.assertTrue;
public class WriteDataFileTest {
+
+ /**
+ * Create the 'target' directory before the tests run. When running tests
with multiple threads,
+ * the working directory might be 'target/fork_#' which would changes the
assumption that the
+ * 'target' directory exists already. When running tests via an IDE, the
working directory might
+ * be the project directory, and the target directory likely already exists.
+ */
+ @Before
+ public void createTestDirectory() {
+ new File("target").mkdirs();
+ }
+
@Test
public void writeCsvFileTest() {
List<String> headerNames =
diff --git
a/iotdb-core/consensus/src/test/java/org/apache/iotdb/consensus/ratis/TestUtils.java
b/iotdb-core/consensus/src/test/java/org/apache/iotdb/consensus/ratis/TestUtils.java
index 4aaa5f77d9e..f5997c261fd 100644
---
a/iotdb-core/consensus/src/test/java/org/apache/iotdb/consensus/ratis/TestUtils.java
+++
b/iotdb-core/consensus/src/test/java/org/apache/iotdb/consensus/ratis/TestUtils.java
@@ -51,6 +51,7 @@ import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
+import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collections;
@@ -251,7 +252,7 @@ public class TestUtils {
this.servers = new ArrayList<>();
for (int i = 0; i < replicas; i++) {
- peers.add(new Peer(gid, i, new TEndPoint("127.0.0.1", 6001 + i)));
+ peers.add(new Peer(gid, i, new TEndPoint("127.0.0.1",
randomFreePort())));
final File storage = storageProvider.apply(i);
FileUtils.deleteFileQuietly(storage);
@@ -493,4 +494,12 @@ public class TestUtils {
return new MiniCluster(gid, replicas, peerStorageProvider, smProvider,
ratisConfig);
}
}
+
+ private static int randomFreePort() {
+ try (ServerSocket socket = new ServerSocket(0)) {
+ return socket.getLocalPort();
+ } catch (IOException e) {
+ throw new IllegalStateException("Failed to find free server socket
port.", e);
+ }
+ }
}
diff --git a/iotdb-core/datanode/pom.xml b/iotdb-core/datanode/pom.xml
index 478e0e783b0..bbc40a08520 100644
--- a/iotdb-core/datanode/pom.xml
+++ b/iotdb-core/datanode/pom.xml
@@ -370,7 +370,7 @@
<configuration>
<skipTests>${iotdb.ut.skip}</skipTests>
<systemProperties>
- <IOTDB_CONF>src/test/resources</IOTDB_CONF>
+
<IOTDB_CONF>${project.basedir}/src/test/resources</IOTDB_CONF>
</systemProperties>
<reuseForks>false</reuseForks>
<runOrder>random</runOrder>
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/constant/TestConstant.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/constant/TestConstant.java
index 1647a19b0cb..a0724c9ae1c 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/constant/TestConstant.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/constant/TestConstant.java
@@ -25,7 +25,7 @@ import java.io.File;
public class TestConstant {
- public static final String BASE_OUTPUT_PATH =
"target".concat(File.separator);
+ public static final String BASE_OUTPUT_PATH = baseOutputDirectory();
public static final String OUTPUT_DATA_DIR =
BASE_OUTPUT_PATH.concat("data").concat(File.separator);
public static final String PARTIAL_PATH_STRING =
@@ -109,4 +109,10 @@ public class TestConstant {
virtualStorageGroupId,
timePartitionId);
}
+
+ private static String baseOutputDirectory() {
+ File dir = new File("target");
+ dir.mkdirs();
+ return dir.getPath().concat(File.separator);
+ }
}
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/wal/io/WALFileTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/wal/io/WALFileTest.java
index d1c0a86ce39..5df2d59899b 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/wal/io/WALFileTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/wal/io/WALFileTest.java
@@ -67,6 +67,8 @@ public class WALFileTest {
public void setUp() throws Exception {
if (walFile.exists()) {
Files.delete(walFile.toPath());
+ } else {
+ walFile.getParentFile().mkdirs();
}
}
diff --git a/pom.xml b/pom.xml
index f8c08049ec4..d8dae21d723 100644
--- a/pom.xml
+++ b/pom.xml
@@ -743,6 +743,8 @@
<version>3.1.2</version>
<configuration>
<argLine>${argLine} -Xmx1024m</argLine>
+ <!-- Force the working directory to be different for
each fork, so forks don't trample each other -->
+
<workingDirectory>${project.build.directory}/fork_${surefire.forkNumber}</workingDirectory>
</configuration>
</plugin>
<!--