package cc.blynk.integration.tcp;
import cc.blynk.integration.IntegrationBase;
import cc.blynk.integration.model.tcp.ClientPair;
import cc.blynk.integration.model.tcp.TestAppClient;
import cc.blynk.integration.model.tcp.TestHardClient;
import cc.blynk.server.api.http.HttpAPIServer;
import cc.blynk.server.application.AppServer;
import cc.blynk.server.core.BaseServer;
import cc.blynk.server.core.model.DashBoard;
import cc.blynk.server.core.protocol.model.messages.ResponseMessage;
import cc.blynk.server.core.protocol.model.messages.common.HardwareConnectedMessage;
import cc.blynk.server.core.protocol.model.messages.common.HardwareMessage;
import cc.blynk.server.hardware.HardwareServer;
import org.asynchttpclient.AsyncHttpClient;
import org.asynchttpclient.DefaultAsyncHttpClient;
import org.asynchttpclient.DefaultAsyncHttpClientConfig;
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.DEVICE_NOT_IN_NETWORK;
import static cc.blynk.server.core.protocol.enums.Response.OK;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.*;
/**
* The Blynk Project.
* Created by Dmitriy Dumanskiy.
* Created on 5/09/2016.
*
*/
@RunWith(MockitoJUnitRunner.class)
public class MultiAppTest extends IntegrationBase {
private BaseServer httpServer;
private BaseServer appServer;
private BaseServer hardwareServer;
private AsyncHttpClient httpclient;
private String httpServerUrl;
private ClientPair clientPair;
@Before
public void init() throws Exception {
httpServer = new HttpAPIServer(holder).start();
hardwareServer = new HardwareServer(holder).start();
appServer = new AppServer(holder).start();
httpServerUrl = String.format("http://localhost:%s/", httpPort);
httpclient = new DefaultAsyncHttpClient(
new DefaultAsyncHttpClientConfig.Builder()
.setUserAgent("")
.setKeepAlive(true)
.build());
if (clientPair == null) {
clientPair = initAppAndHardPair(tcpAppPort, tcpHardPort, properties);
}
clientPair.hardwareClient.reset();
clientPair.appClient.reset();
}
@After
public void shutdown() {
httpServer.close();
appServer.close();
hardwareServer.close();
clientPair.stop();
}
@Test
public void testCreateFewAccountWithDifferentApp() throws Exception {
TestAppClient appClient1 = new TestAppClient("localhost", tcpAppPort, properties);
appClient1.start();
TestAppClient appClient2 = new TestAppClient("localhost", tcpAppPort, properties);
appClient2.start();
String token1 = workflowForUser(appClient1, "test@blynk.cc", "a", "testapp1");
String token2 = workflowForUser(appClient2, "test@blynk.cc", "a", "testapp2");
appClient1.reset();
appClient2.reset();
TestHardClient hardClient1 = new TestHardClient("localhost", tcpHardPort);
hardClient1.start();
TestHardClient hardClient2 = new TestHardClient("localhost", tcpHardPort);
hardClient2.start();
hardClient1.send("login " + token1);
verify(hardClient1.responseMock, timeout(2000)).channelRead(any(), eq(new ResponseMessage(1, OK)));
verify(appClient1.responseMock, timeout(2000)).channelRead(any(), eq(new HardwareConnectedMessage(1, "1-0")));
hardClient2.send("login " + token2);
verify(hardClient2.responseMock, timeout(2000)).channelRead(any(), eq(new ResponseMessage(1, OK)));
verify(appClient2.responseMock, timeout(2000)).channelRead(any(), eq(new HardwareConnectedMessage(1, "1-0")));
hardClient1.send("hardware vw 1 100");
verify(appClient1.responseMock, timeout(2000)).channelRead(any(), eq(new HardwareMessage(2, b("1 vw 1 100"))));
verify(appClient2.responseMock, timeout(500).times(0)).channelRead(any(), eq(new HardwareMessage(1, b("1 vw 1 100"))));
appClient1.reset();
appClient2.reset();
hardClient2.send("hardware vw 1 100");
verify(appClient2.responseMock, timeout(2000)).channelRead(any(), eq(new HardwareMessage(2, b("1 vw 1 100"))));
verify(appClient1.responseMock, timeout(500).times(0)).channelRead(any(), eq(new HardwareMessage(1, b("1 vw 1 100"))));
}
private String workflowForUser(TestAppClient appClient, String email, String pass, String appName) throws Exception{
appClient.send("register " + email + " " + pass + " " + appName);
verify(appClient.responseMock, timeout(1000)).channelRead(any(), eq(new ResponseMessage(1, OK)));
appClient.send("login " + email + " " + pass + " Android 1.10.4 " + appName);
//we should wait until login finished. Only after that we can send commands
verify(appClient.responseMock, timeout(1000)).channelRead(any(), eq(new ResponseMessage(2, OK)));
DashBoard dash = new DashBoard();
dash.id = 1;
dash.name = "test";
appClient.send("createDash " + dash.toString());
verify(appClient.responseMock, timeout(1000)).channelRead(any(), eq(new ResponseMessage(3, OK)));
appClient.send("activate 1");
verify(appClient.responseMock, timeout(1000)).channelRead(any(), eq(new ResponseMessage(4, DEVICE_NOT_IN_NETWORK)));
appClient.reset();
appClient.send("getToken 1");
String token = appClient.getBody();
assertNotNull(token);
return token;
}
}