This is an automated email from the ASF dual-hosted git repository.
Aias00 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git
The following commit(s) were added to refs/heads/master by this push:
new a2624509a9 fix: isolate mock expression evaluation contexts (#7049)
a2624509a9 is described below
commit a2624509a963a4e8c8bdbfa2697247b9a3632075
Author: BobSong <[email protected]>
AuthorDate: Wed Sep 30 09:56:27 2026 +0800
fix: isolate mock expression evaluation contexts (#7049)
Co-authored-by: aias00 <[email protected]>
---
.../mock/generator/ExpressionGeneratorTest.java | 47 ++++++++++++++++++++++
1 file changed, 47 insertions(+)
diff --git
a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/ExpressionGeneratorTest.java
b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/ExpressionGeneratorTest.java
index 01c7220617..4ef032b6b5 100644
---
a/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/ExpressionGeneratorTest.java
+++
b/shenyu-plugin/shenyu-plugin-mock/src/test/java/org/apache/shenyu/plugin/mock/generator/ExpressionGeneratorTest.java
@@ -29,6 +29,11 @@ import
org.springframework.expression.spel.SpelEvaluationException;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.util.Arrays;
+import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.allOf;
@@ -39,6 +44,7 @@ import static org.hamcrest.Matchers.lessThanOrEqualTo;
import static org.hamcrest.Matchers.matchesRegex;
import static org.hamcrest.Matchers.oneOf;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrowsExactly;
@@ -182,6 +188,47 @@ public class ExpressionGeneratorTest {
assertThat(generator.generate("expression|#req.json.address.country",
mockRequest),
is("\"CHINA\""));
}
+
+ @Test
+ public void testGenerateDataFromReqConcurrently() throws Exception {
+ ExecutorService executor = Executors.newFixedThreadPool(2);
+ try {
+ assertConcurrentRequestValues(executor, generator,
"expression|#req.json.value");
+ assertConcurrentRequestValues(executor, new
StandardExpressionGenerator(), "standardSPELExpression|#req.json.value");
+ } finally {
+ executor.shutdownNow();
+ executor.awaitTermination(5, TimeUnit.SECONDS);
+ }
+ }
+
+ private void assertConcurrentRequestValues(final ExecutorService executor,
final Generator<String> testGenerator,
+ final String rule) throws
Exception {
+ for (int i = 0; i < 100; i++) {
+ MockRequest firstRequest = createRequest("first");
+ MockRequest secondRequest = createRequest("second");
+ CyclicBarrier barrier = new CyclicBarrier(2);
+
+ Future<String> firstResult = submitRequest(executor,
testGenerator, rule, firstRequest, barrier);
+ Future<String> secondResult = submitRequest(executor,
testGenerator, rule, secondRequest, barrier);
+
+ assertEquals("\"first\"", firstResult.get(5, TimeUnit.SECONDS));
+ assertEquals("\"second\"", secondResult.get(5, TimeUnit.SECONDS));
+ }
+ }
+
+ private Future<String> submitRequest(final ExecutorService executor, final
Generator<String> testGenerator,
+ final String rule,
+ final MockRequest mockRequest, final
CyclicBarrier barrier) {
+ return executor.submit(() -> {
+ barrier.await();
+ return testGenerator.generate(rule, mockRequest);
+ });
+ }
+
+ private MockRequest createRequest(final String value) {
+ byte[] body = ("{\"value\":\"" + value +
"\"}").getBytes(StandardCharsets.UTF_8);
+ return MockRequest.Builder.builder().body(body).build();
+ }
@Test
public void testZhDataGenerate() {