Skip to content

Commit 4c6c217

Browse files
authored
Speedup CI tests (#179)
speed up tests
1 parent f3a6516 commit 4c6c217

29 files changed

+226
-187
lines changed

.github/workflows/build-and-test.yml

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
# which requires 'pull_request' trigger for the bot to be able to add a comment to PR.
2020
# if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
2121

22-
name: Build on JDK ${{ matrix.jdk }}
22+
name: Run tests on JDK ${{ matrix.jdk }}
2323

2424
runs-on: ubuntu-latest
2525
strategy:
@@ -57,7 +57,6 @@ jobs:
5757

5858
- name: Upload coverage reports to Codecov
5959
uses: codecov/codecov-action@v3
60-
if: matrix.jdk == env.main_jdk
6160
with:
6261
token: ${{ secrets.CODECOV_TOKEN }}
6362

@@ -74,3 +73,36 @@ jobs:
7473
name: gradle-reports
7574
path: '**/build/reports/'
7675
retention-days: 1
76+
lifecycleTests:
77+
name: Run lifecycle tests
78+
runs-on: ubuntu-latest
79+
steps:
80+
- uses: actions/checkout@v3
81+
82+
- name: Set up Java
83+
uses: actions/setup-java@v3
84+
with:
85+
java-version: 8
86+
distribution: 'zulu'
87+
88+
- name: Set up Gradle
89+
uses: gradle/gradle-build-action@v2
90+
with:
91+
# Only write to the cache for builds on the specific branches. (Default is 'main' only.)
92+
# Builds on other branches will only read existing entries from the cache.
93+
cache-read-only: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/develop' }}
94+
95+
- name: Build and run lifecycle tests
96+
run: ./gradlew lifecycleTest --stacktrace --scan
97+
98+
- name: Upload coverage reports to Codecov
99+
uses: codecov/codecov-action@v3
100+
with:
101+
token: ${{ secrets.CODECOV_TOKEN }}
102+
103+
- name: Publish test results
104+
uses: EnricoMi/publish-unit-test-result-action@v2
105+
if: always()
106+
with:
107+
files: "**/build/test-results/**/*.xml"
108+
check_name: "Lifecycle test results"

build.gradle.kts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,17 +89,21 @@ allprojects {
8989
}
9090
}
9191

92-
withType<Test> {
93-
useJUnitPlatform()
94-
testLogging {
95-
events("passed", "skipped", "failed")
92+
test {
93+
useJUnitPlatform {
94+
excludeTags(Tests.lifecycleTag)
9695
}
97-
finalizedBy(jacocoTestReport) // report is always generated after tests run
98-
jvmArgs = listOf("-Xmx2g", "-XX:+HeapDumpOnOutOfMemoryError", "-XX:HeapDumpPath=heapdump.hprof")
96+
setup(jacocoTestReport)
97+
}
98+
99+
val lifecycleTest by creating(Test::class) {
100+
useJUnitPlatform {
101+
includeTags(Tests.lifecycleTag)
102+
}
103+
setup(jacocoTestReport)
99104
}
100105

101106
jacocoTestReport {
102-
dependsOn(test) // tests are required to run before generating the report
103107
classDirectories.setFrom(files(classDirectories.files.map {
104108
fileTree(it) {
105109
excludes.add("org/jacodb/impl/storage/jooq/**")

buildSrc/src/main/kotlin/Tests.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import org.gradle.api.tasks.TaskProvider
2+
import org.gradle.api.tasks.testing.Test
3+
4+
object Tests {
5+
val lifecycleTag = "lifecycle"
6+
7+
}
8+
9+
fun Test.setup(jacocoTestReport: TaskProvider<*>) {
10+
testLogging {
11+
events("passed", "skipped", "failed")
12+
}
13+
finalizedBy(jacocoTestReport) // report is always generated after tests run
14+
jvmArgs = listOf("-Xmx2g", "-XX:+HeapDumpOnOutOfMemoryError", "-XX:HeapDumpPath=heapdump.hprof")
15+
}

jacodb-analysis/src/test/kotlin/org/jacodb/analysis/impl/AliasAnalysisTest.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,8 @@ import org.jacodb.api.cfg.JcExpr
3131
import org.jacodb.api.cfg.JcInst
3232
import org.jacodb.api.ext.cfg.callExpr
3333
import org.jacodb.api.ext.findClass
34-
import org.jacodb.impl.features.InMemoryHierarchy
35-
import org.jacodb.impl.features.Usages
3634
import org.jacodb.testing.BaseTest
37-
import org.jacodb.testing.WithDB
35+
import org.jacodb.testing.WithGlobalDB
3836
import org.junit.jupiter.api.Assertions.assertEquals
3937
import org.junit.jupiter.api.Disabled
4038
import org.junit.jupiter.params.ParameterizedTest
@@ -45,7 +43,7 @@ import kotlin.streams.asStream
4543

4644
@Disabled("Needs modifications after introduction of summaries")
4745
class AliasAnalysisTest : BaseTest() {
48-
companion object : WithDB(Usages, InMemoryHierarchy) {
46+
companion object : WithGlobalDB() {
4947

5048
@JvmStatic
5149
fun provideForPointerBenchBasic(): Stream<Arguments> = listOf(

jacodb-analysis/src/test/kotlin/org/jacodb/analysis/impl/BaseAnalysisTest.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,10 @@ import org.jacodb.api.JcClassOrInterface
2323
import org.jacodb.api.JcMethod
2424
import org.jacodb.api.ext.findClass
2525
import org.jacodb.api.ext.methods
26-
import org.jacodb.impl.features.InMemoryHierarchy
27-
import org.jacodb.impl.features.Usages
2826
import org.jacodb.impl.features.classpaths.UnknownClasses
2927
import org.jacodb.impl.features.hierarchyExt
3028
import org.jacodb.testing.BaseTest
31-
import org.jacodb.testing.WithDB
29+
import org.jacodb.testing.WithGlobalDB
3230
import org.jacodb.testing.allClasspath
3331
import org.junit.jupiter.api.Assertions.assertEquals
3432
import org.junit.jupiter.api.Assertions.assertTrue
@@ -37,7 +35,7 @@ import java.util.stream.Stream
3735
import kotlin.streams.asStream
3836

3937
abstract class BaseAnalysisTest : BaseTest() {
40-
companion object : WithDB(UnknownClasses, Usages, InMemoryHierarchy) {
38+
companion object : WithGlobalDB(UnknownClasses) {
4139
@JvmStatic
4240
fun provideClassesForJuliet(cweNum: Int, cweSpecificBans: List<String> = emptyList()): Stream<Arguments> = runBlocking {
4341
val cp = db.classpath(allClasspath)

jacodb-analysis/src/test/kotlin/org/jacodb/analysis/impl/JodaDateTimeAnalysisTest.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,13 @@ import org.jacodb.analysis.library.newNpeRunnerFactory
2727
import org.jacodb.analysis.runAnalysis
2828
import org.jacodb.analysis.sarif.SarifReport
2929
import org.jacodb.api.ext.findClass
30-
import org.jacodb.impl.features.InMemoryHierarchy
31-
import org.jacodb.impl.features.Usages
3230
import org.jacodb.testing.BaseTest
33-
import org.jacodb.testing.WithDB
31+
import org.jacodb.testing.WithGlobalDB
3432
import org.joda.time.DateTime
3533
import org.junit.jupiter.api.Test
3634

3735
class JodaDateTimeAnalysisTest : BaseTest() {
38-
companion object : WithDB(Usages, InMemoryHierarchy)
36+
companion object : WithGlobalDB()
3937

4038
private fun <UnitType> testOne(unitResolver: UnitResolver<UnitType>, ifdsUnitRunnerFactory: IfdsUnitRunnerFactory) {
4139
val clazz = cp.findClass<DateTime>()

jacodb-analysis/src/test/kotlin/org/jacodb/analysis/impl/NullabilityAssumptionAnalysisTest.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,15 @@ import org.jacodb.api.cfg.JcAssignInst
2323
import org.jacodb.api.cfg.JcInstanceCallExpr
2424
import org.jacodb.api.cfg.JcLocal
2525
import org.jacodb.api.ext.findClass
26-
import org.jacodb.impl.features.InMemoryHierarchy
2726
import org.jacodb.testing.BaseTest
28-
import org.jacodb.testing.WithDB
27+
import org.jacodb.testing.WithGlobalDB
2928
import org.jacodb.testing.cfg.NullAssumptionAnalysisExample
3029
import org.junit.jupiter.api.Assertions.assertTrue
3130
import org.junit.jupiter.api.Test
3231

3332
class NullabilityAssumptionAnalysisTest : BaseTest() {
3433

35-
companion object : WithDB(InMemoryHierarchy)
34+
companion object : WithGlobalDB()
3635

3736
@Test
3837
fun `null-assumption analysis should work`() {

jacodb-core/src/test/java/org/jacodb/testing/JavaApi.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,14 @@
1616

1717
package org.jacodb.testing;
1818

19+
import org.jacodb.api.JcDatabase;
1920
import org.jacodb.api.cfg.JcArgument;
2021
import org.jacodb.api.cfg.JcExpr;
2122
import org.jacodb.api.cfg.TypedExprResolver;
23+
import org.jacodb.impl.JacoDB;
2224
import org.jacodb.impl.JcCacheSettings;
25+
import org.jacodb.impl.JcSettings;
26+
import org.jacodb.impl.features.Usages;
2327
import org.jetbrains.annotations.NotNull;
2428

2529
import java.time.Duration;
@@ -41,4 +45,12 @@ public static void cacheSettings() {
4145
new JcCacheSettings().types(10, Duration.of(1, ChronoUnit.MINUTES));
4246
}
4347

48+
public static void getDatabase() {
49+
try {
50+
JcDatabase instance = JacoDB.async(new JcSettings().installFeatures(Usages.INSTANCE)).get();
51+
} catch (Exception e) {
52+
throw new RuntimeException(e);
53+
}
54+
}
55+
4456
}

jacodb-core/src/test/java/org/jacodb/testing/JavaApiTest.java

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,12 @@
1616

1717
package org.jacodb.testing;
1818

19+
import com.google.common.base.Supplier;
20+
import com.google.common.base.Suppliers;
1921
import com.google.common.collect.Lists;
2022
import org.jacodb.api.JcClassOrInterface;
2123
import org.jacodb.api.JcClasspath;
2224
import org.jacodb.api.JcDatabase;
23-
import org.jacodb.impl.JacoDB;
24-
import org.jacodb.impl.JcSettings;
25-
import org.jacodb.impl.features.Usages;
2625
import org.junit.jupiter.api.Test;
2726

2827
import java.io.IOException;
@@ -33,39 +32,45 @@
3332

3433
public class JavaApiTest {
3534

35+
private final Supplier<JcDatabase> db = Suppliers.memoize(() -> {
36+
try {
37+
return BaseTestKt.getGlobalDb();
38+
} catch (Exception e) {
39+
throw new RuntimeException(e);
40+
}
41+
});
42+
3643
@Test
37-
public void createJcdb() throws ExecutionException, InterruptedException, IOException {
44+
public void createJcdb() {
3845
System.out.println("Creating database");
39-
try (JcDatabase instance = JacoDB.async(new JcSettings().installFeatures(Usages.INSTANCE)).get()) {
40-
System.out.println("Database is ready: " + instance);
41-
}
46+
JcDatabase database = db.get();
47+
assertNotNull(database);
48+
System.out.println("Database is ready: " + database);
4249
}
4350

4451
@Test
4552
public void createClasspath() throws ExecutionException, InterruptedException, IOException {
4653
System.out.println("Creating database");
47-
try (JcDatabase instance = JacoDB.async(new JcSettings().installFeatures(Usages.INSTANCE)).get()) {
48-
try (JcClasspath classpath = instance.asyncClasspath(Lists.newArrayList()).get()) {
49-
JcClassOrInterface clazz = classpath.findClassOrNull("java.lang.String");
50-
assertNotNull(clazz);
51-
assertNotNull(classpath.asyncRefreshed(false).get());
52-
}
53-
System.out.println("Database is ready: " + instance);
54+
JcDatabase instance = db.get();
55+
try (JcClasspath classpath = instance.asyncClasspath(Lists.newArrayList()).get()) {
56+
JcClassOrInterface clazz = classpath.findClassOrNull("java.lang.String");
57+
assertNotNull(clazz);
58+
assertNotNull(classpath.asyncRefreshed(false).get());
5459
}
60+
System.out.println("Database is ready: " + instance);
5561
}
5662

5763
@Test
5864
public void jcdbOperations() throws ExecutionException, InterruptedException, IOException {
5965
System.out.println("Creating database");
60-
try (JcDatabase instance = JacoDB.async(new JcSettings().installFeatures(Usages.INSTANCE)).get()) {
61-
instance.asyncLoad(getAllClasspath()).get();
62-
System.out.println("asyncLoad finished");
63-
instance.asyncRefresh().get();
64-
System.out.println("asyncRefresh finished");
65-
instance.asyncRebuildFeatures().get();
66-
System.out.println("asyncRebuildFeatures finished");
67-
instance.asyncAwaitBackgroundJobs().get();
68-
System.out.println("asyncAwaitBackgroundJobs finished");
69-
}
66+
JcDatabase instance = db.get();
67+
instance.asyncLoad(getAllClasspath()).get();
68+
System.out.println("asyncLoad finished");
69+
instance.asyncRefresh().get();
70+
System.out.println("asyncRefresh finished");
71+
instance.asyncRebuildFeatures().get();
72+
System.out.println("asyncRebuildFeatures finished");
73+
instance.asyncAwaitBackgroundJobs().get();
74+
System.out.println("asyncAwaitBackgroundJobs finished");
7075
}
7176
}

jacodb-core/src/test/kotlin/org/jacodb/testing/AnnotationsTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import org.junit.jupiter.api.Test
2525

2626
class AnnotationsTest : BaseTest() {
2727

28-
companion object : WithDB()
28+
companion object : WithGlobalDB()
2929

3030
@Test
3131
fun `field annotations`() = runBlocking {

0 commit comments

Comments
 (0)