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.device.Device; import cc.blynk.server.core.model.device.Tag; 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.core.protocol.model.messages.appllication.sharing.AppSyncMessage; import cc.blynk.server.core.protocol.model.messages.common.HardwareMessage; import cc.blynk.server.hardware.HardwareServer; 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.runners.MockitoJUnitRunner; import static cc.blynk.server.core.protocol.enums.Response.ILLEGAL_COMMAND; import static cc.blynk.server.core.protocol.enums.Response.OK; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.any; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.verify; /** * The Blynk Project. * Created by Dmitriy Dumanskiy. * Created on 2/2/2015. * */ @RunWith(MockitoJUnitRunner.class) public class TagCommandsTest 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 testAddNewTag() throws Exception { Tag tag0 = new Tag(100_000, "Tag1"); 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()))); clientPair.appClient.reset(); clientPair.appClient.send("getTags 1"); String response = clientPair.appClient.getBody(); Tag[] tags = JsonParser.mapper.readValue(response, Tag[].class); assertNotNull(tags); assertEquals(1, tags.length); assertEqualTag(tag0, tags[0]); } @Test public void testUpdateExistingDevice() throws Exception { Tag tag0 = new Tag(100_000, "Tag1"); 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); assertEquals("Tag1", tag.name); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new CreateTag(1, tag.toString()))); clientPair.appClient.reset(); tag0 = new Tag(100_000, "TagUPDATED"); clientPair.appClient.send("updateTag 1\0" + tag0.toString()); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(1, OK))); clientPair.appClient.reset(); clientPair.appClient.send("getTags 1"); String response = clientPair.appClient.getBody(); Tag[] tags = JsonParser.mapper.readValue(response, Tag[].class); assertNotNull(tags); assertEquals(1, tags.length); assertEqualTag(tag0, tags[0]); } @Test public void testUpdateNonExistingTag() throws Exception { Tag tag0 = new Tag(100_000, "Tag1"); clientPair.appClient.send("updateTag 1\0" + tag0.toString()); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(1, ILLEGAL_COMMAND))); } @Test public void testUpdateTagWithSameName() throws Exception { Tag tag0 = new Tag(100_000, "Tag1"); 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()))); clientPair.appClient.reset(); Tag tag1 = new Tag(100_001, "Tag1"); clientPair.appClient.send("createTag 1\0" + tag1.toString()); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(1, ILLEGAL_COMMAND))); } @Test public void testDeletedNewlyAddedTag() throws Exception { Tag tag0 = new Tag(100_000, "My Dashboard"); clientPair.appClient.send("createTag 1\0" + tag0.toString()); String createdTag = clientPair.appClient.getBody(); Tag tag = JsonParser.parseTag(createdTag); assertNotNull(tag); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new CreateTag(1, tag0.toString()))); clientPair.appClient.reset(); clientPair.appClient.send("getTags 1"); String response = clientPair.appClient.getBody(); Tag[] tags = JsonParser.mapper.readValue(response, Tag[].class); assertNotNull(tags); assertEquals(1, tags.length); assertEqualTag(tag0, tags[0]); clientPair.appClient.send("deleteTag 1\0" + tag0.id); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(2, OK))); clientPair.appClient.reset(); clientPair.appClient.send("getTags 1"); response = clientPair.appClient.getBody(); tags = JsonParser.mapper.readValue(response, Tag[].class); assertNotNull(tags); assertEquals(0, tags.length); } @Test public void testAddNewTagForMultipleDevicesAndAssignWidgetAndVerifySync() 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()))); clientPair.appClient.send("createWidget 1\0{\"id\":88, \"width\":1, \"height\":1, \"deviceId\":100000, \"x\":0, \"y\":0, \"label\":\"Button\", \"type\":\"BUTTON\", \"pinType\":\"VIRTUAL\", \"pin\":88}"); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(ok(2))); clientPair.appClient.send("hardware 1-100000 vw 88 100"); verify(clientPair.hardwareClient.responseMock, timeout(500)).channelRead(any(), eq(new HardwareMessage(3, b("vw 88 100")))); verify(hardClient2.responseMock, timeout(500)).channelRead(any(), eq(new HardwareMessage(3, b("vw 88 100")))); clientPair.hardwareClient.send("hardsync vr 88"); verify(clientPair.hardwareClient.responseMock, timeout(500)).channelRead(any(), eq(new HardwareMessage(1, b("vw 88 100")))); hardClient2.send("hardsync vr 88"); verify(hardClient2.responseMock, timeout(500)).channelRead(any(), eq(new HardwareMessage(2, b("vw 88 100")))); clientPair.appClient.reset(); clientPair.appClient.send("appSync 1"); verify(clientPair.appClient.responseMock, timeout(1000).times(14)).channelRead(any(), any()); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(ok(1))); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new AppSyncMessage(b("1 dw 1 1")))); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new AppSyncMessage(b("1 dw 2 1")))); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new AppSyncMessage(b("1 aw 3 0")))); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new AppSyncMessage(b("1 dw 5 1")))); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new AppSyncMessage(b("1 vw 4 244")))); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new AppSyncMessage(b("1 aw 7 3")))); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new AppSyncMessage(b("1 aw 30 3")))); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new AppSyncMessage(b("1 vw 0 89.888037459418")))); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new AppSyncMessage(b("1 vw 1 -58.74774244674501")))); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new AppSyncMessage(b("1 vw 13 60 143 158")))); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new AppSyncMessage(b("1 vw 88 100")))); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new AppSyncMessage(b("1 vw 88 100")))); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new AppSyncMessage(b("1-100000 vw 88 100")))); } private static void assertEqualTag(Tag expected, Tag real) { assertEquals(expected.id, real.id); assertEquals(expected.name, real.name); assertArrayEquals(expected.deviceIds, real.deviceIds); } }