/* * Copyright 2018 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. */ apply plugin: 'java-library' jar { baseName 'pantheon-core' manifest { attributes('Implementation-Title': baseName, 'Implementation-Version': project.version) } } dependencies { implementation project(':crypto') implementation project(':ethereum:rlp') implementation project(':ethereum:trie') implementation project(':services:kvstore') implementation 'com.fasterxml.jackson.core:jackson-databind' implementation 'com.google.guava:guava' implementation 'io.vertx:vertx-core' implementation 'org.apache.logging.log4j:log4j-api' runtime 'org.apache.logging.log4j:log4j-core' testImplementation project(path:':ethereum:referencetests', configuration: 'testOutput') testImplementation project(':testutil') testImplementation 'org.assertj:assertj-core' testImplementation 'org.mockito:mockito-core' testImplementation 'junit:junit' integrationTestImplementation 'org.assertj:assertj-core' integrationTestImplementation 'org.mockito:mockito-core' integrationTestImplementation 'junit:junit' testSupportImplementation project(':testutil') testSupportImplementation 'org.assertj:assertj-core' testSupportImplementation 'org.mockito:mockito-core' testSupportImplementation 'junit:junit' jmhImplementation project(':util') jmhImplementation project( path: ':ethereum:core', configuration: 'testSupportArtifacts') jmhImplementation project(':crypto') jmhImplementation project(':ethereum:rlp') jmhImplementation project(':ethereum:trie') jmhImplementation project(':services:kvstore') jmhImplementation 'com.google.guava:guava' jmhImplementation 'org.openjdk.jmh:jmh-generator-annprocess' } configurations { testArtifacts } task testJar (type: Jar) { baseName = "${project.name}-test" from sourceSets.test.output } test { exclude 'tech/pegasys/pantheon/ethereum/vm/**ReferenceTest.class' exclude 'tech/pegasys/pantheon/ethereum/vm/blockchain/**.class' exclude 'tech/pegasys/pantheon/ethereum/vm/generalstate/**.class' exclude 'tech/pegasys/pantheon/ethereum/core/TransactionTest.class' } def generateTestFiles(FileTree jsonPath, File resourcesPath, File templateFile, String pathstrip, String destination, String namePrefix) { def referenceTestTemplate = templateFile.text // This is how many json files to include in each test file def fileSets = jsonPath.getFiles().collate(5) fileSets.each { fileSet -> def resPath = resourcesPath.getPath().replaceAll("\\\\", "/") def name = fileSet .find({ !it.getName().toString().startsWith(".")}) .getPath() .toString() .replaceAll("\\\\", "/") .replaceAll(resPath + "/", "") .replaceAll(pathstrip, "") .replaceAll(".json", "") .replaceAll("/", "_") .replaceAll("\\^", "") .replaceAll("\\-", "") .replaceAll("\\+", "") def paths = [] fileSet.each { testJsonFile -> if (!testJsonFile.getName().toString().startsWith(".")) { paths << testJsonFile.getPath().toString() .replaceAll(resPath + "/", "") } } def testFile = file(destination + "/" + namePrefix + "_" + name + ".java") def allPaths = '"' + paths.join('", "') + '"'; def testFileContents = referenceTestTemplate .replaceAll("%%TESTS_FILE%%", allPaths) .replaceAll("%%TESTS_NAME%%", namePrefix + "_" + name) testFile.newWriter().withWriter { w -> w << testFileContents } } } task blockchainReferenceTestsSetup { generateTestFiles( fileTree('../referencetests/src/test/resources/BlockchainTests'), file("../referencetests/src/test/resources"), file("./src/test/resources/tech/pegasys/pantheon/ethereum/vm/BlockchainReferenceTest.java.template"), "BlockchainTests/", "./src/test/java/tech/pegasys/pantheon/ethereum/vm/blockchain", "BlockchainReferenceTest" ) } task generalstateReferenceTestsSetup { generateTestFiles( fileTree("../referencetests/src/test/resources/GeneralStateTests"), file("../referencetests/src/test/resources"), file("./src/test/resources/tech/pegasys/pantheon/ethereum/vm/GeneralStateReferenceTest.java.template"), "GeneralStateTests/", "./src/test/java/tech/pegasys/pantheon/ethereum/vm/generalstate", "GeneralStateReferenceTest" ) } task generalstateRegressionReferenceTestsSetup { generateTestFiles( fileTree("./src/test/resources/regressions/generalstate"), file("./src/test/resources"), file("./src/test/resources/tech/pegasys/pantheon/ethereum/vm/GeneralStateReferenceTest.java.template"), "regressions/generalstate/", "./src/test/java/tech/pegasys/pantheon/ethereum/vm/generalstate", "GeneralStateRegressionReferenceTest" ) } task cleanupReferenceTests(type: Delete) { delete fileTree("./src/test/java/tech/pegasys/pantheon/ethereum/vm/generalstate/") { include("**/GeneralStateReferenceTest*.java") include("**/GeneralStateRegressionReferenceTest*.java") } delete fileTree("./src/test/java/tech/pegasys/pantheon/ethereum/vm/blockchain/") { include("**/BlockchainReferenceTest*.java") } } clean.dependsOn(cleanupReferenceTests) task referenceTests(type: Test, dependsOn: [ "blockchainReferenceTestsSetup", "generalstateReferenceTestsSetup", "generalstateRegressionReferenceTestsSetup", "compileTestJava" ]) { compileTestJava.mustRunAfter blockchainReferenceTestsSetup compileTestJava.mustRunAfter generalstateReferenceTestsSetup compileTestJava.mustRunAfter generalstateRegressionReferenceTestsSetup 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 'tech/pegasys/pantheon/ethereum/vm/**ReferenceTest.class' include 'tech/pegasys/pantheon/ethereum/vm/blockchain/**.class' include 'tech/pegasys/pantheon/ethereum/vm/generalstate/**.class' include 'tech/pegasys/pantheon/ethereum/core/TransactionTest.class' } artifacts { testArtifacts testJar testSupportArtifacts testSupportJar }