From a692d0fb74d8578ac20848949a239e056071644f Mon Sep 17 00:00:00 2001 From: IlyaMuravjov Date: Tue, 14 Nov 2023 01:00:54 +0300 Subject: [PATCH 1/2] Include usvm via GitHub packages --- gradle.properties | 1 + settings.gradle.kts | 3 -- utbot-analytics/build.gradle | 38 ++++++++++------- utbot-junit-contest/build.gradle | 72 ++++++++++++++++++++++++++++++-- 4 files changed, 94 insertions(+), 20 deletions(-) diff --git a/gradle.properties b/gradle.properties index 7595561782..8c327beb29 100644 --- a/gradle.properties +++ b/gradle.properties @@ -102,6 +102,7 @@ commonsIOVersion=2.11.0 javaxVersion=2.2 jakartaVersion=3.1.0 jacoDbVersion=1.3.0 +usvmVersion=1.0.0-competition # use latest Java 8 compaitable Spring and Spring Boot versions springVersion=5.3.28 diff --git a/settings.gradle.kts b/settings.gradle.kts index cad5a70f52..8318313222 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -93,6 +93,3 @@ if (projectType == ultimateEdition) { include("utbot-light") //include("utbot-intellij-main") - -// TODO usvm-sbft-merge: add if here if we want merge contest it into main -includeBuild("../usvm") \ No newline at end of file diff --git a/utbot-analytics/build.gradle b/utbot-analytics/build.gradle index 9952de6e7e..5838ac7591 100644 --- a/utbot-analytics/build.gradle +++ b/utbot-analytics/build.gradle @@ -45,17 +45,27 @@ processResources { } } -jar { - dependsOn classes - manifest { - attributes 'Main-Class': 'org.utbot.QualityAnalysisKt' - } - - dependsOn configurations.runtimeClasspath - from { - configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } - } - - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - zip64 = true -} \ No newline at end of file +// TODO if you need utbot-analytics fat jar, use shadow jar to create a SEPARATE task for a fat jar. +// Do not use main jar for a fat jar, because it breaks Gradle conflict resolution, here's how: +// 1. utbot-analytics depends on library A version 1.0 (and adds it to own main jar) +// 2. utbot-junit-contest depends on utbot-analytics and library A version 1.1 +// 3. Both library A version 1.0 and version 1.1 end up on the classpath and it's a matter of chance which one is earlier +// If utbot-analytics were to only declare its dependency on library A version 1.0 and not force it by adding it to a +// main jar, then Gradle would be able to recognize the conflict of library A version 1.0 and version 1.1 and resolve +// it according to a conflict resolution strategy, which by default picks the latest version, which works in most cases. +// But if you put library A version 1.0 into some fat jar, Gradle will no longer be able to exclude it from the fat jar +// in favor of a newer version when it needs to resolve dependency conflicts. +//jar { +// dependsOn classes +// manifest { +// attributes 'Main-Class': 'org.utbot.QualityAnalysisKt' +// } +// +// dependsOn configurations.runtimeClasspath +// from { +// configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } +// } +// +// duplicatesStrategy = DuplicatesStrategy.EXCLUDE +// zip64 = true +//} \ No newline at end of file diff --git a/utbot-junit-contest/build.gradle b/utbot-junit-contest/build.gradle index 27bd4c8c1d..4e43cb909d 100644 --- a/utbot-junit-contest/build.gradle +++ b/utbot-junit-contest/build.gradle @@ -3,10 +3,30 @@ plugins { } apply plugin: 'jacoco' +repositories { + mavenCentral() + maven { url 'https://jitpack.io' } + maven { + url = uri('https://maven.pkg.github.com/UnitTestBot/usvm') + credentials { + // Generate token here -- https://github.com/settings/tokens/new (select `read:packages` checkbox) + username = ""// System.getenv("GITHUB_ACTOR") + password = ""// System.getenv("GITHUB_TOKEN") + } + } +} + configurations { fetchInstrumentationJar + approximations + usvmApproximationsApi + usvmInstrumentationCollector + usvmInstrumentationRunner } +def approximationsRepo = "com.github.UnitTestBot.java-stdlib-approximations" +def approximationsVersion = "53ceeb23ea" + compileJava { options.compilerArgs << '-XDignore.symbol.file' } @@ -136,6 +156,7 @@ dependencies { implementation group: 'io.github.microutils', name: 'kotlin-logging', version: kotlinLoggingVersion implementation group: 'org.jsoup', name: 'jsoup', version: '1.6.2' implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1' + implementation group: 'com.google.guava', name: 'guava', version: guavaVersion // need for tests implementation group: 'org.mockito', name: 'mockito-core', version: mockitoVersion implementation group: 'org.mockito', name: 'mockito-inline', version: mockitoInlineVersion @@ -143,9 +164,11 @@ dependencies { implementation "org.burningwave:core:12.62.7" - implementation('org.usvm:usvm-core') - implementation('org.usvm:usvm-jvm') - implementation('org.usvm:usvm-jvm-instrumentation') + implementation group: "org.usvm", name: "usvm-core", version: usvmVersion + implementation group: "org.usvm", name: "usvm-jvm", version: usvmVersion + implementation group: "org.usvm", name: "usvm-jvm-api", version: usvmVersion + implementation group: "org.usvm", name: "usvm-jvm-instrumentation", version: usvmVersion + implementation group: "org.usvm", name: "usvm-jvm-instrumentation-collectors", version: usvmVersion implementation group: "org.jacodb", name: "jacodb-core", version: jacoDbVersion implementation group: "org.jacodb", name: "jacodb-analysis", version: jacoDbVersion @@ -160,6 +183,12 @@ dependencies { testImplementation files('src/main/resources/evosuite/evosuite-standalone-runtime-1.2.0.jar') fetchInstrumentationJar project(path: ':utbot-instrumentation', configuration: 'instrumentationArchive') + + approximations "$approximationsRepo:approximations:$approximationsVersion" + usvmApproximationsApi "org.usvm:usvm-jvm-api:$usvmVersion" + usvmInstrumentationCollector "org.usvm:usvm-jvm-instrumentation-collectors:$usvmVersion" + usvmInstrumentationRunner "org.usvm:usvm-jvm-instrumentation:$usvmVersion" + usvmInstrumentationRunner "org.usvm:usvm-jvm-instrumentation-collectors:$usvmVersion" } processResources { @@ -214,3 +243,40 @@ task monitoringJar(type: Jar) { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } + +// TODO usvm-sbft-saloed: replace with runner from usvm (unavailable due to huge jar size) +task usvmInstrumentationRunnerJar(type: Jar) { + archiveBaseName = "usvm-instrumentation-runner" + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + manifest { + attributes( + "Main-Class": "org.usvm.instrumentation.rd.InstrumentedProcessKt", + "Premain-Class": "org.usvm.instrumentation.agent.Agent", + "Can-Retransform-Classes": "true", + "Can-Redefine-Classes": "true" + ) + } + + from { + configurations.usvmInstrumentationRunner.collect { + it.isDirectory() ? it : zipTree(it) + } + } +} + +task run(type: JavaExec) { + mainClass.set("org.utbot.contest.ContestEstimatorKt") + classpath = sourceSets.main.runtimeClasspath + workingDir = project.rootProject.projectDir + + def usvmApproximationJarPath = configurations.approximations.resolve().iterator().next() + def usvmApproximationApiJarPath = configurations.usvmApproximationsApi.resolve().iterator().next() + environment "usvm.jvm.api.jar.path", usvmApproximationApiJarPath.absolutePath + environment "usvm.jvm.approximations.jar.path", usvmApproximationJarPath.absolutePath + + def usvmInstrumentationCollectorJarPath = configurations.usvmInstrumentationCollector.resolve().iterator().next() + environment "usvm-jvm-collectors-jar", usvmInstrumentationCollectorJarPath.absolutePath + + dependsOn(usvmInstrumentationRunnerJar) + environment "usvm-jvm-instrumentation-jar", usvmInstrumentationRunnerJar.outputs.files.singleFile +} From 42b58a72e60f232c150459aca8e12886040eff52 Mon Sep 17 00:00:00 2001 From: IlyaMuravjov Date: Wed, 15 Nov 2023 14:35:13 +0300 Subject: [PATCH 2/2] Improve gradle script for utbot-junit-contest --- gradle.properties | 6 ++++++ utbot-junit-contest/build.gradle | 27 +++++++++++++++++++-------- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/gradle.properties b/gradle.properties index 8c327beb29..c08e7fda4a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -109,6 +109,12 @@ springVersion=5.3.28 springBootVersion=2.7.13 springSecurityVersion=5.8.5 +# Put your GitHub username here to use utbot-junit-contest with usvm +githubActor= +# Use your GitHub token generated here -- https://github.com/settings/tokens/new?description=USVM&scopes=read:packages +# Keep `read:packages` checkbox selected +githubToken= + # configuration for build server # # the following options are passed to gradle command explicitly (see appropriate workflow): diff --git a/utbot-junit-contest/build.gradle b/utbot-junit-contest/build.gradle index 4e43cb909d..8fd6aa5e2b 100644 --- a/utbot-junit-contest/build.gradle +++ b/utbot-junit-contest/build.gradle @@ -9,9 +9,8 @@ repositories { maven { url = uri('https://maven.pkg.github.com/UnitTestBot/usvm') credentials { - // Generate token here -- https://github.com/settings/tokens/new (select `read:packages` checkbox) - username = ""// System.getenv("GITHUB_ACTOR") - password = ""// System.getenv("GITHUB_TOKEN") + username = project.githubActor // System.getenv("GITHUB_ACTOR") + password = project.githubToken // System.getenv("GITHUB_TOKEN") } } } @@ -64,7 +63,10 @@ sourceSets { test { useJUnit() - jvmArgs =[ + if (JavaVersion.current() < JavaVersion.VERSION_1_9) { + jvmArgs = [] + } else { + jvmArgs = [ "--add-opens", "java.base/java.util.concurrent.atomic=ALL-UNNAMED", "--add-opens", "java.base/java.lang.invoke=ALL-UNNAMED", "--add-opens", "java.base/java.util.concurrent=ALL-UNNAMED", @@ -115,7 +117,8 @@ test { "--add-opens", "java.base/jdk.internal.util.xml.impl=ALL-UNNAMED", "--add-opens", "java.base/jdk.internal.vm=ALL-UNNAMED", "--add-opens", "java.base/jdk.internal.vm.annotation=ALL-UNNAMED" - ] + ] + } finalizedBy jacocoTestReport } @@ -269,14 +272,22 @@ task run(type: JavaExec) { classpath = sourceSets.main.runtimeClasspath workingDir = project.rootProject.projectDir - def usvmApproximationJarPath = configurations.approximations.resolve().iterator().next() - def usvmApproximationApiJarPath = configurations.usvmApproximationsApi.resolve().iterator().next() + def usvmApproximationJarPath = configurations.approximations.resolvedConfiguration.files.find() + def usvmApproximationApiJarPath = configurations.usvmApproximationsApi.resolvedConfiguration.files.find() environment "usvm.jvm.api.jar.path", usvmApproximationApiJarPath.absolutePath environment "usvm.jvm.approximations.jar.path", usvmApproximationJarPath.absolutePath - def usvmInstrumentationCollectorJarPath = configurations.usvmInstrumentationCollector.resolve().iterator().next() + def usvmInstrumentationCollectorJarPath = configurations.usvmInstrumentationCollector.resolvedConfiguration.files.find() environment "usvm-jvm-collectors-jar", usvmInstrumentationCollectorJarPath.absolutePath dependsOn(usvmInstrumentationRunnerJar) environment "usvm-jvm-instrumentation-jar", usvmInstrumentationRunnerJar.outputs.files.singleFile + + // "JAVA_HOME" specifies Java path for instrumented process and JacoDB, + // while `System.getProperty('java.home')` is Java used by this process. + // We want both of them to be the same and we also need JDK (not JRE), since we use `javac` to compile tests. + def javaHome = System.getProperty('java.home') + def jreSuffix = "${File.separatorChar}jre" + if (javaHome.endsWith(jreSuffix)) javaHome = javaHome.dropRight(jreSuffix.length()) + environment "JAVA_HOME", javaHome }