/* * Copyright ConsenSys AG. * * Licensed 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. * * SPDX-License-Identifier: Apache-2.0 */ apply plugin: 'java-library' jar { archiveBaseName = 'besu-core' manifest { attributes( 'Specification-Title': archiveBaseName, 'Specification-Version': project.version, 'Implementation-Title': archiveBaseName, 'Implementation-Version': calculateVersion() ) } } sourceSets { test { java { compileClasspath += main.output runtimeClasspath += main.output srcDirs += file('./build/generated/sources/referencetests/java/test') } } } dependencies { annotationProcessor 'org.openjdk.jmh:jmh-generator-annprocess' implementation project(':config') implementation project(':crypto') implementation project(':datatypes') implementation project(':enclave') implementation project(':ethereum:rlp') implementation project(':ethereum:trie') implementation project(':metrics:core') implementation project(':plugin-api') implementation project(':services:kvstore') implementation 'com.fasterxml.jackson.core:jackson-databind' implementation 'com.google.guava:guava' implementation 'io.opentelemetry:opentelemetry-api' implementation 'io.vertx:vertx-core' implementation 'net.java.dev.jna:jna' implementation 'org.apache.logging.log4j:log4j-api' implementation 'org.apache.tuweni:tuweni-bytes' implementation 'org.apache.tuweni:tuweni-concurrent' implementation 'org.apache.tuweni:tuweni-units' implementation 'org.hyperledger.besu:bls12-381' implementation 'org.immutables:value-annotations' implementation 'org.xerial.snappy:snappy-java' annotationProcessor 'org.immutables:value' runtimeOnly 'org.apache.logging.log4j:log4j-core' testImplementation project(path: ':config', configuration: 'testSupportArtifacts') testImplementation project(path: ':ethereum:referencetests') testImplementation project(path: ':ethereum:referencetests', configuration: 'testOutput') testImplementation project(':testutil') testImplementation 'junit:junit' testImplementation 'org.apache.logging.log4j:log4j-core' testImplementation 'org.apache.tuweni:tuweni-bytes' testImplementation 'org.apache.tuweni:tuweni-io' testImplementation 'org.apache.tuweni:tuweni-units' testImplementation 'org.assertj:assertj-core' testImplementation 'org.mockito:mockito-core' integrationTestImplementation project(path: ':config', configuration: 'testSupportArtifacts') integrationTestImplementation project(':testutil') integrationTestImplementation 'junit:junit' integrationTestImplementation 'net.consensys:orion' integrationTestImplementation 'org.assertj:assertj-core' integrationTestImplementation 'org.mockito:mockito-core' testSupportImplementation project(path: ':config', configuration: 'testSupportArtifacts') testSupportImplementation project(':ethereum:eth') testSupportImplementation project(':testutil') testSupportImplementation 'junit:junit' testSupportImplementation 'org.assertj:assertj-core' testSupportImplementation 'org.mockito:mockito-core' jmhImplementation project(path: ':config', configuration: 'testSupportArtifacts') jmhImplementation project(':crypto') jmhImplementation project(path: ':ethereum:core', configuration: 'testSupportArtifacts') jmhImplementation project(':ethereum:rlp') jmhImplementation project(':ethereum:trie') jmhImplementation project(':metrics:core') jmhImplementation project(':plugin-api') jmhImplementation project(':plugins:rocksdb') jmhImplementation project(':services:kvstore') jmhImplementation project(':util') jmhImplementation 'com.google.guava:guava' } configurations { testArtifacts } task testJar(type: Jar) { archiveBaseName = "${project.name}-test" from sourceSets.test.output } test { exclude 'org/hyperledger/besu/ethereum/mainnet/DifficultyCalculatorTests.class' exclude 'org/hyperledger/besu/ethereum/core/TransactionTest.class' exclude 'org/hyperledger/besu/ethereum/vm/**ReferenceTest.class' exclude 'org/hyperledger/besu/ethereum/vm/blockchain/**.class' exclude 'org/hyperledger/besu/ethereum/vm/generalstate/**.class' } def generateTestFiles(FileTree jsonPath, File templateFile, String pathstrip, String destination, String namePrefix, String ... excludedPath) { mkdir(destination) def referenceTestTemplate = templateFile.text // This is how many json files to include in each test file def fileSets = jsonPath.getFiles().collate(5) fileSets.eachWithIndex { fileSet, idx -> def paths = [] fileSet.each { testJsonFile -> def parentFile = testJsonFile.getParentFile() def parentPathFile = parentFile.getPath().substring(parentFile.getPath().indexOf(pathstrip)) if (!testJsonFile.getName().toString().startsWith(".") && !excludedPath.contains(parentPathFile)) { def pathFile = testJsonFile.getPath() paths << pathFile.substring(pathFile.indexOf(pathstrip)) } } def testFile = file(destination + "/" + namePrefix + "_" + idx + ".java") def allPaths = '"' + paths.join('", "') + '"' def testFileContents = referenceTestTemplate .replaceAll("%%TESTS_FILE%%", allPaths) .replaceAll("%%TESTS_NAME%%", namePrefix + "_" + idx) testFile.newWriter().withWriter { w -> w << testFileContents } } } task blockchainReferenceTestsSetup { inputs.files fileTree('../referencetests/src/test/resources/BlockchainTests') outputs.files "./build/generated/sources/referencetests/java/test/org/hyperledger/besu/ethereum/vm/blockchain" generateTestFiles( fileTree('../referencetests/src/test/resources/BlockchainTests'), file("./src/test/resources/org/hyperledger/besu/ethereum/vm/BlockchainReferenceTest.java.template"), "BlockchainTests", "./build/generated/sources/referencetests/java/test/org/hyperledger/besu/ethereum/vm/blockchain", "BlockchainReferenceTest", ("BlockchainTests/InvalidBlocks/bcExpectSection") // exclude test for test filling tool ) } task legacyBlockchainReferenceTestsSetup { inputs.files fileTree('../referencetests/src/test/resources/LegacyTests/Constantinople/BlockchainTests') outputs.files "./build/generated/sources/referencetests/java/test/org/hyperledger/besu/ethereum/vm/blockchain" generateTestFiles( fileTree('../referencetests/src/test/resources/LegacyTests/Constantinople/BlockchainTests'), file("./src/test/resources/org/hyperledger/besu/ethereum/vm/BlockchainReferenceTest.java.template"), "LegacyTests", "./build/generated/sources/referencetests/java/test/org/hyperledger/besu/ethereum/vm/blockchain", "LegacyBlockchainReferenceTest", ("BlockchainTests/InvalidBlocks/bcExpectSection") // exclude test for test filling tool ) } task generalstateReferenceTestsSetup { inputs.files fileTree("../referencetests/src/test/resources/GeneralStateTests") outputs.files "./build/generated/sources/referencetests/java/test/org/hyperledger/besu/ethereum/vm/generalstate" generateTestFiles( fileTree("../referencetests/src/test/resources/GeneralStateTests"), file("./src/test/resources/org/hyperledger/besu/ethereum/vm/GeneralStateReferenceTest.java.template"), "GeneralStateTests", "./build/generated/sources/referencetests/java/test/org/hyperledger/besu/ethereum/vm/generalstate", "GeneralStateReferenceTest" ) } task legacyGeneralstateReferenceTestsSetup { inputs.files fileTree('../referencetests/src/test/resources/LegacyTests/Constantinople/GeneralStateTests') outputs.files "./build/generated/sources/referencetests/java/test/org/hyperledger/besu/ethereum/vm/generalstate" generateTestFiles( fileTree('../referencetests/src/test/resources/LegacyTests/Constantinople/GeneralStateTests'), file("./src/test/resources/org/hyperledger/besu/ethereum/vm/GeneralStateReferenceTest.java.template"), "LegacyTests", "./build/generated/sources/referencetests/java/test/org/hyperledger/besu/ethereum/vm/generalstate", "LegacyGeneralStateReferenceTest" ) } task generalstateRegressionReferenceTestsSetup { inputs.files fileTree("./src/test/resources/regressions/generalstate") outputs.files "./build/generated/sources/referencetests/java/test/org/hyperledger/besu/ethereum/vm/generalstate" generateTestFiles( fileTree("./src/test/resources/regressions/generalstate"), file("./src/test/resources/org/hyperledger/besu/ethereum/vm/GeneralStateReferenceTest.java.template"), "regressions", "./build/generated/sources/referencetests/java/test/org/hyperledger/besu/ethereum/vm/generalstate", "GeneralStateRegressionReferenceTest" ) } //TODO delete in Jan 2022. This is left as a migration aid for reference tests moving to the build directory task cleanupReferenceTests(type: Delete) { delete fileTree("./src/test/java/org/hyperledger/besu/ethereum/vm/generalstate/") { include("**/GeneralStateReferenceTest*.java") include("**/GeneralStateRegressionReferenceTest*.java") include("**/LegacyGeneralStateReferenceTest*.java") include("**/LegacyGeneralStateRegressionReferenceTest*.java") } delete fileTree("./src/test/java/org/hyperledger/besu/ethereum/vm/blockchain/") { include("**/BlockchainReferenceTest*.java") include("**/LegacyBlockchainReferenceTest*.java") } } clean.dependsOn(cleanupReferenceTests) task referenceTests(type: Test, dependsOn: [ "blockchainReferenceTestsSetup", "generalstateReferenceTestsSetup", "legacyBlockchainReferenceTestsSetup", "legacyGeneralstateReferenceTestsSetup", "generalstateRegressionReferenceTestsSetup", "compileTestJava" ]) { compileTestJava.mustRunAfter blockchainReferenceTestsSetup compileTestJava.mustRunAfter generalstateReferenceTestsSetup compileTestJava.mustRunAfter generalstateRegressionReferenceTestsSetup compileTestJava.mustRunAfter legacyBlockchainReferenceTestsSetup compileTestJava.mustRunAfter legacyGeneralstateReferenceTestsSetup doFirst { if (!file("../referencetests/src/test/resources/README.md").exists()) { throw new GradleException("ethereum/referencetests/src/test/resources/README.md missing: please clone submodules (git submodule update --init --recursive)") } } scanForTestClasses = false enableAssertions = true include 'org/hyperledger/besu/ethereum/core/TransactionTest.class' include 'org/hyperledger/besu/ethereum/mainnet/DifficultyCalculatorTests.class' include 'org/hyperledger/besu/ethereum/vm/**ReferenceTest.class' include 'org/hyperledger/besu/ethereum/vm/blockchain/**.class' include 'org/hyperledger/besu/ethereum/vm/generalstate/**.class' } artifacts { testArtifacts testJar testSupportArtifacts testSupportJar }