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);
}
}