Skip to content

Commit

Permalink
Refactor and improve tests (FabricMC#466)
Browse files Browse the repository at this point in the history
* Install and run a production server in tests

* Small improvements

* Add FabricAPI build test
Create new GradleProjectTestTrait replacing the old trait
Improve groovy code formatting.

* Refactor tests

* Fix MultiProjectTest + fix logging for fabric api test

* Cleanup and fixes

* Update fabric api + run in parallel for speed

* Set server memory + fix error
  • Loading branch information
modmuss50 authored Aug 31, 2021
1 parent 2277b93 commit 3ded096
Show file tree
Hide file tree
Showing 34 changed files with 806 additions and 480 deletions.
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ dependencies {
exclude module: 'groovy-all'
}
testImplementation 'io.javalin:javalin:3.13.9'
testImplementation 'net.fabricmc:fabric-installer:0.7.4'

compileOnly 'org.jetbrains:annotations:21.0.1'
}
Expand Down
9 changes: 8 additions & 1 deletion codenarc.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ ruleset {
SpaceAfterSwitch
SpaceAfterWhile
SpaceAroundClosureArrow
SpaceAroundMapEntryColon
SpaceAroundMapEntryColon(characterAfterColonRegex: /\ /)
SpaceAroundOperator
SpaceBeforeClosingBrace
SpaceBeforeOpeningBrace
Expand Down Expand Up @@ -61,6 +61,13 @@ ruleset {
FieldTypeRequired
MethodParameterTypeRequired

// Imports
UnusedImport
UnnecessaryGroovyImport
NoWildcardImports(ignoreStaticImports: true)
ImportFromSamePackage
DuplicateImport

//Misc
LongLiteralWithLowerCaseL
}
10 changes: 9 additions & 1 deletion src/main/java/net/fabricmc/loom/build/MixinRefmapHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,15 @@
import java.io.InputStreamReader;
import java.nio.file.Path;
import java.util.Collection;
import java.util.Collections;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import org.gradle.api.Project;
Expand Down Expand Up @@ -108,7 +110,13 @@ private static JsonObject readFabricModJson(File output) {

@NotNull
private static Collection<String> getMixinConfigurationFiles(JsonObject fabricModJson) {
return StreamSupport.stream(fabricModJson.getAsJsonArray("mixins").spliterator(), false)
JsonArray mixins = fabricModJson.getAsJsonArray("mixins");

if (mixins == null) {
return Collections.emptyList();
}

return StreamSupport.stream(mixins.spliterator(), false)
.map(e -> {
if (e instanceof JsonPrimitive str) {
return str.getAsString();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public MinecraftProcessedProvider(Project project, JarProcessorManager jarProces
protected void addDependencies(DependencyInfo dependency, Consumer<Runnable> postPopulationScheduler) {
if (jarProcessorManager.isInvalid(projectMappedJar) || isRefreshDeps()) {
getProject().getLogger().info(":processing mapped jar");
invalidateJars();
invalidateJar();

try {
FileUtils.copyFile(super.getMappedJar(), projectMappedJar);
Expand All @@ -69,16 +69,14 @@ protected void addDependencies(DependencyInfo dependency, Consumer<Runnable> pos
getProject().getDependencies().module("net.minecraft:minecraft-" + projectMappedClassifier + ":" + getMinecraftProvider().minecraftVersion() + "/" + getExtension().getMappingsProvider().mappingsIdentifier()));
}

private void invalidateJars() {
File dir = projectMappedJar.getParentFile();

if (dir.exists()) {
getProject().getLogger().warn("Invalidating project jars");
private void invalidateJar() {
if (projectMappedJar.exists()) {
getProject().getLogger().warn("Invalidating project jar");

try {
FileUtils.cleanDirectory(dir);
FileUtils.forceDelete(projectMappedJar);
} catch (IOException e) {
throw new RuntimeException("Failed to invalidate jars, try stopping gradle daemon or closing the game", e);
throw new RuntimeException("Failed to invalidate jar, try stopping gradle daemon or closing the game", e);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* This file is part of fabric-loom, licensed under the MIT License (MIT).
*
* Copyright (c) 2016-2021 FabricMC
* Copyright (c) 2021 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
Expand All @@ -22,25 +22,11 @@
* SOFTWARE.
*/

package net.fabricmc.loom.test.util
package net.fabricmc.loom.test

import org.zeroturnaround.zip.ZipUtil
class LoomTestConstants {
public final static String DEFAULT_GRADLE = "7.0.1"
public final static String PRE_RELEASE_GRADLE = "7.3-20210827230026+0000"

trait ArchiveAssertionsTrait {
String getArchiveEntry(String name, String entry, String project = "") {
def file = getOutputFile(name, project)

def bytes = ZipUtil.unpackEntry(file, entry)

if (bytes == null) {
throw new FileNotFoundException("Could not find ${entry} in ${name}")
}

new String(bytes as byte[])
}

boolean hasArchiveEntry(String name, String entry, String project = "") {
def file = getOutputFile(name, project)
ZipUtil.unpackEntry(file, entry) != null
}
}
public final static String[] STANDARD_TEST_VERSIONS = [DEFAULT_GRADLE, PRE_RELEASE_GRADLE]
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,30 +24,25 @@

package net.fabricmc.loom.test.integration

import net.fabricmc.loom.test.util.ArchiveAssertionsTrait
import net.fabricmc.loom.test.util.ProjectTestTrait
import net.fabricmc.loom.test.util.GradleProjectTestTrait
import spock.lang.Specification
import spock.lang.Unroll

import static net.fabricmc.loom.test.LoomTestConstants.*
import static org.gradle.testkit.runner.TaskOutcome.SUCCESS

class AccessWidenerTest extends Specification implements ProjectTestTrait, ArchiveAssertionsTrait {
@Override
String name() {
"accesswidener"
}

class AccessWidenerTest extends Specification implements GradleProjectTestTrait {
@Unroll
def "accesswidener (gradle #gradle)"() {
def "accesswidener (gradle #version)"() {
setup:
def gradle = gradleProject(project: "accesswidener", version: version)
when:
def result = create("build", gradle)
def result = gradle.run(task: "build")
then:
result.task(":build").outcome == SUCCESS
getArchiveEntry("fabric-example-mod-1.0.0.jar", "modid.accesswidener") == expected().replaceAll('\r', '')
gradle.getOutputZipEntry("fabric-example-mod-1.0.0.jar", "modid.accesswidener") == expected().replaceAll('\r', '')
where:
gradle | _
DEFAULT_GRADLE | _
PRE_RELEASE_GRADLE | _
version << STANDARD_TEST_VERSIONS
}

String expected() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,42 +24,36 @@

package net.fabricmc.loom.test.integration

import net.fabricmc.loom.test.util.ProjectTestTrait
import net.fabricmc.loom.test.util.GradleProjectTestTrait
import spock.lang.Specification
import spock.lang.Unroll

import static net.fabricmc.loom.test.LoomTestConstants.*
import static org.gradle.testkit.runner.TaskOutcome.SUCCESS

class CustomManifestTest extends Specification implements ProjectTestTrait {
@Override
String name() {
"minimalBase"
}

@Override
def filesReady() {
buildGradle() << '''
loom {
customMinecraftManifest = "https://maven.fabricmc.net/net/minecraft/1_18_experimental-snapshot-1.json"
}
dependencies {
minecraft "com.mojang:minecraft:1.18_experimental-snapshot-1"
mappings "net.fabricmc:yarn:1.18_experimental-snapshot-1+build.2:v2"
modImplementation "net.fabricmc:fabric-loader:0.11.6"
}
'''
}

class CustomManifestTest extends Specification implements GradleProjectTestTrait {
@Unroll
def "customManifest (gradle #gradle)"() {
def "customManifest (gradle #version)"() {
setup:
def gradle = gradleProject(project: "minimalBase", version: version)
gradle.buildGradle << '''
loom {
customMinecraftManifest = "https://maven.fabricmc.net/net/minecraft/1_18_experimental-snapshot-1.json"
}
dependencies {
minecraft "com.mojang:minecraft:1.18_experimental-snapshot-1"
mappings "net.fabricmc:yarn:1.18_experimental-snapshot-1+build.2:v2"
modImplementation "net.fabricmc:fabric-loader:0.11.6"
}
'''
when:
def result = create("build", gradle)
def result = gradle.run(task: "build")

then:
result.task(":build").outcome == SUCCESS

where:
gradle | _
DEFAULT_GRADLE | _
PRE_RELEASE_GRADLE | _
version << STANDARD_TEST_VERSIONS
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,28 +24,27 @@

package net.fabricmc.loom.test.integration

import net.fabricmc.loom.test.util.ProjectTestTrait
import net.fabricmc.loom.test.util.GradleProjectTestTrait
import spock.lang.Specification
import spock.lang.Unroll

import static net.fabricmc.loom.test.LoomTestConstants.*
import static org.gradle.testkit.runner.TaskOutcome.SUCCESS

class DecompileTest extends Specification implements ProjectTestTrait {
@Override
String name() {
"decompile"
}

class DecompileTest extends Specification implements GradleProjectTestTrait {
@Unroll
def "#decompiler gradle #gradle"() {
def "#decompiler gradle #version"() {
setup:
def gradle = gradleProject(project: "decompile", version: version)

when:
def result = create(task, gradle)
def result = gradle.run(task: task)

then:
result.task(":${task}").outcome == SUCCESS

where:
decompiler | task | gradle
decompiler | task | version
'fernflower' | "genSources" | DEFAULT_GRADLE
'fernflower' | "genSources" | PRE_RELEASE_GRADLE
'cfr' | "genSourcesWithExperimentalCfr" | DEFAULT_GRADLE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,29 +24,27 @@

package net.fabricmc.loom.test.integration

import net.fabricmc.loom.test.util.ProjectTestTrait
import net.fabricmc.loom.test.util.GradleProjectTestTrait
import spock.lang.Specification
import spock.lang.Unroll

import static net.fabricmc.loom.test.LoomTestConstants.*
import static org.gradle.testkit.runner.TaskOutcome.SUCCESS

class DependencyResolutionManagementTest extends Specification implements ProjectTestTrait {
@Override
String name() {
"dependencyResolutionManagement"
}

class DependencyResolutionManagementTest extends Specification implements GradleProjectTestTrait {
@Unroll
def "build (gradle #gradle)"() {
def "build (gradle #version)"() {
setup:
def gradle = gradleProject(project: "dependencyResolutionManagement", version: version)

when:
def result = create("build", gradle)
def result = gradle.run(task: "build")

then:
result.task(":basic:build").outcome == SUCCESS
result.task(":projmap:build").outcome == SUCCESS

where:
gradle | _
DEFAULT_GRADLE | _
PRE_RELEASE_GRADLE | _
version << STANDARD_TEST_VERSIONS
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,38 +24,34 @@

package net.fabricmc.loom.test.integration

import net.fabricmc.loom.test.util.ProjectTestTrait
import net.fabricmc.loom.test.util.GradleProjectTestTrait
import spock.lang.Specification
import spock.lang.Unroll

import static net.fabricmc.loom.test.LoomTestConstants.*
import static org.gradle.testkit.runner.TaskOutcome.SUCCESS

class ExperimentalVersionsTest extends Specification implements ProjectTestTrait {
@Override
String name() {
"minimalBase"
}
class ExperimentalVersionsTest extends Specification implements GradleProjectTestTrait {
@Unroll
def "experimental versions (gradle #version)"() {
setup:
def gradle = gradleProject(project: "minimalBase", version: version)
@Override
def filesReady() {
buildGradle() << '''
dependencies {
minecraft "com.mojang:minecraft:1.18_experimental-snapshot-1"
mappings "net.fabricmc:yarn:1.18_experimental-snapshot-1+build.2:v2"
modImplementation "net.fabricmc:fabric-loader:0.11.6"
}
'''
}
gradle.buildGradle << '''
dependencies {
minecraft "com.mojang:minecraft:1.18_experimental-snapshot-1"
mappings "net.fabricmc:yarn:1.18_experimental-snapshot-1+build.2:v2"
modImplementation "net.fabricmc:fabric-loader:0.11.6"
}
'''
@Unroll
def "experimental versions (gradle #gradle)"() {
when:
def result = create("build", gradle)
def result = gradle.run(task: "build")
then:
result.task(":build").outcome == SUCCESS
where:
gradle | _
DEFAULT_GRADLE | _
PRE_RELEASE_GRADLE | _
version << STANDARD_TEST_VERSIONS
}
}
Loading

0 comments on commit 3ded096

Please sign in to comment.