package cc.blynk.integration.tcp;
import cc.blynk.integration.IntegrationBase;
import cc.blynk.integration.model.tcp.ClientPair;
import cc.blynk.integration.model.tcp.TestHardClient;
import cc.blynk.server.application.AppServer;
import cc.blynk.server.core.BaseServer;
import cc.blynk.server.core.model.DashBoard;
import cc.blynk.server.core.model.Pin;
import cc.blynk.server.core.model.device.Device;
import cc.blynk.server.core.model.device.Tag;
import cc.blynk.server.core.model.enums.PinType;
import cc.blynk.server.core.model.widgets.Widget;
import cc.blynk.server.core.model.widgets.controls.Timer;
import cc.blynk.server.core.model.widgets.others.eventor.Eventor;
import cc.blynk.server.core.model.widgets.others.eventor.Rule;
import cc.blynk.server.core.model.widgets.others.eventor.TimerTime;
import cc.blynk.server.core.model.widgets.others.eventor.model.action.BaseAction;
import cc.blynk.server.core.model.widgets.others.eventor.model.action.SetPinAction;
import cc.blynk.server.core.model.widgets.others.eventor.model.action.notification.NotifyAction;
import cc.blynk.server.core.protocol.model.messages.ResponseMessage;
import cc.blynk.server.core.protocol.model.messages.appllication.CreateDevice;
import cc.blynk.server.core.protocol.model.messages.appllication.CreateTag;
import cc.blynk.server.hardware.HardwareServer;
import cc.blynk.server.notifications.push.android.AndroidGCMMessage;
import cc.blynk.server.notifications.push.enums.Priority;
import cc.blynk.utils.DateTimeUtils;
import cc.blynk.utils.JsonParser;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.runners.MockitoJUnitRunner;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import static cc.blynk.server.core.protocol.enums.Command.HARDWARE;
import static cc.blynk.server.core.protocol.enums.Response.OK;
import static cc.blynk.server.core.protocol.model.messages.MessageFactory.produce;
import static cc.blynk.server.workers.timer.TimerWorker.TIMER_MSG_ID;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
/**
* The Blynk Project.
* Created by Dmitriy Dumanskiy.
* Created on 2/2/2015.
*
*/
@RunWith(MockitoJUnitRunner.class)
public class TimerTest extends IntegrationBase {
private BaseServer appServer;
private BaseServer hardwareServer;
private ClientPair clientPair;
@Before
public void init() throws Exception {
this.hardwareServer = new HardwareServer(holder).start();
this.appServer = new AppServer(holder).start();
this.clientPair = initAppAndHardPair();
}
@After
public void shutdown() {
this.appServer.close();
this.hardwareServer.close();
this.clientPair.stop();
}
@Test
public void testTimerEvent() throws Exception {
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(holder.timerWorker, 0, 1000, TimeUnit.MILLISECONDS);
TimerTime timerTime = new TimerTime();
timerTime.days = new int[] {1,2,3,4,5,6,7};
//adding 2 seconds just to be sure we no gonna miss timer event
timerTime.time = LocalTime.now(DateTimeUtils.UTC).toSecondOfDay() + 2;
timerTime.tzName = DateTimeUtils.UTC;
Rule rule = new Rule();
rule.isActive = true;
rule.triggerTime = timerTime;
SetPinAction setPinAction = new SetPinAction();
setPinAction.pin = new Pin();
setPinAction.pin.pin = 1;
setPinAction.pin.pinType = PinType.VIRTUAL;
setPinAction.value = "1";
rule.actions = new BaseAction[] {
setPinAction
};
Eventor eventor = new Eventor(new Rule[] {
rule
});
clientPair.appClient.send("createWidget 1\0" + JsonParser.mapper.writeValueAsString(eventor));
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(ok(1)));
verify(clientPair.appClient.responseMock, timeout(3000)).channelRead(any(), eq(produce(TIMER_MSG_ID, HARDWARE, b("1 vw 1 1"))));
verify(clientPair.hardwareClient.responseMock, timeout(3000)).channelRead(any(), eq(produce(TIMER_MSG_ID, HARDWARE, b("vw 1 1"))));
}
@Test
public void testTimerEventNotActive() throws Exception {
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(holder.timerWorker, 0, 1000, TimeUnit.MILLISECONDS);
TimerTime timerTime = new TimerTime();
timerTime.days = new int[] {1,2,3,4,5,6,7};
//adding 2 seconds just to be sure we no gonna miss timer event
timerTime.time = LocalTime.now(DateTimeUtils.UTC).toSecondOfDay() + 2;
timerTime.tzName = DateTimeUtils.UTC;
Rule rule = new Rule();
rule.isActive = true;
rule.triggerTime = timerTime;
SetPinAction setPinAction = new SetPinAction();
setPinAction.pin = new Pin();
setPinAction.pin.pin = 1;
setPinAction.pin.pinType = PinType.VIRTUAL;
setPinAction.value = "1";
rule.actions = new BaseAction[] {
setPinAction
};
Eventor eventor = new Eventor(new Rule[] {
rule
});
clientPair.appClient.send("createWidget 1\0" + JsonParser.mapper.writeValueAsString(eventor));
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(ok(1)));
verify(clientPair.appClient.responseMock, timeout(3000)).channelRead(any(), eq(produce(TIMER_MSG_ID, HARDWARE, b("1 vw 1 1"))));
verify(clientPair.hardwareClient.responseMock, timeout(3000)).channelRead(any(), eq(produce(TIMER_MSG_ID, HARDWARE, b("vw 1 1"))));
clientPair.appClient.reset();
clientPair.hardwareClient.reset();
rule.isActive = false;
timerTime.time = LocalTime.now(DateTimeUtils.UTC).toSecondOfDay() + 1;
clientPair.appClient.send("updateWidget 1\0" + JsonParser.mapper.writeValueAsString(eventor));
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(ok(1)));
verify(clientPair.appClient.responseMock, after(1500).never()).channelRead(any(), eq(produce(TIMER_MSG_ID, HARDWARE, b("1 vw 1 1"))));
verify(clientPair.hardwareClient.responseMock, after(1500).never()).channelRead(any(), eq(produce(TIMER_MSG_ID, HARDWARE, b("vw 1 1"))));
}
@Test
public void testTimerEventWithMultiActions() throws Exception {
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(holder.timerWorker, 0, 1000, TimeUnit.MILLISECONDS);
TimerTime timerTime = new TimerTime();
timerTime.days = new int[] {1,2,3,4,5,6,7};
//adding 2 seconds just to be sure we no gonna miss timer event
timerTime.time = LocalTime.now(DateTimeUtils.UTC).toSecondOfDay() + 2;
timerTime.tzName = DateTimeUtils.UTC;
Rule rule = new Rule();
rule.isActive = true;
rule.triggerTime = timerTime;
SetPinAction setPinAction = new SetPinAction();
setPinAction.pin = new Pin();
setPinAction.pin.pin = 1;
setPinAction.pin.pinType = PinType.VIRTUAL;
setPinAction.value = "1";
SetPinAction setPinAction2 = new SetPinAction();
setPinAction2.pin = new Pin();
setPinAction2.pin.pin = 2;
setPinAction2.pin.pinType = PinType.VIRTUAL;
setPinAction2.value = "2";
rule.actions = new BaseAction[] {
setPinAction,
setPinAction2
};
Eventor eventor = new Eventor(new Rule[] {
rule
});
clientPair.appClient.send("createWidget 1\0" + JsonParser.mapper.writeValueAsString(eventor));
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(ok(1)));
verify(clientPair.appClient.responseMock, timeout(2000)).channelRead(any(), eq(produce(TIMER_MSG_ID, HARDWARE, b("1 vw 1 1"))));
verify(clientPair.appClient.responseMock, timeout(2000)).channelRead(any(), eq(produce(TIMER_MSG_ID, HARDWARE, b("1 vw 2 2"))));
verify(clientPair.hardwareClient.responseMock, timeout(2000)).channelRead(any(), eq(produce(TIMER_MSG_ID, HARDWARE, b("vw 1 1"))));
verify(clientPair.hardwareClient.responseMock, timeout(2000)).channelRead(any(), eq(produce(TIMER_MSG_ID, HARDWARE, b("vw 2 2"))));
}
@Test
public void testTimerEventWithMultiActions1() throws Exception {
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(holder.timerWorker, 0, 1000, TimeUnit.MILLISECONDS);
TimerTime timerTime = new TimerTime();
timerTime.days = new int[] {1,2,3,4,5,6,7};
//adding 2 seconds just to be sure we no gonna miss timer event
timerTime.time = LocalTime.now(DateTimeUtils.UTC).toSecondOfDay() + 2;
timerTime.tzName = DateTimeUtils.UTC;
Rule rule = new Rule();
rule.isActive = true;
rule.triggerTime = timerTime;
SetPinAction setPinAction = new SetPinAction();
setPinAction.pin = new Pin();
setPinAction.pin.pin = 1;
setPinAction.pin.pinType = PinType.VIRTUAL;
setPinAction.value = "1";
NotifyAction notifyAction = new NotifyAction();
notifyAction.message = "Hello";
rule.actions = new BaseAction[] {
setPinAction,
notifyAction
};
Eventor eventor = new Eventor(new Rule[] {
rule
});
clientPair.appClient.send("createWidget 1\0" + JsonParser.mapper.writeValueAsString(eventor));
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(ok(1)));
ArgumentCaptor<AndroidGCMMessage> objectArgumentCaptor = ArgumentCaptor.forClass(AndroidGCMMessage.class);
verify(gcmWrapper, timeout(2000).times(1)).send(objectArgumentCaptor.capture(), any(), any());
AndroidGCMMessage message = objectArgumentCaptor.getValue();
String expectedJson = new AndroidGCMMessage("token", Priority.normal, "Hello", 1).toJson();
assertEquals(expectedJson, message.toJson());
verify(clientPair.appClient.responseMock, timeout(2000)).channelRead(any(), eq(produce(TIMER_MSG_ID, HARDWARE, b("1 vw 1 1"))));
verify(clientPair.hardwareClient.responseMock, timeout(2000)).channelRead(any(), eq(produce(TIMER_MSG_ID, HARDWARE, b("vw 1 1"))));
}
@Test
public void testIsTimeMethod() {
ZonedDateTime currentDateTime = ZonedDateTime.now(DateTimeUtils.UTC).withHour(23);
//kiev is +2, so as currentDateTime has 23 hour. kiev should be always ahead.
LocalDateTime userDateTime = currentDateTime.withZoneSameInstant(ZoneId.of("Europe/Kiev")).toLocalDateTime();
assertNotEquals(currentDateTime.getDayOfWeek(), userDateTime.getDayOfWeek());
}
@Test
public void testTimerEventWithWrongDayDontWork() throws Exception {
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(holder.timerWorker, 0, 1000, TimeUnit.MILLISECONDS);
ZonedDateTime now = ZonedDateTime.now(DateTimeUtils.UTC);
int currentDayIndex = now.getDayOfWeek().ordinal();
TimerTime timerTime = new TimerTime();
timerTime.days = new int[] {1,2,3,4,5,6,7};
//removing today day from expected days so timer doesnt work.
timerTime.days[currentDayIndex] = -1;
//adding 2 seconds just to be sure we no gonna miss timer event
timerTime.time = LocalTime.now(DateTimeUtils.UTC).toSecondOfDay() + 1;
timerTime.tzName = DateTimeUtils.UTC;
Rule rule = new Rule();
rule.isActive = true;
rule.triggerTime = timerTime;
SetPinAction setPinAction = new SetPinAction();
setPinAction.pin = new Pin();
setPinAction.pin.pin = 1;
setPinAction.pin.pinType = PinType.VIRTUAL;
setPinAction.value = "1";
rule.actions = new BaseAction[] {
setPinAction
};
Eventor eventor = new Eventor(new Rule[] {
rule
});
clientPair.appClient.send("createWidget 1\0" + JsonParser.mapper.writeValueAsString(eventor));
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(ok(1)));
verify(clientPair.appClient.responseMock, after(700).never()).channelRead(any(), eq(produce(TIMER_MSG_ID, HARDWARE, b("1 vw 1 1"))));
verify(clientPair.hardwareClient.responseMock, after(700).never()).channelRead(any(), eq(produce(TIMER_MSG_ID, HARDWARE, b("vw 1 1"))));
}
@Test
public void testAddTimerWidgetWithStartTimeTriggered() throws Exception {
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(holder.timerWorker, 0, 1000, TimeUnit.MILLISECONDS);
Timer timer = new Timer();
timer.id = 112;
timer.x = 1;
timer.y = 1;
timer.width = 2;
timer.height = 1;
timer.pinType = PinType.DIGITAL;
timer.pin = 5;
timer.startValue = b("dw 5 1");
LocalTime localDateTime = LocalTime.now(ZoneId.of("UTC"));
int curTime = localDateTime.toSecondOfDay();
timer.startTime = curTime + 1;
clientPair.appClient.send("createWidget 1\0" + JsonParser.toJson(timer));
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(1, OK)));
verify(clientPair.hardwareClient.responseMock, timeout(1500).times(1)).channelRead(any(), any());
verify(clientPair.hardwareClient.responseMock, timeout(2000)).channelRead(any(), eq(produce(7777, HARDWARE, b("dw 5 1"))));
}
@Test
public void testAddTimerWidgetWithStopAndStartTimeTriggered() throws Exception {
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(holder.timerWorker, 0, 1000, TimeUnit.MILLISECONDS);
Timer timer = new Timer();
timer.id = 112;
timer.x = 1;
timer.y = 1;
timer.width = 2;
timer.height = 1;
timer.pinType = PinType.DIGITAL;
timer.pin = 5;
timer.stopValue = b("dw 5 0");
LocalTime localDateTime = LocalTime.now(ZoneId.of("UTC"));
int curTime = localDateTime.toSecondOfDay();
timer.stopTime = curTime + 1;
clientPair.appClient.send("createWidget 1\0" + JsonParser.toJson(timer));
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(1, OK)));
verify(clientPair.hardwareClient.responseMock, timeout(1500).times(1)).channelRead(any(), any());
verify(clientPair.hardwareClient.responseMock, timeout(2000)).channelRead(any(), eq(produce(7777, HARDWARE, b("dw 5 0"))));
}
@Test
public void testAddTimerWidgetWithStopTimeTriggered() throws Exception {
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(holder.timerWorker, 0, 1000, TimeUnit.MILLISECONDS);
Timer timer = new Timer();
timer.id = 112;
timer.x = 1;
timer.y = 1;
timer.pinType = PinType.DIGITAL;
timer.pin = 5;
timer.width = 2;
timer.height = 1;
timer.startValue = b("dw 5 1");
timer.stopValue = b("dw 5 0");
LocalTime localDateTime = LocalTime.now(ZoneId.of("UTC"));
int curTime = localDateTime.toSecondOfDay();
timer.startTime = curTime + 1;
timer.stopTime = curTime + 2;
clientPair.appClient.send("createWidget 1\0" + JsonParser.toJson(timer));
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(1, OK)));
verify(clientPair.hardwareClient.responseMock, timeout(2500).times(2)).channelRead(any(), any());
verify(clientPair.hardwareClient.responseMock, timeout(2000)).channelRead(any(), eq(produce(7777, HARDWARE, b("dw 5 0"))));
verify(clientPair.hardwareClient.responseMock, timeout(2000)).channelRead(any(), eq(produce(7777, HARDWARE, b("dw 5 1"))));
}
@Test
public void testAddTimerWidgetWithStopTimeAndRemove() throws Exception {
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(holder.timerWorker, 0, 1000, TimeUnit.MILLISECONDS);
Timer timer = new Timer();
timer.id = 112;
timer.x = 1;
timer.y = 1;
timer.pinType = PinType.DIGITAL;
timer.pin = 5;
timer.width = 2;
timer.height = 1;
timer.startValue = b("dw 5 1");
timer.stopValue = b("dw 5 0");
LocalTime localDateTime = LocalTime.now(ZoneId.of("UTC"));
int curTime = localDateTime.toSecondOfDay();
timer.startTime = curTime + 1;
timer.stopTime = curTime + 2;
clientPair.appClient.send("createWidget 1\0" + JsonParser.toJson(timer));
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(1, OK)));
clientPair.appClient.send("deleteWidget 1\0" + 112);
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(2, OK)));
verify(clientPair.hardwareClient.responseMock, after(2500).never()).channelRead(any(), any());
}
@Test
public void testAddFewTimersWidgetWithStartTimeTriggered() throws Exception {
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(holder.timerWorker, 0, 1000, TimeUnit.MILLISECONDS);
Timer timer = new Timer();
timer.id = 112;
timer.x = 1;
timer.y = 1;
timer.pinType = PinType.DIGITAL;
timer.pin = 5;
timer.startValue = b("1");
timer.width = 2;
timer.height = 1;
LocalTime localDateTime = LocalTime.now(ZoneId.of("UTC"));
int curTime = localDateTime.toSecondOfDay();
timer.startTime = curTime + 1;
clientPair.appClient.send("createWidget 1\0" + JsonParser.toJson(timer));
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(1, OK)));
timer.id = 113;
timer.startValue = b("2");
clientPair.appClient.send("createWidget 1\0" + JsonParser.toJson(timer));
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(2, OK)));
verify(clientPair.hardwareClient.responseMock, timeout(2500).times(2)).channelRead(any(), any());
verify(clientPair.hardwareClient.responseMock, timeout(2000)).channelRead(any(), eq(produce(7777, HARDWARE, b("dw 5 1"))));
verify(clientPair.hardwareClient.responseMock, timeout(2000)).channelRead(any(), eq(produce(7777, HARDWARE, b("dw 5 2"))));
}
@Test
public void testAddTimerWithSameStartStopTriggered() throws Exception {
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(holder.timerWorker, 0, 1000, TimeUnit.MILLISECONDS);
Timer timer = new Timer();
timer.id = 112;
timer.x = 1;
timer.y = 1;
timer.pinType = PinType.DIGITAL;
timer.pin = 5;
timer.width = 2;
timer.height = 1;
timer.startValue = b("dw 5 0");
timer.stopValue = b("dw 5 1");
LocalTime localDateTime = LocalTime.now(ZoneId.of("UTC"));
int curTime = localDateTime.toSecondOfDay();
timer.startTime = curTime + 1;
timer.stopTime = curTime + 1;
clientPair.appClient.send("createWidget 1\0" + JsonParser.toJson(timer));
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(1, OK)));
verify(clientPair.hardwareClient.responseMock, timeout(2500).times(2)).channelRead(any(), any());
verify(clientPair.hardwareClient.responseMock, timeout(2000)).channelRead(any(), eq(produce(7777, HARDWARE, b("dw 5 0"))));
verify(clientPair.hardwareClient.responseMock, timeout(2000)).channelRead(any(), eq(produce(7777, HARDWARE, b("dw 5 1"))));
}
@Test
public void testUpdateTimerWidgetWithStopTimeTriggered() throws Exception {
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(holder.timerWorker, 0, 1000, TimeUnit.MILLISECONDS);
Timer timer = new Timer();
timer.id = 112;
timer.x = 1;
timer.y = 1;
timer.width = 2;
timer.height = 1;
timer.pinType = PinType.DIGITAL;
timer.pin = 5;
timer.startValue = b("dw 5 1");
timer.stopValue = b("dw 5 0");
LocalTime localDateTime = LocalTime.now(ZoneId.of("UTC"));
int curTime = localDateTime.toSecondOfDay();
timer.startTime = curTime + 1;
timer.stopTime = curTime + 2;
clientPair.appClient.send("createWidget 1\0" + JsonParser.toJson(timer));
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(1, OK)));
timer.startValue = b("dw 5 11");
timer.stopValue = b("dw 5 10");
clientPair.appClient.send("updateWidget 1\0" + JsonParser.toJson(timer));
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(1, OK)));
verify(clientPair.hardwareClient.responseMock, timeout(2500).times(2)).channelRead(any(), any());
verify(clientPair.hardwareClient.responseMock, timeout(2000)).channelRead(any(), eq(produce(7777, HARDWARE, b("dw 5 11"))));
verify(clientPair.hardwareClient.responseMock, timeout(2000)).channelRead(any(), eq(produce(7777, HARDWARE, b("dw 5 10"))));
}
@Test
public void testDashTimerNotTriggered() throws Exception {
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(holder.timerWorker, 0, 1000, TimeUnit.MILLISECONDS);
Timer timer = new Timer();
timer.id = 112;
timer.x = 1;
timer.y = 1;
timer.width = 2;
timer.height = 1;
timer.pinType = PinType.DIGITAL;
timer.pin = 5;
timer.startValue = b("dw 5 1");
timer.stopValue = b("dw 5 0");
LocalTime localDateTime = LocalTime.now(ZoneId.of("UTC"));
int curTime = localDateTime.toSecondOfDay();
timer.startTime = curTime + 1;
timer.stopTime = curTime + 2;
clientPair.appClient.send("createWidget 1\0" + JsonParser.toJson(timer));
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(1, OK)));
clientPair.appClient.send("deleteDash 1");
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(2, OK)));
verify(clientPair.hardwareClient.responseMock, after(2500).times(0)).channelRead(any(), any());
}
@Test
public void testTimerWidgetTriggeredAndSendCommandToCorrectDevice() throws Exception {
TestHardClient hardClient2 = new TestHardClient("localhost", tcpHardPort);
hardClient2.start();
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(holder.timerWorker, 0, 1000, TimeUnit.MILLISECONDS);
clientPair.appClient.send("deactivate 1");
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(1, OK)));
Timer timer = new Timer();
timer.id = 1;
timer.x = 1;
timer.y = 1;
timer.pinType = PinType.DIGITAL;
timer.pin = 5;
timer.startValue = b("dw 5 1");
timer.stopValue = b("dw 5 0");
LocalTime localDateTime = LocalTime.now(ZoneId.of("UTC"));
int curTime = localDateTime.toSecondOfDay();
timer.startTime = curTime + 1;
timer.stopTime = curTime + 2;
DashBoard dashBoard = new DashBoard();
dashBoard.id = 1;
dashBoard.name = "Test";
dashBoard.widgets = new Widget[] {timer};
clientPair.appClient.send("updateDash " + dashBoard.toString());
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(2, OK)));
dashBoard.id = 2;
clientPair.appClient.send("createDash " + dashBoard.toString());
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(3, OK)));
clientPair.appClient.send("activate 1");
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(4, OK)));
clientPair.appClient.reset();
clientPair.appClient.send("getToken 2");
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), any());
hardClient2.send("login " + clientPair.appClient.getBody());
verify(hardClient2.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(1, OK)));
hardClient2.reset();
verify(clientPair.hardwareClient.responseMock, timeout(2000)).channelRead(any(), eq(produce(7777, HARDWARE, b("dw 5 1"))));
clientPair.hardwareClient.reset();
verify(clientPair.hardwareClient.responseMock, timeout(2000)).channelRead(any(), eq(produce(7777, HARDWARE, b("dw 5 0"))));
verify(hardClient2.responseMock, never()).channelRead(any(), any());
hardClient2.stop().awaitUninterruptibly();
}
@Test
public void testTimerWidgetTriggered() throws Exception {
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(holder.timerWorker, 0, 1000, TimeUnit.MILLISECONDS);
clientPair.appClient.send("deactivate 1");
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(1, OK)));
Timer timer = new Timer();
timer.id = 1;
timer.x = 1;
timer.y = 1;
timer.pinType = PinType.DIGITAL;
timer.pin = 5;
timer.startValue = "1";
timer.stopValue = "0";
LocalTime localDateTime = LocalTime.now(ZoneId.of("UTC"));
int curTime = localDateTime.toSecondOfDay();
timer.startTime = curTime + 1;
timer.stopTime = curTime + 2;
DashBoard dashBoard = new DashBoard();
dashBoard.id = 1;
dashBoard.name = "Test";
dashBoard.widgets = new Widget[] {timer};
clientPair.appClient.send("updateDash " + dashBoard.toString());
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(2, OK)));
clientPair.appClient.send("activate 1");
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(3, OK)));
verify(clientPair.hardwareClient.responseMock, timeout(2000)).channelRead(any(), eq(produce(7777, HARDWARE, b("dw 5 1"))));
clientPair.hardwareClient.reset();
verify(clientPair.hardwareClient.responseMock, timeout(2000)).channelRead(any(), eq(produce(7777, HARDWARE, b("dw 5 0"))));
}
@Test
public void testTimerWorksWithTag() throws Exception {
//creating new device
Device device1 = new Device(1, "My Device", "ESP8266");
clientPair.appClient.send("createDevice 1\0" + device1.toString());
String createdDevice = clientPair.appClient.getBody();
Device device = JsonParser.parseDevice(createdDevice);
assertNotNull(device);
assertNotNull(device.token);
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new CreateDevice(1, device.toString())));
TestHardClient hardClient2 = new TestHardClient("localhost", tcpHardPort);
hardClient2.start();
hardClient2.send("login " + device.token);
verify(hardClient2.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(1, OK)));
clientPair.appClient.reset();
//creating new tag
Tag tag0 = new Tag(100_000, "Tag1");
//assigning 2 devices on 1 tag.
tag0.deviceIds = new int[] {0, 1};
clientPair.appClient.send("createTag 1\0" + tag0.toString());
String createdTag = clientPair.appClient.getBody();
Tag tag = JsonParser.parseTag(createdTag);
assertNotNull(tag);
assertEquals(100_000, tag.id);
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new CreateTag(1, tag.toString())));
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(holder.timerWorker, 0, 1000, TimeUnit.MILLISECONDS);
Timer timer = new Timer();
timer.id = 112;
timer.x = 1;
timer.y = 1;
timer.width = 2;
timer.height = 1;
timer.pinType = PinType.DIGITAL;
timer.pin = 5;
timer.startValue = b("dw 5 1");
timer.deviceId = 100_000;
LocalTime localDateTime = LocalTime.now(ZoneId.of("UTC"));
int curTime = localDateTime.toSecondOfDay();
timer.startTime = curTime + 1;
clientPair.appClient.send("createWidget 1\0" + JsonParser.toJson(timer));
verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(2, OK)));
verify(clientPair.hardwareClient.responseMock, timeout(2000)).channelRead(any(), eq(produce(7777, HARDWARE, b("dw 5 1"))));
verify(hardClient2.responseMock, timeout(2000)).channelRead(any(), eq(produce(7777, HARDWARE, b("dw 5 1"))));
}
}