|
@@ -2,16 +2,13 @@ package com.yomahub.liteflow.test.redis;
|
|
|
|
|
|
import cn.hutool.crypto.digest.DigestUtil;
|
|
|
import com.yomahub.liteflow.core.FlowExecutor;
|
|
|
-import com.yomahub.liteflow.core.FlowInitHook;
|
|
|
-import com.yomahub.liteflow.flow.FlowBus;
|
|
|
import com.yomahub.liteflow.flow.LiteflowResponse;
|
|
|
+import com.yomahub.liteflow.log.LFLog;
|
|
|
+import com.yomahub.liteflow.log.LFLoggerManager;
|
|
|
import com.yomahub.liteflow.parser.redis.mode.RClient;
|
|
|
-import com.yomahub.liteflow.property.LiteflowConfigGetter;
|
|
|
+import com.yomahub.liteflow.parser.redis.mode.polling.RedisParserPollingMode;
|
|
|
import com.yomahub.liteflow.slot.DefaultContext;
|
|
|
-import com.yomahub.liteflow.spi.holder.SpiFactoryCleaner;
|
|
|
-import com.yomahub.liteflow.spring.ComponentScanner;
|
|
|
import com.yomahub.liteflow.test.BaseTest;
|
|
|
-import com.yomahub.liteflow.thread.ExecutorHelper;
|
|
|
import org.junit.jupiter.api.*;
|
|
|
import org.junit.jupiter.api.extension.ExtendWith;
|
|
|
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
|
@@ -20,25 +17,29 @@ import org.springframework.boot.test.mock.mockito.MockBean;
|
|
|
import org.springframework.context.annotation.ComponentScan;
|
|
|
import org.springframework.test.context.TestPropertySource;
|
|
|
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
|
|
+
|
|
|
import javax.annotation.Resource;
|
|
|
+import java.lang.reflect.Field;
|
|
|
import java.util.HashSet;
|
|
|
import java.util.Set;
|
|
|
+import java.util.concurrent.ScheduledThreadPoolExecutor;
|
|
|
|
|
|
-import static org.mockito.ArgumentMatchers.*;
|
|
|
+import static org.mockito.ArgumentMatchers.anyString;
|
|
|
+import static org.mockito.ArgumentMatchers.eq;
|
|
|
import static org.mockito.Mockito.when;
|
|
|
|
|
|
/**
|
|
|
- * springboot环境下的redis配置源轮询拉取模式功能测试
|
|
|
+ * springboot环境下的redis配置源script轮询拉取模式功能测试
|
|
|
*
|
|
|
* @author hxinyu
|
|
|
* @since 2.11.0
|
|
|
*/
|
|
|
@ExtendWith(SpringExtension.class)
|
|
|
-@TestPropertySource(value = "classpath:/redis/application-poll-xml.properties")
|
|
|
-@SpringBootTest(classes = RedisWithXmlELPollSpringbootTest.class)
|
|
|
+@TestPropertySource(value = "classpath:/redis/application-poll-script-xml.properties")
|
|
|
+@SpringBootTest(classes = RedisWithXmlELPollScriptSpringbootTest.class)
|
|
|
@EnableAutoConfiguration
|
|
|
@ComponentScan({"com.yomahub.liteflow.test.redis.cmp"})
|
|
|
-public class RedisWithXmlELPollSpringbootTest extends BaseTest {
|
|
|
+public class RedisWithXmlELPollScriptSpringbootTest extends BaseTest {
|
|
|
|
|
|
@MockBean(name = "chainClient")
|
|
|
private static RClient chainClient;
|
|
@@ -63,68 +64,37 @@ public class RedisWithXmlELPollSpringbootTest extends BaseTest {
|
|
|
"local sha1 = redis.sha1hex(value);\n" +
|
|
|
"return sha1;";
|
|
|
|
|
|
+ static LFLog LOG = LFLoggerManager.getLogger(RedisWithXmlELPollChainSpringbootTest.class);
|
|
|
|
|
|
- @AfterEach
|
|
|
- public void after() {
|
|
|
- FlowBus.cleanCache();
|
|
|
- FlowInitHook.cleanHook();
|
|
|
- ExecutorHelper.loadInstance().clearExecutorServiceMap();
|
|
|
- SpiFactoryCleaner.clean();
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 测试chain
|
|
|
- */
|
|
|
- @Test
|
|
|
- public void testPollWithXml() throws InterruptedException {
|
|
|
- Set<String> chainNameSet = new HashSet<>();
|
|
|
- chainNameSet.add("chain11");
|
|
|
- String chainValue = "THEN(a, b, c);";
|
|
|
- //SHA值用于测试修改chain的轮询刷新功能
|
|
|
- String chainSHA = DigestUtil.sha1Hex(chainValue);
|
|
|
-
|
|
|
- //修改chain并更新SHA值
|
|
|
- String changeChainValue = "THEN(a, c);";
|
|
|
- String changeChainSHA = DigestUtil.sha1Hex(changeChainValue);
|
|
|
- when(chainClient.hkeys("pollChainKey")).thenReturn(chainNameSet);
|
|
|
- when(chainClient.hget("pollChainKey", "chain11")).thenReturn(chainValue).thenReturn(changeChainValue);
|
|
|
- when(chainClient.scriptLoad(luaOfKey)).thenReturn("keysha");
|
|
|
- when(chainClient.scriptLoad(luaOfValue)).thenReturn("valuesha");
|
|
|
- when(chainClient.evalSha(eq("keysha"), anyString())).thenReturn("1");
|
|
|
- when(chainClient.evalSha(eq("valuesha"), anyString(), anyString())).thenReturn(chainSHA).thenReturn(changeChainSHA);
|
|
|
- //这里其实并没有script数据 预设数据只是为了不产生NumberFormatException
|
|
|
- when(scriptClient.scriptLoad(luaOfKey)).thenReturn("keysha");
|
|
|
- when(scriptClient.scriptLoad(luaOfValue)).thenReturn("valuesha");
|
|
|
- when(scriptClient.evalSha(eq("keysha"), anyString())).thenReturn("0");
|
|
|
- when(scriptClient.evalSha(eq("valuesha"), anyString(), anyString())).thenReturn("");
|
|
|
-
|
|
|
- //测试修改前的chain
|
|
|
- LiteflowResponse response = flowExecutor.execute2Resp("chain11", "arg");
|
|
|
- Assertions.assertTrue(response.isSuccess());
|
|
|
- Assertions.assertEquals("a==>b==>c", response.getExecuteStepStr());
|
|
|
-
|
|
|
- Thread.sleep(4000);
|
|
|
|
|
|
- //测试修改后的chain
|
|
|
- response = flowExecutor.execute2Resp("chain11", "arg");
|
|
|
- Assertions.assertTrue(response.isSuccess());
|
|
|
- Assertions.assertEquals("a==>c", response.getExecuteStepStr());
|
|
|
+ @AfterAll
|
|
|
+ public static void after() {
|
|
|
+ //关闭poll模式的轮询线程池
|
|
|
+ try{
|
|
|
+ Field pollExecutor = RedisParserPollingMode.class.getDeclaredField("pollExecutor");
|
|
|
+ pollExecutor.setAccessible(true);
|
|
|
+ ScheduledThreadPoolExecutor threadPoolExecutor = (ScheduledThreadPoolExecutor) pollExecutor.get(null);
|
|
|
+ threadPoolExecutor.shutdownNow();
|
|
|
+ } catch (Exception ignored) {
|
|
|
+ LOG.error("[Polling thread pool not closed]", ignored);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 测试script
|
|
|
*/
|
|
|
@Test
|
|
|
- public void testPollWithScript() throws InterruptedException {
|
|
|
+ public void testPollWithScriptXml() throws InterruptedException {
|
|
|
Set<String> chainNameSet = new HashSet<>();
|
|
|
chainNameSet.add("chain22");
|
|
|
String chainValue = "THEN(s11, s22, s33, a, b);";
|
|
|
+ String chainSHA = DigestUtil.sha1Hex(chainValue);
|
|
|
when(chainClient.hkeys("pollChainKey")).thenReturn(chainNameSet);
|
|
|
when(chainClient.hget("pollChainKey", "chain22")).thenReturn(chainValue);
|
|
|
when(chainClient.scriptLoad(luaOfKey)).thenReturn("keysha");
|
|
|
when(chainClient.scriptLoad(luaOfValue)).thenReturn("valuesha");
|
|
|
- when(chainClient.evalSha(eq("keysha"), anyString())).thenReturn("1");
|
|
|
- when(chainClient.evalSha(eq("valuesha"), anyString(), anyString())).thenReturn("");
|
|
|
+ when(chainClient.evalSha(eq("keysha"), anyString())).thenReturn(null);
|
|
|
+ when(chainClient.evalSha(eq("valuesha"), anyString(), anyString())).thenReturn(chainSHA);
|
|
|
|
|
|
Set<String> scriptFieldSet = new HashSet<>();
|
|
|
scriptFieldSet.add("s11:script:脚本s11:groovy");
|