package cc.blynk.integration.tcp;
import cc.blynk.integration.IntegrationBase;
import cc.blynk.integration.model.tcp.TestAppClient;
import cc.blynk.server.Holder;
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.appllication.GetServerMessage;
import cc.blynk.server.hardware.HardwareServer;
import cc.blynk.utils.ServerProperties;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
import redis.clients.jedis.Jedis;
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.assertEquals;
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 LoadBalancingIntegrationTest extends IntegrationBase {
private BaseServer appServer1;
private BaseServer hardwareServer1;
private BaseServer appServer2;
private BaseServer hardwareServer2;
private int tcpAppPort2;
private int plainHardPort2;
@Before
public void init() throws Exception {
hardwareServer1 = new HardwareServer(holder).start();
appServer1 = new AppServer(holder).start();
try (Jedis jedis = holder.redisClient.getTokenPool().getResource()) {
jedis.flushDB();
}
try (Jedis jedis = holder.redisClient.getUserPool().getResource()) {
jedis.flushDB();
}
ServerProperties properties2 = new ServerProperties("server2.properties");
Holder holder2 = new Holder(properties2, twitterWrapper, mailWrapper, gcmWrapper, smsWrapper, "no-db.properties");
hardwareServer2 = new HardwareServer(holder2).start();
appServer2 = new AppServer(holder2).start();
plainHardPort2 = properties2.getIntProperty("hardware.default.port");
tcpAppPort2 = properties2.getIntProperty("app.ssl.port");
}
@After
public void shutdown() {
appServer1.close();
hardwareServer1.close();
appServer2.close();
hardwareServer2.close();
}
@Test
public void test2NewUsersStoredOnDifferentServers() throws Exception {
TestAppClient appClient1 = new TestAppClient("localhost", tcpAppPort, properties);
appClient1.start();
String email = "test_new@gmail.com";
String pass = "a";
String appName = "Blynk";
appClient1.send("getServer " + email + "\0" + appName);
verify(appClient1.responseMock, timeout(1000)).channelRead(any(), eq(new GetServerMessage(1, "127.0.0.1")));
appClient1.reset();
String token = workflowForUser(appClient1, email, pass, appName);
assertEquals("127.0.0.1", holder.redisClient.getServerByToken(token));
assertEquals("127.0.0.1", holder.redisClient.getServerByUser(email));
TestAppClient appClient2 = new TestAppClient("localhost", tcpAppPort2, properties);
appClient2.start();
String username2 = "test2_new@gmail.com";
appClient2.send("getServer " + username2 + "\0" + appName);
verify(appClient2.responseMock, timeout(1000)).channelRead(any(), eq(new GetServerMessage(1, "localhost")));
appClient2.reset();
String token2 = workflowForUser(appClient2, username2, pass, appName);
assertEquals("localhost", holder.redisClient.getServerByToken(token2));
assertEquals("localhost", holder.redisClient.getServerByUser(username2));
}
private String workflowForUser(TestAppClient appClient, String username, String pass, String appName) throws Exception{
appClient.send("register " + username + " " + pass + " " + appName);
verify(appClient.responseMock, timeout(1000)).channelRead(any(), eq(new ResponseMessage(1, OK)));
appClient.send("login " + username + " " + 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;
}
}