From 6212155bdb95beecd185e5fa6c07696c6a10509a Mon Sep 17 00:00:00 2001 From: Fabio Di Fabio Date: Thu, 18 Dec 2025 18:56:51 +0100 Subject: [PATCH] Move test plugins in a detached project so they can use the Gradle Besu plugin Signed-off-by: Fabio Di Fabio --- .../detached-test-plugins/build.gradle | 23 + .../detached-test-plugins/settings.gradle | 10 + ...AbstractTestReloadConfigurationPlugin.java | 0 ...AbstractTestTransactionSelectorPlugin.java | 0 .../plugins/BadCLIOptionsPlugin.java | 0 .../plugins/TestBesuEventsPlugin.java | 0 .../TestBlockchainServiceFinalizedPlugin.java | 0 .../plugins/TestBlockchainServicePlugin.java | 0 .../acceptance/plugins/TestBundlePlugin.java | 0 .../TestInProcessRpcServicePlugin.java | 0 .../acceptance/plugins/TestMetricsPlugin.java | 0 .../plugins/TestPermissioningPlugin.java | 0 .../acceptance/plugins/TestPicoCLIPlugin.java | 0 .../TestReloadConfigurationPlugin1.java | 0 .../TestReloadConfigurationPlugin2.java | 0 .../plugins/TestRpcEndpointServicePlugin.java | 0 .../TestTransactionSelectorPlugin1.java | 0 .../TestTransactionSelectorPlugin2.java | 0 .../TestTransactionValidatorPlugin.java | 0 .../plugins/TestWorldStateServicePlugin.java | 0 acceptance-tests/test-plugins/build.gradle | 40 -- .../services/BesuPluginContextImplTest.java | 452 ------------------ acceptance-tests/tests/build.gradle | 8 +- build.gradle | 38 ++ settings.gradle | 1 - 25 files changed, 76 insertions(+), 496 deletions(-) create mode 100644 acceptance-tests/detached-test-plugins/build.gradle create mode 100644 acceptance-tests/detached-test-plugins/settings.gradle rename acceptance-tests/{test-plugins => detached-test-plugins}/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/AbstractTestReloadConfigurationPlugin.java (100%) rename acceptance-tests/{test-plugins => detached-test-plugins}/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/AbstractTestTransactionSelectorPlugin.java (100%) rename acceptance-tests/{test-plugins => detached-test-plugins}/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/BadCLIOptionsPlugin.java (100%) rename acceptance-tests/{test-plugins => detached-test-plugins}/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBesuEventsPlugin.java (100%) rename acceptance-tests/{test-plugins => detached-test-plugins}/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBlockchainServiceFinalizedPlugin.java (100%) rename acceptance-tests/{test-plugins => detached-test-plugins}/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBlockchainServicePlugin.java (100%) rename acceptance-tests/{test-plugins => detached-test-plugins}/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBundlePlugin.java (100%) rename acceptance-tests/{test-plugins => detached-test-plugins}/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestInProcessRpcServicePlugin.java (100%) rename acceptance-tests/{test-plugins => detached-test-plugins}/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestMetricsPlugin.java (100%) rename acceptance-tests/{test-plugins => detached-test-plugins}/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestPermissioningPlugin.java (100%) rename acceptance-tests/{test-plugins => detached-test-plugins}/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestPicoCLIPlugin.java (100%) rename acceptance-tests/{test-plugins => detached-test-plugins}/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestReloadConfigurationPlugin1.java (100%) rename acceptance-tests/{test-plugins => detached-test-plugins}/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestReloadConfigurationPlugin2.java (100%) rename acceptance-tests/{test-plugins => detached-test-plugins}/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestRpcEndpointServicePlugin.java (100%) rename acceptance-tests/{test-plugins => detached-test-plugins}/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestTransactionSelectorPlugin1.java (100%) rename acceptance-tests/{test-plugins => detached-test-plugins}/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestTransactionSelectorPlugin2.java (100%) rename acceptance-tests/{test-plugins => detached-test-plugins}/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestTransactionValidatorPlugin.java (100%) rename acceptance-tests/{test-plugins => detached-test-plugins}/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestWorldStateServicePlugin.java (100%) delete mode 100644 acceptance-tests/test-plugins/build.gradle delete mode 100644 acceptance-tests/test-plugins/src/test/java/org/hyperledger/besu/services/BesuPluginContextImplTest.java diff --git a/acceptance-tests/detached-test-plugins/build.gradle b/acceptance-tests/detached-test-plugins/build.gradle new file mode 100644 index 00000000000..875007f0d0b --- /dev/null +++ b/acceptance-tests/detached-test-plugins/build.gradle @@ -0,0 +1,23 @@ +plugins { + id 'net.consensys.besu-plugin-distribution' version '0.1.4' +} + +group = 'org.hyperledger.besu.tests' +version = besuVersion + +java { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 +} + +jar { + archiveFileName = 'testPlugins.jar' + manifest { + attributes( + 'Specification-Title': archiveBaseName, + 'Specification-Version': project.version, + 'Implementation-Title': archiveBaseName, + 'Implementation-Version': project.version + ) + } +} \ No newline at end of file diff --git a/acceptance-tests/detached-test-plugins/settings.gradle b/acceptance-tests/detached-test-plugins/settings.gradle new file mode 100644 index 00000000000..87de6d4cba3 --- /dev/null +++ b/acceptance-tests/detached-test-plugins/settings.gradle @@ -0,0 +1,10 @@ +// Configure plugin repositories - must be first +pluginManagement { + repositories { + mavenLocal() + gradlePluginPortal() + mavenCentral() + } +} + +rootProject.name = 'test-plugins' \ No newline at end of file diff --git a/acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/AbstractTestReloadConfigurationPlugin.java b/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/AbstractTestReloadConfigurationPlugin.java similarity index 100% rename from acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/AbstractTestReloadConfigurationPlugin.java rename to acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/AbstractTestReloadConfigurationPlugin.java diff --git a/acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/AbstractTestTransactionSelectorPlugin.java b/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/AbstractTestTransactionSelectorPlugin.java similarity index 100% rename from acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/AbstractTestTransactionSelectorPlugin.java rename to acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/AbstractTestTransactionSelectorPlugin.java diff --git a/acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/BadCLIOptionsPlugin.java b/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/BadCLIOptionsPlugin.java similarity index 100% rename from acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/BadCLIOptionsPlugin.java rename to acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/BadCLIOptionsPlugin.java diff --git a/acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBesuEventsPlugin.java b/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBesuEventsPlugin.java similarity index 100% rename from acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBesuEventsPlugin.java rename to acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBesuEventsPlugin.java diff --git a/acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBlockchainServiceFinalizedPlugin.java b/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBlockchainServiceFinalizedPlugin.java similarity index 100% rename from acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBlockchainServiceFinalizedPlugin.java rename to acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBlockchainServiceFinalizedPlugin.java diff --git a/acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBlockchainServicePlugin.java b/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBlockchainServicePlugin.java similarity index 100% rename from acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBlockchainServicePlugin.java rename to acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBlockchainServicePlugin.java diff --git a/acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBundlePlugin.java b/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBundlePlugin.java similarity index 100% rename from acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBundlePlugin.java rename to acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestBundlePlugin.java diff --git a/acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestInProcessRpcServicePlugin.java b/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestInProcessRpcServicePlugin.java similarity index 100% rename from acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestInProcessRpcServicePlugin.java rename to acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestInProcessRpcServicePlugin.java diff --git a/acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestMetricsPlugin.java b/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestMetricsPlugin.java similarity index 100% rename from acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestMetricsPlugin.java rename to acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestMetricsPlugin.java diff --git a/acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestPermissioningPlugin.java b/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestPermissioningPlugin.java similarity index 100% rename from acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestPermissioningPlugin.java rename to acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestPermissioningPlugin.java diff --git a/acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestPicoCLIPlugin.java b/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestPicoCLIPlugin.java similarity index 100% rename from acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestPicoCLIPlugin.java rename to acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestPicoCLIPlugin.java diff --git a/acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestReloadConfigurationPlugin1.java b/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestReloadConfigurationPlugin1.java similarity index 100% rename from acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestReloadConfigurationPlugin1.java rename to acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestReloadConfigurationPlugin1.java diff --git a/acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestReloadConfigurationPlugin2.java b/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestReloadConfigurationPlugin2.java similarity index 100% rename from acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestReloadConfigurationPlugin2.java rename to acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestReloadConfigurationPlugin2.java diff --git a/acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestRpcEndpointServicePlugin.java b/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestRpcEndpointServicePlugin.java similarity index 100% rename from acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestRpcEndpointServicePlugin.java rename to acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestRpcEndpointServicePlugin.java diff --git a/acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestTransactionSelectorPlugin1.java b/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestTransactionSelectorPlugin1.java similarity index 100% rename from acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestTransactionSelectorPlugin1.java rename to acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestTransactionSelectorPlugin1.java diff --git a/acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestTransactionSelectorPlugin2.java b/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestTransactionSelectorPlugin2.java similarity index 100% rename from acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestTransactionSelectorPlugin2.java rename to acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestTransactionSelectorPlugin2.java diff --git a/acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestTransactionValidatorPlugin.java b/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestTransactionValidatorPlugin.java similarity index 100% rename from acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestTransactionValidatorPlugin.java rename to acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestTransactionValidatorPlugin.java diff --git a/acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestWorldStateServicePlugin.java b/acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestWorldStateServicePlugin.java similarity index 100% rename from acceptance-tests/test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestWorldStateServicePlugin.java rename to acceptance-tests/detached-test-plugins/src/main/java/org/hyperledger/besu/tests/acceptance/plugins/TestWorldStateServicePlugin.java diff --git a/acceptance-tests/test-plugins/build.gradle b/acceptance-tests/test-plugins/build.gradle deleted file mode 100644 index 474d60865b9..00000000000 --- a/acceptance-tests/test-plugins/build.gradle +++ /dev/null @@ -1,40 +0,0 @@ - -dependencies { - api 'org.slf4j:slf4j-api' - - implementation project(':acceptance-tests:dsl') - implementation project(':app') - implementation project(':crypto:algorithms') - implementation project(':datatypes') - implementation project(':ethereum:api') - implementation project(':ethereum:core') - implementation project(path: ':ethereum:core', configuration: 'testSupportArtifacts') - implementation project(':ethereum:eth') - implementation project(':ethereum:rlp') - implementation project(':evm') - implementation project(':plugin-api') - implementation 'com.google.auto.service:auto-service' - implementation 'info.picocli:picocli' - - testImplementation 'org.assertj:assertj-core' - testImplementation 'org.junit.jupiter:junit-jupiter' -} - -task testPluginsJar(type: Jar) { - archiveFileName = 'testPlugins.jar' - manifest { - attributes( - 'Specification-Title': archiveBaseName, - 'Specification-Version': project.version, - 'Implementation-Title': archiveBaseName, - 'Implementation-Version': calculateVersion(), - 'Commit-Hash': getGitCommitDetails(40).hash - ) - } - from sourceSets.main.output -} - -artifacts { testPluginsJar } - - -javadoc { enabled = false } diff --git a/acceptance-tests/test-plugins/src/test/java/org/hyperledger/besu/services/BesuPluginContextImplTest.java b/acceptance-tests/test-plugins/src/test/java/org/hyperledger/besu/services/BesuPluginContextImplTest.java deleted file mode 100644 index 7e8c98afab2..00000000000 --- a/acceptance-tests/test-plugins/src/test/java/org/hyperledger/besu/services/BesuPluginContextImplTest.java +++ /dev/null @@ -1,452 +0,0 @@ -/* - * Copyright contributors to Hyperledger Besu. - * - * 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 - */ -package org.hyperledger.besu.services; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.junit.jupiter.api.Assertions.assertThrows; - -import org.hyperledger.besu.ethereum.core.plugins.ImmutablePluginConfiguration; -import org.hyperledger.besu.ethereum.core.plugins.PluginConfiguration; -import org.hyperledger.besu.ethereum.core.plugins.PluginInfo; -import org.hyperledger.besu.plugin.BesuPlugin; -import org.hyperledger.besu.tests.acceptance.plugins.TestBesuEventsPlugin; -import org.hyperledger.besu.tests.acceptance.plugins.TestPicoCLIPlugin; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.Optional; - -import org.assertj.core.api.ThrowableAssert; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -public class BesuPluginContextImplTest { - private static final Path DEFAULT_PLUGIN_DIRECTORY = Paths.get("."); - private static final String TEST_PICO_CLI_PLUGIN = "TestPicoCLIPlugin"; - private static final String TEST_PICO_CLI_PLUGIN_TEST_OPTION = "testPicoCLIPlugin.testOption"; - private static final String FAIL_REGISTER = "FAILREGISTER"; - private static final String FAIL_START = "FAILSTART"; - private static final String FAIL_STOP = "FAILSTOP"; - private static final String FAIL_BEFORE_EXTERNAL_SERVICES = "FAILBEFOREEXTERNALSERVICES"; - private static final String FAIL_BEFORE_MAIN_LOOP = "FAILBEFOREMAINLOOP"; - private static final String FAIL_AFTER_EXTERNAL_SERVICE_POST_MAIN_LOOP = - "FAILAFTEREXTERNALSERVICEPOSTMAINLOOP"; - private static final String NON_EXISTENT_PLUGIN = "NonExistentPlugin"; - private static final String REGISTERED = "registered"; - private static final String STARTED = "started"; - private static final String STOPPED = "stopped"; - private static final String FAIL_START_STATE = "failstart"; - private static final String FAIL_STOP_STATE = "failstop"; - - private BesuPluginContextImpl contextImpl; - - private static final PluginConfiguration DEFAULT_CONFIGURATION = - ImmutablePluginConfiguration.builder() - .pluginsDir(DEFAULT_PLUGIN_DIRECTORY) - .externalPluginsEnabled(true) - .continueOnPluginError(true) - .build(); - - @BeforeAll - public static void createFakePluginDir() throws IOException { - if (System.getProperty("besu.plugins.dir") == null) { - final Path pluginDir = Files.createTempDirectory("besuTest"); - pluginDir.toFile().deleteOnExit(); - System.setProperty("besu.plugins.dir", pluginDir.toAbsolutePath().toString()); - } - } - - @AfterEach - public void clearTestPluginState() { - System.clearProperty(TEST_PICO_CLI_PLUGIN_TEST_OPTION); - } - - @BeforeEach - void setup() { - contextImpl = new BesuPluginContextImpl(); - } - - @Test - public void verifyEverythingGoesSmoothly() { - assertThat(contextImpl.getRegisteredPlugins()).isEmpty(); - contextImpl.initialize(DEFAULT_CONFIGURATION); - contextImpl.registerPlugins(); - assertThat(contextImpl.getRegisteredPlugins()).isNotEmpty(); - - final Optional testPluginOptional = - findTestPlugin(contextImpl.getRegisteredPlugins(), TestPicoCLIPlugin.class); - assertThat(testPluginOptional).isPresent(); - final TestPicoCLIPlugin testPicoCLIPlugin = testPluginOptional.get(); - assertThat(testPicoCLIPlugin.getState()).isEqualTo(REGISTERED); - - contextImpl.beforeExternalServices(); - contextImpl.startPlugins(); - assertThat(testPicoCLIPlugin.getState()).isEqualTo(STARTED); - - contextImpl.stopPlugins(); - assertThat(testPicoCLIPlugin.getState()).isEqualTo(STOPPED); - } - - @Test - public void registrationErrorsHandledSmoothly() { - System.setProperty(TEST_PICO_CLI_PLUGIN_TEST_OPTION, FAIL_REGISTER); - - assertThat(contextImpl.getRegisteredPlugins()).isEmpty(); - contextImpl.initialize(DEFAULT_CONFIGURATION); - contextImpl.registerPlugins(); - assertThat(contextImpl.getRegisteredPlugins()).isNotInstanceOfAny(TestPicoCLIPlugin.class); - - contextImpl.beforeExternalServices(); - assertThat(contextImpl.getRegisteredPlugins()).isNotInstanceOfAny(TestPicoCLIPlugin.class); - - contextImpl.startPlugins(); - assertThat(contextImpl.getRegisteredPlugins()).isNotInstanceOfAny(TestPicoCLIPlugin.class); - - contextImpl.stopPlugins(); - assertThat(contextImpl.getRegisteredPlugins()).isNotInstanceOfAny(TestPicoCLIPlugin.class); - } - - @Test - public void startErrorsHandledSmoothly() { - System.setProperty(TEST_PICO_CLI_PLUGIN_TEST_OPTION, FAIL_START); - - assertThat(contextImpl.getRegisteredPlugins()).isEmpty(); - contextImpl.initialize(DEFAULT_CONFIGURATION); - contextImpl.registerPlugins(); - assertThat(contextImpl.getRegisteredPlugins()) - .extracting("class") - .contains(TestPicoCLIPlugin.class); - - final Optional testPluginOptional = - findTestPlugin(contextImpl.getRegisteredPlugins(), TestPicoCLIPlugin.class); - assertThat(testPluginOptional).isPresent(); - final TestPicoCLIPlugin testPicoCLIPlugin = testPluginOptional.get(); - assertThat(testPicoCLIPlugin.getState()).isEqualTo(REGISTERED); - - contextImpl.beforeExternalServices(); - contextImpl.startPlugins(); - assertThat(testPicoCLIPlugin.getState()).isEqualTo(FAIL_START_STATE); - assertThat(contextImpl.getRegisteredPlugins()).isNotInstanceOfAny(TestPicoCLIPlugin.class); - - contextImpl.stopPlugins(); - assertThat(contextImpl.getRegisteredPlugins()).isNotInstanceOfAny(TestPicoCLIPlugin.class); - } - - @Test - public void stopErrorsHandledSmoothly() { - System.setProperty(TEST_PICO_CLI_PLUGIN_TEST_OPTION, FAIL_STOP); - - assertThat(contextImpl.getRegisteredPlugins()).isEmpty(); - contextImpl.initialize(DEFAULT_CONFIGURATION); - contextImpl.registerPlugins(); - assertThat(contextImpl.getRegisteredPlugins()) - .extracting("class") - .contains(TestPicoCLIPlugin.class); - - final Optional testPluginOptional = - findTestPlugin(contextImpl.getRegisteredPlugins(), TestPicoCLIPlugin.class); - assertThat(testPluginOptional).isPresent(); - final TestPicoCLIPlugin testPicoCLIPlugin = testPluginOptional.get(); - assertThat(testPicoCLIPlugin.getState()).isEqualTo(REGISTERED); - - contextImpl.beforeExternalServices(); - contextImpl.startPlugins(); - assertThat(testPicoCLIPlugin.getState()).isEqualTo(STARTED); - - contextImpl.stopPlugins(); - assertThat(testPicoCLIPlugin.getState()).isEqualTo(FAIL_STOP_STATE); - } - - @Test - public void lifecycleExceptions() throws Throwable { - contextImpl.initialize(DEFAULT_CONFIGURATION); - final ThrowableAssert.ThrowingCallable registerPlugins = () -> contextImpl.registerPlugins(); - - assertThatExceptionOfType(IllegalStateException.class).isThrownBy(contextImpl::startPlugins); - assertThatExceptionOfType(IllegalStateException.class).isThrownBy(contextImpl::stopPlugins); - - registerPlugins.call(); - assertThatExceptionOfType(IllegalStateException.class).isThrownBy(registerPlugins); - assertThatExceptionOfType(IllegalStateException.class).isThrownBy(contextImpl::stopPlugins); - - contextImpl.beforeExternalServices(); - contextImpl.startPlugins(); - assertThatExceptionOfType(IllegalStateException.class).isThrownBy(registerPlugins); - assertThatExceptionOfType(IllegalStateException.class).isThrownBy(contextImpl::startPlugins); - - contextImpl.stopPlugins(); - assertThatExceptionOfType(IllegalStateException.class).isThrownBy(registerPlugins); - assertThatExceptionOfType(IllegalStateException.class).isThrownBy(contextImpl::startPlugins); - assertThatExceptionOfType(IllegalStateException.class).isThrownBy(contextImpl::stopPlugins); - } - - @Test - public void shouldRegisterAllPluginsWhenNoPluginsOption() { - assertThat(contextImpl.getRegisteredPlugins()).isEmpty(); - contextImpl.initialize(DEFAULT_CONFIGURATION); - contextImpl.registerPlugins(); - final Optional testPluginOptional = - findTestPlugin(contextImpl.getRegisteredPlugins(), TestPicoCLIPlugin.class); - assertThat(testPluginOptional).isPresent(); - final TestPicoCLIPlugin testPicoCLIPlugin = testPluginOptional.get(); - assertThat(testPicoCLIPlugin.getState()).isEqualTo(REGISTERED); - } - - @Test - public void shouldRegisterOnlySpecifiedPluginWhenPluginsOptionIsSet() { - assertThat(contextImpl.getRegisteredPlugins()).isEmpty(); - contextImpl.initialize(createConfigurationForSpecificPlugin(TEST_PICO_CLI_PLUGIN)); - contextImpl.registerPlugins(); - - final Optional requestedPlugin = - findTestPlugin(contextImpl.getRegisteredPlugins(), TestPicoCLIPlugin.class); - - assertThat(requestedPlugin).isPresent(); - assertThat(requestedPlugin.get().getState()).isEqualTo(REGISTERED); - - final Optional nonRequestedPlugin = - findTestPlugin(contextImpl.getRegisteredPlugins(), TestBesuEventsPlugin.class); - - assertThat(nonRequestedPlugin).isEmpty(); - } - - @Test - public void shouldNotRegisterUnspecifiedPluginsWhenPluginsOptionIsSet() { - assertThat(contextImpl.getRegisteredPlugins()).isEmpty(); - contextImpl.initialize(createConfigurationForSpecificPlugin(TEST_PICO_CLI_PLUGIN)); - contextImpl.registerPlugins(); - - final Optional nonRequestedPlugin = - findTestPlugin(contextImpl.getRegisteredPlugins(), TestBesuEventsPlugin.class); - assertThat(nonRequestedPlugin).isEmpty(); - } - - @Test - void shouldThrowExceptionIfExplicitlySpecifiedPluginNotFound() { - contextImpl.initialize(createConfigurationForSpecificPlugin(NON_EXISTENT_PLUGIN)); - String exceptionMessage = - assertThrows(NoSuchElementException.class, () -> contextImpl.registerPlugins()) - .getMessage(); - final String expectedMessage = - "The following requested plugins were not found: " + NON_EXISTENT_PLUGIN; - assertThat(exceptionMessage).isEqualTo(expectedMessage); - assertThat(contextImpl.getRegisteredPlugins()).isEmpty(); - } - - @Test - void shouldNotRegisterAnyPluginsIfExternalPluginsDisabled() { - PluginConfiguration config = - ImmutablePluginConfiguration.builder() - .pluginsDir(DEFAULT_PLUGIN_DIRECTORY) - .externalPluginsEnabled(false) - .build(); - contextImpl.initialize(config); - contextImpl.registerPlugins(); - assertThat(contextImpl.getRegisteredPlugins().isEmpty()).isTrue(); - } - - @Test - void shouldRegisterPluginsIfExternalPluginsEnabled() { - contextImpl.initialize(DEFAULT_CONFIGURATION); - contextImpl.registerPlugins(); - assertThat(contextImpl.getRegisteredPlugins().isEmpty()).isFalse(); - } - - @Test - void shouldHaltOnRegisterErrorWhenFlagIsFalse() { - System.setProperty(TEST_PICO_CLI_PLUGIN_TEST_OPTION, FAIL_REGISTER); - - PluginConfiguration config = - ImmutablePluginConfiguration.builder() - .requestedPluginsInfo(List.of(new PluginInfo(TEST_PICO_CLI_PLUGIN))) - .pluginsDir(DEFAULT_PLUGIN_DIRECTORY) - .continueOnPluginError(false) - .build(); - - contextImpl.initialize(config); - - String errorMessage = - String.format("Error registering plugin of type %s", TestPicoCLIPlugin.class.getName()); - assertThatExceptionOfType(RuntimeException.class) - .isThrownBy(() -> contextImpl.registerPlugins()) - .withMessageContaining(errorMessage); - } - - @Test - void shouldNotHaltOnRegisterErrorWhenFlagIsTrue() { - System.setProperty(TEST_PICO_CLI_PLUGIN_TEST_OPTION, FAIL_REGISTER); - - PluginConfiguration config = - ImmutablePluginConfiguration.builder() - .pluginsDir(DEFAULT_PLUGIN_DIRECTORY) - .continueOnPluginError(true) - .build(); - - contextImpl.initialize(config); - contextImpl.registerPlugins(); - assertThat(contextImpl.getRegisteredPlugins()).isNotInstanceOfAny(TestPicoCLIPlugin.class); - } - - @Test - void shouldHaltOnBeforeExternalServicesErrorWhenFlagIsFalse() { - System.setProperty(TEST_PICO_CLI_PLUGIN_TEST_OPTION, FAIL_BEFORE_EXTERNAL_SERVICES); - - PluginConfiguration config = - ImmutablePluginConfiguration.builder() - .requestedPluginsInfo(List.of(new PluginInfo(TEST_PICO_CLI_PLUGIN))) - .pluginsDir(DEFAULT_PLUGIN_DIRECTORY) - .continueOnPluginError(false) - .build(); - - contextImpl.initialize(config); - contextImpl.registerPlugins(); - - String errorMessage = - String.format( - "Error calling `beforeExternalServices` on plugin of type %s", - TestPicoCLIPlugin.class.getName()); - assertThatExceptionOfType(RuntimeException.class) - .isThrownBy(() -> contextImpl.beforeExternalServices()) - .withMessageContaining(errorMessage); - } - - @Test - void shouldNotHaltOnBeforeExternalServicesErrorWhenFlagIsTrue() { - System.setProperty(TEST_PICO_CLI_PLUGIN_TEST_OPTION, FAIL_BEFORE_EXTERNAL_SERVICES); - - PluginConfiguration config = - ImmutablePluginConfiguration.builder() - .requestedPluginsInfo(List.of(new PluginInfo(TEST_PICO_CLI_PLUGIN))) - .pluginsDir(DEFAULT_PLUGIN_DIRECTORY) - .continueOnPluginError(true) - .build(); - - contextImpl.initialize(config); - contextImpl.registerPlugins(); - contextImpl.beforeExternalServices(); - - assertThat(contextImpl.getRegisteredPlugins()).isNotInstanceOfAny(TestPicoCLIPlugin.class); - } - - @Test - void shouldHaltOnBeforeMainLoopErrorWhenFlagIsFalse() { - System.setProperty(TEST_PICO_CLI_PLUGIN_TEST_OPTION, FAIL_START); - - PluginConfiguration config = - ImmutablePluginConfiguration.builder() - .requestedPluginsInfo(List.of(new PluginInfo(TEST_PICO_CLI_PLUGIN))) - .pluginsDir(DEFAULT_PLUGIN_DIRECTORY) - .continueOnPluginError(false) - .build(); - - contextImpl.initialize(config); - contextImpl.registerPlugins(); - contextImpl.beforeExternalServices(); - - String errorMessage = - String.format("Error starting plugin of type %s", TestPicoCLIPlugin.class.getName()); - assertThatExceptionOfType(RuntimeException.class) - .isThrownBy(() -> contextImpl.startPlugins()) - .withMessageContaining(errorMessage); - } - - @Test - void shouldNotHaltOnBeforeMainLoopErrorWhenFlagIsTrue() { - System.setProperty(TEST_PICO_CLI_PLUGIN_TEST_OPTION, FAIL_BEFORE_MAIN_LOOP); - - PluginConfiguration config = - ImmutablePluginConfiguration.builder() - .requestedPluginsInfo(List.of(new PluginInfo(TEST_PICO_CLI_PLUGIN))) - .pluginsDir(DEFAULT_PLUGIN_DIRECTORY) - .continueOnPluginError(true) - .build(); - - contextImpl.initialize(config); - contextImpl.registerPlugins(); - contextImpl.beforeExternalServices(); - contextImpl.startPlugins(); - - assertThat(contextImpl.getRegisteredPlugins()).isNotInstanceOfAny(TestPicoCLIPlugin.class); - } - - @Test - void shouldHaltOnAfterExternalServicePostMainLoopErrorWhenFlagIsFalse() { - System.setProperty( - TEST_PICO_CLI_PLUGIN_TEST_OPTION, FAIL_AFTER_EXTERNAL_SERVICE_POST_MAIN_LOOP); - - PluginConfiguration config = - ImmutablePluginConfiguration.builder() - .requestedPluginsInfo(List.of(new PluginInfo(TEST_PICO_CLI_PLUGIN))) - .pluginsDir(DEFAULT_PLUGIN_DIRECTORY) - .continueOnPluginError(false) - .build(); - - contextImpl.initialize(config); - contextImpl.registerPlugins(); - contextImpl.beforeExternalServices(); - contextImpl.startPlugins(); - - String errorMessage = - String.format( - "Error calling `afterExternalServicePostMainLoop` on plugin of type %s", - TestPicoCLIPlugin.class.getName()); - assertThatExceptionOfType(RuntimeException.class) - .isThrownBy(() -> contextImpl.afterExternalServicesMainLoop()) - .withMessageContaining(errorMessage); - } - - @Test - void shouldNotHaltOnAfterExternalServicePostMainLoopErrorWhenFlagIsTrue() { - System.setProperty( - TEST_PICO_CLI_PLUGIN_TEST_OPTION, FAIL_AFTER_EXTERNAL_SERVICE_POST_MAIN_LOOP); - - PluginConfiguration config = - ImmutablePluginConfiguration.builder() - .requestedPluginsInfo(List.of(new PluginInfo(TEST_PICO_CLI_PLUGIN))) - .pluginsDir(DEFAULT_PLUGIN_DIRECTORY) - .continueOnPluginError(true) - .build(); - - contextImpl.initialize(config); - contextImpl.registerPlugins(); - contextImpl.beforeExternalServices(); - contextImpl.startPlugins(); - contextImpl.afterExternalServicesMainLoop(); - - assertThat(contextImpl.getRegisteredPlugins()).isNotInstanceOfAny(TestPicoCLIPlugin.class); - } - - private PluginConfiguration createConfigurationForSpecificPlugin(final String pluginName) { - return ImmutablePluginConfiguration.builder() - .requestedPluginsInfo(List.of(new PluginInfo(pluginName))) - .pluginsDir(DEFAULT_PLUGIN_DIRECTORY) - .build(); - } - - private Optional findTestPlugin( - final List plugins, final Class type) { - return plugins.stream() - .filter(p -> type.equals(p.getClass())) - .map(p -> (TestPicoCLIPlugin) p) - .findFirst(); - } -} diff --git a/acceptance-tests/tests/build.gradle b/acceptance-tests/tests/build.gradle index fa917b792b8..148ee249e43 100644 --- a/acceptance-tests/tests/build.gradle +++ b/acceptance-tests/tests/build.gradle @@ -34,7 +34,7 @@ dependencies { implementation project(':ethereum:eth') testImplementation project(':acceptance-tests:dsl') - testImplementation project(':acceptance-tests:test-plugins') + testImplementation files("${rootProject.projectDir}/acceptance-tests/detached-test-plugins/build/libs/testPlugins.jar") testImplementation project(':app') testImplementation project(':config') testImplementation project(':consensus:clique') @@ -88,12 +88,14 @@ test.enabled = false sourceSets { test { resources { - srcDirs "${rootDir}/acceptance-tests/test-plugins/build/libs" + srcDirs "${rootDir}/acceptance-tests/detached-test-plugins/build/install/test-plugins" } } } -processTestResources.dependsOn(':acceptance-tests:test-plugins:testPluginsJar',':acceptance-tests:test-plugins:jar') +processTestResources.dependsOn(':buildDetachedTestPlugins') + +compileTestJava.dependsOn ':buildDetachedTestPlugins' // FKA acceptanceTestNotPrivacy task acceptanceTest(type: Test) { diff --git a/build.gradle b/build.gradle index 32243b0fb1a..fcedd17cc5e 100644 --- a/build.gradle +++ b/build.gradle @@ -1300,6 +1300,44 @@ tasks.register('generateArtifactsCatalog') { } } +tasks.register('prepareDetachedTestPlugins') { + group = 'build setup' + description = 'Publishes required Besu artifacts to mavenLocal and build detached-test-plugins project' + dependsOn subprojects.findAll { it.plugins.hasPlugin('maven-publish') }.collect { it.tasks.named('publishToMavenLocal') } +} + +// Skip javadoc and sources tasks when preparing detached test plugins to save time +gradle.taskGraph.whenReady { graph -> + if (graph.hasTask(':prepareDetachedTestPlugins')) { + allprojects { + tasks.matching { it.name == 'javadoc' || it.name == 'javadocJar' || it.name == 'sourcesJar' }.configureEach { + enabled = false + } + } + } +} + +tasks.register('buildDetachedTestPlugins', GradleBuild) { + group = 'build' + dependsOn 'prepareDetachedTestPlugins' + + dir = file('acceptance-tests/detached-test-plugins') + tasks = [ + 'clean', + 'build', + 'installDist' + ] + + startParameter.projectProperties = [ + 'besuVersion': calculateVersion() + ] + + doFirst { + println "Building detached-test-plugins project with besuVersion=" + calculateVersion() + } +} + + build.dependsOn verifyDistributions artifactoryPublish.dependsOn verifyDistributions artifactoryPublish.mustRunAfter(distTar) diff --git a/settings.gradle b/settings.gradle index 7664baabb9f..70985a374ce 100644 --- a/settings.gradle +++ b/settings.gradle @@ -20,7 +20,6 @@ pluginManagement { } rootProject.name='besu' -include 'acceptance-tests:test-plugins' include 'acceptance-tests:dsl' include 'acceptance-tests:tests' include 'acceptance-tests:tests:shanghai'