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.application.AppServer; import cc.blynk.server.core.BaseServer; import cc.blynk.server.core.model.Pin; import cc.blynk.server.core.model.Profile; import cc.blynk.server.core.model.widgets.MultiPinWidget; import cc.blynk.server.core.model.widgets.OnePinWidget; import cc.blynk.server.core.model.widgets.Widget; import cc.blynk.server.core.protocol.model.messages.ResponseMessage; import cc.blynk.server.core.protocol.model.messages.common.HardwareConnectedMessage; import cc.blynk.server.hardware.HardwareServer; import io.netty.channel.ChannelFuture; import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.runners.MockitoJUnitRunner; import java.util.List; import static cc.blynk.server.core.protocol.enums.Response.OK; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.verify; /** * The Blynk Project. * Created by Dmitriy Dumanskiy. * Created on 28.04.16. */ @RunWith(MockitoJUnitRunner.class) @Ignore("ignored cause requires token to work properly") public class FacebookLoginTest extends IntegrationBase { private BaseServer appServer; private BaseServer hardwareServer; private final String facebookAuthToken = ""; @Before public void init() throws Exception { this.hardwareServer = new HardwareServer(holder).start(); this.appServer = new AppServer(holder).start(); } @After public void shutdown() { this.appServer.close(); this.hardwareServer.close(); } @Test public void testLoginWorksForNewUser() throws Exception { String host = "localhost"; String email = "shartax@gmail.com"; ClientPair clientPair = initAppAndHardPair(host, tcpAppPort, tcpHardPort, email + " 1", null, properties, 10000); ChannelFuture channelFuture = clientPair.appClient.stop(); channelFuture.await(); TestAppClient appClient = new TestAppClient(host, tcpAppPort, properties); appClient.start(); appClient.send("login " + email + "\0" + facebookAuthToken + "\0" + "Android" + "\0" + "1.10.4" + "\0" + "facebook"); verify(appClient.responseMock, timeout(1000)).channelRead(any(), eq(new ResponseMessage(1, OK))); String expected = readTestUserProfile(); appClient.reset(); appClient.send("loadProfileGzipped"); verify(appClient.responseMock, timeout(500)).channelRead(any(), any()); Profile profile = parseProfile(appClient.getBody()); profile.dashBoards[0].updatedAt = 0; assertEquals(expected, profile.toString()); } @Test public void testFacebookLoginWorksForExistingUser() throws Exception { initFacebookAppAndHardPair("localhost", tcpAppPort, tcpHardPort, "shartax@gmail.com", facebookAuthToken); } private ClientPair initFacebookAppAndHardPair(String host, int appPort, int hardPort, String user, String facebookAuthToken) throws Exception { TestAppClient appClient = new TestAppClient(host, appPort, properties); TestHardClient hardClient = new TestHardClient(host, hardPort); appClient.start(); hardClient.start(); String userProfileString = readTestUserProfile(null); Profile profile = parseProfile(userProfileString); int expectedSyncCommandsCount = 0; for (Widget widget : profile.dashBoards[0].widgets) { if (widget instanceof OnePinWidget) { if (((OnePinWidget) widget).makeHardwareBody() != null) { expectedSyncCommandsCount++; } } else if (widget instanceof MultiPinWidget) { MultiPinWidget multiPinWidget = ((MultiPinWidget) widget); if (multiPinWidget.pins != null) { for (Pin pin : multiPinWidget.pins) { if (pin.notEmpty()) { expectedSyncCommandsCount++; } } } } } int dashId = profile.dashBoards[0].id; appClient.send("login " + user + "\0" + facebookAuthToken + "\0" + "Android" + "\0" + "1.10.4" + "\0" + "facebook"); verify(appClient.responseMock, timeout(1000)).channelRead(any(), eq(new ResponseMessage(1, OK))); appClient.send("addEnergy " + 10000 + "\0" + "123456"); verify(appClient.responseMock, timeout(1000)).channelRead(any(), eq(new ResponseMessage(2, OK))); saveProfile(appClient, profile.dashBoards); appClient.send("activate " + dashId); appClient.send("getToken " + dashId); ArgumentCaptor<Object> objectArgumentCaptor = ArgumentCaptor.forClass(Object.class); verify(appClient.responseMock, timeout(2000).times(4 + profile.dashBoards.length + expectedSyncCommandsCount)).channelRead(any(), objectArgumentCaptor.capture()); List<Object> arguments = objectArgumentCaptor.getAllValues(); String token = getGetTokenMessage(arguments).body; hardClient.send("login " + token); verify(hardClient.responseMock, timeout(2000)).channelRead(any(), eq(new ResponseMessage(1, OK))); verify(appClient.responseMock, timeout(2000)).channelRead(any(), eq(new HardwareConnectedMessage(1, String.valueOf(dashId)))); appClient.reset(); hardClient.reset(); return new ClientPair(appClient, hardClient, token); } }