diff --git a/.teamcity/subprojects.json b/.teamcity/subprojects.json index 7ecd32b2bf2b..c1ab97f8953c 100644 --- a/.teamcity/subprojects.json +++ b/.teamcity/subprojects.json @@ -199,7 +199,7 @@ "name": "declarative-dsl-core", "path": "platforms/core-configuration/declarative-dsl-core", "unitTests": true, - "functionalTests": false, + "functionalTests": true, "crossVersionTests": false }, { diff --git a/platforms/core-configuration/declarative-dsl-core/build.gradle.kts b/platforms/core-configuration/declarative-dsl-core/build.gradle.kts index 19d38ab16e87..9ba55a0dc1be 100644 --- a/platforms/core-configuration/declarative-dsl-core/build.gradle.kts +++ b/platforms/core-configuration/declarative-dsl-core/build.gradle.kts @@ -28,4 +28,6 @@ dependencies { testImplementation(libs.futureKotlin("test-junit5")) testImplementation("org.jetbrains:annotations:24.0.1") + + integTestDistributionRuntimeOnly(project(":distributions-full")) } diff --git a/platforms/core-configuration/declarative-dsl-core/src/integTest/groovy/org/gradle/internal/declarativedsl/ErrorHandlingOnReflectiveCallsSpec.groovy b/platforms/core-configuration/declarative-dsl-core/src/integTest/groovy/org/gradle/internal/declarativedsl/ErrorHandlingOnReflectiveCallsSpec.groovy new file mode 100644 index 000000000000..322d6786ba84 --- /dev/null +++ b/platforms/core-configuration/declarative-dsl-core/src/integTest/groovy/org/gradle/internal/declarativedsl/ErrorHandlingOnReflectiveCallsSpec.groovy @@ -0,0 +1,111 @@ +/* + * Copyright 2024 the original author or authors. + * + * 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. + */ + +package org.gradle.internal.declarativedsl + +import org.gradle.integtests.fixtures.AbstractIntegrationSpec + +class ErrorHandlingOnReflectiveCallsSpec extends AbstractIntegrationSpec { + + def 'when reflective invocation fails the cause is identified correctly'() { + given: + file("buildSrc/build.gradle") << """ + plugins { + id('java-gradle-plugin') + } + gradlePlugin { + plugins { + create("restrictedPlugin") { + id = "com.example.restricted" + implementationClass = "com.example.restricted.RestrictedPlugin" + } + } + } + """ + + file("buildSrc/src/main/java/com/example/restricted/Extension.java") << """ + package com.example.restricted; + + import org.gradle.declarative.dsl.model.annotations.Configuring; + import org.gradle.declarative.dsl.model.annotations.Restricted; + import org.gradle.api.Action; + import org.gradle.api.model.ObjectFactory; + import org.gradle.api.provider.Property; + + import javax.inject.Inject; + + @Restricted + public abstract class Extension { + private final Access access; + private final ObjectFactory objects; + + public Access getAccess() { + return access; + } + + @Inject + public Extension(ObjectFactory objects) { + this.objects = objects; + this.access = objects.newInstance(Access.class); + } + + @Configuring + public void access(Action configure) { + throw new RuntimeException("Boom"); + } + + public abstract static class Access { + @Restricted + public abstract Property getName(); + } + + } + """ + + file("buildSrc/src/main/java/com/example/restricted/RestrictedPlugin.java") << """ + package com.example.restricted; + + import org.gradle.api.Plugin; + import org.gradle.api.Project; + + public class RestrictedPlugin implements Plugin { + @Override + public void apply(Project target) { + target.getExtensions().create("restricted", Extension.class); + } + } + """ + + file("build.gradle.something") << """ + plugins { + id("com.example.restricted") + } + + restricted { + access { + name = "something" + } + } + """ + + when: + fails(":help") + + then: + failureCauseContains("Boom") + } + +}