From b7bb178a89d3bd5d108eaa4bbd5afe32fafbb93c Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 4 Dec 2024 00:10:14 +0800 Subject: [PATCH 01/22] Convert Log4j2PluginsCacheFileTransformerSpec --- ...g4j2PluginsCacheFileTransformerSpec.groovy | 85 ------------------- .../Log4j2PluginsCacheFileTransformerTest.kt | 68 +++++++++++++++ 2 files changed, 68 insertions(+), 85 deletions(-) delete mode 100644 src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerSpec.groovy create mode 100644 src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt diff --git a/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerSpec.groovy b/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerSpec.groovy deleted file mode 100644 index abacd4498..000000000 --- a/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerSpec.groovy +++ /dev/null @@ -1,85 +0,0 @@ -package com.github.jengelman.gradle.plugins.shadow.transformers - -import com.github.jengelman.gradle.plugins.shadow.ShadowStats -import com.github.jengelman.gradle.plugins.shadow.relocation.Relocator -import com.github.jengelman.gradle.plugins.shadow.relocation.SimpleRelocator -import org.apache.logging.log4j.core.config.plugins.processor.PluginCache -import org.apache.tools.zip.ZipOutputStream -import spock.lang.Specification - -import static java.util.Collections.singletonList -import static org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor.PLUGIN_CACHE_FILE - -/** - * @author Paul Nelson Baker - * @since 2018-08 - * @see GitHub - * @see LinkedIn - */ -class Log4j2PluginsCacheFileTransformerSpec extends Specification { - - Log4j2PluginsCacheFileTransformer transformer - - void setup() { - transformer = new Log4j2PluginsCacheFileTransformer() - } - - void "should transform for a single file"() { - when: - transformer.transform(new TransformerContext(PLUGIN_CACHE_FILE, getResourceStream(PLUGIN_CACHE_FILE))) - - then: - transformer.hasTransformedResource() - } - - void "should transform"() { - given: - def relocators = singletonList(new SimpleRelocator()) - - when: - transformer.transform(new TransformerContext(PLUGIN_CACHE_FILE, getResourceStream(PLUGIN_CACHE_FILE), relocators)) - - then: - transformer.hasTransformedResource() - } - - void "relocate classes inside DAT file"() { - given: - String pattern = "org.apache.logging" - String destination = "new.location.org.apache.logging" - - List relocators = singletonList(new SimpleRelocator(pattern, destination)) - - when: - transformer.transform(new TransformerContext(PLUGIN_CACHE_FILE, getResourceStream(PLUGIN_CACHE_FILE), relocators)) - - then: - transformer.hasTransformedResource() - - when: - // Write out to a fake jar file - def testableZipFile = File.createTempFile("testable-zip-file-", ".jar") - def fileOutputStream = new FileOutputStream(testableZipFile) - def bufferedOutputStream = new BufferedOutputStream(fileOutputStream) - def zipOutputStream = new ZipOutputStream(bufferedOutputStream) - - transformer.modifyOutputStream(zipOutputStream, true) - - zipOutputStream.close() - bufferedOutputStream.close() - fileOutputStream.close() - - then: - // Pull the data back out and make sure it was transformed - PluginCache cache = new PluginCache() - def urlString = "jar:" + testableZipFile.toURI().toURL() + "!/" + PLUGIN_CACHE_FILE - cache.loadCacheFiles(Collections.enumeration([new URL(urlString)])) - - cache.getCategory("lookup")["date"].className == "new.location.org.apache.logging.log4j.core.lookup.DateLookup" - - } - - InputStream getResourceStream(String resource) { - return this.class.getClassLoader().getResourceAsStream(resource) - } -} diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt new file mode 100644 index 000000000..a1b0c0783 --- /dev/null +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt @@ -0,0 +1,68 @@ +package com.github.jengelman.gradle.plugins.shadow.transformers + +import assertk.assertThat +import assertk.assertions.isEqualTo +import assertk.assertions.isTrue +import com.github.jengelman.gradle.plugins.shadow.relocation.SimpleRelocator +import java.io.File +import java.io.FileNotFoundException +import java.io.InputStream +import java.net.URL +import java.util.Collections +import org.apache.logging.log4j.core.config.plugins.processor.PluginCache +import org.apache.tools.zip.ZipOutputStream +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test + +class Log4j2PluginsCacheFileTransformerTest : TransformerTestSupport() { + + @BeforeEach + fun setup() { + transformer = Log4j2PluginsCacheFileTransformer() + } + + @Test + fun `should transform for a single file`() { + transformer.transform(TransformerContext(PLUGIN_CACHE_FILE, getResourceStream())) + assertThat(transformer.hasTransformedResource()).isTrue() + } + + @Test + fun `should transform`() { + val relocators = listOf(SimpleRelocator()) + transformer.transform(TransformerContext(PLUGIN_CACHE_FILE, getResourceStream(), relocators)) + assertThat(transformer.hasTransformedResource()).isTrue() + } + + @Test + fun `relocate classes inside DAT file`() { + val pattern = "org.apache.logging" + val destination = "new.location.org.apache.logging" + val relocators = listOf(SimpleRelocator(pattern, destination)) + + transformer.transform(TransformerContext(PLUGIN_CACHE_FILE, getResourceStream(), relocators)) + assertThat(transformer.hasTransformedResource()).isTrue() + + // Write out to a fake jar file + val testableZipFile = File.createTempFile("testable-zip-file-", ".jar") + val zipOutputStream = ZipOutputStream(testableZipFile.outputStream().buffered()) + transformer.modifyOutputStream(zipOutputStream, true) + zipOutputStream.close() + + // Pull the data back out and make sure it was transformed + val cache = PluginCache() + val urlString = "jar:" + testableZipFile.toURI().toURL() + "!/" + PLUGIN_CACHE_FILE + cache.loadCacheFiles(Collections.enumeration(listOf(URL(urlString)))) + + assertThat(cache.getCategory("lookup")["date"]?.className) + .isEqualTo("new.location.org.apache.logging.log4j.core.lookup.DateLookup") + } + + private fun getResourceStream(resource: String = PLUGIN_CACHE_FILE): InputStream { + return this::class.java.classLoader.getResourceAsStream(resource) ?: throw FileNotFoundException("Resource not found: $resource") + } + + companion object { + private const val PLUGIN_CACHE_FILE = "META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat" + } +} From e90a0e5fcc78d9e9f075b4fe0a59c5b51f7ff371 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 4 Dec 2024 00:28:13 +0800 Subject: [PATCH 02/22] Revert "Add a new source set to share test kits (#1081)" This reverts commit 6c1920568d4c9c98ed5bb86ebf106a92ff63ef01. --- build.gradle.kts | 10 +--------- .../transformers/PropertiesFileTransformerSpec.groovy | 1 - .../shadow/transformers/TransformerSpecSupport.groovy | 3 +++ .../ApacheNoticeResourceTransformerTest.kt | 2 +- .../shadow/transformers/AppendingTransformerTest.kt | 2 +- .../transformers/ManifestAppenderTransformerTest.kt | 2 +- .../transformers/PropertiesFileTransformerTest.kt | 2 +- .../shadow/transformers/XmlAppendingTransformerTest.kt | 2 +- .../jengelman/gradle/plugins/shadow}/util/Utils.kt | 4 +--- 9 files changed, 10 insertions(+), 18 deletions(-) rename src/{testKit/kotlin/com/github/jengelman/gradle/plugins/shadow/testkit => test/kotlin/com/github/jengelman/gradle/plugins/shadow}/util/Utils.kt (65%) diff --git a/build.gradle.kts b/build.gradle.kts index bf84d0158..aa4265751 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -43,9 +43,6 @@ spotless { } } -val testKit: SourceSet by sourceSets.creating -val testKitImplementation: Configuration by configurations.getting - val intiTest: SourceSet by sourceSets.creating val intiTestImplementation: Configuration by configurations.getting { extendsFrom(configurations.testImplementation.get()) @@ -77,11 +74,6 @@ dependencies { implementation(libs.plexus.utils) implementation(libs.plexus.xml) - val mainOutput = sourceSets.main.map { it.output } - testKitImplementation(mainOutput) - testKitImplementation(gradleTestKit()) - - testImplementation(testKit.output) testImplementation(platform(libs.junit.bom)) testImplementation(libs.junit.jupiter) testImplementation(libs.assertk) @@ -93,7 +85,7 @@ dependencies { exclude(group = "org.codehaus.groovy") exclude(group = "org.hamcrest") } - funcTestImplementation(mainOutput) + funcTestImplementation(sourceSets.main.get().output) lintChecks(libs.androidx.gradlePluginLints) lintChecks(libs.assertk.lint) diff --git a/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerSpec.groovy b/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerSpec.groovy index 6fc067a6b..3bb3af5f6 100644 --- a/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerSpec.groovy +++ b/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerSpec.groovy @@ -22,7 +22,6 @@ package com.github.jengelman.gradle.plugins.shadow.transformers import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer.MergeStrategy import spock.lang.Unroll -import static com.github.jengelman.gradle.plugins.shadow.testkit.util.Utils.testObjectFactory import static groovy.lang.Closure.IDENTITY @Unroll diff --git a/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/TransformerSpecSupport.groovy b/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/TransformerSpecSupport.groovy index 86978937c..f7f999eb0 100644 --- a/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/TransformerSpecSupport.groovy +++ b/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/TransformerSpecSupport.groovy @@ -4,11 +4,14 @@ import com.github.jengelman.gradle.plugins.shadow.ShadowStats import org.gradle.api.file.FileTreeElement import org.gradle.api.file.RelativePath import org.gradle.api.internal.file.DefaultFileTreeElement +import org.gradle.testfixtures.ProjectBuilder import spock.lang.Shared import spock.lang.Specification class TransformerSpecSupport extends Specification { + protected static final def testObjectFactory = ProjectBuilder.builder().build().objects + @Shared ShadowStats stats diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformerTest.kt index f8cf651ff..05d013dbf 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformerTest.kt @@ -4,7 +4,7 @@ import assertk.assertThat import assertk.assertions.isFalse import assertk.assertions.isTrue import assertk.fail -import com.github.jengelman.gradle.plugins.shadow.testkit.util.testObjectFactory +import com.github.jengelman.gradle.plugins.shadow.util.testObjectFactory import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/AppendingTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/AppendingTransformerTest.kt index 681000705..b5eee7d89 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/AppendingTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/AppendingTransformerTest.kt @@ -3,7 +3,7 @@ package com.github.jengelman.gradle.plugins.shadow.transformers import assertk.assertThat import assertk.assertions.isFalse import assertk.assertions.isTrue -import com.github.jengelman.gradle.plugins.shadow.testkit.util.testObjectFactory +import com.github.jengelman.gradle.plugins.shadow.util.testObjectFactory import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ManifestAppenderTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ManifestAppenderTransformerTest.kt index 935c98da6..9c1e8c084 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ManifestAppenderTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ManifestAppenderTransformerTest.kt @@ -6,7 +6,7 @@ import assertk.assertions.isFalse import assertk.assertions.isGreaterThan import assertk.assertions.isNotEmpty import assertk.assertions.isTrue -import com.github.jengelman.gradle.plugins.shadow.testkit.util.testObjectFactory +import com.github.jengelman.gradle.plugins.shadow.util.testObjectFactory import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt index 81e084d43..3106cc9ba 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt @@ -6,7 +6,7 @@ import assertk.assertions.isEqualTo import assertk.assertions.isFalse import assertk.assertions.isNotEmpty import assertk.assertions.isTrue -import com.github.jengelman.gradle.plugins.shadow.testkit.util.testObjectFactory +import com.github.jengelman.gradle.plugins.shadow.util.testObjectFactory import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/XmlAppendingTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/XmlAppendingTransformerTest.kt index 32895d9fc..1eaf76436 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/XmlAppendingTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/XmlAppendingTransformerTest.kt @@ -3,7 +3,7 @@ package com.github.jengelman.gradle.plugins.shadow.transformers import assertk.assertThat import assertk.assertions.isFalse import assertk.assertions.isTrue -import com.github.jengelman.gradle.plugins.shadow.testkit.util.testObjectFactory +import com.github.jengelman.gradle.plugins.shadow.util.testObjectFactory import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test diff --git a/src/testKit/kotlin/com/github/jengelman/gradle/plugins/shadow/testkit/util/Utils.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/util/Utils.kt similarity index 65% rename from src/testKit/kotlin/com/github/jengelman/gradle/plugins/shadow/testkit/util/Utils.kt rename to src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/util/Utils.kt index 0785681b0..a6acfd481 100644 --- a/src/testKit/kotlin/com/github/jengelman/gradle/plugins/shadow/testkit/util/Utils.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/util/Utils.kt @@ -1,6 +1,4 @@ -@file:JvmName("Utils") - -package com.github.jengelman.gradle.plugins.shadow.testkit.util +package com.github.jengelman.gradle.plugins.shadow.util import org.gradle.api.model.ObjectFactory import org.gradle.testfixtures.ProjectBuilder From 3e2d2ff5abd2e5290cef35170772726444bd1cbf Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 4 Dec 2024 14:29:21 +0800 Subject: [PATCH 03/22] Use byteInputStream --- .../shadow/transformers/ApacheNoticeResourceTransformerTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformerTest.kt index 05d013dbf..efb0d71af 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformerTest.kt @@ -72,7 +72,7 @@ class ApacheNoticeResourceTransformerTest : TransformerTestSupport Date: Wed, 4 Dec 2024 14:35:29 +0800 Subject: [PATCH 04/22] Add inputStream extension for Properties --- .../gradle/plugins/shadow/internal/Utils.kt | 15 +++++++++++++++ .../transformers/PropertiesFileTransformer.kt | 13 ++----------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/Utils.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/Utils.kt index 0871a3a6c..caac4ed9a 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/Utils.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/Utils.kt @@ -1,7 +1,11 @@ package com.github.jengelman.gradle.plugins.shadow.internal +import java.io.ByteArrayInputStream +import java.io.ByteArrayOutputStream import java.io.File import java.io.InputStream +import java.nio.charset.Charset +import java.util.Properties import org.gradle.api.Project import org.gradle.api.artifacts.Configuration import org.gradle.api.file.RelativePath @@ -45,6 +49,17 @@ internal inline fun unsafeLazy(noinline initializer: () -> T): Lazy { return lazy(LazyThreadSafetyMode.NONE, initializer) } +internal fun Properties.inputStream( + charset: Charset = Charsets.UTF_8, + comments: String = "", +): ByteArrayInputStream { + val os = ByteArrayOutputStream() + os.writer(charset).use { writer -> + store(writer, comments) + } + return os.toByteArray().inputStream() +} + internal fun Class<*>.requireResourceAsText(name: String): String { return requireResourceAsStream(name).bufferedReader().readText() } diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformer.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformer.kt index b09a42921..cbdaf9b8c 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformer.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformer.kt @@ -1,13 +1,12 @@ package com.github.jengelman.gradle.plugins.shadow.transformers import com.github.jengelman.gradle.plugins.shadow.internal.CleanProperties +import com.github.jengelman.gradle.plugins.shadow.internal.inputStream import com.github.jengelman.gradle.plugins.shadow.internal.property import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer.MergeStrategy import groovy.lang.Closure import groovy.lang.Closure.IDENTITY -import java.io.ByteArrayOutputStream import java.io.InputStream -import java.io.InputStreamReader import java.nio.charset.Charset import java.util.Properties import javax.inject.Inject @@ -226,7 +225,7 @@ public open class PropertiesFileTransformer @Inject constructor( val entry = ZipEntry(path) entry.time = TransformerContext.getEntryTimestamp(preserveFileTimestamps, entry.time) os.putNextEntry(entry) - props.toReader().use { + props.inputStream(charset).reader(charset).use { it.copyTo(zipWriter) } zipWriter.flush() @@ -234,14 +233,6 @@ public open class PropertiesFileTransformer @Inject constructor( } } - private fun Properties.toReader(): InputStreamReader { - val os = ByteArrayOutputStream() - os.writer(charset).use { writer -> - store(writer, "") - } - return os.toByteArray().inputStream().reader(charset) - } - public enum class MergeStrategy { First, Latest, From 4b2d2b23b57e4063ed57b51044409373aa30703b Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 4 Dec 2024 14:58:46 +0800 Subject: [PATCH 05/22] Add util functions --- .../gradle/plugins/shadow/internal/Utils.kt | 2 +- .../Log4j2PluginsCacheFileTransformerTest.kt | 16 ++++--------- .../transformers/TransformerTestSupport.kt | 24 ++++++++++++++++++- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/Utils.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/Utils.kt index caac4ed9a..a8f116b35 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/Utils.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/Utils.kt @@ -50,7 +50,7 @@ internal inline fun unsafeLazy(noinline initializer: () -> T): Lazy { } internal fun Properties.inputStream( - charset: Charset = Charsets.UTF_8, + charset: Charset = Charsets.ISO_8859_1, comments: String = "", ): ByteArrayInputStream { val os = ByteArrayOutputStream() diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt index a1b0c0783..9c57e0390 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt @@ -5,8 +5,6 @@ import assertk.assertions.isEqualTo import assertk.assertions.isTrue import com.github.jengelman.gradle.plugins.shadow.relocation.SimpleRelocator import java.io.File -import java.io.FileNotFoundException -import java.io.InputStream import java.net.URL import java.util.Collections import org.apache.logging.log4j.core.config.plugins.processor.PluginCache @@ -23,14 +21,14 @@ class Log4j2PluginsCacheFileTransformerTest : TransformerTestSupport { get() = TransformerContext(MANIFEST_NAME, requireResourceAsStream(MANIFEST_NAME)) protected fun requireResourceAsStream(name: String): InputStream { - return this::class.java.classLoader.getResourceAsStream(name) ?: error("Resource $name not found.") + return this::class.java.classLoader.getResourceAsStream(name) ?: throw FileNotFoundException("Resource $name not found.") } protected companion object { const val MANIFEST_NAME: String = "META-INF/MANIFEST.MF" + val sharedStats = ShadowStats() fun getFileElement(path: String): FileTreeElement { return createDefaultFileTreeElement(relativePath = RelativePath.parse(true, path)) @@ -53,5 +59,21 @@ abstract class TransformerTestSupport { fun setupTurkishLocale() { Locale.setDefault(Locale("tr")) } + + fun Map.toProperties(): Properties { + return Properties().also { it.putAll(this) } + } + + fun Properties.toMap(): Map { + return entries.associate { it.key.toString() to it.value.toString() } + } + + fun context(path: String, input: Map, charset: Charset = Charsets.ISO_8859_1): TransformerContext { + return TransformerContext(path, input.toProperties().inputStream(charset), stats = sharedStats) + } + + fun context(path: String, input: String): TransformerContext { + return TransformerContext(path, input.byteInputStream(), stats = sharedStats) + } } } From 151e0aa0884136107e91a493240d6c1357f89b0b Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 4 Dec 2024 15:04:13 +0800 Subject: [PATCH 06/22] Tweak requireResourceAsStream --- .../github/jengelman/gradle/plugins/shadow/internal/Utils.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/Utils.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/Utils.kt index a8f116b35..61d774cd6 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/Utils.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/Utils.kt @@ -3,6 +3,7 @@ package com.github.jengelman.gradle.plugins.shadow.internal import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import java.io.File +import java.io.FileNotFoundException import java.io.InputStream import java.nio.charset.Charset import java.util.Properties @@ -65,7 +66,7 @@ internal fun Class<*>.requireResourceAsText(name: String): String { } private fun Class<*>.requireResourceAsStream(name: String): InputStream { - return getResourceAsStream(name) ?: error("Resource $name not found.") + return getResourceAsStream(name) ?: throw FileNotFoundException("Resource $name not found.") } private val DummyFile = File("dummy") From 88355fcb78a05e8a091554d0b89a6bc2a6901e18 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 4 Dec 2024 15:08:20 +0800 Subject: [PATCH 07/22] Optimize Log4j2PluginsCacheFileTransformerTest --- .../transformers/Log4j2PluginsCacheFileTransformerTest.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt index 9c57e0390..5b576a1ff 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt @@ -43,9 +43,9 @@ class Log4j2PluginsCacheFileTransformerTest : TransformerTestSupport + transformer.modifyOutputStream(zipOutputStream, true) + } // Pull the data back out and make sure it was transformed val cache = PluginCache() From 2445fec445ccf56e1ad2715d5e225a2ab68f43d5 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 4 Dec 2024 15:30:48 +0800 Subject: [PATCH 08/22] Convert ServiceFileTransformerSpec --- .../ServiceFileTransformerSpec.groovy | 63 ----------------- .../transformers/ServiceFileTransformer.kt | 4 +- .../ServiceFileTransformerTest.kt | 69 +++++++++++++++++++ 3 files changed, 72 insertions(+), 64 deletions(-) delete mode 100644 src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerSpec.groovy create mode 100644 src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerTest.kt diff --git a/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerSpec.groovy b/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerSpec.groovy deleted file mode 100644 index edee227ee..000000000 --- a/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerSpec.groovy +++ /dev/null @@ -1,63 +0,0 @@ -package com.github.jengelman.gradle.plugins.shadow.transformers - -import spock.lang.Unroll - -@Unroll -class ServiceFileTransformerSpec extends TransformerSpecSupport { - - def "#status path #path #transform transformed"() { - given: - def transformer = new ServiceFileTransformer() - if (exclude) { - transformer.exclude(path) - } - - when: - def actual = transformer.canTransformResource(getFileElement(path)) - - then: - actual == expected - - where: - path | exclude | expected - 'META-INF/services/java.sql.Driver' | false | true - 'META-INF/services/io.dropwizard.logging.AppenderFactory' | false | true - 'META-INF/services/org.apache.maven.Shade' | true | false - 'META-INF/services/foo/bar/moo.goo.Zoo' | false | true - 'foo/bar.properties' | false | false - 'foo.props' | false | false - - transform = expected ? 'can be' : 'can not be' - status = exclude ? 'excluded' : 'non-excluded' - } - - def "transforms service file"() { - given: - def element = getFileElement(path) - def transformer = new ServiceFileTransformer() - - when: - if (transformer.canTransformResource(element)) { - transformer.transform(context(path, input1)) - transformer.transform(context(path, input2)) - } - - then: - transformer.hasTransformedResource() - output == transformer.serviceEntries[path].toInputStream().text - - where: - path | input1 | input2 || output - 'META-INF/services/com.acme.Foo' | 'foo' | 'bar' || 'foo\nbar' - 'META-INF/services/com.acme.Bar' | 'foo\nbar' | 'zoo' || 'foo\nbar\nzoo' - } - - def "excludes Groovy extension module descriptor files by default"() { - given: - def transformer = new ServiceFileTransformer() - def element = getFileElement('META-INF/services/org.codehaus.groovy.runtime.ExtensionModule') - - expect: - !transformer.canTransformResource(element) - } -} diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.kt index 6d26c2a99..3f8023e64 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.kt @@ -11,6 +11,7 @@ import org.apache.tools.zip.ZipEntry import org.apache.tools.zip.ZipOutputStream import org.gradle.api.file.FileTreeElement import org.gradle.api.tasks.Input +import org.gradle.api.tasks.Internal import org.gradle.api.tasks.util.PatternFilterable import org.gradle.api.tasks.util.PatternSet @@ -34,7 +35,8 @@ public open class ServiceFileTransformer( .exclude(GROOVY_EXTENSION_MODULE_DESCRIPTOR_PATTERN), ) : Transformer, PatternFilterable by patternSet { - private val serviceEntries = mutableMapOf() + @get:Internal + internal val serviceEntries = mutableMapOf() override fun canTransformResource(element: FileTreeElement): Boolean { val target = if (element is ShadowCopyAction.ArchiveFileTreeElement) element.asFileTreeElement() else element diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerTest.kt new file mode 100644 index 000000000..5ff7604ea --- /dev/null +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerTest.kt @@ -0,0 +1,69 @@ +package com.github.jengelman.gradle.plugins.shadow.transformers + +import assertk.assertThat +import assertk.assertions.isEqualTo +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.Arguments +import org.junit.jupiter.params.provider.MethodSource + +class ServiceFileTransformerTest : TransformerTestSupport() { + @BeforeEach + fun setup() { + transformer = ServiceFileTransformer() + } + + @ParameterizedTest(name = "{index} => path={0}, exclude={1}, expected={2}") + @MethodSource("canTransformResourceData") + fun `test canTransformResource`(path: String, exclude: Boolean, expected: Boolean) { + if (exclude) { + transformer.exclude(path) + } + assertThat(transformer.canTransformResource(getFileElement(path))).isEqualTo(expected) + } + + @ParameterizedTest(name = "{index} => path={0}") + @MethodSource("transformsServiceFileData") + fun `test transforms service file`(path: String, input1: String, input2: String, output: String) { + val element = getFileElement(path) + val transformer = ServiceFileTransformer() + + if (transformer.canTransformResource(element)) { + transformer.transform(context(path, input1)) + transformer.transform(context(path, input2)) + } + + assertThat(transformer.hasTransformedResource()).isEqualTo(true) + val transformedText = transformer.serviceEntries.getValue(path).toInputStream().bufferedReader().readText() + assertThat(transformedText).isEqualTo(output) + } + + @Test + fun `test excludes Groovy extension module descriptor files by default`() { + val transformer = ServiceFileTransformer() + val element = getFileElement("META-INF/services/org.codehaus.groovy.runtime.ExtensionModule") + + assertThat(transformer.canTransformResource(element)).isEqualTo(false) + } + + private companion object { + @JvmStatic + fun canTransformResourceData() = listOf( + // path, exclude, expected + Arguments.of("META-INF/services/java.sql.Driver", false, true), + Arguments.of("META-INF/services/io.dropwizard.logging.AppenderFactory", false, true), + Arguments.of("META-INF/services/org.apache.maven.Shade", true, false), + Arguments.of("META-INF/services/foo/bar/moo.goo.Zoo", false, true), + Arguments.of("foo/bar.properties", false, false), + Arguments.of("foo.props", false, false), + ) + + @JvmStatic + fun transformsServiceFileData() = listOf( + // path, input1, input2, output + Arguments.of("META-INF/services/com.acme.Foo", "foo", "bar", "foo\nbar"), + Arguments.of("META-INF/services/com.acme.Bar", "foo\nbar", "zoo", "foo\nbar\nzoo"), + ) + } +} From 762c97ac43d0c0aba1e38c7ec738ab1ada8a6fc9 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 4 Dec 2024 15:58:46 +0800 Subject: [PATCH 09/22] Convert PropertiesFileTransformerSpec --- .../PropertiesFileTransformerSpec.groovy | 165 ---------- .../TransformerSpecSupport.groovy | 61 ---- .../transformers/PropertiesFileTransformer.kt | 4 +- .../PropertiesFileTransformerSpec.kt | 298 ++++++++++++++++++ 4 files changed, 301 insertions(+), 227 deletions(-) delete mode 100644 src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerSpec.groovy delete mode 100644 src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/TransformerSpecSupport.groovy create mode 100644 src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerSpec.kt diff --git a/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerSpec.groovy b/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerSpec.groovy deleted file mode 100644 index 3bb3af5f6..000000000 --- a/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerSpec.groovy +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 com.github.jengelman.gradle.plugins.shadow.transformers - -import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer.MergeStrategy -import spock.lang.Unroll - -import static groovy.lang.Closure.IDENTITY - -@Unroll -class PropertiesFileTransformerSpec extends TransformerSpecSupport { - - void "Path #path #transform transformed"() { - given: - Transformer transformer = new PropertiesFileTransformer(testObjectFactory) - - when: - boolean actual = transformer.canTransformResource(getFileElement(path)) - - then: - actual == expected - - where: - path || expected - 'foo.properties' || true - 'foo/bar.properties' || true - 'foo.props' || false - - transform = expected ? 'can be' : 'can not be' - } - - void exerciseAllTransformConfigurations() { - given: - def element = getFileElement(path) - Transformer transformer = new PropertiesFileTransformer(testObjectFactory) - transformer.mergeStrategy.set(MergeStrategy.from(mergeStrategy)) - transformer.mergeSeparator.set(mergeSeparator) - - when: - if (transformer.canTransformResource(element)) { - transformer.transform(context(path, input1)) - transformer.transform(context(path, input2)) - } - - then: - output == toMap(transformer.propertiesEntries[path]) - - where: - path | mergeStrategy | mergeSeparator | input1 | input2 || output - 'f.properties' | 'first' | '' | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'foo'] - 'f.properties' | 'latest' | '' | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'bar'] - 'f.properties' | 'append' | ',' | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'foo,bar'] - 'f.properties' | 'append' | ';' | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'foo;bar'] - } - - void exerciseAllTransformConfigurationsWithPaths() { - given: - def element = getFileElement(path) - Transformer transformer = new PropertiesFileTransformer(testObjectFactory) - transformer.paths.set(paths) - transformer.mergeStrategy.set(MergeStrategy.from('first')) - - when: - if (transformer.canTransformResource(element)) { - transformer.transform(context(path, input1)) - transformer.transform(context(path, input2)) - } - - then: - output == toMap(transformer.propertiesEntries[path]) - - where: - path | paths | input1 | input2 || output - 'f.properties' | ['f.properties'] | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'foo'] - 'foo.properties' | ['.*.properties'] | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'foo'] - 'foo.properties' | ['.*bar'] | ['foo': 'foo'] | ['foo': 'bar'] || [:] - 'foo.properties' | [] | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'foo'] - } - - void exerciseAllTransformConfigurationsWithMappings() { - given: - def element = getFileElement(path) - Transformer transformer = new PropertiesFileTransformer(testObjectFactory) - transformer.mappings.set(mappings) - transformer.mergeStrategy.set(MergeStrategy.from('latest')) - - when: - if (transformer.canTransformResource(element)) { - transformer.transform(context(path, input1)) - transformer.transform(context(path, input2)) - } - - then: - output == toMap(transformer.propertiesEntries[path]) - - where: - path | mappings | input1 | input2 || output - 'f.properties' | ['f.properties': [mergeStrategy: 'first']] | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'foo'] - 'f.properties' | ['f.properties': [mergeStrategy: 'latest']] | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'bar'] - 'f.properties' | ['f.properties': [mergeStrategy: 'append']] | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'foo,bar'] - 'f.properties' | ['f.properties': [mergeStrategy: 'append', mergeSeparator: ';']] | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'foo;bar'] - 'foo.properties' | ['.*.properties': [mergeStrategy: 'first']] | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'foo'] - 'foo.properties' | ['.*bar': [mergeStrategy: 'first']] | ['foo': 'foo'] | ['foo': 'bar'] || [:] - } - - void appliesKeyTransformer() { - given: - def element = getFileElement(path) - Transformer transformer = new PropertiesFileTransformer(testObjectFactory) - transformer.keyTransformer.set(keyTransformer) - transformer.mergeStrategy.set(MergeStrategy.from('append')) - - when: - if (transformer.canTransformResource(element)) { - transformer.transform(context(path, input1)) - transformer.transform(context(path, input2)) - } - - then: - output == toMap(transformer.propertiesEntries[path]) - - where: - path | keyTransformer | input1 | input2 || output - 'foo.properties' | IDENTITY | ['foo': 'bar'] | ['FOO': 'baz'] || ['foo': 'bar', 'FOO': 'baz'] - 'foo.properties' | { key -> key.toUpperCase() } | ['foo': 'bar'] | ['FOO': 'baz'] || ['FOO': 'bar,baz'] - 'foo.properties' | { key -> 'bar.' + key.toLowerCase() } | ['foo': 'bar'] | ['FOO': 'baz'] || ['bar.foo': 'bar,baz'] - 'foo.properties' | { key -> key.replaceAll('^(foo)', 'bar.$1') } | ['foo': 'bar'] | ['FOO': 'baz'] || ['bar.foo': 'bar', 'FOO': 'baz'] - } - - void appliesCharset() { - given: - def element = getFileElement(path) - def transformer = new PropertiesFileTransformer(testObjectFactory) - transformer.charsetName.set(charset) - - when: - if (transformer.canTransformResource(element)) { - transformer.transform(context(path, input, charset)) - } - - then: - output == toMap(transformer.propertiesEntries[path]) - - where: - path | charset | input || output - 'utf8.properties' | 'utf-8' | ['foo': '传傳磨宿说説'] || ['foo': '传傳磨宿说説'] - } -} diff --git a/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/TransformerSpecSupport.groovy b/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/TransformerSpecSupport.groovy deleted file mode 100644 index f7f999eb0..000000000 --- a/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/TransformerSpecSupport.groovy +++ /dev/null @@ -1,61 +0,0 @@ -package com.github.jengelman.gradle.plugins.shadow.transformers - -import com.github.jengelman.gradle.plugins.shadow.ShadowStats -import org.gradle.api.file.FileTreeElement -import org.gradle.api.file.RelativePath -import org.gradle.api.internal.file.DefaultFileTreeElement -import org.gradle.testfixtures.ProjectBuilder -import spock.lang.Shared -import spock.lang.Specification - -class TransformerSpecSupport extends Specification { - - protected static final def testObjectFactory = ProjectBuilder.builder().build().objects - - @Shared - ShadowStats stats - - def setup() { - stats = new ShadowStats() - } - - protected static FileTreeElement getFileElement(String path) { - // TODO: this should be replace with `createDefaultFileTreeElement` once this test gets migrated to Kotlin. - return new DefaultFileTreeElement(null, RelativePath.parse(true, path), null, null) - } - - protected static InputStream toInputStream(String str) { - return new ByteArrayInputStream(str.bytes) - } - - protected static InputStream toInputStream(Properties props, String charset) { - ByteArrayOutputStream baos = new ByteArrayOutputStream() - baos.withWriter(charset) { w -> - props.store(w, '') - } - new ByteArrayInputStream(baos.toByteArray()) - } - - protected static Properties toProperties(Map map) { - map.inject(new Properties()) { Properties props, entry -> - props.put(entry.key, entry.value) - props - } - } - - protected static Map toMap(Properties props) { - props.inject([:]) { Map map, entry -> - map.put(entry.key, entry.value) - map - } - } - - protected TransformerContext context(String path, Map input, String charset = 'ISO_8859_1') { - TransformerContext.builder().path(path).inputStream(toInputStream(toProperties(input), charset)).stats(stats).build() - } - - protected TransformerContext context(String path, String input) { - TransformerContext.builder().path(path).inputStream(toInputStream(input)).stats(stats).build() - } - -} diff --git a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformer.kt b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformer.kt index cbdaf9b8c..1e3a80a5d 100644 --- a/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformer.kt +++ b/src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformer.kt @@ -101,9 +101,11 @@ import org.gradle.api.tasks.Internal public open class PropertiesFileTransformer @Inject constructor( final override val objectFactory: ObjectFactory, ) : Transformer { - private val propertiesEntries = mutableMapOf() private inline val charset get() = Charset.forName(charsetName.get()) + @get:Internal + internal val propertiesEntries = mutableMapOf() + @get:Input public open val paths: ListProperty = objectFactory.listProperty(String::class.java) diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerSpec.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerSpec.kt new file mode 100644 index 000000000..f80cfe971 --- /dev/null +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerSpec.kt @@ -0,0 +1,298 @@ +package com.github.jengelman.gradle.plugins.shadow.transformers + +import assertk.assertThat +import assertk.assertions.isEqualTo +import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer.MergeStrategy +import com.github.jengelman.gradle.plugins.shadow.util.testObjectFactory +import groovy.lang.Closure +import java.nio.charset.Charset +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.Arguments +import org.junit.jupiter.params.provider.MethodSource + +class PropertiesFileTransformerSpec : TransformerTestSupport() { + + @BeforeEach + fun setup() { + transformer = PropertiesFileTransformer(testObjectFactory) + } + + @ParameterizedTest(name = "Path {0} {2} transformed") + @MethodSource("pathProvider") + fun `test canTransformResource with paths`(path: String, expected: Boolean, transform: String) { + assertThat(transformer.canTransformResource(getFileElement(path))).isEqualTo(expected) + } + + @ParameterizedTest(name = "mergeStrategy={1}, mergeSeparator='{2}'") + @MethodSource("transformConfigurationsProvider") + fun `test exerciseAllTransformConfigurations`( + path: String, + mergeStrategy: String, + mergeSeparator: String, + input1: Map, + input2: Map, + expectedOutput: Map, + ) { + val element = getFileElement(path) + transformer.mergeStrategy.set(MergeStrategy.from(mergeStrategy)) + transformer.mergeSeparator.set(mergeSeparator) + + if (transformer.canTransformResource(element)) { + transformer.transform(context(path, input1)) + transformer.transform(context(path, input2)) + } + + assertThat(transformer.propertiesEntries[path].orEmpty()).isEqualTo(expectedOutput) + } + + @ParameterizedTest(name = "Paths={1}") + @MethodSource("transformConfigurationsWithPathsProvider") + fun `test exerciseAllTransformConfigurationsWithPaths`( + path: String, + paths: List, + input1: Map, + input2: Map, + expectedOutput: Map, + ) { + val element = getFileElement(path) + transformer.paths.set(paths) + transformer.mergeStrategy.set(MergeStrategy.from("first")) + + if (transformer.canTransformResource(element)) { + transformer.transform(context(path, input1)) + transformer.transform(context(path, input2)) + } + + assertThat(transformer.propertiesEntries[path].orEmpty()).isEqualTo(expectedOutput) + } + + @ParameterizedTest(name = "Mappings={1}") + @MethodSource("transformConfigurationsWithMappingsProvider") + fun `test exerciseAllTransformConfigurationsWithMappings`( + path: String, + mappings: Map>, + input1: Map, + input2: Map, + expectedOutput: Map, + ) { + val element = getFileElement(path) + transformer.mappings.set(mappings) + transformer.mergeStrategy.set(MergeStrategy.from("latest")) + + if (transformer.canTransformResource(element)) { + transformer.transform(context(path, input1)) + transformer.transform(context(path, input2)) + } + + assertThat(transformer.propertiesEntries[path].orEmpty()).isEqualTo(expectedOutput) + } + + @ParameterizedTest(name = "KeyTransformer: {1}") + @MethodSource("appliesKeyTransformerProvider") + fun `test appliesKeyTransformer`( + path: String, + keyTransformer: (String) -> String, + input1: Map, + input2: Map, + expectedOutput: Map, + ) { + val element = getFileElement(path) + transformer.keyTransformer.set(object : Closure(null) { + override fun call(vararg arguments: Any?): String { + return keyTransformer.invoke(arguments.first() as String) + } + }) + transformer.mergeStrategy.set(MergeStrategy.from("append")) + + if (transformer.canTransformResource(element)) { + transformer.transform(context(path, input1)) + transformer.transform(context(path, input2)) + } + + assertThat(transformer.propertiesEntries[path].orEmpty()).isEqualTo(expectedOutput) + } + + @ParameterizedTest(name = "Charset: {1}") + @MethodSource("appliesCharsetProvider") + fun `test appliesCharset`( + path: String, + charset: String, + input: Map, + expectedOutput: Map, + ) { + val element = getFileElement(path) + transformer.charsetName.set(charset) + + if (transformer.canTransformResource(element)) { + transformer.transform(context(path, input, Charset.forName(charset))) + } + + assertThat(transformer.propertiesEntries[path].orEmpty()).isEqualTo(expectedOutput) + } + + private companion object { + @JvmStatic + fun pathProvider() = listOf( + Arguments.of("foo.properties", true, "can be"), + Arguments.of("foo/bar.properties", true, "can be"), + Arguments.of("foo.props", false, "can not be"), + ) + + @JvmStatic + fun appliesCharsetProvider() = listOf( + Arguments.of( + "utf8.properties", + "utf-8", + mapOf("foo" to "传傳磨宿说説"), + mapOf("foo" to "传傳磨宿说説"), + ), + ) + + @JvmStatic + fun transformConfigurationsWithPathsProvider() = listOf( + Arguments.of( + "f.properties", + listOf("f.properties"), + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "foo"), + ), + Arguments.of( + "foo.properties", + listOf(".*.properties"), + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "foo"), + ), + Arguments.of( + "foo.properties", + listOf(".*bar"), + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + emptyMap(), + ), + Arguments.of( + "foo.properties", + emptyList(), + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "foo"), + ), + ) + + @JvmStatic + fun transformConfigurationsWithMappingsProvider() = listOf( + Arguments.of( + "f.properties", + mapOf("f.properties" to mapOf("mergeStrategy" to "first")), + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "foo"), + ), + Arguments.of( + "f.properties", + mapOf("f.properties" to mapOf("mergeStrategy" to "latest")), + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "bar"), + ), + Arguments.of( + "f.properties", + mapOf("f.properties" to mapOf("mergeStrategy" to "append")), + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "foo,bar"), + ), + Arguments.of( + "f.properties", + mapOf("f.properties" to mapOf("mergeStrategy" to "append", "mergeSeparator" to ";")), + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "foo;bar"), + ), + Arguments.of( + "foo.properties", + mapOf(".*.properties" to mapOf("mergeStrategy" to "first")), + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "foo"), + ), + Arguments.of( + "foo.properties", + mapOf(".*bar" to mapOf("mergeStrategy" to "first")), + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + emptyMap(), + ), + ) + + @JvmStatic + fun transformConfigurationsProvider() = listOf( + Arguments.of( + "f.properties", + "first", + "", + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "foo"), + ), + Arguments.of( + "f.properties", + "latest", + "", + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "bar"), + ), + Arguments.of( + "f.properties", + "append", + ",", + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "foo,bar"), + ), + Arguments.of( + "f.properties", + "append", + ";", + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "foo;bar"), + ), + ) + + @JvmStatic + fun appliesKeyTransformerProvider() = listOf( + Arguments.of( + "foo.properties", + { key: String -> key }, + mapOf("foo" to "bar"), + mapOf("FOO" to "baz"), + mapOf("foo" to "bar", "FOO" to "baz"), + ), + Arguments.of( + "foo.properties", + { key: String -> key.uppercase() }, + mapOf("foo" to "bar"), + mapOf("FOO" to "baz"), + mapOf("FOO" to "bar,baz"), + ), + Arguments.of( + "foo.properties", + { key: String -> "bar.${key.lowercase()}" }, + mapOf("foo" to "bar"), + mapOf("FOO" to "baz"), + mapOf("bar.foo" to "bar,baz"), + ), + Arguments.of( + "foo.properties", + { key: String -> key.replaceFirst(Regex("^(foo)"), "bar.$1") }, + mapOf("foo" to "bar"), + mapOf("FOO" to "baz"), + mapOf("bar.foo" to "bar", "FOO" to "baz"), + ), + ) + } +} From 321f90ec59845b794a42f62b32edf6717a00dc48 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 4 Dec 2024 16:09:51 +0800 Subject: [PATCH 10/22] Merge PropertiesFileTransformerTest --- .../PropertiesFileTransformerSpec.kt | 298 ------------------ .../PropertiesFileTransformerTest.kt | 284 +++++++++++++++++ 2 files changed, 284 insertions(+), 298 deletions(-) delete mode 100644 src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerSpec.kt diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerSpec.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerSpec.kt deleted file mode 100644 index f80cfe971..000000000 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerSpec.kt +++ /dev/null @@ -1,298 +0,0 @@ -package com.github.jengelman.gradle.plugins.shadow.transformers - -import assertk.assertThat -import assertk.assertions.isEqualTo -import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer.MergeStrategy -import com.github.jengelman.gradle.plugins.shadow.util.testObjectFactory -import groovy.lang.Closure -import java.nio.charset.Charset -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.Arguments -import org.junit.jupiter.params.provider.MethodSource - -class PropertiesFileTransformerSpec : TransformerTestSupport() { - - @BeforeEach - fun setup() { - transformer = PropertiesFileTransformer(testObjectFactory) - } - - @ParameterizedTest(name = "Path {0} {2} transformed") - @MethodSource("pathProvider") - fun `test canTransformResource with paths`(path: String, expected: Boolean, transform: String) { - assertThat(transformer.canTransformResource(getFileElement(path))).isEqualTo(expected) - } - - @ParameterizedTest(name = "mergeStrategy={1}, mergeSeparator='{2}'") - @MethodSource("transformConfigurationsProvider") - fun `test exerciseAllTransformConfigurations`( - path: String, - mergeStrategy: String, - mergeSeparator: String, - input1: Map, - input2: Map, - expectedOutput: Map, - ) { - val element = getFileElement(path) - transformer.mergeStrategy.set(MergeStrategy.from(mergeStrategy)) - transformer.mergeSeparator.set(mergeSeparator) - - if (transformer.canTransformResource(element)) { - transformer.transform(context(path, input1)) - transformer.transform(context(path, input2)) - } - - assertThat(transformer.propertiesEntries[path].orEmpty()).isEqualTo(expectedOutput) - } - - @ParameterizedTest(name = "Paths={1}") - @MethodSource("transformConfigurationsWithPathsProvider") - fun `test exerciseAllTransformConfigurationsWithPaths`( - path: String, - paths: List, - input1: Map, - input2: Map, - expectedOutput: Map, - ) { - val element = getFileElement(path) - transformer.paths.set(paths) - transformer.mergeStrategy.set(MergeStrategy.from("first")) - - if (transformer.canTransformResource(element)) { - transformer.transform(context(path, input1)) - transformer.transform(context(path, input2)) - } - - assertThat(transformer.propertiesEntries[path].orEmpty()).isEqualTo(expectedOutput) - } - - @ParameterizedTest(name = "Mappings={1}") - @MethodSource("transformConfigurationsWithMappingsProvider") - fun `test exerciseAllTransformConfigurationsWithMappings`( - path: String, - mappings: Map>, - input1: Map, - input2: Map, - expectedOutput: Map, - ) { - val element = getFileElement(path) - transformer.mappings.set(mappings) - transformer.mergeStrategy.set(MergeStrategy.from("latest")) - - if (transformer.canTransformResource(element)) { - transformer.transform(context(path, input1)) - transformer.transform(context(path, input2)) - } - - assertThat(transformer.propertiesEntries[path].orEmpty()).isEqualTo(expectedOutput) - } - - @ParameterizedTest(name = "KeyTransformer: {1}") - @MethodSource("appliesKeyTransformerProvider") - fun `test appliesKeyTransformer`( - path: String, - keyTransformer: (String) -> String, - input1: Map, - input2: Map, - expectedOutput: Map, - ) { - val element = getFileElement(path) - transformer.keyTransformer.set(object : Closure(null) { - override fun call(vararg arguments: Any?): String { - return keyTransformer.invoke(arguments.first() as String) - } - }) - transformer.mergeStrategy.set(MergeStrategy.from("append")) - - if (transformer.canTransformResource(element)) { - transformer.transform(context(path, input1)) - transformer.transform(context(path, input2)) - } - - assertThat(transformer.propertiesEntries[path].orEmpty()).isEqualTo(expectedOutput) - } - - @ParameterizedTest(name = "Charset: {1}") - @MethodSource("appliesCharsetProvider") - fun `test appliesCharset`( - path: String, - charset: String, - input: Map, - expectedOutput: Map, - ) { - val element = getFileElement(path) - transformer.charsetName.set(charset) - - if (transformer.canTransformResource(element)) { - transformer.transform(context(path, input, Charset.forName(charset))) - } - - assertThat(transformer.propertiesEntries[path].orEmpty()).isEqualTo(expectedOutput) - } - - private companion object { - @JvmStatic - fun pathProvider() = listOf( - Arguments.of("foo.properties", true, "can be"), - Arguments.of("foo/bar.properties", true, "can be"), - Arguments.of("foo.props", false, "can not be"), - ) - - @JvmStatic - fun appliesCharsetProvider() = listOf( - Arguments.of( - "utf8.properties", - "utf-8", - mapOf("foo" to "传傳磨宿说説"), - mapOf("foo" to "传傳磨宿说説"), - ), - ) - - @JvmStatic - fun transformConfigurationsWithPathsProvider() = listOf( - Arguments.of( - "f.properties", - listOf("f.properties"), - mapOf("foo" to "foo"), - mapOf("foo" to "bar"), - mapOf("foo" to "foo"), - ), - Arguments.of( - "foo.properties", - listOf(".*.properties"), - mapOf("foo" to "foo"), - mapOf("foo" to "bar"), - mapOf("foo" to "foo"), - ), - Arguments.of( - "foo.properties", - listOf(".*bar"), - mapOf("foo" to "foo"), - mapOf("foo" to "bar"), - emptyMap(), - ), - Arguments.of( - "foo.properties", - emptyList(), - mapOf("foo" to "foo"), - mapOf("foo" to "bar"), - mapOf("foo" to "foo"), - ), - ) - - @JvmStatic - fun transformConfigurationsWithMappingsProvider() = listOf( - Arguments.of( - "f.properties", - mapOf("f.properties" to mapOf("mergeStrategy" to "first")), - mapOf("foo" to "foo"), - mapOf("foo" to "bar"), - mapOf("foo" to "foo"), - ), - Arguments.of( - "f.properties", - mapOf("f.properties" to mapOf("mergeStrategy" to "latest")), - mapOf("foo" to "foo"), - mapOf("foo" to "bar"), - mapOf("foo" to "bar"), - ), - Arguments.of( - "f.properties", - mapOf("f.properties" to mapOf("mergeStrategy" to "append")), - mapOf("foo" to "foo"), - mapOf("foo" to "bar"), - mapOf("foo" to "foo,bar"), - ), - Arguments.of( - "f.properties", - mapOf("f.properties" to mapOf("mergeStrategy" to "append", "mergeSeparator" to ";")), - mapOf("foo" to "foo"), - mapOf("foo" to "bar"), - mapOf("foo" to "foo;bar"), - ), - Arguments.of( - "foo.properties", - mapOf(".*.properties" to mapOf("mergeStrategy" to "first")), - mapOf("foo" to "foo"), - mapOf("foo" to "bar"), - mapOf("foo" to "foo"), - ), - Arguments.of( - "foo.properties", - mapOf(".*bar" to mapOf("mergeStrategy" to "first")), - mapOf("foo" to "foo"), - mapOf("foo" to "bar"), - emptyMap(), - ), - ) - - @JvmStatic - fun transformConfigurationsProvider() = listOf( - Arguments.of( - "f.properties", - "first", - "", - mapOf("foo" to "foo"), - mapOf("foo" to "bar"), - mapOf("foo" to "foo"), - ), - Arguments.of( - "f.properties", - "latest", - "", - mapOf("foo" to "foo"), - mapOf("foo" to "bar"), - mapOf("foo" to "bar"), - ), - Arguments.of( - "f.properties", - "append", - ",", - mapOf("foo" to "foo"), - mapOf("foo" to "bar"), - mapOf("foo" to "foo,bar"), - ), - Arguments.of( - "f.properties", - "append", - ";", - mapOf("foo" to "foo"), - mapOf("foo" to "bar"), - mapOf("foo" to "foo;bar"), - ), - ) - - @JvmStatic - fun appliesKeyTransformerProvider() = listOf( - Arguments.of( - "foo.properties", - { key: String -> key }, - mapOf("foo" to "bar"), - mapOf("FOO" to "baz"), - mapOf("foo" to "bar", "FOO" to "baz"), - ), - Arguments.of( - "foo.properties", - { key: String -> key.uppercase() }, - mapOf("foo" to "bar"), - mapOf("FOO" to "baz"), - mapOf("FOO" to "bar,baz"), - ), - Arguments.of( - "foo.properties", - { key: String -> "bar.${key.lowercase()}" }, - mapOf("foo" to "bar"), - mapOf("FOO" to "baz"), - mapOf("bar.foo" to "bar,baz"), - ), - Arguments.of( - "foo.properties", - { key: String -> key.replaceFirst(Regex("^(foo)"), "bar.$1") }, - mapOf("foo" to "bar"), - mapOf("FOO" to "baz"), - mapOf("bar.foo" to "bar", "FOO" to "baz"), - ), - ) - } -} diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt index 3106cc9ba..33fe7e151 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt @@ -6,9 +6,15 @@ import assertk.assertions.isEqualTo import assertk.assertions.isFalse import assertk.assertions.isNotEmpty import assertk.assertions.isTrue +import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer.MergeStrategy import com.github.jengelman.gradle.plugins.shadow.util.testObjectFactory +import groovy.lang.Closure +import java.nio.charset.Charset import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.Arguments +import org.junit.jupiter.params.provider.MethodSource class PropertiesFileTransformerTest : TransformerTestSupport() { @@ -54,4 +60,282 @@ class PropertiesFileTransformerTest : TransformerTestSupport, + input2: Map, + expectedOutput: Map, + ) { + val element = getFileElement(path) + transformer.mergeStrategy.set(MergeStrategy.from(mergeStrategy)) + transformer.mergeSeparator.set(mergeSeparator) + + if (transformer.canTransformResource(element)) { + transformer.transform(context(path, input1)) + transformer.transform(context(path, input2)) + } + + assertThat(transformer.propertiesEntries[path].orEmpty()).isEqualTo(expectedOutput) + } + + @ParameterizedTest(name = "Paths={1}") + @MethodSource("transformConfigurationsWithPathsProvider") + fun `test exerciseAllTransformConfigurationsWithPaths`( + path: String, + paths: List, + input1: Map, + input2: Map, + expectedOutput: Map, + ) { + val element = getFileElement(path) + transformer.paths.set(paths) + transformer.mergeStrategy.set(MergeStrategy.from("first")) + + if (transformer.canTransformResource(element)) { + transformer.transform(context(path, input1)) + transformer.transform(context(path, input2)) + } + + assertThat(transformer.propertiesEntries[path].orEmpty()).isEqualTo(expectedOutput) + } + + @ParameterizedTest(name = "Mappings={1}") + @MethodSource("transformConfigurationsWithMappingsProvider") + fun `test exerciseAllTransformConfigurationsWithMappings`( + path: String, + mappings: Map>, + input1: Map, + input2: Map, + expectedOutput: Map, + ) { + val element = getFileElement(path) + transformer.mappings.set(mappings) + transformer.mergeStrategy.set(MergeStrategy.from("latest")) + + if (transformer.canTransformResource(element)) { + transformer.transform(context(path, input1)) + transformer.transform(context(path, input2)) + } + + assertThat(transformer.propertiesEntries[path].orEmpty()).isEqualTo(expectedOutput) + } + + @ParameterizedTest(name = "KeyTransformer: {1}") + @MethodSource("appliesKeyTransformerProvider") + fun `test appliesKeyTransformer`( + path: String, + keyTransformer: (String) -> String, + input1: Map, + input2: Map, + expectedOutput: Map, + ) { + val element = getFileElement(path) + transformer.keyTransformer.set(object : Closure(null) { + override fun call(vararg arguments: Any?): String { + return keyTransformer.invoke(arguments.first() as String) + } + }) + transformer.mergeStrategy.set(MergeStrategy.from("append")) + + if (transformer.canTransformResource(element)) { + transformer.transform(context(path, input1)) + transformer.transform(context(path, input2)) + } + + assertThat(transformer.propertiesEntries[path].orEmpty()).isEqualTo(expectedOutput) + } + + @ParameterizedTest(name = "Charset: {1}") + @MethodSource("appliesCharsetProvider") + fun `test appliesCharset`( + path: String, + charset: String, + input: Map, + expectedOutput: Map, + ) { + val element = getFileElement(path) + transformer.charsetName.set(charset) + + if (transformer.canTransformResource(element)) { + transformer.transform(context(path, input, Charset.forName(charset))) + } + + assertThat(transformer.propertiesEntries[path].orEmpty()).isEqualTo(expectedOutput) + } + + private companion object { + @JvmStatic + fun pathProvider() = listOf( + Arguments.of("foo.properties", true, "can be"), + Arguments.of("foo/bar.properties", true, "can be"), + Arguments.of("foo.props", false, "can not be"), + ) + + @JvmStatic + fun appliesCharsetProvider() = listOf( + Arguments.of( + "utf8.properties", + "utf-8", + mapOf("foo" to "传傳磨宿说説"), + mapOf("foo" to "传傳磨宿说説"), + ), + ) + + @JvmStatic + fun transformConfigurationsWithPathsProvider() = listOf( + Arguments.of( + "f.properties", + listOf("f.properties"), + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "foo"), + ), + Arguments.of( + "foo.properties", + listOf(".*.properties"), + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "foo"), + ), + Arguments.of( + "foo.properties", + listOf(".*bar"), + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + emptyMap(), + ), + Arguments.of( + "foo.properties", + emptyList(), + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "foo"), + ), + ) + + @JvmStatic + fun transformConfigurationsWithMappingsProvider() = listOf( + Arguments.of( + "f.properties", + mapOf("f.properties" to mapOf("mergeStrategy" to "first")), + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "foo"), + ), + Arguments.of( + "f.properties", + mapOf("f.properties" to mapOf("mergeStrategy" to "latest")), + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "bar"), + ), + Arguments.of( + "f.properties", + mapOf("f.properties" to mapOf("mergeStrategy" to "append")), + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "foo,bar"), + ), + Arguments.of( + "f.properties", + mapOf("f.properties" to mapOf("mergeStrategy" to "append", "mergeSeparator" to ";")), + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "foo;bar"), + ), + Arguments.of( + "foo.properties", + mapOf(".*.properties" to mapOf("mergeStrategy" to "first")), + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "foo"), + ), + Arguments.of( + "foo.properties", + mapOf(".*bar" to mapOf("mergeStrategy" to "first")), + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + emptyMap(), + ), + ) + + @JvmStatic + fun transformConfigurationsProvider() = listOf( + Arguments.of( + "f.properties", + "first", + "", + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "foo"), + ), + Arguments.of( + "f.properties", + "latest", + "", + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "bar"), + ), + Arguments.of( + "f.properties", + "append", + ",", + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "foo,bar"), + ), + Arguments.of( + "f.properties", + "append", + ";", + mapOf("foo" to "foo"), + mapOf("foo" to "bar"), + mapOf("foo" to "foo;bar"), + ), + ) + + @JvmStatic + fun appliesKeyTransformerProvider() = listOf( + Arguments.of( + "foo.properties", + { key: String -> key }, + mapOf("foo" to "bar"), + mapOf("FOO" to "baz"), + mapOf("foo" to "bar", "FOO" to "baz"), + ), + Arguments.of( + "foo.properties", + { key: String -> key.uppercase() }, + mapOf("foo" to "bar"), + mapOf("FOO" to "baz"), + mapOf("FOO" to "bar,baz"), + ), + Arguments.of( + "foo.properties", + { key: String -> "bar.${key.lowercase()}" }, + mapOf("foo" to "bar"), + mapOf("FOO" to "baz"), + mapOf("bar.foo" to "bar,baz"), + ), + Arguments.of( + "foo.properties", + { key: String -> key.replaceFirst(Regex("^(foo)"), "bar.$1") }, + mapOf("foo" to "bar"), + mapOf("FOO" to "baz"), + mapOf("bar.foo" to "bar", "FOO" to "baz"), + ), + ) + } } From 9dc60d7f4baa4381beafadc05bc8c1ca838c4b89 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 4 Dec 2024 16:10:51 +0800 Subject: [PATCH 11/22] Rename TransformerTestSupport to BaseTransformerTest --- .../shadow/transformers/ApacheLicenseResourceTransformerTest.kt | 2 +- .../shadow/transformers/ApacheNoticeResourceTransformerTest.kt | 2 +- .../plugins/shadow/transformers/AppendingTransformerTest.kt | 2 +- .../{TransformerTestSupport.kt => BaseTransformerTest.kt} | 2 +- .../shadow/transformers/ComponentsXmlResourceTransformerTest.kt | 2 +- .../transformers/Log4j2PluginsCacheFileTransformerTest.kt | 2 +- .../shadow/transformers/ManifestAppenderTransformerTest.kt | 2 +- .../shadow/transformers/PropertiesFileTransformerTest.kt | 2 +- .../plugins/shadow/transformers/ServiceFileTransformerTest.kt | 2 +- .../plugins/shadow/transformers/XmlAppendingTransformerTest.kt | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) rename src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/{TransformerTestSupport.kt => BaseTransformerTest.kt} (98%) diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformerTest.kt index 407721fed..12372602c 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformerTest.kt @@ -9,7 +9,7 @@ import org.junit.jupiter.api.Test /** * Modified from [org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformerTest.java](https://github.com/apache/maven-shade-plugin/blob/master/src/test/java/org/apache/maven/plugins/shade/resource/ApacheLicenseResourceTransformerTest.java). */ -class ApacheLicenseResourceTransformerTest : TransformerTestSupport() { +class ApacheLicenseResourceTransformerTest : BaseTransformerTest() { init { setupTurkishLocale() diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformerTest.kt index efb0d71af..a9a89c2ff 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheNoticeResourceTransformerTest.kt @@ -11,7 +11,7 @@ import org.junit.jupiter.api.Test /** * Modified from [org.apache.maven.plugins.shade.resource.ApacheNoticeResourceTransformerParameterTests.java](https://github.com/apache/maven-shade-plugin/blob/master/src/test/java/org/apache/maven/plugins/shade/resource/ApacheNoticeResourceTransformerParameterTests.java). */ -class ApacheNoticeResourceTransformerTest : TransformerTestSupport() { +class ApacheNoticeResourceTransformerTest : BaseTransformerTest() { init { setupTurkishLocale() diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/AppendingTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/AppendingTransformerTest.kt index b5eee7d89..7ca08f1d3 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/AppendingTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/AppendingTransformerTest.kt @@ -10,7 +10,7 @@ import org.junit.jupiter.api.Test /** * Modified from [org.apache.maven.plugins.shade.resource.AppendingTransformerTest.java](https://github.com/apache/maven-shade-plugin/blob/master/src/test/java/org/apache/maven/plugins/shade/resource/AppendingTransformerTest.java). */ -class AppendingTransformerTest : TransformerTestSupport() { +class AppendingTransformerTest : BaseTransformerTest() { init { setupTurkishLocale() diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/TransformerTestSupport.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt similarity index 98% rename from src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/TransformerTestSupport.kt rename to src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt index 86282100e..44cbbebf1 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/TransformerTestSupport.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt @@ -16,7 +16,7 @@ import org.apache.tools.zip.ZipOutputStream import org.gradle.api.file.FileTreeElement import org.gradle.api.file.RelativePath -abstract class TransformerTestSupport { +abstract class BaseTransformerTest { protected lateinit var transformer: T protected val manifestTransformerContext: TransformerContext diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ComponentsXmlResourceTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ComponentsXmlResourceTransformerTest.kt index 9045a89b2..a74679726 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ComponentsXmlResourceTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ComponentsXmlResourceTransformerTest.kt @@ -9,7 +9,7 @@ import org.junit.jupiter.api.Test /** * Modified from [org.apache.maven.plugins.shade.resource.ComponentsXmlResourceTransformerTest.java](https://github.com/apache/maven-shade-plugin/blob/master/src/test/java/org/apache/maven/plugins/shade/resource/ComponentsXmlResourceTransformerTest.java). */ -class ComponentsXmlResourceTransformerTest : TransformerTestSupport() { +class ComponentsXmlResourceTransformerTest : BaseTransformerTest() { @BeforeEach fun setup() { diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt index 5b576a1ff..51b4f37a2 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt @@ -12,7 +12,7 @@ import org.apache.tools.zip.ZipOutputStream import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test -class Log4j2PluginsCacheFileTransformerTest : TransformerTestSupport() { +class Log4j2PluginsCacheFileTransformerTest : BaseTransformerTest() { @BeforeEach fun setup() { diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ManifestAppenderTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ManifestAppenderTransformerTest.kt index 9c1e8c084..f859767cb 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ManifestAppenderTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ManifestAppenderTransformerTest.kt @@ -10,7 +10,7 @@ import com.github.jengelman.gradle.plugins.shadow.util.testObjectFactory import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test -class ManifestAppenderTransformerTest : TransformerTestSupport() { +class ManifestAppenderTransformerTest : BaseTransformerTest() { @BeforeEach fun setup() { transformer = ManifestAppenderTransformer(testObjectFactory) diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt index 33fe7e151..a3196023a 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt @@ -16,7 +16,7 @@ import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments import org.junit.jupiter.params.provider.MethodSource -class PropertiesFileTransformerTest : TransformerTestSupport() { +class PropertiesFileTransformerTest : BaseTransformerTest() { @BeforeEach fun setup() { diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerTest.kt index 5ff7604ea..18e4892b3 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerTest.kt @@ -8,7 +8,7 @@ import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments import org.junit.jupiter.params.provider.MethodSource -class ServiceFileTransformerTest : TransformerTestSupport() { +class ServiceFileTransformerTest : BaseTransformerTest() { @BeforeEach fun setup() { transformer = ServiceFileTransformer() diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/XmlAppendingTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/XmlAppendingTransformerTest.kt index 1eaf76436..8b757e658 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/XmlAppendingTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/XmlAppendingTransformerTest.kt @@ -7,7 +7,7 @@ import com.github.jengelman.gradle.plugins.shadow.util.testObjectFactory import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test -class XmlAppendingTransformerTest : TransformerTestSupport() { +class XmlAppendingTransformerTest : BaseTransformerTest() { init { setupTurkishLocale() From b90a8e5708c4eeabe76ae7c998eda03365a7e021 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 4 Dec 2024 16:56:47 +0800 Subject: [PATCH 12/22] Fix merge --- .../plugins/shadow/transformers/BaseTransformerTest.kt | 4 ++-- .../transformers/Log4j2PluginsCacheFileTransformerTest.kt | 7 ------- .../shadow/transformers/PropertiesFileTransformerTest.kt | 1 - .../shadow/transformers/ServiceFileTransformerTest.kt | 6 ------ 4 files changed, 2 insertions(+), 16 deletions(-) diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt index 57e67a996..8628baec2 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt @@ -3,12 +3,12 @@ package com.github.jengelman.gradle.plugins.shadow.transformers import com.github.jengelman.gradle.plugins.shadow.ShadowStats import com.github.jengelman.gradle.plugins.shadow.internal.createDefaultFileTreeElement import com.github.jengelman.gradle.plugins.shadow.internal.inputStream -import java.io.FileNotFoundException import com.github.jengelman.gradle.plugins.shadow.transformers.Transformer.Companion.create import com.github.jengelman.gradle.plugins.shadow.util.testObjectFactory +import java.io.FileNotFoundException import java.io.InputStream -import java.nio.charset.Charset import java.lang.reflect.ParameterizedType +import java.nio.charset.Charset import java.nio.file.Path import java.util.Locale import java.util.Properties diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt index 51b4f37a2..5571c0b55 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt @@ -9,16 +9,9 @@ import java.net.URL import java.util.Collections import org.apache.logging.log4j.core.config.plugins.processor.PluginCache import org.apache.tools.zip.ZipOutputStream -import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test class Log4j2PluginsCacheFileTransformerTest : BaseTransformerTest() { - - @BeforeEach - fun setup() { - transformer = Log4j2PluginsCacheFileTransformer() - } - @Test fun `should transform for a single file`() { transformer.transform(TransformerContext(PLUGIN_CACHE_FILE, requireResourceAsStream(PLUGIN_CACHE_FILE))) diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt index 2cbabc39c..343707470 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt @@ -9,7 +9,6 @@ import assertk.assertions.isTrue import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer.MergeStrategy import groovy.lang.Closure import java.nio.charset.Charset -import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerTest.kt index 18e4892b3..42e4b2cc1 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerTest.kt @@ -2,18 +2,12 @@ package com.github.jengelman.gradle.plugins.shadow.transformers import assertk.assertThat import assertk.assertions.isEqualTo -import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments import org.junit.jupiter.params.provider.MethodSource class ServiceFileTransformerTest : BaseTransformerTest() { - @BeforeEach - fun setup() { - transformer = ServiceFileTransformer() - } - @ParameterizedTest(name = "{index} => path={0}, exclude={1}, expected={2}") @MethodSource("canTransformResourceData") fun `test canTransformResource`(path: String, exclude: Boolean, expected: Boolean) { From 0da86e6788ab67915a8f6da5f1c8992e11033589 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 4 Dec 2024 17:01:07 +0800 Subject: [PATCH 13/22] Cleanups --- .../shadow/transformers/BaseTransformerTest.kt | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt index 8628baec2..f345462e1 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt @@ -72,16 +72,9 @@ abstract class BaseTransformerTest { Locale.setDefault(Locale("tr")) } - fun Map.toProperties(): Properties { - return Properties().also { it.putAll(this) } - } - - fun Properties.toMap(): Map { - return entries.associate { it.key.toString() to it.value.toString() } - } - fun context(path: String, input: Map, charset: Charset = Charsets.ISO_8859_1): TransformerContext { - return TransformerContext(path, input.toProperties().inputStream(charset), stats = sharedStats) + val properties = Properties().apply { putAll(input) } + return TransformerContext(path, properties.inputStream(charset), stats = sharedStats) } fun context(path: String, input: String): TransformerContext { From 56de8bee4551d92803e3a614274a1ad3188a0866 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 4 Dec 2024 17:42:38 +0800 Subject: [PATCH 14/22] Cleanup Log4j2PluginsCacheFileTransformerTest --- .../Log4j2PluginsCacheFileTransformerTest.kt | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt index 5571c0b55..48a4b1ff3 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/Log4j2PluginsCacheFileTransformerTest.kt @@ -13,25 +13,21 @@ import org.junit.jupiter.api.Test class Log4j2PluginsCacheFileTransformerTest : BaseTransformerTest() { @Test - fun `should transform for a single file`() { - transformer.transform(TransformerContext(PLUGIN_CACHE_FILE, requireResourceAsStream(PLUGIN_CACHE_FILE))) + fun `should transform`() { + transformer.transform(context(SimpleRelocator())) assertThat(transformer.hasTransformedResource()).isTrue() } @Test - fun `should transform`() { - val relocators = listOf(SimpleRelocator()) - transformer.transform(TransformerContext(PLUGIN_CACHE_FILE, requireResourceAsStream(PLUGIN_CACHE_FILE), relocators)) + fun `should transform for a single file`() { + transformer.transform(context()) assertThat(transformer.hasTransformedResource()).isTrue() } @Test fun `relocate classes inside DAT file`() { - val pattern = "org.apache.logging" - val destination = "new.location.org.apache.logging" - val relocators = listOf(SimpleRelocator(pattern, destination)) - - transformer.transform(TransformerContext(PLUGIN_CACHE_FILE, requireResourceAsStream(PLUGIN_CACHE_FILE), relocators)) + val relocator = SimpleRelocator("org.apache.logging", "new.location.org.apache.logging") + transformer.transform(context(relocator)) assertThat(transformer.hasTransformedResource()).isTrue() // Write out to a fake jar file @@ -49,6 +45,10 @@ class Log4j2PluginsCacheFileTransformerTest : BaseTransformerTest Date: Wed, 4 Dec 2024 17:53:24 +0800 Subject: [PATCH 15/22] Cleanup ServiceFileTransformerTest --- .../ServiceFileTransformerTest.kt | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerTest.kt index 42e4b2cc1..89d107e88 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerTest.kt @@ -2,6 +2,8 @@ package com.github.jengelman.gradle.plugins.shadow.transformers import assertk.assertThat import assertk.assertions.isEqualTo +import assertk.assertions.isFalse +import assertk.assertions.isTrue import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments @@ -10,7 +12,7 @@ import org.junit.jupiter.params.provider.MethodSource class ServiceFileTransformerTest : BaseTransformerTest() { @ParameterizedTest(name = "{index} => path={0}, exclude={1}, expected={2}") @MethodSource("canTransformResourceData") - fun `test canTransformResource`(path: String, exclude: Boolean, expected: Boolean) { + fun testCanTransformResource(path: String, exclude: Boolean, expected: Boolean) { if (exclude) { transformer.exclude(path) } @@ -20,25 +22,20 @@ class ServiceFileTransformerTest : BaseTransformerTest() @ParameterizedTest(name = "{index} => path={0}") @MethodSource("transformsServiceFileData") fun `test transforms service file`(path: String, input1: String, input2: String, output: String) { - val element = getFileElement(path) - val transformer = ServiceFileTransformer() - - if (transformer.canTransformResource(element)) { + if (transformer.canTransformResource(getFileElement(path))) { transformer.transform(context(path, input1)) transformer.transform(context(path, input2)) } - assertThat(transformer.hasTransformedResource()).isEqualTo(true) - val transformedText = transformer.serviceEntries.getValue(path).toInputStream().bufferedReader().readText() - assertThat(transformedText).isEqualTo(output) + assertThat(transformer.hasTransformedResource()).isTrue() + assertThat(transformer.serviceEntries.getValue(path).toInputStream().bufferedReader().readText()) + .isEqualTo(output) } @Test fun `test excludes Groovy extension module descriptor files by default`() { - val transformer = ServiceFileTransformer() val element = getFileElement("META-INF/services/org.codehaus.groovy.runtime.ExtensionModule") - - assertThat(transformer.canTransformResource(element)).isEqualTo(false) + assertThat(transformer.canTransformResource(element)).isFalse() } private companion object { From 9a90d064eb70da443b47b927c060c345b85c4b31 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 4 Dec 2024 18:57:34 +0800 Subject: [PATCH 16/22] Cleanup PropertiesFileTransformerTest --- .../PropertiesFileTransformerTest.kt | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt index 343707470..773b33833 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt @@ -69,11 +69,10 @@ class PropertiesFileTransformerTest : BaseTransformerTest, expectedOutput: Map, ) { - val element = getFileElement(path) transformer.mergeStrategy.set(MergeStrategy.from(mergeStrategy)) transformer.mergeSeparator.set(mergeSeparator) - if (transformer.canTransformResource(element)) { + if (transformer.canTransformResource(getFileElement(path))) { transformer.transform(context(path, input1)) transformer.transform(context(path, input2)) } @@ -90,11 +89,10 @@ class PropertiesFileTransformerTest : BaseTransformerTest, expectedOutput: Map, ) { - val element = getFileElement(path) transformer.paths.set(paths) - transformer.mergeStrategy.set(MergeStrategy.from("first")) + transformer.mergeStrategy.set(MergeStrategy.First) - if (transformer.canTransformResource(element)) { + if (transformer.canTransformResource(getFileElement(path))) { transformer.transform(context(path, input1)) transformer.transform(context(path, input2)) } @@ -111,11 +109,10 @@ class PropertiesFileTransformerTest : BaseTransformerTest, expectedOutput: Map, ) { - val element = getFileElement(path) transformer.mappings.set(mappings) - transformer.mergeStrategy.set(MergeStrategy.from("latest")) + transformer.mergeStrategy.set(MergeStrategy.Latest) - if (transformer.canTransformResource(element)) { + if (transformer.canTransformResource(getFileElement(path))) { transformer.transform(context(path, input1)) transformer.transform(context(path, input2)) } @@ -132,15 +129,14 @@ class PropertiesFileTransformerTest : BaseTransformerTest, expectedOutput: Map, ) { - val element = getFileElement(path) + transformer.mergeStrategy.set(MergeStrategy.Append) transformer.keyTransformer.set(object : Closure(null) { override fun call(vararg arguments: Any?): String { return keyTransformer.invoke(arguments.first() as String) } }) - transformer.mergeStrategy.set(MergeStrategy.from("append")) - if (transformer.canTransformResource(element)) { + if (transformer.canTransformResource(getFileElement(path))) { transformer.transform(context(path, input1)) transformer.transform(context(path, input2)) } @@ -156,10 +152,9 @@ class PropertiesFileTransformerTest : BaseTransformerTest, expectedOutput: Map, ) { - val element = getFileElement(path) transformer.charsetName.set(charset) - if (transformer.canTransformResource(element)) { + if (transformer.canTransformResource(getFileElement(path))) { transformer.transform(context(path, input, Charset.forName(charset))) } From c2988f14fb50d9a715c7179d25cdc0f0855308f1 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 4 Dec 2024 19:04:53 +0800 Subject: [PATCH 17/22] Add canTransformResource extension --- .../ApacheLicenseResourceTransformerTest.kt | 12 ++++++------ .../ApacheNoticeResourceTransformerTest.kt | 12 ++++++------ .../shadow/transformers/AppendingTransformerTest.kt | 6 +++--- .../shadow/transformers/BaseTransformerTest.kt | 6 +++--- .../transformers/ManifestAppenderTransformerTest.kt | 4 ++-- .../transformers/PropertiesFileTransformerTest.kt | 12 ++++++------ .../transformers/ServiceFileTransformerTest.kt | 6 +++--- .../transformers/XmlAppendingTransformerTest.kt | 6 +++--- 8 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformerTest.kt index 57a63652f..3c2782e61 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ApacheLicenseResourceTransformerTest.kt @@ -16,11 +16,11 @@ class ApacheLicenseResourceTransformerTest : BaseTransformerTest() { fun testCanTransformResource() { transformer.resource.set("abcdefghijklmnopqrstuvwxyz") - assertThat(transformer.canTransformResource(getFileElement("abcdefghijklmnopqrstuvwxyz"))).isTrue() - assertThat(transformer.canTransformResource(getFileElement("ABCDEFGHIJKLMNOPQRSTUVWXYZ"))).isTrue() - assertThat(transformer.canTransformResource(getFileElement("META-INF/MANIFEST.MF"))).isFalse() + assertThat(transformer.canTransformResource("abcdefghijklmnopqrstuvwxyz")).isTrue() + assertThat(transformer.canTransformResource("ABCDEFGHIJKLMNOPQRSTUVWXYZ")).isTrue() + assertThat(transformer.canTransformResource("META-INF/MANIFEST.MF")).isFalse() } } diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt index f345462e1..6ee9e8536 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt @@ -16,7 +16,6 @@ import java.util.zip.ZipFile import kotlin.io.path.createTempFile import kotlin.io.path.outputStream import org.apache.tools.zip.ZipOutputStream -import org.gradle.api.file.FileTreeElement import org.gradle.api.file.RelativePath import org.junit.jupiter.api.BeforeEach @@ -42,8 +41,9 @@ abstract class BaseTransformerTest { const val MANIFEST_NAME: String = "META-INF/MANIFEST.MF" val sharedStats = ShadowStats() - fun getFileElement(path: String): FileTreeElement { - return createDefaultFileTreeElement(relativePath = RelativePath.parse(true, path)) + fun Transformer.canTransformResource(path: String): Boolean { + val element = createDefaultFileTreeElement(relativePath = RelativePath.parse(true, path)) + return canTransformResource(element) } fun readFrom(jarPath: Path, resourceName: String = MANIFEST_NAME): List { diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ManifestAppenderTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ManifestAppenderTransformerTest.kt index 0b32b271e..e699711a7 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ManifestAppenderTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ManifestAppenderTransformerTest.kt @@ -16,8 +16,8 @@ class ManifestAppenderTransformerTest : BaseTransformerTest() if (exclude) { transformer.exclude(path) } - assertThat(transformer.canTransformResource(getFileElement(path))).isEqualTo(expected) + assertThat(transformer.canTransformResource(path)).isEqualTo(expected) } @ParameterizedTest(name = "{index} => path={0}") @MethodSource("transformsServiceFileData") fun `test transforms service file`(path: String, input1: String, input2: String, output: String) { - if (transformer.canTransformResource(getFileElement(path))) { + if (transformer.canTransformResource(path)) { transformer.transform(context(path, input1)) transformer.transform(context(path, input2)) } @@ -34,7 +34,7 @@ class ServiceFileTransformerTest : BaseTransformerTest() @Test fun `test excludes Groovy extension module descriptor files by default`() { - val element = getFileElement("META-INF/services/org.codehaus.groovy.runtime.ExtensionModule") + val element = "META-INF/services/org.codehaus.groovy.runtime.ExtensionModule" assertThat(transformer.canTransformResource(element)).isFalse() } diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/XmlAppendingTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/XmlAppendingTransformerTest.kt index a6d702c91..eddd1a2d0 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/XmlAppendingTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/XmlAppendingTransformerTest.kt @@ -15,8 +15,8 @@ class XmlAppendingTransformerTest : BaseTransformerTest fun testCanTransformResource() { transformer.resource.set("abcdefghijklmnopqrstuvwxyz") - assertThat(transformer.canTransformResource(getFileElement("abcdefghijklmnopqrstuvwxyz"))).isTrue() - assertThat(transformer.canTransformResource(getFileElement("ABCDEFGHIJKLMNOPQRSTUVWXYZ"))).isTrue() - assertThat(transformer.canTransformResource(getFileElement("META-INF/MANIFEST.MF"))).isFalse() + assertThat(transformer.canTransformResource("abcdefghijklmnopqrstuvwxyz")).isTrue() + assertThat(transformer.canTransformResource("ABCDEFGHIJKLMNOPQRSTUVWXYZ")).isTrue() + assertThat(transformer.canTransformResource("META-INF/MANIFEST.MF")).isFalse() } } From 29cb7505c9f404ad832041eed8f770067b57072f Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 4 Dec 2024 19:05:21 +0800 Subject: [PATCH 18/22] private sharedStats --- .../gradle/plugins/shadow/transformers/BaseTransformerTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt index 6ee9e8536..5e79e1f7d 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt @@ -38,8 +38,8 @@ abstract class BaseTransformerTest { } protected companion object { + private val sharedStats = ShadowStats() const val MANIFEST_NAME: String = "META-INF/MANIFEST.MF" - val sharedStats = ShadowStats() fun Transformer.canTransformResource(path: String): Boolean { val element = createDefaultFileTreeElement(relativePath = RelativePath.parse(true, path)) From 9048aa86db5ef06779ddde019344e86e9206bb9f Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 4 Dec 2024 19:10:19 +0800 Subject: [PATCH 19/22] Cleanups --- .../plugins/shadow/util/PluginSpecification.groovy | 2 -- .../shadow/relocation/SimpleRelocatorTest.kt | 14 ++++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/util/PluginSpecification.groovy b/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/util/PluginSpecification.groovy index 23b88c502..81678db82 100644 --- a/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/util/PluginSpecification.groovy +++ b/src/funcTest/groovy/com/github/jengelman/gradle/plugins/shadow/util/PluginSpecification.groovy @@ -16,8 +16,6 @@ abstract class PluginSpecification extends Specification { @TempDir Path dir - public static final String SHADOW_VERSION = System.getProperty("shadowVersion") - AppendableMavenFileRepository repo def setup() { diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/relocation/SimpleRelocatorTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/relocation/SimpleRelocatorTest.kt index bf7c6cf3d..b5c9a070e 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/relocation/SimpleRelocatorTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/relocation/SimpleRelocatorTest.kt @@ -179,11 +179,13 @@ class SimpleRelocatorTest { .isEqualTo("META-INF/hidden.org.foo.xml") } - private fun SimpleRelocator.relocatePath(path: String): String { - return relocatePath(RelocatePathContext(path)) - } - - private fun SimpleRelocator.relocateClass(className: String): String { - return relocateClass(RelocateClassContext(className)) + private companion object { + fun SimpleRelocator.relocatePath(path: String): String { + return relocatePath(RelocatePathContext(path)) + } + + fun SimpleRelocator.relocateClass(className: String): String { + return relocateClass(RelocateClassContext(className)) + } } } From 5c813822cd92b24086e754cea006190c69a13025 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 4 Dec 2024 19:14:43 +0800 Subject: [PATCH 20/22] Fix typo --- .../gradle/plugins/shadow/transformers/BaseTransformerTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt index 5e79e1f7d..0dbd4c198 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt @@ -65,7 +65,7 @@ abstract class BaseTransformerTest { } /** - * NOTE: The Turkish locale has an usual case transformation for the letters "I" and "i", making it a prime + * NOTE: The Turkish locale has a usual case transformation for the letters "I" and "i", making it a prime * choice to test for improper case-less string comparisons. */ fun setupTurkishLocale() { From e40bd41c408e81f378bf492a040d8cad548b390b Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 4 Dec 2024 19:18:11 +0800 Subject: [PATCH 21/22] Rearrange context extensions --- .../shadow/transformers/BaseTransformerTest.kt | 14 +------------- .../transformers/PropertiesFileTransformerTest.kt | 7 +++++++ .../transformers/ServiceFileTransformerTest.kt | 4 ++++ 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt index 0dbd4c198..18b0c4dbc 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/BaseTransformerTest.kt @@ -2,16 +2,13 @@ package com.github.jengelman.gradle.plugins.shadow.transformers import com.github.jengelman.gradle.plugins.shadow.ShadowStats import com.github.jengelman.gradle.plugins.shadow.internal.createDefaultFileTreeElement -import com.github.jengelman.gradle.plugins.shadow.internal.inputStream import com.github.jengelman.gradle.plugins.shadow.transformers.Transformer.Companion.create import com.github.jengelman.gradle.plugins.shadow.util.testObjectFactory import java.io.FileNotFoundException import java.io.InputStream import java.lang.reflect.ParameterizedType -import java.nio.charset.Charset import java.nio.file.Path import java.util.Locale -import java.util.Properties import java.util.zip.ZipFile import kotlin.io.path.createTempFile import kotlin.io.path.outputStream @@ -38,8 +35,8 @@ abstract class BaseTransformerTest { } protected companion object { - private val sharedStats = ShadowStats() const val MANIFEST_NAME: String = "META-INF/MANIFEST.MF" + val sharedStats = ShadowStats() fun Transformer.canTransformResource(path: String): Boolean { val element = createDefaultFileTreeElement(relativePath = RelativePath.parse(true, path)) @@ -71,14 +68,5 @@ abstract class BaseTransformerTest { fun setupTurkishLocale() { Locale.setDefault(Locale("tr")) } - - fun context(path: String, input: Map, charset: Charset = Charsets.ISO_8859_1): TransformerContext { - val properties = Properties().apply { putAll(input) } - return TransformerContext(path, properties.inputStream(charset), stats = sharedStats) - } - - fun context(path: String, input: String): TransformerContext { - return TransformerContext(path, input.byteInputStream(), stats = sharedStats) - } } } diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt index b75ae0c22..c418447f0 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt @@ -6,9 +6,11 @@ import assertk.assertions.isEqualTo import assertk.assertions.isFalse import assertk.assertions.isNotEmpty import assertk.assertions.isTrue +import com.github.jengelman.gradle.plugins.shadow.internal.inputStream import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer.MergeStrategy import groovy.lang.Closure import java.nio.charset.Charset +import java.util.Properties import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments @@ -162,6 +164,11 @@ class PropertiesFileTransformerTest : BaseTransformerTest, charset: Charset = Charsets.ISO_8859_1): TransformerContext { + val properties = Properties().apply { putAll(input) } + return TransformerContext(path, properties.inputStream(charset), stats = sharedStats) + } + @JvmStatic fun pathProvider() = listOf( Arguments.of("foo.properties", true, "can be"), diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerTest.kt index 7f64d96b1..55bec8828 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformerTest.kt @@ -39,6 +39,10 @@ class ServiceFileTransformerTest : BaseTransformerTest() } private companion object { + fun context(path: String, input: String): TransformerContext { + return TransformerContext(path, input.byteInputStream(), stats = sharedStats) + } + @JvmStatic fun canTransformResourceData() = listOf( // path, exclude, expected From 5eeddc4bdd5567cbcc1210f9107859518ce6ca60 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 4 Dec 2024 19:34:10 +0800 Subject: [PATCH 22/22] Tweak names --- .../transformers/PropertiesFileTransformerTest.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt index c418447f0..75bb2219b 100644 --- a/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt +++ b/src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/transformers/PropertiesFileTransformerTest.kt @@ -57,13 +57,13 @@ class PropertiesFileTransformerTest : BaseTransformerTest, input1: Map, @@ -104,7 +104,7 @@ class PropertiesFileTransformerTest : BaseTransformerTest>, input1: Map, @@ -124,7 +124,7 @@ class PropertiesFileTransformerTest : BaseTransformerTest String, input1: Map, @@ -148,7 +148,7 @@ class PropertiesFileTransformerTest : BaseTransformerTest,