package cc.blynk.integration.tcp; import cc.blynk.integration.IntegrationBase; import cc.blynk.integration.model.tcp.ClientPair; 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.Status; import cc.blynk.server.core.protocol.model.messages.ResponseMessage; import cc.blynk.server.core.protocol.model.messages.appllication.CreateDevice; 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_BODY; import static cc.blynk.server.core.protocol.enums.Response.OK; 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 DeviceCommandsTest 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 testAddNewDevice() throws Exception { Device device0 = new Device(0, "My Dashboard", "UNO"); device0.status = Status.ONLINE; Device device1 = new Device(1, "My Device", "ESP8266"); device1.status = Status.OFFLINE; 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()))); clientPair.appClient.reset(); clientPair.appClient.send("getDevices 1"); String response = clientPair.appClient.getBody(); Device[] devices = JsonParser.mapper.readValue(response, Device[].class); assertNotNull(devices); assertEquals(2, devices.length); assertEqualDevice(device0, devices[0]); assertEqualDevice(device1, devices[1]); } @Test public void testUpdateExistingDevice() throws Exception { Device device0 = new Device(0, "My Dashboard Updated", "UNO"); device0.status = Status.ONLINE; clientPair.appClient.send("updateDevice 1\0" + device0.toString()); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(1, OK))); clientPair.appClient.reset(); clientPair.appClient.send("getDevices 1"); String response = clientPair.appClient.getBody(); Device[] devices = JsonParser.mapper.readValue(response, Device[].class); assertNotNull(devices); assertEquals(1, devices.length); assertEqualDevice(device0, devices[0]); } @Test public void testUpdateNonExistingDevice() throws Exception { Device device = new Device(100, "My Dashboard Updated", "UNO"); clientPair.appClient.send("updateDevice 1\0" + device.toString()); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(1, ILLEGAL_COMMAND_BODY))); } @Test public void testGetDevices() throws Exception { Device device0 = new Device(0, "My Dashboard", "UNO"); device0.status = Status.ONLINE; clientPair.appClient.send("getDevices 1"); String response = clientPair.appClient.getBody(); Device[] devices = JsonParser.mapper.readValue(response, Device[].class); assertNotNull(devices); assertEquals(1, devices.length); assertEqualDevice(device0, devices[0]); } @Test public void testTokenNotUpdatedForExistingDevice() throws Exception { Device device0 = new Device(0, "My Dashboard", "UNO"); device0.status = Status.ONLINE; clientPair.appClient.send("getDevices 1"); String response = clientPair.appClient.getBody(); Device[] devices = JsonParser.mapper.readValue(response, Device[].class); assertNotNull(devices); assertEquals(1, devices.length); assertEqualDevice(device0, devices[0]); String token = devices[0].token; device0.name = "My Dashboard UPDATED"; device0.token = "123"; clientPair.appClient.send("updateDevice 1\0" + device0.toString()); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(2, OK))); clientPair.appClient.reset(); clientPair.appClient.send("getDevices 1"); response = clientPair.appClient.getBody(); devices = JsonParser.mapper.readValue(response, Device[].class); assertNotNull(devices); assertEquals(1, devices.length); assertEqualDevice(device0, devices[0]); assertEquals("My Dashboard UPDATED", devices[0].name); assertEquals(token, devices[0].token); } @Test public void testDeletedNewlyAddedDevice() throws Exception { Device device0 = new Device(0, "My Dashboard", "UNO"); device0.status = Status.ONLINE; Device device1 = new Device(1, "My Device", "ESP8266"); device1.status = Status.OFFLINE; 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()))); clientPair.appClient.reset(); clientPair.appClient.send("getDevices 1"); String response = clientPair.appClient.getBody(); Device[] devices = JsonParser.mapper.readValue(response, Device[].class); assertNotNull(devices); assertEquals(2, devices.length); assertEqualDevice(device0, devices[0]); assertEqualDevice(device1, devices[1]); clientPair.appClient.send("deleteDevice 1\0" + device1.id); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new ResponseMessage(2, OK))); clientPair.appClient.reset(); clientPair.appClient.send("getDevices 1"); response = clientPair.appClient.getBody(); devices = JsonParser.mapper.readValue(response, Device[].class); assertNotNull(devices); assertEquals(1, devices.length); assertEqualDevice(device0, devices[0]); } private static void assertEqualDevice(Device expected, Device real) { assertEquals(expected.id, real.id); //assertEquals(expected.name, real.name); assertEquals(expected.boardType, real.boardType); assertNotNull(real.token); assertEquals(expected.status, real.status); } }