From 8b0c1937a6f94bda3df062c62420203e882fd8c7 Mon Sep 17 00:00:00 2001 From: Roberto Franchini Date: Sun, 5 Oct 2025 19:22:08 +0200 Subject: [PATCH 1/3] feat: enhance CI by adding slow unit tests and coverage reporting --- .github/workflows/mvn-test.yml | 45 ++++++++++++++++++- .../com/arcadedb/ACIDTransactionTest.java | 4 ++ .../src/test/java/com/arcadedb/CRUDTest.java | 3 ++ .../arcadedb/RandomTestMultiThreadsTest.java | 2 + .../com/arcadedb/engine/RandomDeleteTest.java | 2 + .../arcadedb/engine/RecordRecyclingTest.java | 7 +-- .../com/arcadedb/index/LSMTreeIndexTest.java | 2 + .../arcadedb/index/TypeLSMTreeIndexTest.java | 2 + 8 files changed, 63 insertions(+), 4 deletions(-) diff --git a/.github/workflows/mvn-test.yml b/.github/workflows/mvn-test.yml index 5a01974a87..3c9ecd066e 100644 --- a/.github/workflows/mvn-test.yml +++ b/.github/workflows/mvn-test.yml @@ -87,7 +87,50 @@ jobs: - name: Run Unit Tests with Coverage # verify because it runs the tests and generates the coverage report, ITs are skipped - run: ./mvnw verify -Pcoverage --batch-mode --errors --fail-never --show-version -pl !e2e,!e2e-perf + run: ./mvnw verify -Pcoverage --batch-mode --errors --fail-never --show-version -pl !e2e,!e2e-perf -DexcludedGroups=slow + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Unit Tests Reporter + uses: dorny/test-reporter@dc3a92680fcc15842eef52e8c4606ea7ce6bd3f3 # v2.1.1 + if: success() || failure() + with: + name: Unit Tests Report + path: "**/surefire-reports/TEST*.xml" + list-suites: "failed" + list-tests: "failed" + reporter: java-junit + + - name: Upload unit test coverage reports + if: success() || failure() + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: unit-coverage-reports + path: | + **/jacoco*.xml + retention-days: 1 + + slow-unit-tests: + runs-on: ubuntu-latest + needs: build-and-package + steps: + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + + - name: Set up JDK 21 + uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5.0.0 + with: + distribution: "temurin" + java-version: 21 + cache: "maven" + + - name: Restore Maven artifacts + uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 + with: + path: ~/.m2/repository + key: maven-repo-${{ github.run_id }}-${{ github.run_attempt }} + + - name: Run Slow Unit Tests with Coverage + run: ./mvnw verify -Pcoverage --batch-mode --errors --fail-never --show-version -pl engine -Dgroups=slow env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/engine/src/test/java/com/arcadedb/ACIDTransactionTest.java b/engine/src/test/java/com/arcadedb/ACIDTransactionTest.java index dd1bfa01ae..e2a1bec5e9 100644 --- a/engine/src/test/java/com/arcadedb/ACIDTransactionTest.java +++ b/engine/src/test/java/com/arcadedb/ACIDTransactionTest.java @@ -36,6 +36,8 @@ import com.arcadedb.schema.Schema; import com.arcadedb.schema.Type; import com.arcadedb.schema.VertexType; +import jdk.jfr.Category; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import java.io.*; @@ -256,6 +258,7 @@ public Void call() throws IOException { } @Test + @Tag("slow") public void testAsyncIOExceptionAfterWALIsWrittenManyRecords() { final Database db = database; @@ -397,6 +400,7 @@ public void multiThreadConcurrentTransactions() { } @Test + @Tag("slow") public void testAsyncEdges() { final Database db = database; diff --git a/engine/src/test/java/com/arcadedb/CRUDTest.java b/engine/src/test/java/com/arcadedb/CRUDTest.java index b388dadcb4..f50f69157a 100644 --- a/engine/src/test/java/com/arcadedb/CRUDTest.java +++ b/engine/src/test/java/com/arcadedb/CRUDTest.java @@ -28,6 +28,7 @@ import com.arcadedb.schema.Schema; import com.arcadedb.schema.Type; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import java.util.concurrent.atomic.*; @@ -77,6 +78,7 @@ public void testUpdate() { } @Test + @Tag("slow") public void testMultiUpdatesOverlap() { final Database db = database; @@ -177,6 +179,7 @@ public void testUpdateAndDelete() { } @Test + @Tag("slow") public void testMultiUpdatesAndDeleteOverlap() { final Database db = database; try { diff --git a/engine/src/test/java/com/arcadedb/RandomTestMultiThreadsTest.java b/engine/src/test/java/com/arcadedb/RandomTestMultiThreadsTest.java index 96e78fa29f..0e8ce818b0 100644 --- a/engine/src/test/java/com/arcadedb/RandomTestMultiThreadsTest.java +++ b/engine/src/test/java/com/arcadedb/RandomTestMultiThreadsTest.java @@ -32,6 +32,7 @@ import com.arcadedb.schema.Schema; import com.arcadedb.schema.VertexType; import com.arcadedb.utility.Pair; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import java.math.*; @@ -58,6 +59,7 @@ public class RandomTestMultiThreadsTest extends TestHelper { private final boolean debug = false; @Test + @Tag("slow") public void testRandom() { GlobalConfiguration.COMMIT_LOCK_TIMEOUT.setValue(10_000); diff --git a/engine/src/test/java/com/arcadedb/engine/RandomDeleteTest.java b/engine/src/test/java/com/arcadedb/engine/RandomDeleteTest.java index 74ef720a72..faf0c75ccf 100644 --- a/engine/src/test/java/com/arcadedb/engine/RandomDeleteTest.java +++ b/engine/src/test/java/com/arcadedb/engine/RandomDeleteTest.java @@ -24,6 +24,7 @@ import com.arcadedb.database.Record; import com.arcadedb.graph.MutableVertex; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import java.util.*; @@ -34,6 +35,7 @@ public class RandomDeleteTest { private static final int CYCLES = 3; @Test + @Tag("slow") public void testSmallRecords() { try (DatabaseFactory databaseFactory = new DatabaseFactory("databases/randomDeleteTest")) { if (databaseFactory.exists()) diff --git a/engine/src/test/java/com/arcadedb/engine/RecordRecyclingTest.java b/engine/src/test/java/com/arcadedb/engine/RecordRecyclingTest.java index c24fc7dfb0..6aa4e3fef5 100644 --- a/engine/src/test/java/com/arcadedb/engine/RecordRecyclingTest.java +++ b/engine/src/test/java/com/arcadedb/engine/RecordRecyclingTest.java @@ -22,15 +22,15 @@ import com.arcadedb.database.Database; import com.arcadedb.database.DatabaseFactory; import com.arcadedb.database.RID; -import com.arcadedb.graph.MutableEdge; import com.arcadedb.graph.MutableVertex; import com.arcadedb.graph.Vertex; import com.arcadedb.query.select.SelectIterator; import com.arcadedb.query.sql.executor.ResultSet; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; -import java.io.*; -import java.util.*; +import java.io.File; +import java.util.Collection; import static com.arcadedb.schema.LocalSchema.STATISTICS_FILE_NAME; import static org.assertj.core.api.Assertions.assertThat; @@ -43,6 +43,7 @@ public class RecordRecyclingTest { private final static int TOT_VERTICES = 1000; @Test + @Tag("slow") public void testCreateAndDeleteGraph() { GlobalConfiguration.BUCKET_REUSE_SPACE_MODE.setValue("high"); diff --git a/engine/src/test/java/com/arcadedb/index/LSMTreeIndexTest.java b/engine/src/test/java/com/arcadedb/index/LSMTreeIndexTest.java index cff7a825b2..d69ab25ca3 100644 --- a/engine/src/test/java/com/arcadedb/index/LSMTreeIndexTest.java +++ b/engine/src/test/java/com/arcadedb/index/LSMTreeIndexTest.java @@ -31,6 +31,7 @@ import com.arcadedb.schema.DocumentType; import com.arcadedb.schema.Schema; import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import java.util.ArrayList; @@ -1011,6 +1012,7 @@ public void testScanIndexRangeExclusive2Exclusive() { } @Test + @Tag("slow") public void testUniqueConcurrentWithIndexesCompaction() throws InterruptedException { database.begin(); final long startingWith = database.countType(TYPE_NAME, true); diff --git a/engine/src/test/java/com/arcadedb/index/TypeLSMTreeIndexTest.java b/engine/src/test/java/com/arcadedb/index/TypeLSMTreeIndexTest.java index 3186b238b1..0259207390 100644 --- a/engine/src/test/java/com/arcadedb/index/TypeLSMTreeIndexTest.java +++ b/engine/src/test/java/com/arcadedb/index/TypeLSMTreeIndexTest.java @@ -32,6 +32,7 @@ import com.arcadedb.schema.Schema; import com.arcadedb.schema.Type; import com.arcadedb.schema.VertexType; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import java.util.ArrayList; @@ -560,6 +561,7 @@ public void testScanIndexRangeExclusive2ExclusiveInverse() { } @Test + @Tag("slow") public void testUniqueConcurrentWithIndexesCompaction() { GlobalConfiguration.INDEX_COMPACTION_MIN_PAGES_SCHEDULE.setValue(0); From 783df96fd842cc6da9dbe2f896fdf53e767315e6 Mon Sep 17 00:00:00 2001 From: Roberto Franchini Date: Sun, 5 Oct 2025 19:26:01 +0200 Subject: [PATCH 2/3] refactor: clean up imports in ACIDTransactionTest.java for better readability --- .../java/com/arcadedb/ACIDTransactionTest.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/engine/src/test/java/com/arcadedb/ACIDTransactionTest.java b/engine/src/test/java/com/arcadedb/ACIDTransactionTest.java index e2a1bec5e9..2b5fa2660b 100644 --- a/engine/src/test/java/com/arcadedb/ACIDTransactionTest.java +++ b/engine/src/test/java/com/arcadedb/ACIDTransactionTest.java @@ -36,15 +36,19 @@ import com.arcadedb.schema.Schema; import com.arcadedb.schema.Type; import com.arcadedb.schema.VertexType; -import jdk.jfr.Category; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; -import java.io.*; -import java.util.*; -import java.util.concurrent.*; -import java.util.concurrent.atomic.*; -import java.util.logging.*; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; From 012323a72827235e5b2965c3748e3b3f510258af Mon Sep 17 00:00:00 2001 From: Roberto Franchini Date: Sun, 5 Oct 2025 19:37:00 +0200 Subject: [PATCH 3/3] feat: update CI to include slow unit test coverage reports --- .github/workflows/mvn-test.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/mvn-test.yml b/.github/workflows/mvn-test.yml index 3c9ecd066e..5c19af7caf 100644 --- a/.github/workflows/mvn-test.yml +++ b/.github/workflows/mvn-test.yml @@ -148,7 +148,7 @@ jobs: if: success() || failure() uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: - name: unit-coverage-reports + name: slow-unit-coverage-reports path: | **/jacoco*.xml retention-days: 1 @@ -412,7 +412,7 @@ jobs: coverage-report: runs-on: ubuntu-latest - needs: [ unit-tests, integration-tests ] + needs: [ unit-tests, integration-tests, slow-unit-tests ] if: success() || failure() steps: - name: Download unit test coverage reports @@ -421,6 +421,12 @@ jobs: name: unit-coverage-reports path: unit-coverage + - name: Download unit test coverage reports + uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 + with: + name: slow-unit-coverage-reports + path: slow-unit-coverage + - name: Download integration test coverage reports uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 with: