diff options
| author | modmuss50 <modmuss50@gmail.com> | 2021-03-06 11:40:07 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-03-06 11:40:07 +0000 |
| commit | 87f3743b2423b59e40ca5a74e8641affffa57499 (patch) | |
| tree | 2c2b04051a4161dc4387f1a735bc28502902fee8 /src/test/groovy/net/fabricmc | |
| parent | 679026ef31d619409187a564bc0623891f5979e6 (diff) | |
| download | architectury-loom-87f3743b2423b59e40ca5a74e8641affffa57499.tar.gz architectury-loom-87f3743b2423b59e40ca5a74e8641affffa57499.tar.bz2 architectury-loom-87f3743b2423b59e40ca5a74e8641affffa57499.zip | |
Rewrite tests to be easier to write and maintain (#361)
Diffstat (limited to 'src/test/groovy/net/fabricmc')
14 files changed, 534 insertions, 441 deletions
diff --git a/src/test/groovy/net/fabricmc/loom/AccessWidenerTest.groovy b/src/test/groovy/net/fabricmc/loom/AccessWidenerTest.groovy new file mode 100644 index 00000000..a1449001 --- /dev/null +++ b/src/test/groovy/net/fabricmc/loom/AccessWidenerTest.groovy @@ -0,0 +1,56 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2016, 2017, 2018 FabricMC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.fabricmc.loom + +import net.fabricmc.loom.util.ArchiveAssertionsTrait +import net.fabricmc.loom.util.ProjectTestTrait +import spock.lang.Specification +import spock.lang.Unroll + +import static org.gradle.testkit.runner.TaskOutcome.SUCCESS + +class AccessWidenerTest extends Specification implements ProjectTestTrait, ArchiveAssertionsTrait { + @Override + String name() { + "accesswidener" + } + + @Unroll + def "accesswidener (gradle #gradle)"() { + when: + def result = create("build", gradle) + then: + result.task(":build").outcome == SUCCESS + getArchiveEntry("fabric-example-mod-1.0.0.jar", "modid.accesswidener") == expected() + where: + gradle | _ + '6.8.3' | _ + '7.0-milestone-2' | _ + } + + String expected() { + new File("src/test/resources/accesswidener/expected.accesswidener").text + } +} diff --git a/src/test/groovy/net/fabricmc/loom/BuildUtils.groovy b/src/test/groovy/net/fabricmc/loom/BuildUtils.groovy deleted file mode 100644 index 58fe3cfd..00000000 --- a/src/test/groovy/net/fabricmc/loom/BuildUtils.groovy +++ /dev/null @@ -1,209 +0,0 @@ -package net.fabricmc.loom - -/** - * Created by Mitchell Skaggs on 6/12/2019. - */ -static String genBuildFile(String mappingsDep = "\"net.fabricmc:yarn:\${project.yarn_mappings}\"") { - """ -plugins { - id 'fabric-loom' - id 'maven-publish' -} -sourceCompatibility = JavaVersion.VERSION_1_8 -targetCompatibility = JavaVersion.VERSION_1_8 - -archivesBaseName = project.archives_base_name -version = project.mod_version -group = project.maven_group - - -minecraft { -} - -dependencies { - //to change the versions see the gradle.properties file - minecraft "com.mojang:minecraft:\${project.minecraft_version}" - mappings ${mappingsDep} - modImplementation "net.fabricmc:fabric-loader:\${project.loader_version}" - - // Fabric API. This is technically optional, but you probably want it anyway. - modImplementation "net.fabricmc.fabric-api:fabric-api:\${project.fabric_version}" - - // PSA: Some older mods, compiled on Loom 0.2.1, might have outdated Maven POMs. - // You may need to force-disable transitiveness on them. -} - -processResources { - inputs.property "version", project.version - - filesMatching("fabric.mod.json") { - expand "version": project.version - } -} - -// ensure that the encoding is set to UTF-8, no matter what the system default is -// this fixes some edge cases with special characters not displaying correctly -// see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html -tasks.withType(JavaCompile) { - options.encoding = "UTF-8" -} - -// Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task -// if it is present. -// If you remove this task, sources will not be generated. -task sourcesJar(type: Jar, dependsOn: classes) { - classifier = "sources" - from sourceSets.main.allSource -} - -jar { - from "LICENSE" -} - -// configure the maven publication -publishing { - publications { - mavenJava(MavenPublication) { - // add all the jars that should be included when publishing to maven - artifact(jar) { - builtBy remapJar - } - artifact(sourcesJar) { - builtBy remapSourcesJar - } - } - } - - // select the repositories you want to publish to - repositories { - // uncomment to publish to the local maven - // mavenLocal() - } -} -""" -} - -static String genPropsFile(String mcVersion, String yarnVersion, String loaderVersion, String fabricVersion, boolean caching = true, boolean parallel = true) { - """ -org.gradle.caching=$caching -org.gradle.parallel=$parallel - -# Fabric Properties -# check these on https://fabricmc.net/use -minecraft_version=$mcVersion -yarn_mappings=$yarnVersion -loader_version=$loaderVersion - -# Mod Properties -mod_version = 1.0.0 -maven_group = net.fabricmc -archives_base_name = fabric-example-mod - -# Dependencies -# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric -fabric_version=$fabricVersion -""" -} - -static String genSettingsFile(String name) { - """ -rootProject.name = '$name' -""" -} - -static String genModJsonFile() { - """ -{ - "schemaVersion": 1, - "id": "modid", - "version": "\${version}", - - "name": "Example Mod", - "description": "This is an example description! Tell everyone what your mod is about!", - "authors": [ - "Me!" - ], - "contact": { - "homepage": "https://fabricmc.net/", - "sources": "https://github.com/FabricMC/fabric-example-mod" - }, - - "license": "CC0-1.0", - - "environment": "*", - "entrypoints": { - "main": [ - "net.fabricmc.example.ExampleMod" - ] - }, - "mixins": [ - "modid.mixins.json" - ], - - "depends": { - "fabricloader": ">=0.4.0", - "fabric": "*" - }, - "suggests": { - "flamingo": "*" - } -} -""" -} - -static String genModJavaFile() { - """ -package net.fabricmc.example; - -import net.fabricmc.api.ModInitializer; - -public class ExampleMod implements ModInitializer { - @Override - public void onInitialize() { - // This code runs as soon as Minecraft is in a mod-load-ready state. - // However, some things (like resources) may still be uninitialized. - // Proceed with mild caution. - - System.out.println("Hello Fabric world!"); - } -} -""" -} - -static String genModMixinsJsonFile() { - """ -{ - "required": true, - "package": "net.fabricmc.example.mixin", - "compatibilityLevel": "JAVA_8", - "mixins": [ - ], - "client": [ - "ExampleMixin" - ], - "injectors": { - "defaultRequire": 1 - } -} -""" -} - -static String genModMixinsJavaFile() { - """ -package net.fabricmc.example.mixin; - -import net.minecraft.client.MinecraftClient; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(MinecraftClient.class) -public class ExampleMixin { - @Inject(at = @At("HEAD"), method = "init()V") - private void init(CallbackInfo info) { - System.out.println("This line is printed by an example mod mixin!"); - } -} -""" -} diff --git a/src/test/groovy/net/fabricmc/loom/DecompileTest.groovy b/src/test/groovy/net/fabricmc/loom/DecompileTest.groovy new file mode 100644 index 00000000..b30f90a1 --- /dev/null +++ b/src/test/groovy/net/fabricmc/loom/DecompileTest.groovy @@ -0,0 +1,54 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2016, 2017, 2018 FabricMC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.fabricmc.loom + +import net.fabricmc.loom.util.ProjectTestTrait +import spock.lang.Ignore +import spock.lang.Specification +import spock.lang.Unroll + +import static org.gradle.testkit.runner.TaskOutcome.SUCCESS + +@Ignore // TODO this fails due to the plugin classpath being setup differently. We need to explore other ways to do this. +class DecompileTest extends Specification implements ProjectTestTrait { + @Override + String name() { + "simple" + } + + @Unroll + def "#decompiler decompile"() { + when: + def result = create(task) + + then: + result.task(":${task}").outcome == SUCCESS + + where: + decompiler | task + 'fernflower' | "genSources" + 'cfr' | "genSourcesWithExperimentalCfr" + } +} diff --git a/src/test/groovy/net/fabricmc/loom/EmptyBuildFunctionalTest.groovy b/src/test/groovy/net/fabricmc/loom/EmptyBuildFunctionalTest.groovy deleted file mode 100644 index 996ab656..00000000 --- a/src/test/groovy/net/fabricmc/loom/EmptyBuildFunctionalTest.groovy +++ /dev/null @@ -1,51 +0,0 @@ -package net.fabricmc.loom - -import org.gradle.testkit.runner.GradleRunner -import org.junit.Rule -import org.junit.rules.TemporaryFolder -import spock.lang.Specification -import spock.lang.Unroll - -import static net.fabricmc.loom.BuildUtils.* -import static org.gradle.testkit.runner.TaskOutcome.SUCCESS - -/** - * Created by Mitchell Skaggs on 6/10/2019. - */ -class EmptyBuildFunctionalTest extends Specification { - @Rule - TemporaryFolder testProjectDir = new TemporaryFolder() - File settingsFile - File buildFile - File propsFile - - def setup() { - settingsFile = testProjectDir.newFile('settings.gradle') - buildFile = testProjectDir.newFile('build.gradle') - propsFile = testProjectDir.newFile('gradle.properties') - } - - @Unroll - def "empty build succeeds using Minecraft #mcVersion"() { - given: - settingsFile << genSettingsFile("empty-build-functional-test") - propsFile << genPropsFile(mcVersion, yarnVersion, loaderVersion, fabricVersion) - buildFile << genBuildFile() - - when: - def result = GradleRunner.create() - .withProjectDir(testProjectDir.root) - .withArguments('build',"--stacktrace", "--warning-mode", System.getenv().TEST_WARNING_MODE ?: 'all') - .withPluginClasspath() - .forwardOutput() - .build() - - then: - result.task(":build").outcome == SUCCESS - - where: - mcVersion | yarnVersion | loaderVersion | fabricVersion - '1.14' | '1.14+build.21' | '0.4.8+build.155' | '0.3.0+build.183' - '1.16.2' | '1.16.2+build.26:v2' | '0.9.2+build.206' | '0.19.0+build.398-1.16' - } -} diff --git a/src/test/groovy/net/fabricmc/loom/EmptyBuildMojangFunctionalTest.groovy b/src/test/groovy/net/fabricmc/loom/EmptyBuildMojangFunctionalTest.groovy deleted file mode 100644 index d360ba6f..00000000 --- a/src/test/groovy/net/fabricmc/loom/EmptyBuildMojangFunctionalTest.groovy +++ /dev/null @@ -1,50 +0,0 @@ -package net.fabricmc.loom - -import org.gradle.testkit.runner.GradleRunner -import org.junit.Rule -import org.junit.rules.TemporaryFolder -import spock.lang.Specification -import spock.lang.Unroll - -import static net.fabricmc.loom.BuildUtils.* -import static org.gradle.testkit.runner.TaskOutcome.SUCCESS - -/** - * Created by Mitchell Skaggs on 6/10/2019. - */ -class EmptyBuildMojangFunctionalTest extends Specification { - @Rule - TemporaryFolder testProjectDir = new TemporaryFolder() - File settingsFile - File buildFile - File propsFile - - def setup() { - settingsFile = testProjectDir.newFile('settings.gradle') - buildFile = testProjectDir.newFile('build.gradle') - propsFile = testProjectDir.newFile('gradle.properties') - } - - @Unroll - def "empty build succeeds using Minecraft #mcVersion"() { - given: - settingsFile << genSettingsFile("empty-build-functional-test") - propsFile << genPropsFile(mcVersion, "nope", loaderVersion, fabricVersion) - buildFile << genBuildFile("minecraft.officialMojangMappings()") - - when: - def result = GradleRunner.create() - .withProjectDir(testProjectDir.root) - .withArguments('build',"--stacktrace", "--warning-mode", System.getenv().TEST_WARNING_MODE ?: 'all') - .withPluginClasspath() - .forwardOutput() - .build() - - then: - result.task(":build").outcome == SUCCESS - - where: - mcVersion | loaderVersion | fabricVersion - '1.16.2' | '0.9.2+build.206' | '0.19.0+build.398-1.16' - } -} diff --git a/src/test/groovy/net/fabricmc/loom/KotlinTest.groovy b/src/test/groovy/net/fabricmc/loom/KotlinTest.groovy new file mode 100644 index 00000000..380dffda --- /dev/null +++ b/src/test/groovy/net/fabricmc/loom/KotlinTest.groovy @@ -0,0 +1,50 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2016, 2017, 2018 FabricMC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.fabricmc.loom + +import net.fabricmc.loom.util.ProjectTestTrait +import spock.lang.Specification +import spock.lang.Unroll + +import static org.gradle.testkit.runner.TaskOutcome.SUCCESS + +class KotlinTest extends Specification implements ProjectTestTrait { + @Override + String name() { + "kotlin" + } + + @Unroll + def "kotlin build (gradle #gradle)"() { + when: + def result = create("build", gradle) + then: + result.task(":build").outcome == SUCCESS + where: + gradle | _ + '6.8.3' | _ + '7.0-milestone-2' | _ + } +} diff --git a/src/test/groovy/net/fabricmc/loom/LegacyProjectTest.groovy b/src/test/groovy/net/fabricmc/loom/LegacyProjectTest.groovy new file mode 100644 index 00000000..aac95fe8 --- /dev/null +++ b/src/test/groovy/net/fabricmc/loom/LegacyProjectTest.groovy @@ -0,0 +1,53 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2016, 2017, 2018 FabricMC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.fabricmc.loom + +import net.fabricmc.loom.util.ProjectTestTrait +import spock.lang.Specification +import spock.lang.Unroll + +import static org.gradle.testkit.runner.TaskOutcome.SUCCESS + +// This test uses gradle 4.9 and 1.14.4 v1 mappings +class LegacyProjectTest extends Specification implements ProjectTestTrait { + @Override + String name() { + "legacy" + } + + @Unroll + def "build"() { + when: + def result = create("build", "4.9") + then: + result.task(":build").outcome == SUCCESS + } + + @Override + String warningMode() { + // Gradle 4.9 doesnt support fail, and well this is a legacy test so deprecations are expected + 'all' + } +} diff --git a/src/test/groovy/net/fabricmc/loom/MixinBuildFunctionalTest.groovy b/src/test/groovy/net/fabricmc/loom/MixinBuildFunctionalTest.groovy deleted file mode 100644 index b40a2ba7..00000000 --- a/src/test/groovy/net/fabricmc/loom/MixinBuildFunctionalTest.groovy +++ /dev/null @@ -1,69 +0,0 @@ -package net.fabricmc.loom - -import org.gradle.testkit.runner.GradleRunner -import org.junit.Rule -import org.junit.rules.TemporaryFolder -import spock.lang.Ignore -import spock.lang.Specification -import spock.lang.Unroll - -import static net.fabricmc.loom.BuildUtils.* -import static org.gradle.testkit.runner.TaskOutcome.SUCCESS - -/** - * Created by Mitchell Skaggs on 6/10/2019. - */ -class MixinBuildFunctionalTest extends Specification { - @Rule - TemporaryFolder testProjectDir = new TemporaryFolder() - File settingsFile - File buildFile - File propsFile - File modJsonFile - File modJavaFile - File modMixinsJsonFile - File modMixinsJavaFile - - def setup() { - settingsFile = testProjectDir.newFile('settings.gradle') - buildFile = testProjectDir.newFile('build.gradle') - propsFile = testProjectDir.newFile('gradle.properties') - - testProjectDir.newFolder("src", "main", "resources") - modJsonFile = testProjectDir.newFile('src/main/resources/fabric.mod.json') - modMixinsJsonFile = testProjectDir.newFile('src/main/resources/modid.mixins.json') - - testProjectDir.newFolder("src", "main", "java", "net", "fabricmc", "example") - modJavaFile = testProjectDir.newFile("src/main/java/net/fabricmc/example/ExampleMod.java") - - testProjectDir.newFolder("src", "main", "java", "net", "fabricmc", "example", "mixin") - modMixinsJavaFile = testProjectDir.newFile("src/main/java/net/fabricmc/example/mixin/ExampleMixin.java") - } - - @Unroll - def "mixin build succeeds using Minecraft #mcVersion"() { - given: - settingsFile << genSettingsFile("mixin-build-functional-test") - propsFile << genPropsFile(mcVersion, yarnVersion, loaderVersion, fabricVersion) - buildFile << genBuildFile() - modJsonFile << genModJsonFile() - modJavaFile << genModJavaFile() - modMixinsJsonFile << genModMixinsJsonFile() - modMixinsJavaFile << genModMixinsJavaFile() - - when: - def result = GradleRunner.create() - .withProjectDir(testProjectDir.root) - .withArguments('build','--stacktrace', "--warning-mode", System.getenv().TEST_WARNING_MODE ?: 'all') - .withPluginClasspath() - .forwardOutput() - .build() - - then: - result.task(":build").outcome == SUCCESS - - where: - mcVersion | yarnVersion | loaderVersion | fabricVersion - '1.14' | '1.14+build.21' | '0.4.8+build.155' | '0.3.0+build.184' - } -} diff --git a/src/test/groovy/net/fabricmc/loom/MojangMappingsProjectTest.groovy b/src/test/groovy/net/fabricmc/loom/MojangMappingsProjectTest.groovy new file mode 100644 index 00000000..dd8a9808 --- /dev/null +++ b/src/test/groovy/net/fabricmc/loom/MojangMappingsProjectTest.groovy @@ -0,0 +1,50 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2016, 2017, 2018 FabricMC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.fabricmc.loom + +import net.fabricmc.loom.util.ProjectTestTrait +import spock.lang.Specification +import spock.lang.Unroll + +import static org.gradle.testkit.runner.TaskOutcome.SUCCESS + +class MojangMappingsProjectTest extends Specification implements ProjectTestTrait { + @Override + String name() { + "mojangMappings" + } + + @Unroll + def "build (gradle #gradle)"() { + when: + def result = create("build", gradle) + then: + result.task(":build").outcome == SUCCESS + where: + gradle | _ + '6.8.3' | _ + '7.0-milestone-2' | _ + } +} diff --git a/src/test/groovy/net/fabricmc/loom/ReproducibleBuildTest.groovy b/src/test/groovy/net/fabricmc/loom/ReproducibleBuildTest.groovy new file mode 100644 index 00000000..b33f8949 --- /dev/null +++ b/src/test/groovy/net/fabricmc/loom/ReproducibleBuildTest.groovy @@ -0,0 +1,70 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2016, 2017, 2018 FabricMC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.fabricmc.loom + +import net.fabricmc.loom.util.ProjectTestTrait +import spock.lang.Ignore +import spock.lang.Specification +import spock.lang.Unroll + +import java.security.DigestInputStream +import java.security.MessageDigest + +import static org.gradle.testkit.runner.TaskOutcome.SUCCESS + +@Ignore //TODO this is currently failing! +class ReproducibleBuildTest extends Specification implements ProjectTestTrait { + @Override + String name() { + "reproducible" + } + + @Unroll + def "build (gradle #gradle)"() { + when: + def result = create("build", gradle) + then: + result.task(":build").outcome == SUCCESS + getOutputHash("fabric-example-mod-1.0.0.jar") == modHash + getOutputHash("fabric-example-mod-1.0.0-sources.jar") == sourceHash + where: + gradle | modHash | sourceHash + '6.8.3' | "e1beb19574f3446800e0a5e289121365" | "123" + '7.0-milestone-2' | "9759775e1f5440a18667c41cf1961908" | "123" + } + + String getOutputHash(String name) { + generateMD5(getOutputFile(name)) + } + + String generateMD5(File file) { + file.withInputStream { + new DigestInputStream(it, MessageDigest.getInstance('MD5')).withStream { + it.eachByte {} + it.messageDigest.digest().encodeHex() as String + } + } + } +} diff --git a/src/test/groovy/net/fabricmc/loom/SimpleBuildFunctionalTest.groovy b/src/test/groovy/net/fabricmc/loom/SimpleBuildFunctionalTest.groovy deleted file mode 100644 index 756a3faa..00000000 --- a/src/test/groovy/net/fabricmc/loom/SimpleBuildFunctionalTest.groovy +++ /dev/null @@ -1,62 +0,0 @@ -package net.fabricmc.loom - -import org.gradle.testkit.runner.GradleRunner -import org.junit.Rule -import org.junit.rules.TemporaryFolder -import spock.lang.Specification -import spock.lang.Unroll - -import static net.fabricmc.loom.BuildUtils.* -import static org.gradle.testkit.runner.TaskOutcome.SUCCESS - -/** - * Created by Mitchell Skaggs on 6/10/2019. - */ -class SimpleBuildFunctionalTest extends Specification { - @Rule - TemporaryFolder testProjectDir = new TemporaryFolder() - File settingsFile - File buildFile - File propsFile - File modJsonFile - File modExampleFile - - def setup() { - settingsFile = testProjectDir.newFile('settings.gradle') - buildFile = testProjectDir.newFile('build.gradle') - propsFile = testProjectDir.newFile('gradle.properties') - - testProjectDir.newFolder("src", "main", "resources") - modJsonFile = testProjectDir.newFile('src/main/resources/fabric.mod.json') - - testProjectDir.newFolder("src", "main", "java", "net", "fabricmc", "example") - modExampleFile = testProjectDir.newFile("src/main/java/net/fabricmc/example/ExampleMod.java") - } - - @Unroll - def "simple build succeeds using Minecraft #mcVersion"() { - given: - settingsFile << genSettingsFile("simple-build-functional-test") - propsFile << genPropsFile(mcVersion, yarnVersion, loaderVersion, fabricVersion) - buildFile << genBuildFile() - modJsonFile << genModJsonFile() - modExampleFile << genModJavaFile() - - when: - def result = GradleRunner.create() - .withProjectDir(testProjectDir.root) - .withArguments('build',"--stacktrace", "--warning-mode", System.getenv().TEST_WARNING_MODE ?: 'all') - .withPluginClasspath() - .forwardOutput() - .withDebug(true) - .build() - - then: - result.task(":build").outcome == SUCCESS - - where: - mcVersion | yarnVersion | loaderVersion | fabricVersion - '19w45a' | '19w45a+build.2:v2' | '0.6.2+build.166' | '0.4.9+build.258-1.15' - '1.14' | '1.14+build.21' | '0.4.8+build.155' | '0.3.0+build.184' - } -} diff --git a/src/test/groovy/net/fabricmc/loom/SimpleProjectTest.groovy b/src/test/groovy/net/fabricmc/loom/SimpleProjectTest.groovy new file mode 100644 index 00000000..6954b88d --- /dev/null +++ b/src/test/groovy/net/fabricmc/loom/SimpleProjectTest.groovy @@ -0,0 +1,63 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2016, 2017, 2018 FabricMC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.fabricmc.loom + +import net.fabricmc.loom.util.ProjectTestTrait +import spock.lang.Specification +import spock.lang.Unroll + +import static org.gradle.testkit.runner.TaskOutcome.SUCCESS + +class SimpleProjectTest extends Specification implements ProjectTestTrait { + @Override + String name() { + "simple" + } + + @Unroll + def "build (gradle #gradle)"() { + when: + def result = create("build", gradle) + then: + result.task(":build").outcome == SUCCESS + where: + gradle | _ + '6.8.3' | _ + '7.0-milestone-2' | _ + } + + @Unroll + def "#ide config generation"() { + when: + def result = create(ide) + then: + result.task(":${ide}").outcome == SUCCESS + where: + ide | _ + 'idea' | _ + 'eclipse' | _ + 'vscode' | _ + } +} diff --git a/src/test/groovy/net/fabricmc/loom/util/ArchiveAssertionsTrait.groovy b/src/test/groovy/net/fabricmc/loom/util/ArchiveAssertionsTrait.groovy new file mode 100644 index 00000000..4225864e --- /dev/null +++ b/src/test/groovy/net/fabricmc/loom/util/ArchiveAssertionsTrait.groovy @@ -0,0 +1,41 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2016, 2017, 2018 FabricMC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.fabricmc.loom.util + +import org.zeroturnaround.zip.ZipUtil + +trait ArchiveAssertionsTrait extends ProjectTestTrait { + String getArchiveEntry(String name, String entry) { + def file = getOutputFile(name) + + def bytes = ZipUtil.unpackEntry(file, entry) + + if (bytes == null) { + throw new FileNotFoundException("Could not find ${entry} in ${name}") + } + + new String(bytes as byte[]) + } +}
\ No newline at end of file diff --git a/src/test/groovy/net/fabricmc/loom/util/ProjectTestTrait.groovy b/src/test/groovy/net/fabricmc/loom/util/ProjectTestTrait.groovy new file mode 100644 index 00000000..7dfcac50 --- /dev/null +++ b/src/test/groovy/net/fabricmc/loom/util/ProjectTestTrait.groovy @@ -0,0 +1,97 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2016, 2017, 2018 FabricMC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.fabricmc.loom.util + +import org.gradle.testkit.runner.BuildResult +import org.gradle.testkit.runner.GradleRunner +import spock.lang.Shared + +trait ProjectTestTrait { + static File gradleHome = File.createTempDir() + + File testProjectDir = File.createTempDir() + + abstract String name() + + @SuppressWarnings('unused') + def setup() { + def baseProjectDir = new File("src/test/resources/projects/" + name()) + + if (!baseProjectDir.exists()) { + throw new FileNotFoundException("Failed to find project directory at:" + baseProjectDir.absolutePath) + } + + baseProjectDir.eachFileRecurse {file -> + if (file.isDirectory()) { + return + } + + def path = file.path.replace(baseProjectDir.path, "") + + File tempFile = new File(testProjectDir, path) + tempFile.parentFile.mkdirs() + tempFile << file.text + } + + // Disable the CI checks to ensure nothing is skipped + System.setProperty("fabric.loom.ci", "false") + } + + @SuppressWarnings('unused') + def cleanupSpec() { + testProjectDir.deleteDir() + gradleHome.deleteDir() + } + + BuildResult create(String task, String gradleVersion = "6.8.3") { + GradleRunner.create() + .withProjectDir(testProjectDir) + .withArguments(task, "--stacktrace", "--warning-mode", warningMode(), "--gradle-user-home", gradleHomeDirectory(gradleVersion)) + .withPluginClasspath() + .withGradleVersion(gradleVersion) + .forwardOutput() + .withDebug(true) + .build() + } + + String warningMode() { + System.getenv().TEST_WARNING_MODE ?: 'all' + } + + String gradleHomeDirectory(String gradleVersion) { + // Each gradle version gets its own dir to run on, to ensure that a full run is done. + new File(gradleHome, gradleVersion).absolutePath + } + + File getOutputFile(String name) { + def file = new File(testProjectDir, "build/libs/" + name) + + if (!file.exists()) { + throw new FileNotFoundException("Could not find ${name} at ${file.absolutePath}") + } + + return file + } +}
\ No newline at end of file |
