/* * 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-qbft' manifest { attributes( 'Specification-Title': archiveBaseName, 'Specification-Version': project.version, 'Implementation-Title': archiveBaseName, 'Implementation-Version': calculateVersion() ) } } sourceSets { referenceTest { java { compileClasspath += main.output runtimeClasspath += main.output srcDir file('src/reference-test/java') } resources.srcDir file('src/reference-test/resources') } } task referenceTests(type: Test, dependsOn: ["compileTestJava"]) { group = "verification" description = "Runs the Besu QBFT reference tests" jvmArgs = [ '--add-opens', 'java.base/java.util=ALL-UNNAMED', '--add-opens', 'java.base/java.util.concurrent=ALL-UNNAMED' ] testClassesDirs = sourceSets.referenceTest.output.classesDirs classpath = sourceSets.referenceTest.runtimeClasspath outputs.upToDateWhen { false } } dependencies { implementation project(':config') implementation project(':consensus:common') implementation project(':crypto') implementation project(':ethereum:api') implementation project(':ethereum:blockcreation') implementation project(':ethereum:core') implementation project(':ethereum:eth') implementation project(':ethereum:p2p') implementation project(':ethereum:rlp') implementation project(':services:kvstore') implementation 'com.google.guava:guava' implementation 'io.vertx:vertx-core' implementation 'org.apache.tuweni:bytes' implementation 'org.apache.tuweni:units' integrationTestImplementation project(path: ':config', configuration: 'testSupportArtifacts') integrationTestImplementation project(path: ':ethereum:core', configuration: 'testSupportArtifacts') testImplementation 'junit:junit' testImplementation 'org.awaitility:awaitility' testImplementation 'org.assertj:assertj-core' testImplementation 'org.mockito:mockito-core' testImplementation project(path: ':crypto', configuration: 'testSupportArtifacts') testImplementation project(path: ':config', configuration: 'testSupportArtifacts') testImplementation project(path: ':consensus:common', configuration: 'testArtifacts') testImplementation project(path: ':consensus:common', configuration: 'testSupportArtifacts') testImplementation project(path: ':ethereum:core', configuration: 'testSupportArtifacts') testImplementation project(':metrics:core') testImplementation project(':testutil') testImplementation project(':crypto') integrationTestImplementation project(path: ':crypto', configuration: 'testSupportArtifacts') integrationTestImplementation project(path: ':consensus:common', configuration: 'testSupportArtifacts') integrationTestImplementation project(':metrics:core') integrationTestImplementation project(':testutil') integrationTestImplementation 'junit:junit' integrationTestImplementation 'org.assertj:assertj-core' integrationTestImplementation 'org.mockito:mockito-core' referenceTestImplementation 'junit:junit' referenceTestImplementation 'com.google.guava:guava' referenceTestImplementation 'org.assertj:assertj-core' referenceTestImplementation 'org.mockito:mockito-core' referenceTestImplementation 'com.fasterxml.jackson.core:jackson-databind' referenceTestImplementation 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8' referenceTestImplementation 'org.apache.tuweni:bytes' referenceTestImplementation project(':crypto') referenceTestImplementation project(path: ':crypto', configuration: 'testSupportArtifacts') referenceTestImplementation project(':consensus:common') referenceTestImplementation project(':ethereum:core') referenceTestImplementation project(':ethereum:rlp') referenceTestImplementation project(':config') referenceTestImplementation project(':testutil') testSupportImplementation 'org.mockito:mockito-core' } task ('validateReferenceTestSubmodule') { description = "Checks that the reference tests submodule is not accidentally changed" doLast { def result = new ByteArrayOutputStream() def expectedHash = '3862d7282e017f8d2c5af88e4c1eeeafcbb97697' def submodulePath = java.nio.file.Path.of("${rootProject.projectDir}", "consensus/qbft/src/reference-test/resources").toAbsolutePath() try { exec { commandLine 'git', 'submodule', 'status', submodulePath standardOutput = result errorOutput = result } } catch (Exception ignore) { // Ignore it. We want to fail in a friendly fashion if they don't have git installed. // The CI servers have git and that is the only critical place for this failure expectedHash = '' } if (!result.toString().contains(expectedHash)) { throw new GradleException("""For the QBFT Reference Tests the git commit did not match what was expected. If this is a deliberate change where you are updating the reference tests then update "expectedHash" in `consensus/qbft/build.gradle` as the commit hash for this task. Expected hash : ${expectedHash} Full git output : ${result} If this is accidental you can correct the reference test versions with the following commands: pushd ${submodulePath} git checkout ${expectedHash} cd .. git add resources popd""") } } } processResources.dependsOn('validateReferenceTestSubmodule')