package cc.blynk.integration.http; import cc.blynk.integration.IntegrationBase; import cc.blynk.integration.model.tcp.ClientPair; 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.Profile; import cc.blynk.server.core.model.enums.PinType; import cc.blynk.server.core.model.widgets.Widget; import cc.blynk.server.core.model.widgets.controls.Button; import cc.blynk.server.core.protocol.model.messages.appllication.SetWidgetPropertyMessage; import cc.blynk.server.hardware.HardwareServer; import org.asynchttpclient.AsyncHttpClient; import org.asynchttpclient.DefaultAsyncHttpClient; import org.asynchttpclient.DefaultAsyncHttpClientConfig; import org.asynchttpclient.Response; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.runners.MockitoJUnitRunner; import java.util.concurrent.Future; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; 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 24.12.15. */ @RunWith(MockitoJUnitRunner.class) public class HttpAPISetPropertyAsyncClientTest extends IntegrationBase { private static BaseServer httpServer; private static AsyncHttpClient httpclient; private static String httpsServerUrl; private static BaseServer hardwareServer; private static BaseServer appServer; private static ClientPair clientPair; @AfterClass public static void shutdown() throws Exception { httpclient.close(); httpServer.close(); appServer.close(); hardwareServer.close(); clientPair.stop(); } @BeforeClass public static void init() throws Exception { httpServer = new HttpAPIServer(staticHolder).start(); httpsServerUrl = String.format("http://localhost:%s/", httpPort); httpclient = new DefaultAsyncHttpClient( new DefaultAsyncHttpClientConfig.Builder() .setUserAgent("") .setKeepAlive(false) .build() ); hardwareServer = new HardwareServer(staticHolder).start(); appServer = new AppServer(staticHolder).start(); clientPair = initAppAndHardPair(tcpAppPort, tcpHardPort, properties); } @Before public void reset() { clientPair.appClient.reset(); } @Test public void testChangeLabelPropertyViaGet() throws Exception { clientPair.appClient.send("getToken 1"); String token = clientPair.appClient.getBody(); Future<Response> f = httpclient.prepareGet(httpsServerUrl + token + "/update/v4?label=My-New-Label").execute(); Response response = f.get(); assertEquals(200, response.getStatusCode()); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new SetWidgetPropertyMessage(111, b("1 4 label My-New-Label")))); clientPair.appClient.reset(); clientPair.appClient.send("loadProfileGzipped"); Profile profile = parseProfile(clientPair.appClient.getBody()); Widget widget = profile.dashBoards[0].findWidgetByPin(0, (byte) 4, PinType.VIRTUAL); assertNotNull(widget); assertEquals("My-New-Label", widget.label); } @Test public void testChangeColorPropertyViaGet() throws Exception { clientPair.appClient.send("getToken 1"); String token = clientPair.appClient.getBody(); Future<Response> f = httpclient.prepareGet(httpsServerUrl + token + "/update/v4?color=%23000000").execute(); Response response = f.get(); assertEquals(200, response.getStatusCode()); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new SetWidgetPropertyMessage(111, b("1 4 color #000000")))); clientPair.appClient.reset(); clientPair.appClient.send("loadProfileGzipped"); Profile profile = parseProfile(clientPair.appClient.getBody()); Widget widget = profile.dashBoards[0].findWidgetByPin(0, (byte) 4, PinType.VIRTUAL); assertNotNull(widget); assertEquals(255, widget.color); } @Test public void testChangeOnLabelPropertyViaGet() throws Exception { clientPair.appClient.send("getToken 1"); String token = clientPair.appClient.getBody(); clientPair.appClient.reset(); clientPair.appClient.send("updateWidget 1\0{\"id\":1, \"width\":1, \"height\":1, \"x\":1, \"y\":1, \"label\":\"Some Text\", \"type\":\"BUTTON\", \"pinType\":\"VIRTUAL\", \"pin\":1, \"value\":\"1\"}"); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(ok(1))); Future<Response> f = httpclient.prepareGet(httpsServerUrl + token + "/update/v1?onLabel=newOnButtonLabel").execute(); Response response = f.get(); assertEquals(200, response.getStatusCode()); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new SetWidgetPropertyMessage(111, b("1 1 onLabel newOnButtonLabel")))); clientPair.appClient.reset(); clientPair.appClient.send("loadProfileGzipped"); Profile profile = parseProfile(clientPair.appClient.getBody()); Button button = (Button) profile.dashBoards[0].findWidgetByPin(0, (byte) 1, PinType.VIRTUAL); assertNotNull(button); assertEquals("newOnButtonLabel", button.onLabel); } @Test public void testChangeOffLabelPropertyViaGet() throws Exception { clientPair.appClient.send("getToken 1"); String token = clientPair.appClient.getBody(); clientPair.appClient.reset(); clientPair.appClient.send("updateWidget 1\0{\"id\":1, \"width\":1, \"height\":1, \"x\":1, \"y\":1, \"label\":\"Some Text\", \"type\":\"BUTTON\", \"pinType\":\"VIRTUAL\", \"pin\":1, \"value\":\"1\"}"); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(ok(1))); Future<Response> f = httpclient.prepareGet(httpsServerUrl + token + "/update/v1?offLabel=newOffButtonLabel").execute(); Response response = f.get(); assertEquals(200, response.getStatusCode()); verify(clientPair.appClient.responseMock, timeout(500)).channelRead(any(), eq(new SetWidgetPropertyMessage(111, b("1 1 offLabel newOffButtonLabel")))); clientPair.appClient.reset(); clientPair.appClient.send("loadProfileGzipped"); Profile profile = parseProfile(clientPair.appClient.getBody()); Button button = (Button) profile.dashBoards[0].findWidgetByPin(0, (byte) 1, PinType.VIRTUAL); assertNotNull(button); assertEquals("newOffButtonLabel", button.offLabel); } }