mirror of
https://gitee.com/dromara/liteFlow.git
synced 2026-05-14 12:12:08 +08:00
feature #I7I3LL 增加declare-springboot下的测试用例
This commit is contained in:
@@ -0,0 +1,184 @@
|
||||
package com.yomahub.liteflow.test.maxWaitSeconds;
|
||||
|
||||
import com.yomahub.liteflow.builder.LiteFlowNodeBuilder;
|
||||
import com.yomahub.liteflow.builder.el.LiteFlowChainELBuilder;
|
||||
import com.yomahub.liteflow.core.FlowExecutor;
|
||||
import com.yomahub.liteflow.enums.NodeTypeEnum;
|
||||
import com.yomahub.liteflow.exception.WhenTimeoutException;
|
||||
import com.yomahub.liteflow.flow.LiteflowResponse;
|
||||
import com.yomahub.liteflow.slot.DefaultContext;
|
||||
import com.yomahub.liteflow.test.BaseTest;
|
||||
import com.yomahub.liteflow.test.loop.LoopELDeclSpringbootTest;
|
||||
import com.yomahub.liteflow.test.maxWaitSeconds.cmp.ACmp;
|
||||
import com.yomahub.liteflow.test.maxWaitSeconds.cmp.BCmp;
|
||||
import com.yomahub.liteflow.test.maxWaitSeconds.cmp.CCmp;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.context.annotation.ComponentScan;
|
||||
import org.springframework.test.context.TestPropertySource;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import static com.yomahub.liteflow.test.maxWaitSeconds.cmp.DCmp.CONTENT_KEY;
|
||||
|
||||
/**
|
||||
* springboot环境下超时控制测试
|
||||
*
|
||||
* @author DaleLee
|
||||
* @since 2.11.0
|
||||
*/
|
||||
@RunWith(SpringRunner.class)
|
||||
@TestPropertySource(value = "classpath:/maxWaitSeconds/application.properties")
|
||||
@SpringBootTest(classes = MaxWaitSecondsELDeclSpringBootTest.class)
|
||||
@EnableAutoConfiguration
|
||||
@ComponentScan({ "com.yomahub.liteflow.test.maxWaitSeconds.cmp" })
|
||||
public class MaxWaitSecondsELDeclSpringBootTest extends BaseTest {
|
||||
@Resource
|
||||
private FlowExecutor flowExecutor;
|
||||
|
||||
// 测试 THEN 的超时情况
|
||||
@Test
|
||||
public void testThen1() {
|
||||
assertTimeout("then1");
|
||||
}
|
||||
|
||||
// 测试 THEN 的非超时情况
|
||||
@Test
|
||||
public void testThen2() {
|
||||
assertNotTimeout("then2");
|
||||
}
|
||||
|
||||
// 测试 When 的超时情况
|
||||
@Test
|
||||
public void testWhen1() {
|
||||
assertTimeout("when1");
|
||||
}
|
||||
|
||||
// 测试 WHEN 的非超时情况
|
||||
@Test
|
||||
public void testWhen2() {
|
||||
assertNotTimeout("when2");
|
||||
}
|
||||
|
||||
// 测试 FOR 的超时情况
|
||||
@Test
|
||||
public void testFor1() {
|
||||
assertTimeout("for1");
|
||||
}
|
||||
|
||||
// 测试 FOR 的非超时情况
|
||||
@Test
|
||||
public void testFor2() {
|
||||
assertNotTimeout("for2");
|
||||
}
|
||||
|
||||
// 测试 WHILE 的超时情况
|
||||
@Test
|
||||
public void testWhile1() {
|
||||
assertTimeout("while1");
|
||||
}
|
||||
|
||||
// 测试 WHILE 的非超时情况
|
||||
@Test
|
||||
public void testWhile2() {
|
||||
assertNotTimeout("while2");
|
||||
}
|
||||
|
||||
// 测试 ITERATOR 的超时情况
|
||||
@Test
|
||||
public void testIterator1() {
|
||||
assertTimeout("iterator1");
|
||||
}
|
||||
|
||||
// 测试 ITERATOR 的非超时情况
|
||||
@Test
|
||||
public void testIterator2() {
|
||||
assertNotTimeout("iterator2");
|
||||
}
|
||||
|
||||
// 测试 SWITCH 的超时情况
|
||||
@Test
|
||||
public void testSwitch1() {
|
||||
assertTimeout("switch1");
|
||||
}
|
||||
|
||||
// 测试 SWITCH 的非超时情况
|
||||
@Test
|
||||
public void testSwitch2() {
|
||||
assertNotTimeout("switch2");
|
||||
}
|
||||
|
||||
// 测试 IF 的超时情况
|
||||
@Test
|
||||
public void testIf1() {
|
||||
assertTimeout("if1");
|
||||
}
|
||||
|
||||
// 测试 SWITCH 的非超时情况
|
||||
@Test
|
||||
public void testIf2() {
|
||||
assertNotTimeout("if2");
|
||||
}
|
||||
|
||||
// 测试单个组件的超时情况
|
||||
@Test
|
||||
public void testComponent1() {
|
||||
assertTimeout("component1");
|
||||
}
|
||||
|
||||
// 测试单个组件的非超时情况
|
||||
@Test
|
||||
public void testComponent2() {
|
||||
assertNotTimeout("component2");
|
||||
}
|
||||
|
||||
// 测试 FINALLY,虽然超时,但 FINALLY 仍会执行
|
||||
@Test
|
||||
public void testFinally1() {
|
||||
LiteflowResponse response = flowExecutor.execute2Resp("finally", "arg");
|
||||
Assert.assertFalse(response.isSuccess());
|
||||
Assert.assertEquals(WhenTimeoutException.class, response.getCause().getClass());
|
||||
// FINALLY 执行时在默认数据上下文中放入了 CONTENT_KEY
|
||||
DefaultContext contextBean = response.getFirstContextBean();
|
||||
Assert.assertTrue(contextBean.hasData(CONTENT_KEY));
|
||||
}
|
||||
|
||||
// 测试 maxWaitSeconds 关键字不能作用于 Finally
|
||||
@Test
|
||||
public void testFinally2() {
|
||||
LiteFlowNodeBuilder.createNode()
|
||||
.setId("a")
|
||||
.setName("组件A")
|
||||
.setType(NodeTypeEnum.COMMON)
|
||||
.setClazz(ACmp.class)
|
||||
.build();
|
||||
LiteFlowNodeBuilder.createNode()
|
||||
.setId("b")
|
||||
.setName("组件B")
|
||||
.setType(NodeTypeEnum.COMMON)
|
||||
.setClazz(BCmp.class)
|
||||
.build();
|
||||
LiteFlowNodeBuilder.createNode()
|
||||
.setId("c")
|
||||
.setName("组件C")
|
||||
.setType(NodeTypeEnum.COMMON)
|
||||
.setClazz(CCmp.class)
|
||||
.build();
|
||||
Assert.assertFalse(LiteFlowChainELBuilder.validate("THEN(a, b, FINALLY(c).maxWaitSeconds(10))"));
|
||||
}
|
||||
|
||||
private void assertTimeout(String chainId) {
|
||||
LiteflowResponse response = flowExecutor.execute2Resp(chainId, "arg");
|
||||
Assert.assertFalse(response.isSuccess());
|
||||
Assert.assertEquals(WhenTimeoutException.class, response.getCause().getClass());
|
||||
}
|
||||
|
||||
private void assertNotTimeout(String chainId) {
|
||||
LiteflowResponse response = flowExecutor.execute2Resp(chainId, "arg");
|
||||
Assert.assertTrue(response.isSuccess());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.yomahub.liteflow.test.maxWaitSeconds.cmp;
|
||||
|
||||
import com.yomahub.liteflow.annotation.LiteflowComponent;
|
||||
import com.yomahub.liteflow.annotation.LiteflowMethod;
|
||||
import com.yomahub.liteflow.core.NodeComponent;
|
||||
import com.yomahub.liteflow.enums.LiteFlowMethodEnum;
|
||||
|
||||
@LiteflowComponent("a")
|
||||
public class ACmp {
|
||||
|
||||
@LiteflowMethod(LiteFlowMethodEnum.PROCESS)
|
||||
public void process(NodeComponent bindCmp) {
|
||||
try {
|
||||
Thread.sleep(1000);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
System.out.println("ACmp executed!");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.yomahub.liteflow.test.maxWaitSeconds.cmp;
|
||||
|
||||
import com.yomahub.liteflow.annotation.LiteflowComponent;
|
||||
import com.yomahub.liteflow.annotation.LiteflowMethod;
|
||||
import com.yomahub.liteflow.core.NodeComponent;
|
||||
import com.yomahub.liteflow.enums.LiteFlowMethodEnum;
|
||||
|
||||
@LiteflowComponent("b")
|
||||
public class BCmp {
|
||||
|
||||
@LiteflowMethod(LiteFlowMethodEnum.PROCESS)
|
||||
public void process(NodeComponent bindCmp) {
|
||||
try {
|
||||
Thread.sleep(2000);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
System.out.println("BCmp executed!");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.yomahub.liteflow.test.maxWaitSeconds.cmp;
|
||||
|
||||
import com.yomahub.liteflow.annotation.LiteflowComponent;
|
||||
import com.yomahub.liteflow.annotation.LiteflowMethod;
|
||||
import com.yomahub.liteflow.core.NodeComponent;
|
||||
import com.yomahub.liteflow.enums.LiteFlowMethodEnum;
|
||||
|
||||
@LiteflowComponent("c")
|
||||
public class CCmp {
|
||||
|
||||
@LiteflowMethod(LiteFlowMethodEnum.PROCESS)
|
||||
public void process(NodeComponent bindCmp) {
|
||||
try {
|
||||
Thread.sleep(5000);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
System.out.println("CCmp executed!");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package com.yomahub.liteflow.test.maxWaitSeconds.cmp;
|
||||
|
||||
import com.yomahub.liteflow.annotation.LiteflowComponent;
|
||||
import com.yomahub.liteflow.annotation.LiteflowMethod;
|
||||
import com.yomahub.liteflow.core.NodeComponent;
|
||||
import com.yomahub.liteflow.enums.LiteFlowMethodEnum;
|
||||
import com.yomahub.liteflow.slot.DefaultContext;
|
||||
|
||||
@LiteflowComponent("d")
|
||||
public class DCmp {
|
||||
|
||||
public static final String CONTENT_KEY = "testKey";
|
||||
|
||||
@LiteflowMethod(LiteFlowMethodEnum.PROCESS)
|
||||
public void process(NodeComponent bindCmp) {
|
||||
try {
|
||||
Thread.sleep(500);
|
||||
DefaultContext contextBean = bindCmp.getFirstContextBean();
|
||||
contextBean.setData(CONTENT_KEY, "value");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
System.out.println("DCmp executed!");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.yomahub.liteflow.test.maxWaitSeconds.cmp;
|
||||
|
||||
import com.yomahub.liteflow.annotation.LiteflowCmpDefine;
|
||||
import com.yomahub.liteflow.annotation.LiteflowComponent;
|
||||
import com.yomahub.liteflow.annotation.LiteflowMethod;
|
||||
import com.yomahub.liteflow.core.NodeComponent;
|
||||
import com.yomahub.liteflow.enums.LiteFlowMethodEnum;
|
||||
import com.yomahub.liteflow.enums.NodeTypeEnum;
|
||||
|
||||
@LiteflowComponent("f")
|
||||
@LiteflowCmpDefine(NodeTypeEnum.IF)
|
||||
public class FCmp {
|
||||
|
||||
@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_IF, nodeType = NodeTypeEnum.IF)
|
||||
public boolean processIf(NodeComponent bindCmp) throws Exception {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.yomahub.liteflow.test.maxWaitSeconds.cmp;
|
||||
|
||||
import com.yomahub.liteflow.annotation.LiteflowCmpDefine;
|
||||
import com.yomahub.liteflow.annotation.LiteflowComponent;
|
||||
import com.yomahub.liteflow.annotation.LiteflowMethod;
|
||||
import com.yomahub.liteflow.core.NodeComponent;
|
||||
import com.yomahub.liteflow.enums.LiteFlowMethodEnum;
|
||||
import com.yomahub.liteflow.enums.NodeTypeEnum;
|
||||
|
||||
@LiteflowComponent("s")
|
||||
@LiteflowCmpDefine(NodeTypeEnum.SWITCH)
|
||||
public class SCmp {
|
||||
|
||||
@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_SWITCH, nodeType = NodeTypeEnum.SWITCH)
|
||||
public String processSwitch(NodeComponent bindCmp) throws Exception {
|
||||
return "b";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.yomahub.liteflow.test.maxWaitSeconds.cmp;
|
||||
|
||||
import com.yomahub.liteflow.annotation.LiteflowCmpDefine;
|
||||
import com.yomahub.liteflow.annotation.LiteflowComponent;
|
||||
import com.yomahub.liteflow.annotation.LiteflowMethod;
|
||||
import com.yomahub.liteflow.core.NodeComponent;
|
||||
import com.yomahub.liteflow.enums.LiteFlowMethodEnum;
|
||||
import com.yomahub.liteflow.enums.NodeTypeEnum;
|
||||
|
||||
@LiteflowComponent("w")
|
||||
@LiteflowCmpDefine(NodeTypeEnum.WHILE)
|
||||
public class WCmp {
|
||||
private int count = 0;
|
||||
|
||||
@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_WHILE, nodeType = NodeTypeEnum.WHILE)
|
||||
public boolean processWhile(NodeComponent bindCmp) throws Exception {
|
||||
count++;
|
||||
return count <= 2;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.yomahub.liteflow.test.maxWaitSeconds.cmp;
|
||||
|
||||
import cn.hutool.core.collection.ListUtil;
|
||||
import com.yomahub.liteflow.annotation.LiteflowCmpDefine;
|
||||
import com.yomahub.liteflow.annotation.LiteflowComponent;
|
||||
import com.yomahub.liteflow.annotation.LiteflowMethod;
|
||||
import com.yomahub.liteflow.core.NodeComponent;
|
||||
import com.yomahub.liteflow.enums.LiteFlowMethodEnum;
|
||||
import com.yomahub.liteflow.enums.NodeTypeEnum;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
@LiteflowComponent("x")
|
||||
@LiteflowCmpDefine(NodeTypeEnum.ITERATOR)
|
||||
public class XCmp {
|
||||
|
||||
@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_ITERATOR, nodeType = NodeTypeEnum.ITERATOR)
|
||||
public Iterator<?> processIterator(NodeComponent bindCmp) throws Exception {
|
||||
List<String> list = ListUtil.toList("one", "two");
|
||||
return list.iterator();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
liteflow.rule-source=maxWaitSeconds/flow.el.xml
|
||||
@@ -0,0 +1,98 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<flow>
|
||||
<!--
|
||||
a=>1s b=>2s c=>5s
|
||||
-->
|
||||
<!-- 串行编排测试 -->
|
||||
<chain name="then1">
|
||||
<!-- 超时 -->
|
||||
THEN(a,b).maxWaitSeconds(2);
|
||||
</chain>
|
||||
<chain name="then2">
|
||||
<!-- 不超时 -->
|
||||
THEN(a,b).maxWaitSeconds(5);
|
||||
</chain>
|
||||
|
||||
<!-- 并行编排测试 -->
|
||||
<chain name="when1">
|
||||
<!-- 超时 -->
|
||||
WHEN(a,c).maxWaitSeconds(3);
|
||||
</chain>
|
||||
<chain name="when2">
|
||||
<!-- 不超时 -->
|
||||
WHEN(a,b).maxWaitSeconds(3);
|
||||
</chain>
|
||||
|
||||
<!-- 循环编排测试 -->
|
||||
<chain name="for1">
|
||||
<!-- 超时 -->
|
||||
FOR(2).DO(a).maxWaitSeconds(1);
|
||||
</chain>
|
||||
<chain name="for2">
|
||||
<!-- 不超时 -->
|
||||
FOR(2).DO(a).maxWaitSeconds(3);
|
||||
</chain>
|
||||
<!-- w 循环两次 -->
|
||||
<chain name="while1">
|
||||
<!-- 超时 -->
|
||||
WHILE(w).DO(a).maxWaitSeconds(1);
|
||||
</chain>
|
||||
<chain name="while2">
|
||||
<!-- 不超时 -->
|
||||
WHILE(w).DO(a).maxWaitSeconds(3);
|
||||
</chain>
|
||||
<!-- x 迭代两次 -->
|
||||
<chain name="iterator1">
|
||||
<!-- 超时 -->
|
||||
ITERATOR(x).DO(a).maxWaitSeconds(1);
|
||||
</chain>
|
||||
<chain name="iterator2">
|
||||
<!-- 不超时 -->
|
||||
ITERATOR(x).DO(a).maxWaitSeconds(3);
|
||||
</chain>
|
||||
|
||||
<!-- 选择编排测试 -->
|
||||
<!-- s 选择 b 组件 -->
|
||||
<chain name="switch1">
|
||||
<!-- 超时 -->
|
||||
SWITCH(s).TO(a, b).maxWaitSeconds(1);
|
||||
</chain>
|
||||
<chain name="switch2">
|
||||
<!-- 不超时 -->
|
||||
SWITCH(s).TO(a, b).maxWaitSeconds(3);
|
||||
</chain>
|
||||
|
||||
<!-- 条件编排测试 -->
|
||||
<!-- f 返回 true -->
|
||||
<chain name="if1">
|
||||
<!-- 超时 -->
|
||||
IF(f, b, c).maxWaitSeconds(1);
|
||||
</chain>
|
||||
<chain name="if2">
|
||||
<!-- 不超时 -->
|
||||
IF(f, b, c).maxWaitSeconds(3);
|
||||
</chain>
|
||||
|
||||
<!-- 测试单个组件 -->
|
||||
<chain name="component1">
|
||||
<!-- 超时 -->
|
||||
WHEN(
|
||||
a.maxWaitSeconds(2),
|
||||
c.maxWaitSeconds(3)
|
||||
);
|
||||
</chain>
|
||||
<chain name="component2">
|
||||
<!-- 不超时 -->
|
||||
WHEN(
|
||||
a.maxWaitSeconds(2),
|
||||
b.maxWaitSeconds(3)
|
||||
);
|
||||
</chain>
|
||||
|
||||
<!-- 测试 FINALLY -->
|
||||
<chain name="finally">
|
||||
<!-- 超时,但 FINALLY 执行 -->
|
||||
THEN(PRE(a), b, FINALLY(d)).maxWaitSeconds(2);
|
||||
</chain>
|
||||
|
||||
</flow>
|
||||
Reference in New Issue
Block a user