Showing
13 changed files
with
155 additions
and
73 deletions
... | ... | @@ -53,7 +53,6 @@ import java.util.function.Consumer; |
53 | 53 | */ |
54 | 54 | class DefaultTbContext implements TbContext { |
55 | 55 | |
56 | - private static final Function<? super List<Void>, ? extends Void> LIST_VOID_FUNCTION = v -> null; | |
57 | 56 | private final ActorSystemContext mainCtx; |
58 | 57 | private final RuleNodeCtx nodeCtx; |
59 | 58 | |
... | ... | @@ -120,7 +119,7 @@ class DefaultTbContext implements TbContext { |
120 | 119 | |
121 | 120 | @Override |
122 | 121 | public TbMsg newMsg(String type, EntityId originator, TbMsgMetaData metaData, String data) { |
123 | - return new TbMsg(UUIDs.timeBased(), type, originator, metaData, data); | |
122 | + return new TbMsg(UUIDs.timeBased(), type, originator, metaData, data, nodeCtx.getSelf().getRuleChainId(), nodeCtx.getSelf().getId(), 0L); | |
124 | 123 | } |
125 | 124 | |
126 | 125 | @Override | ... | ... |
... | ... | @@ -169,12 +169,12 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh |
169 | 169 | |
170 | 170 | void onServiceToRuleEngineMsg(ServiceToRuleEngineMsg envelope) { |
171 | 171 | checkActive(); |
172 | - putToQueue(envelope.getTbMsg(), msg -> pushMsgToNode(firstNode, msg)); | |
172 | + putToQueue(enrichWithRuleChainId(envelope.getTbMsg()), msg -> pushMsgToNode(firstNode, msg)); | |
173 | 173 | } |
174 | 174 | |
175 | 175 | void onDeviceActorToRuleEngineMsg(DeviceActorToRuleEngineMsg envelope) { |
176 | 176 | checkActive(); |
177 | - putToQueue(envelope.getTbMsg(), msg -> { | |
177 | + putToQueue(enrichWithRuleChainId(envelope.getTbMsg()), msg -> { | |
178 | 178 | pushMsgToNode(firstNode, msg); |
179 | 179 | envelope.getCallbackRef().tell(new RuleEngineQueuePutAckMsg(msg.getId()), self); |
180 | 180 | }); |
... | ... | @@ -185,7 +185,7 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh |
185 | 185 | RuleNodeId originator = envelope.getOriginator(); |
186 | 186 | String targetRelationType = envelope.getRelationType(); |
187 | 187 | List<RuleNodeRelation> relations = nodeRoutes.get(originator).stream() |
188 | - .filter(r -> targetRelationType == null || targetRelationType.equals(r.getType())) | |
188 | + .filter(r -> targetRelationType == null || targetRelationType.equalsIgnoreCase(r.getType())) | |
189 | 189 | .collect(Collectors.toList()); |
190 | 190 | |
191 | 191 | TbMsg msg = envelope.getMsg(); |
... | ... | @@ -212,7 +212,8 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh |
212 | 212 | } |
213 | 213 | } |
214 | 214 | //TODO: Ideally this should happen in async way when all targets confirm that the copied messages are successfully written to corresponding target queues. |
215 | - queue.ack(msg, msg.getRuleNodeId().getId(), msg.getClusterPartition()); | |
215 | + EntityId ackId = msg.getRuleNodeId() != null ? msg.getRuleNodeId() : msg.getRuleChainId(); | |
216 | + queue.ack(msg, ackId.getId(), msg.getClusterPartition()); | |
216 | 217 | } |
217 | 218 | } |
218 | 219 | |
... | ... | @@ -232,4 +233,9 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh |
232 | 233 | nodeCtx.getSelfActor().tell(new RuleChainToRuleNodeMsg(new DefaultTbContext(systemContext, nodeCtx), msg), self); |
233 | 234 | } |
234 | 235 | } |
236 | + | |
237 | + private TbMsg enrichWithRuleChainId(TbMsg tbMsg) { | |
238 | + // We don't put firstNodeId because it may change over time; | |
239 | + return new TbMsg(tbMsg.getId(), tbMsg.getType(), tbMsg.getOriginator(), tbMsg.getMetaData(), tbMsg.getData(), entityId, null, 0L); | |
240 | + } | |
235 | 241 | } | ... | ... |
... | ... | @@ -87,6 +87,7 @@ public abstract class ComponentMsgProcessor<T extends EntityId> extends Abstract |
87 | 87 | } |
88 | 88 | |
89 | 89 | protected void putToQueue(final TbMsg tbMsg, final Consumer<TbMsg> onSuccess) { |
90 | + EntityId entityId = tbMsg.getRuleNodeId() != null ? tbMsg.getRuleNodeId() : tbMsg.getRuleChainId(); | |
90 | 91 | Futures.addCallback(queue.put(tbMsg, entityId.getId(), 0), new FutureCallback<Void>() { |
91 | 92 | @Override |
92 | 93 | public void onSuccess(@Nullable Void result) { | ... | ... |
... | ... | @@ -80,7 +80,6 @@ public abstract class AbstractMqttServerSideRpcIntegrationTest extends AbstractC |
80 | 80 | } |
81 | 81 | } |
82 | 82 | |
83 | - @Ignore | |
84 | 83 | @Test |
85 | 84 | public void testServerMqttOneWayRpc() throws Exception { |
86 | 85 | Device device = new Device(); |
... | ... | @@ -107,7 +106,6 @@ public abstract class AbstractMqttServerSideRpcIntegrationTest extends AbstractC |
107 | 106 | Assert.assertTrue(StringUtils.isEmpty(result)); |
108 | 107 | } |
109 | 108 | |
110 | - @Ignore | |
111 | 109 | @Test |
112 | 110 | public void testServerMqttOneWayRpcDeviceOffline() throws Exception { |
113 | 111 | Device device = new Device(); | ... | ... |
... | ... | @@ -15,7 +15,7 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.mqtt.rpc.sql; |
17 | 17 | |
18 | -import org.thingsboard.server.dao.service.DaoNoSqlTest; | |
18 | +import org.junit.Ignore; | |
19 | 19 | import org.thingsboard.server.dao.service.DaoSqlTest; |
20 | 20 | import org.thingsboard.server.mqtt.rpc.AbstractMqttServerSideRpcIntegrationTest; |
21 | 21 | ... | ... |
... | ... | @@ -150,7 +150,7 @@ public abstract class AbstractRuleEngineFlowIntegrationTest extends AbstractRule |
150 | 150 | "CUSTOM", |
151 | 151 | device.getId(), |
152 | 152 | new TbMsgMetaData(), |
153 | - "{}"); | |
153 | + "{}", null, null, 0L); | |
154 | 154 | actorService.onMsg(new ServiceToRuleEngineMsg(savedTenant.getId(), tbMsg)); |
155 | 155 | |
156 | 156 | Thread.sleep(3000); | ... | ... |
... | ... | @@ -138,7 +138,8 @@ public abstract class AbstractRuleEngineLifecycleIntegrationTest extends Abstrac |
138 | 138 | "CUSTOM", |
139 | 139 | device.getId(), |
140 | 140 | new TbMsgMetaData(), |
141 | - "{}"); | |
141 | + "{}", | |
142 | + null, null, 0L); | |
142 | 143 | actorService.onMsg(new ServiceToRuleEngineMsg(savedTenant.getId(), tbMsg)); |
143 | 144 | |
144 | 145 | Thread.sleep(3000); | ... | ... |
... | ... | @@ -42,7 +42,7 @@ public class NashornJsEngineTest { |
42 | 42 | metaData.putValue("humidity", "99"); |
43 | 43 | String rawJson = "{\"name\": \"Vit\", \"passed\": 5, \"bigObj\": {\"prop\":42}}"; |
44 | 44 | |
45 | - TbMsg msg = new TbMsg(UUIDs.timeBased(), "USER", null, metaData, rawJson); | |
45 | + TbMsg msg = new TbMsg(UUIDs.timeBased(), "USER", null, metaData, rawJson, null, null, 0L); | |
46 | 46 | |
47 | 47 | TbMsg actual = scriptEngine.executeUpdate(msg); |
48 | 48 | assertEquals("70", actual.getMetaData().getValue("temp")); |
... | ... | @@ -57,7 +57,7 @@ public class NashornJsEngineTest { |
57 | 57 | metaData.putValue("humidity", "99"); |
58 | 58 | String rawJson = "{\"name\": \"Vit\", \"passed\": 5, \"bigObj\": {\"prop\":42}}"; |
59 | 59 | |
60 | - TbMsg msg = new TbMsg(UUIDs.timeBased(), "USER", null, metaData, rawJson); | |
60 | + TbMsg msg = new TbMsg(UUIDs.timeBased(), "USER", null, metaData, rawJson, null, null, 0L); | |
61 | 61 | |
62 | 62 | TbMsg actual = scriptEngine.executeUpdate(msg); |
63 | 63 | assertEquals("94", actual.getMetaData().getValue("newAttr")); |
... | ... | @@ -72,7 +72,7 @@ public class NashornJsEngineTest { |
72 | 72 | metaData.putValue("humidity", "99"); |
73 | 73 | String rawJson = "{\"name\":\"Vit\",\"passed\": 5,\"bigObj\":{\"prop\":42}}"; |
74 | 74 | |
75 | - TbMsg msg = new TbMsg(UUIDs.timeBased(), "USER", null, metaData, rawJson); | |
75 | + TbMsg msg = new TbMsg(UUIDs.timeBased(), "USER", null, metaData, rawJson, null, null, 0L); | |
76 | 76 | |
77 | 77 | TbMsg actual = scriptEngine.executeUpdate(msg); |
78 | 78 | |
... | ... | @@ -89,7 +89,7 @@ public class NashornJsEngineTest { |
89 | 89 | metaData.putValue("humidity", "99"); |
90 | 90 | String rawJson = "{\"name\": \"Vit\", \"passed\": 5, \"bigObj\": {\"prop\":42}}"; |
91 | 91 | |
92 | - TbMsg msg = new TbMsg(UUIDs.timeBased(), "USER", null, metaData, rawJson); | |
92 | + TbMsg msg = new TbMsg(UUIDs.timeBased(), "USER", null, metaData, rawJson, null, null, 0L); | |
93 | 93 | assertFalse(scriptEngine.executeFilter(msg)); |
94 | 94 | } |
95 | 95 | |
... | ... | @@ -102,7 +102,7 @@ public class NashornJsEngineTest { |
102 | 102 | metaData.putValue("humidity", "99"); |
103 | 103 | String rawJson = "{\"name\": \"Vit\", \"passed\": 5, \"bigObj\": {\"prop\":42}}"; |
104 | 104 | |
105 | - TbMsg msg = new TbMsg(UUIDs.timeBased(), "USER", null, metaData, rawJson); | |
105 | + TbMsg msg = new TbMsg(UUIDs.timeBased(), "USER", null, metaData, rawJson, null, null, 0L); | |
106 | 106 | assertTrue(scriptEngine.executeFilter(msg)); |
107 | 107 | } |
108 | 108 | |
... | ... | @@ -122,7 +122,7 @@ public class NashornJsEngineTest { |
122 | 122 | metaData.putValue("humidity", "99"); |
123 | 123 | String rawJson = "{\"name\": \"Vit\", \"passed\": 5, \"bigObj\": {\"prop\":42}}"; |
124 | 124 | |
125 | - TbMsg msg = new TbMsg(UUIDs.timeBased(), "USER", null, metaData, rawJson); | |
125 | + TbMsg msg = new TbMsg(UUIDs.timeBased(), "USER", null, metaData, rawJson, null, null, 0L); | |
126 | 126 | Set<String> actual = scriptEngine.executeSwitch(msg); |
127 | 127 | assertEquals(Sets.newHashSet("one"), actual); |
128 | 128 | } |
... | ... | @@ -143,7 +143,7 @@ public class NashornJsEngineTest { |
143 | 143 | metaData.putValue("humidity", "99"); |
144 | 144 | String rawJson = "{\"name\": \"Vit\", \"passed\": 5, \"bigObj\": {\"prop\":42}}"; |
145 | 145 | |
146 | - TbMsg msg = new TbMsg(UUIDs.timeBased(), "USER", null, metaData, rawJson); | |
146 | + TbMsg msg = new TbMsg(UUIDs.timeBased(), "USER", null, metaData, rawJson, null, null, 0L); | |
147 | 147 | Set<String> actual = scriptEngine.executeSwitch(msg); |
148 | 148 | assertEquals(Sets.newHashSet("one", "three"), actual); |
149 | 149 | } | ... | ... |
1 | +/** | |
2 | + * Copyright © 2016-2018 The Thingsboard Authors | |
3 | + * | |
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | + * you may not use this file except in compliance with the License. | |
6 | + * You may obtain a copy of the License at | |
7 | + * | |
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | |
9 | + * | |
10 | + * Unless required by applicable law or agreed to in writing, software | |
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | |
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | + * See the License for the specific language governing permissions and | |
14 | + * limitations under the License. | |
15 | + */ | |
16 | +package org.thingsboard.server.dao.sql.queue; | |
17 | + | |
18 | +import com.google.common.util.concurrent.Futures; | |
19 | +import com.google.common.util.concurrent.ListenableFuture; | |
20 | +import lombok.extern.slf4j.Slf4j; | |
21 | +import org.springframework.stereotype.Component; | |
22 | +import org.thingsboard.server.common.msg.TbMsg; | |
23 | +import org.thingsboard.server.dao.queue.MsgQueue; | |
24 | +import org.thingsboard.server.dao.util.SqlDao; | |
25 | + | |
26 | +import java.util.Collections; | |
27 | +import java.util.UUID; | |
28 | + | |
29 | +/** | |
30 | + * Created by ashvayka on 27.04.18. | |
31 | + */ | |
32 | +@Component | |
33 | +@Slf4j | |
34 | +@SqlDao | |
35 | +public class DummySqlMsgQueue implements MsgQueue { | |
36 | + @Override | |
37 | + public ListenableFuture<Void> put(TbMsg msg, UUID nodeId, long clusterPartition) { | |
38 | + return Futures.immediateFuture(null); | |
39 | + } | |
40 | + | |
41 | + @Override | |
42 | + public ListenableFuture<Void> ack(TbMsg msg, UUID nodeId, long clusterPartition) { | |
43 | + return Futures.immediateFuture(null); | |
44 | + } | |
45 | + | |
46 | + @Override | |
47 | + public Iterable<TbMsg> findUnprocessed(UUID nodeId, long clusterPartition) { | |
48 | + return Collections.emptyList(); | |
49 | + } | |
50 | +} | ... | ... |
... | ... | @@ -118,17 +118,21 @@ public class TbAlarmNodeTest { |
118 | 118 | |
119 | 119 | node.onMsg(ctx, msg); |
120 | 120 | |
121 | - ArgumentCaptor<TbMsg> captor = ArgumentCaptor.forClass(TbMsg.class); | |
122 | - verify(ctx).tellNext(captor.capture(), eq("Created")); | |
123 | - TbMsg actualMsg = captor.getValue(); | |
121 | + verify(ctx).tellNext(any(), eq("Created")); | |
124 | 122 | |
125 | - assertEquals("ALARM", actualMsg.getType()); | |
126 | - assertEquals(originator, actualMsg.getOriginator()); | |
127 | - assertEquals("value", actualMsg.getMetaData().getValue("key")); | |
128 | - assertEquals(Boolean.TRUE.toString(), actualMsg.getMetaData().getValue(IS_NEW_ALARM)); | |
129 | - assertNotSame(metaData, actualMsg.getMetaData()); | |
123 | + ArgumentCaptor<String> typeCaptor = ArgumentCaptor.forClass(String.class); | |
124 | + ArgumentCaptor<EntityId> originatorCaptor = ArgumentCaptor.forClass(EntityId.class); | |
125 | + ArgumentCaptor<TbMsgMetaData> metadataCaptor = ArgumentCaptor.forClass(TbMsgMetaData.class); | |
126 | + ArgumentCaptor<String> dataCaptor = ArgumentCaptor.forClass(String.class); | |
127 | + verify(ctx).newMsg(typeCaptor.capture(), originatorCaptor.capture(), metadataCaptor.capture(), dataCaptor.capture()); | |
130 | 128 | |
131 | - Alarm actualAlarm = new ObjectMapper().readValue(actualMsg.getData().getBytes(), Alarm.class); | |
129 | + assertEquals("ALARM", typeCaptor.getValue()); | |
130 | + assertEquals(originator, originatorCaptor.getValue()); | |
131 | + assertEquals("value", metadataCaptor.getValue().getValue("key")); | |
132 | + assertEquals(Boolean.TRUE.toString(), metadataCaptor.getValue().getValue(IS_NEW_ALARM)); | |
133 | + assertNotSame(metaData, metadataCaptor.getValue()); | |
134 | + | |
135 | + Alarm actualAlarm = new ObjectMapper().readValue(dataCaptor.getValue().getBytes(), Alarm.class); | |
132 | 136 | Alarm expectedAlarm = Alarm.builder() |
133 | 137 | .tenantId(tenantId) |
134 | 138 | .originator(originator) |
... | ... | @@ -208,17 +212,22 @@ public class TbAlarmNodeTest { |
208 | 212 | |
209 | 213 | node.onMsg(ctx, msg); |
210 | 214 | |
211 | - ArgumentCaptor<TbMsg> captor = ArgumentCaptor.forClass(TbMsg.class); | |
212 | - verify(ctx).tellNext(captor.capture(), eq("Created")); | |
213 | - TbMsg actualMsg = captor.getValue(); | |
215 | + verify(ctx).tellNext(any(), eq("Created")); | |
216 | + | |
217 | + ArgumentCaptor<String> typeCaptor = ArgumentCaptor.forClass(String.class); | |
218 | + ArgumentCaptor<EntityId> originatorCaptor = ArgumentCaptor.forClass(EntityId.class); | |
219 | + ArgumentCaptor<TbMsgMetaData> metadataCaptor = ArgumentCaptor.forClass(TbMsgMetaData.class); | |
220 | + ArgumentCaptor<String> dataCaptor = ArgumentCaptor.forClass(String.class); | |
221 | + verify(ctx).newMsg(typeCaptor.capture(), originatorCaptor.capture(), metadataCaptor.capture(), dataCaptor.capture()); | |
222 | + | |
223 | + assertEquals("ALARM", typeCaptor.getValue()); | |
224 | + assertEquals(originator, originatorCaptor.getValue()); | |
225 | + assertEquals("value", metadataCaptor.getValue().getValue("key")); | |
226 | + assertEquals(Boolean.TRUE.toString(), metadataCaptor.getValue().getValue(IS_NEW_ALARM)); | |
227 | + assertNotSame(metaData, metadataCaptor.getValue()); | |
214 | 228 | |
215 | - assertEquals("ALARM", actualMsg.getType()); | |
216 | - assertEquals(originator, actualMsg.getOriginator()); | |
217 | - assertEquals("value", actualMsg.getMetaData().getValue("key")); | |
218 | - assertEquals(Boolean.TRUE.toString(), actualMsg.getMetaData().getValue(IS_NEW_ALARM)); | |
219 | - assertNotSame(metaData, actualMsg.getMetaData()); | |
220 | 229 | |
221 | - Alarm actualAlarm = new ObjectMapper().readValue(actualMsg.getData().getBytes(), Alarm.class); | |
230 | + Alarm actualAlarm = new ObjectMapper().readValue(dataCaptor.getValue().getBytes(), Alarm.class); | |
222 | 231 | Alarm expectedAlarm = Alarm.builder() |
223 | 232 | .tenantId(tenantId) |
224 | 233 | .originator(originator) |
... | ... | @@ -252,17 +261,21 @@ public class TbAlarmNodeTest { |
252 | 261 | |
253 | 262 | node.onMsg(ctx, msg); |
254 | 263 | |
255 | - ArgumentCaptor<TbMsg> captor = ArgumentCaptor.forClass(TbMsg.class); | |
256 | - verify(ctx).tellNext(captor.capture(), eq("Updated")); | |
257 | - TbMsg actualMsg = captor.getValue(); | |
264 | + verify(ctx).tellNext(any(), eq("Updated")); | |
258 | 265 | |
259 | - assertEquals("ALARM", actualMsg.getType()); | |
260 | - assertEquals(originator, actualMsg.getOriginator()); | |
261 | - assertEquals("value", actualMsg.getMetaData().getValue("key")); | |
262 | - assertEquals(Boolean.TRUE.toString(), actualMsg.getMetaData().getValue(IS_EXISTING_ALARM)); | |
263 | - assertNotSame(metaData, actualMsg.getMetaData()); | |
266 | + ArgumentCaptor<String> typeCaptor = ArgumentCaptor.forClass(String.class); | |
267 | + ArgumentCaptor<EntityId> originatorCaptor = ArgumentCaptor.forClass(EntityId.class); | |
268 | + ArgumentCaptor<TbMsgMetaData> metadataCaptor = ArgumentCaptor.forClass(TbMsgMetaData.class); | |
269 | + ArgumentCaptor<String> dataCaptor = ArgumentCaptor.forClass(String.class); | |
270 | + verify(ctx).newMsg(typeCaptor.capture(), originatorCaptor.capture(), metadataCaptor.capture(), dataCaptor.capture()); | |
264 | 271 | |
265 | - Alarm actualAlarm = new ObjectMapper().readValue(actualMsg.getData().getBytes(), Alarm.class); | |
272 | + assertEquals("ALARM", typeCaptor.getValue()); | |
273 | + assertEquals(originator, originatorCaptor.getValue()); | |
274 | + assertEquals("value", metadataCaptor.getValue().getValue("key")); | |
275 | + assertEquals(Boolean.TRUE.toString(), metadataCaptor.getValue().getValue(IS_EXISTING_ALARM)); | |
276 | + assertNotSame(metaData, metadataCaptor.getValue()); | |
277 | + | |
278 | + Alarm actualAlarm = new ObjectMapper().readValue(dataCaptor.getValue().getBytes(), Alarm.class); | |
266 | 279 | assertTrue(activeAlarm.getEndTs() > oldEndDate); |
267 | 280 | Alarm expectedAlarm = Alarm.builder() |
268 | 281 | .tenantId(tenantId) |
... | ... | @@ -298,17 +311,21 @@ public class TbAlarmNodeTest { |
298 | 311 | |
299 | 312 | node.onMsg(ctx, msg); |
300 | 313 | |
301 | - ArgumentCaptor<TbMsg> captor = ArgumentCaptor.forClass(TbMsg.class); | |
302 | - verify(ctx).tellNext(captor.capture(), eq("Cleared")); | |
303 | - TbMsg actualMsg = captor.getValue(); | |
314 | + verify(ctx).tellNext(any(), eq("Cleared")); | |
315 | + | |
316 | + ArgumentCaptor<String> typeCaptor = ArgumentCaptor.forClass(String.class); | |
317 | + ArgumentCaptor<EntityId> originatorCaptor = ArgumentCaptor.forClass(EntityId.class); | |
318 | + ArgumentCaptor<TbMsgMetaData> metadataCaptor = ArgumentCaptor.forClass(TbMsgMetaData.class); | |
319 | + ArgumentCaptor<String> dataCaptor = ArgumentCaptor.forClass(String.class); | |
320 | + verify(ctx).newMsg(typeCaptor.capture(), originatorCaptor.capture(), metadataCaptor.capture(), dataCaptor.capture()); | |
304 | 321 | |
305 | - assertEquals("ALARM", actualMsg.getType()); | |
306 | - assertEquals(originator, actualMsg.getOriginator()); | |
307 | - assertEquals("value", actualMsg.getMetaData().getValue("key")); | |
308 | - assertEquals(Boolean.TRUE.toString(), actualMsg.getMetaData().getValue(IS_CLEARED_ALARM)); | |
309 | - assertNotSame(metaData, actualMsg.getMetaData()); | |
322 | + assertEquals("ALARM", typeCaptor.getValue()); | |
323 | + assertEquals(originator, originatorCaptor.getValue()); | |
324 | + assertEquals("value", metadataCaptor.getValue().getValue("key")); | |
325 | + assertEquals(Boolean.TRUE.toString(), metadataCaptor.getValue().getValue(IS_CLEARED_ALARM)); | |
326 | + assertNotSame(metaData, metadataCaptor.getValue()); | |
310 | 327 | |
311 | - Alarm actualAlarm = new ObjectMapper().readValue(actualMsg.getData().getBytes(), Alarm.class); | |
328 | + Alarm actualAlarm = new ObjectMapper().readValue(dataCaptor.getValue().getBytes(), Alarm.class); | |
312 | 329 | Alarm expectedAlarm = Alarm.builder() |
313 | 330 | .tenantId(tenantId) |
314 | 331 | .originator(originator) | ... | ... |
... | ... | @@ -36,7 +36,9 @@ import java.io.IOException; |
36 | 36 | |
37 | 37 | import static org.junit.Assert.assertEquals; |
38 | 38 | import static org.junit.Assert.assertNotSame; |
39 | +import static org.mockito.Matchers.any; | |
39 | 40 | import static org.mockito.Mockito.verify; |
41 | +import static org.mockito.Mockito.when; | |
40 | 42 | |
41 | 43 | @RunWith(MockitoJUnitRunner.class) |
42 | 44 | public class TbMsgToEmailNodeTest { |
... | ... | @@ -62,17 +64,19 @@ public class TbMsgToEmailNodeTest { |
62 | 64 | |
63 | 65 | emailNode.onMsg(ctx, msg); |
64 | 66 | |
65 | - ArgumentCaptor<TbMsg> captor = ArgumentCaptor.forClass(TbMsg.class); | |
66 | - verify(ctx).tellNext(captor.capture()); | |
67 | - TbMsg actualMsg = captor.getValue(); | |
67 | + ArgumentCaptor<String> typeCaptor = ArgumentCaptor.forClass(String.class); | |
68 | + ArgumentCaptor<EntityId> originatorCaptor = ArgumentCaptor.forClass(EntityId.class); | |
69 | + ArgumentCaptor<TbMsgMetaData> metadataCaptor = ArgumentCaptor.forClass(TbMsgMetaData.class); | |
70 | + ArgumentCaptor<String> dataCaptor = ArgumentCaptor.forClass(String.class); | |
71 | + verify(ctx).newMsg(typeCaptor.capture(), originatorCaptor.capture(), metadataCaptor.capture(), dataCaptor.capture()); | |
68 | 72 | |
69 | - assertEquals("SEND_EMAIL", actualMsg.getType()); | |
70 | - assertEquals(originator, actualMsg.getOriginator()); | |
71 | - assertEquals("oreo", actualMsg.getMetaData().getValue("username")); | |
72 | - assertNotSame(metaData, actualMsg.getMetaData()); | |
73 | 73 | |
74 | + assertEquals("SEND_EMAIL", typeCaptor.getValue()); | |
75 | + assertEquals(originator, originatorCaptor.getValue()); | |
76 | + assertEquals("oreo", metadataCaptor.getValue().getValue("username")); | |
77 | + assertNotSame(metaData, metadataCaptor.getValue()); | |
74 | 78 | |
75 | - EmailPojo actual = new ObjectMapper().readValue(actualMsg.getData().getBytes(), EmailPojo.class); | |
79 | + EmailPojo actual = new ObjectMapper().readValue(dataCaptor.getValue().getBytes(), EmailPojo.class); | |
76 | 80 | |
77 | 81 | EmailPojo expected = new EmailPojo.EmailPojoBuilder() |
78 | 82 | .from("test@mail.org") | ... | ... |
... | ... | @@ -29,6 +29,7 @@ import org.thingsboard.rule.engine.api.TbNodeException; |
29 | 29 | import org.thingsboard.server.common.data.asset.Asset; |
30 | 30 | import org.thingsboard.server.common.data.id.AssetId; |
31 | 31 | import org.thingsboard.server.common.data.id.CustomerId; |
32 | +import org.thingsboard.server.common.data.id.EntityId; | |
32 | 33 | import org.thingsboard.server.common.data.id.RuleChainId; |
33 | 34 | import org.thingsboard.server.common.data.id.RuleNodeId; |
34 | 35 | import org.thingsboard.server.common.msg.TbMsg; |
... | ... | @@ -68,11 +69,14 @@ public class TbChangeOriginatorNodeTest { |
68 | 69 | when(assetService.findAssetByIdAsync(assetId)).thenReturn(Futures.immediateFuture(asset)); |
69 | 70 | |
70 | 71 | node.onMsg(ctx, msg); |
71 | - ArgumentCaptor<TbMsg> captor = ArgumentCaptor.forClass(TbMsg.class); | |
72 | - verify(ctx).tellNext(captor.capture()); | |
73 | - TbMsg actualMsg = captor.getValue(); | |
74 | - assertEquals(customerId, actualMsg.getOriginator()); | |
75 | - assertEquals(msg.getId(), actualMsg.getId()); | |
72 | + | |
73 | + ArgumentCaptor<String> typeCaptor = ArgumentCaptor.forClass(String.class); | |
74 | + ArgumentCaptor<EntityId> originatorCaptor = ArgumentCaptor.forClass(EntityId.class); | |
75 | + ArgumentCaptor<TbMsgMetaData> metadataCaptor = ArgumentCaptor.forClass(TbMsgMetaData.class); | |
76 | + ArgumentCaptor<String> dataCaptor = ArgumentCaptor.forClass(String.class); | |
77 | + verify(ctx).newMsg(typeCaptor.capture(), originatorCaptor.capture(), metadataCaptor.capture(), dataCaptor.capture()); | |
78 | + | |
79 | + assertEquals(customerId, originatorCaptor.getValue()); | |
76 | 80 | } |
77 | 81 | |
78 | 82 | @Test |
... | ... | @@ -92,11 +96,13 @@ public class TbChangeOriginatorNodeTest { |
92 | 96 | when(assetService.findAssetByIdAsync(assetId)).thenReturn(Futures.immediateFuture(asset)); |
93 | 97 | |
94 | 98 | node.onMsg(ctx, msg); |
95 | - ArgumentCaptor<TbMsg> captor = ArgumentCaptor.forClass(TbMsg.class); | |
96 | - verify(ctx).spawn(captor.capture()); | |
97 | - TbMsg actualMsg = captor.getValue(); | |
98 | - assertEquals(customerId, actualMsg.getOriginator()); | |
99 | - assertEquals(msg.getId(), actualMsg.getId()); | |
99 | + ArgumentCaptor<String> typeCaptor = ArgumentCaptor.forClass(String.class); | |
100 | + ArgumentCaptor<EntityId> originatorCaptor = ArgumentCaptor.forClass(EntityId.class); | |
101 | + ArgumentCaptor<TbMsgMetaData> metadataCaptor = ArgumentCaptor.forClass(TbMsgMetaData.class); | |
102 | + ArgumentCaptor<String> dataCaptor = ArgumentCaptor.forClass(String.class); | |
103 | + verify(ctx).newMsg(typeCaptor.capture(), originatorCaptor.capture(), metadataCaptor.capture(), dataCaptor.capture()); | |
104 | + | |
105 | + assertEquals(customerId, originatorCaptor.getValue()); | |
100 | 106 | } |
101 | 107 | |
102 | 108 | @Test | ... | ... |