From c8ae194f7d2eb4508df1aa29623d92100b22f809 Mon Sep 17 00:00:00 2001 From: TheMode Date: Tue, 26 Apr 2022 14:36:42 +0200 Subject: [PATCH] Basic concurrency tests for tags Signed-off-by: TheMode --- jcstress-tests/build.gradle.kts | 6 ++- .../net/minestom/server/tag/TagPathTest.java | 42 +++++++++++++++++++ .../java/net/minestom/server/tag/TagTest.java | 33 +++++++++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 jcstress-tests/src/jcstress/java/net/minestom/server/tag/TagPathTest.java create mode 100644 jcstress-tests/src/jcstress/java/net/minestom/server/tag/TagTest.java diff --git a/jcstress-tests/build.gradle.kts b/jcstress-tests/build.gradle.kts index 3f9bb5841..dc62cdcae 100644 --- a/jcstress-tests/build.gradle.kts +++ b/jcstress-tests/build.gradle.kts @@ -6,4 +6,8 @@ plugins { dependencies { jcstressImplementation(rootProject) jcstress(libs.jcstress.core) -} \ No newline at end of file +} + +jcstress { + verbose = "true" +} diff --git a/jcstress-tests/src/jcstress/java/net/minestom/server/tag/TagPathTest.java b/jcstress-tests/src/jcstress/java/net/minestom/server/tag/TagPathTest.java new file mode 100644 index 000000000..6f3489c9b --- /dev/null +++ b/jcstress-tests/src/jcstress/java/net/minestom/server/tag/TagPathTest.java @@ -0,0 +1,42 @@ +package net.minestom.server.tag; + +import org.jglrxavpok.hephaistos.nbt.NBT; +import org.openjdk.jcstress.annotations.*; +import org.openjdk.jcstress.infra.results.L_Result; + +import java.util.Map; + +import static org.openjdk.jcstress.annotations.Expect.ACCEPTABLE; + +@JCStressTest +@Outcome(id = "tag", expect = ACCEPTABLE) +@Outcome(id = "tag_path", expect = ACCEPTABLE) +@State +public class TagPathTest { + private static final Tag TAG = Tag.Integer("path"); + private static final Tag TAG_PATH = Tag.Integer("key").path("path"); + + private final TagHandler handler = TagHandler.newHandler(); + + @Actor + public void actor1() { + handler.setTag(TAG, 1); + } + + @Actor + public void actor2() { + handler.setTag(TAG_PATH, 5); + } + + @Arbiter + public void arbiter(L_Result r) { + var compound = handler.asCompound(); + if (compound.equals(NBT.Compound(Map.of("path", NBT.Int(1))))) { + r.r1 = "tag"; + } else if (compound.equals(NBT.Compound(Map.of("path", NBT.Compound(Map.of("key", NBT.Int(5))))))) { + r.r1 = "tag_path"; + } else { + r.r1 = compound; + } + } +} diff --git a/jcstress-tests/src/jcstress/java/net/minestom/server/tag/TagTest.java b/jcstress-tests/src/jcstress/java/net/minestom/server/tag/TagTest.java new file mode 100644 index 000000000..97ccb8ea8 --- /dev/null +++ b/jcstress-tests/src/jcstress/java/net/minestom/server/tag/TagTest.java @@ -0,0 +1,33 @@ +package net.minestom.server.tag; + +import org.openjdk.jcstress.annotations.*; +import org.openjdk.jcstress.infra.results.L_Result; + +import static org.openjdk.jcstress.annotations.Expect.ACCEPTABLE; +import static org.openjdk.jcstress.annotations.Expect.FORBIDDEN; + +@JCStressTest +@Outcome(id = "1", expect = ACCEPTABLE) +@Outcome(id = "5", expect = ACCEPTABLE) +@Outcome(id = "null", expect = FORBIDDEN, desc = "Tag is not seen") +@State +public class TagTest { + private static final Tag TAG = Tag.Integer("key"); + + private final TagHandler handler = TagHandler.newHandler(); + + @Actor + public void actor1() { + handler.setTag(TAG, 1); + } + + @Actor + public void actor2() { + handler.setTag(TAG, 5); + } + + @Arbiter + public void arbiter(L_Result r) { + r.r1 = handler.getTag(TAG); + } +}