Skip to content

Commit 34d313d

Browse files
committed
build: validate gcFreeChunkSerializer output in tests
1 parent 4bb47f9 commit 34d313d

File tree

4 files changed

+37
-1
lines changed

4 files changed

+37
-1
lines changed

c2me-rewrites-chunk-serializer/src/main/java/com/ishland/c2me/rewrites/chunk_serializer/TheMod.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.ishland.c2me.base.common.registry.SerializerAccess;
55
import com.ishland.c2me.rewrites.chunk_serializer.common.ChunkDataSerializer;
66
import com.ishland.c2me.rewrites.chunk_serializer.common.NbtWriter;
7+
import com.ishland.c2me.rewrites.chunk_serializer.common.utils.ValidationUtils;
78
import net.minecraft.nbt.NbtElement;
89

910
public class TheMod implements net.fabricmc.api.ModInitializer {
@@ -17,6 +18,7 @@ public void onInitialize() {
1718
nbtWriter.finishCompound();
1819
final byte[] data = nbtWriter.toByteArray();
1920
nbtWriter.release();
21+
ValidationUtils.validateNbt(data);
2022
return Either.right(data);
2123
});
2224
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.ishland.c2me.rewrites.chunk_serializer.common.utils;
2+
3+
import net.minecraft.nbt.NbtCompound;
4+
import net.minecraft.nbt.NbtIo;
5+
6+
import java.io.ByteArrayInputStream;
7+
import java.io.DataInputStream;
8+
9+
public class ValidationUtils {
10+
11+
private static final boolean VALIDATION_ENABLED = Boolean.getBoolean("c2me.gcFreeChunkSerializer.validateNbt");
12+
13+
static {
14+
if (VALIDATION_ENABLED) {
15+
System.out.println("NBT validation for gcFreeChunkSerializer is enabled. This *will* impact performance.");
16+
}
17+
}
18+
19+
public static void validateNbt(byte[] bytes) {
20+
if (!VALIDATION_ENABLED) {
21+
return;
22+
}
23+
try (final var in = new DataInputStream(new ByteArrayInputStream(bytes))) {
24+
NbtCompound read = NbtIo.readCompound(in);
25+
} catch (Throwable e) {
26+
throw new RuntimeException(e);
27+
}
28+
}
29+
30+
}

c2me-rewrites-chunk-serializer/src/main/java/com/ishland/c2me/rewrites/chunk_serializer/mixin/MixinThreadedAnvilChunkStorage.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.ishland.c2me.base.mixin.access.IVersionedChunkStorage;
77
import com.ishland.c2me.rewrites.chunk_serializer.common.ChunkDataSerializer;
88
import com.ishland.c2me.rewrites.chunk_serializer.common.NbtWriter;
9+
import com.ishland.c2me.rewrites.chunk_serializer.common.utils.ValidationUtils;
910
import com.mojang.datafixers.DataFixer;
1011
import net.minecraft.nbt.NbtElement;
1112
import net.minecraft.server.world.ChunkHolder;
@@ -100,7 +101,9 @@ private boolean save(Chunk chunk) {
100101
nbtWriter.start(NbtElement.COMPOUND_TYPE);
101102
ChunkDataSerializer.write(chunkSerializer, nbtWriter);
102103
nbtWriter.finishCompound();
103-
return nbtWriter.toByteArray();
104+
byte[] byteArray = nbtWriter.toByteArray();
105+
ValidationUtils.validateNbt(byteArray);
106+
return byteArray;
104107
} finally {
105108
nbtWriter.release();
106109
}

tests/c2me-test/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ loom {
1313
"-Dc2me.base.config.override.ioSystem.gcFreeChunkSerializer=true",
1414
"-Dc2me.base.config.override.vanillaWorldGenOptimizations.useDensityFunctionCompiler=true",
1515
"-Dc2me.base.config.override.vanillaWorldGenOptimizations.nativeAcceleration.enabled=true",
16+
"-Dc2me.gcFreeChunkSerializer.validateNbt=true",
1617
"-Dcom.ishland.c2me.mixin.doAudit=true"
1718
if (System.getenv("GITHUB_WORKFLOW") != null) {
1819
if (System.getenv("RUNNER_OS").equals("macOS")) {

0 commit comments

Comments
 (0)