Merge pull request #7833 from smatvienko-tb/fix/logNode-isStandardForTBEL

[3.5] Custom TBEL script ignored fix for TbLogNode
This commit is contained in:
Andrew Shvayka 2023-03-15 15:11:28 +02:00 committed by GitHub
commit c4e0586265
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 82 additions and 2 deletions

View File

@ -32,6 +32,8 @@ import org.thingsboard.server.common.data.plugin.ComponentType;
import org.thingsboard.server.common.data.script.ScriptLanguage; import org.thingsboard.server.common.data.script.ScriptLanguage;
import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.common.msg.TbMsg;
import java.util.Objects;
@Slf4j @Slf4j
@RuleNode( @RuleNode(
type = ComponentType.ACTION, type = ComponentType.ACTION,
@ -54,8 +56,12 @@ public class TbLogNode implements TbNode {
@Override @Override
public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException { public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException {
this.config = TbNodeUtils.convert(configuration, TbLogNodeConfiguration.class); this.config = TbNodeUtils.convert(configuration, TbLogNodeConfiguration.class);
this.standard = new TbLogNodeConfiguration().defaultConfiguration().getJsScript().equals(config.getJsScript()); this.standard = isStandard(config);
this.scriptEngine = this.standard ? null : ctx.createScriptEngine(config.getScriptLang(), this.scriptEngine = this.standard ? null : createScriptEngine(ctx, config);
}
ScriptEngine createScriptEngine(TbContext ctx, TbLogNodeConfiguration config) {
return ctx.createScriptEngine(config.getScriptLang(),
ScriptLanguage.TBEL.equals(config.getScriptLang()) ? config.getTbelScript() : config.getJsScript()); ScriptLanguage.TBEL.equals(config.getScriptLang()) ? config.getTbelScript() : config.getJsScript());
} }
@ -83,6 +89,18 @@ public class TbLogNode implements TbNode {
}, MoreExecutors.directExecutor()); //usually js responses runs on js callback executor }, MoreExecutors.directExecutor()); //usually js responses runs on js callback executor
} }
boolean isStandard(TbLogNodeConfiguration conf) {
Objects.requireNonNull(conf, "node config is null");
final TbLogNodeConfiguration defaultConfig = new TbLogNodeConfiguration().defaultConfiguration();
switch (conf.getScriptLang()) {
case JS: return defaultConfig.getJsScript().equals(conf.getJsScript());
case TBEL: return defaultConfig.getTbelScript().equals(conf.getTbelScript());
default:
log.warn("No rule to define isStandard script for script language [{}], assuming that is non-standard", conf.getScriptLang());
return false;
}
}
void logStandard(TbContext ctx, TbMsg msg) { void logStandard(TbContext ctx, TbMsg msg) {
log.info(toLogMessage(msg)); log.info(toLogMessage(msg));
ctx.tellSuccess(msg); ctx.tellSuccess(msg);

View File

@ -17,14 +17,29 @@ package org.thingsboard.rule.engine.action;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.EnumSource;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.api.TbContext;
import org.thingsboard.rule.engine.api.TbNodeConfiguration;
import org.thingsboard.rule.engine.api.TbNodeException;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.script.ScriptLanguage;
import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.common.msg.TbMsg;
import org.thingsboard.server.common.msg.TbMsgMetaData; import org.thingsboard.server.common.msg.TbMsgMetaData;
import java.util.Collections; import java.util.Collections;
import java.util.Map; import java.util.Map;
import java.util.UUID;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
@Slf4j @Slf4j
public class TbLogNodeTest { public class TbLogNodeTest {
@ -61,6 +76,7 @@ public class TbLogNodeTest {
"Incoming metadata:\n" + "Incoming metadata:\n" +
"{}"); "{}");
} }
@Test @Test
void givenNullDataMsg_whenToLog_thenReturnString() { void givenNullDataMsg_whenToLog_thenReturnString() {
TbLogNode node = new TbLogNode(); TbLogNode node = new TbLogNode();
@ -77,4 +93,50 @@ public class TbLogNodeTest {
"{}"); "{}");
} }
@ParameterizedTest
@EnumSource(ScriptLanguage.class)
void givenDefaultConfig_whenIsStandardForEachScriptLanguage_thenTrue(ScriptLanguage scriptLanguage) throws TbNodeException {
TbLogNodeConfiguration config = new TbLogNodeConfiguration().defaultConfiguration();
config.setScriptLang(scriptLanguage);
TbLogNode node = spy(new TbLogNode());
TbNodeConfiguration tbNodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
TbContext ctx = mock(TbContext.class);
node.init(ctx, tbNodeConfiguration);
assertThat(node.isStandard(config)).as("Script is standard for language " + scriptLanguage).isTrue();
verify(node, never()).createScriptEngine(any(), any());
verify(ctx, never()).createScriptEngine(any(), anyString());
}
@Test
void givenScriptEngineEnum_whenNewAdded_thenFailed() {
assertThat(ScriptLanguage.values().length).as("only two ScriptLanguage supported").isEqualTo(2);
}
@Test
void givenScriptEngineLangJs_whenCreateScriptEngine_thenSupplyJsScript(){
TbLogNodeConfiguration configJs = new TbLogNodeConfiguration().defaultConfiguration();
configJs.setScriptLang(ScriptLanguage.JS);
configJs.setJsScript(configJs.getJsScript() + " // This is JS script " + UUID.randomUUID());
TbLogNode node = new TbLogNode();
TbContext ctx = mock(TbContext.class);
node.createScriptEngine(ctx, configJs);
verify(ctx).createScriptEngine(ScriptLanguage.JS, configJs.getJsScript());
verifyNoMoreInteractions(ctx);
}
@Test
void givenScriptEngineLangTbel_whenCreateScriptEngine_thenSupplyTbelScript(){
TbLogNodeConfiguration configTbel = new TbLogNodeConfiguration().defaultConfiguration();
configTbel.setScriptLang(ScriptLanguage.TBEL);
configTbel.setTbelScript(configTbel.getTbelScript() + " // This is TBEL script " + UUID.randomUUID());
TbLogNode node = new TbLogNode();
TbContext ctx = mock(TbContext.class);
node.createScriptEngine(ctx, configTbel);
verify(ctx).createScriptEngine(ScriptLanguage.TBEL, configTbel.getTbelScript());
verifyNoMoreInteractions(ctx);
}
} }