package cc.blynk.integration.http; import cc.blynk.integration.BaseTest; import cc.blynk.server.Holder; import cc.blynk.server.api.http.HttpAPIServer; import cc.blynk.server.api.http.pojo.EmailPojo; import cc.blynk.server.api.http.pojo.PushMessagePojo; import cc.blynk.server.core.BaseServer; import cc.blynk.utils.JsonParser; import cc.blynk.utils.properties.GCMProperties; import cc.blynk.utils.properties.MailProperties; import cc.blynk.utils.properties.SmsProperties; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.runners.MockitoJUnitRunner; import java.util.Collections; import java.util.List; import static org.junit.Assert.assertEquals; /** * The Blynk Project. * Created by Dmitriy Dumanskiy. * Created on 24.12.15. */ @RunWith(MockitoJUnitRunner.class) public class HttpAPIPinsTest extends BaseTest { private static BaseServer httpServer; private static CloseableHttpClient httpclient; private static String httpsServerUrl; private static Holder localHolder; @BeforeClass public static void init() throws Exception { properties.setProperty("data.folder", getRelativeDataFolder("/profiles")); localHolder = new Holder(properties, new MailProperties(Collections.emptyMap()), new SmsProperties(Collections.emptyMap()), new GCMProperties(Collections.emptyMap()), false ); httpServer = new HttpAPIServer(localHolder).start(); httpsServerUrl = String.format("http://localhost:%s/", httpPort); httpclient = HttpClients.createDefault(); } @AfterClass public static void shutdown() throws Exception { httpclient.close(); httpServer.close(); localHolder.close(); } //----------------------------GET METHODS SECTION @Test public void testGetWithFakeToken() throws Exception { HttpGet request = new HttpGet(httpsServerUrl + "dsadasddasdasdasdasdasdas/pin/d8"); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(400, response.getStatusLine().getStatusCode()); assertEquals("Invalid token.", consumeText(response)); } } @Test public void testGetWithWrongPathToken() throws Exception { HttpGet request = new HttpGet(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/w/d8"); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(404, response.getStatusLine().getStatusCode()); } } @Test public void testGetWithWrongPin() throws Exception { HttpGet request = new HttpGet(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/x8"); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(400, response.getStatusLine().getStatusCode()); assertEquals("Wrong pin format.", consumeText(response)); } } @Test public void testGetWithNonExistingPin() throws Exception { HttpGet request = new HttpGet(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/v11"); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(400, response.getStatusLine().getStatusCode()); assertEquals("Requested pin not exists in app.", consumeText(response)); } } @Test public void testPutGetNonExistingPin() throws Exception { HttpPut put = new HttpPut(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/v10"); put.setEntity(new StringEntity("[\"100\"]", ContentType.APPLICATION_JSON)); try (CloseableHttpResponse response = httpclient.execute(put)) { assertEquals(200, response.getStatusLine().getStatusCode()); } HttpGet get = new HttpGet(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/v10"); try (CloseableHttpResponse response = httpclient.execute(get)) { assertEquals(200, response.getStatusLine().getStatusCode()); List<String> values = consumeJsonPinValues(response); assertEquals(1, values.size()); assertEquals("100", values.get(0)); } } @Test public void testMultiPutGetNonExistingPin() throws Exception { HttpPut put = new HttpPut(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/v10"); put.setEntity(new StringEntity("[\"100\", \"101\", \"102\"]", ContentType.APPLICATION_JSON)); try (CloseableHttpResponse response = httpclient.execute(put)) { assertEquals(200, response.getStatusLine().getStatusCode()); } HttpGet get = new HttpGet(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/v10"); try (CloseableHttpResponse response = httpclient.execute(get)) { assertEquals(200, response.getStatusLine().getStatusCode()); List<String> values = consumeJsonPinValues(response); assertEquals(3, values.size()); assertEquals("100", values.get(0)); assertEquals("101", values.get(1)); assertEquals("102", values.get(2)); } } @Test public void testMultiPutGetNonExistingPinWithNewMethod() throws Exception { HttpPut put = new HttpPut(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/update/v10"); put.setEntity(new StringEntity("[\"100\", \"101\", \"102\"]", ContentType.APPLICATION_JSON)); try (CloseableHttpResponse response = httpclient.execute(put)) { assertEquals(200, response.getStatusLine().getStatusCode()); } HttpGet get = new HttpGet(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/get/v10"); try (CloseableHttpResponse response = httpclient.execute(get)) { assertEquals(200, response.getStatusLine().getStatusCode()); List<String> values = consumeJsonPinValues(response); assertEquals(3, values.size()); assertEquals("100", values.get(0)); assertEquals("101", values.get(1)); assertEquals("102", values.get(2)); } } @Test public void testGetTimerExistingPin() throws Exception { HttpGet request = new HttpGet(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/D0"); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(200, response.getStatusLine().getStatusCode()); List<String> values = consumeJsonPinValues(response); assertEquals(1, values.size()); assertEquals("1", values.get(0)); } } @Test public void testGetWithExistingPin() throws Exception { HttpGet request = new HttpGet(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/D8"); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(200, response.getStatusLine().getStatusCode()); List<String> values = consumeJsonPinValues(response); assertEquals(1, values.size()); assertEquals("0", values.get(0)); } request = new HttpGet(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/d1"); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(200, response.getStatusLine().getStatusCode()); List<String> values = consumeJsonPinValues(response); assertEquals(1, values.size()); assertEquals("1", values.get(0)); } request = new HttpGet(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/d3"); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(200, response.getStatusLine().getStatusCode()); List<String> values = consumeJsonPinValues(response); assertEquals(1, values.size()); assertEquals("87", values.get(0)); } } @Test public void testGetWithExistingEmptyPin() throws Exception { HttpGet request = new HttpGet(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/a14"); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(200, response.getStatusLine().getStatusCode()); List<String> values = consumeJsonPinValues(response); assertEquals(0, values.size()); } } @Test public void testGetWithExistingMultiPin() throws Exception { HttpGet request = new HttpGet(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/a15"); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(200, response.getStatusLine().getStatusCode()); List<String> values = consumeJsonPinValues(response); assertEquals(2, values.size()); assertEquals("1", values.get(0)); assertEquals("2", values.get(1)); } } @Test public void testGetForRGBMerge() throws Exception { HttpGet request = new HttpGet(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/v13"); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(200, response.getStatusLine().getStatusCode()); List<String> values = consumeJsonPinValues(response); assertEquals(3, values.size()); assertEquals("60", values.get(0)); assertEquals("143", values.get(1)); assertEquals("158", values.get(2)); } } @Test public void testGetForJoystickMerge() throws Exception { HttpGet request = new HttpGet(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/v14"); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(200, response.getStatusLine().getStatusCode()); List<String> values = consumeJsonPinValues(response); assertEquals(2, values.size()); assertEquals("128", values.get(0)); assertEquals("129", values.get(1)); } } //----------------------------PUT METHODS SECTION @Test public void testPutNoContentType() throws Exception { HttpPut request = new HttpPut(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/d8"); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(500, response.getStatusLine().getStatusCode()); assertEquals("Unexpected content type. Expecting application/json.", consumeText(response)); } } @Test public void testPutFakeToken() throws Exception { HttpPut request = new HttpPut(httpsServerUrl + "dsadasddasdasdasdasdasdas/pin/d8"); request.setHeader("Content-Type", ContentType.APPLICATION_JSON.toString()); request.setEntity(new StringEntity("[\"100\"]", ContentType.APPLICATION_JSON)); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(400, response.getStatusLine().getStatusCode()); assertEquals("Invalid token.", consumeText(response)); } } @Test public void testPutWithWrongPin() throws Exception { HttpPut request = new HttpPut(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/x8"); request.setHeader("Content-Type", ContentType.APPLICATION_JSON.toString()); request.setEntity(new StringEntity("[\"100\"]", ContentType.APPLICATION_JSON)); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(400, response.getStatusLine().getStatusCode()); assertEquals("Wrong pin format.", consumeText(response)); } } @Test public void testPutWithNoWidget() throws Exception { HttpPut request = new HttpPut(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/v10"); request.setHeader("Content-Type", ContentType.APPLICATION_JSON.toString()); request.setEntity(new StringEntity("[\"100\"]", ContentType.APPLICATION_JSON)); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(200, response.getStatusLine().getStatusCode()); } } @Test public void testPutWithNoWidgetNoPinData() throws Exception { HttpPut request = new HttpPut(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/v10"); request.setHeader("Content-Type", ContentType.APPLICATION_JSON.toString()); request.setEntity(new StringEntity("[]", ContentType.APPLICATION_JSON)); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(400, response.getStatusLine().getStatusCode()); assertEquals("No pin for update provided.", consumeText(response)); } } @Test public void testPutWithNoWidgetMultivalue() throws Exception { HttpPut request = new HttpPut(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/v10"); request.setHeader("Content-Type", ContentType.APPLICATION_JSON.toString()); request.setEntity(new StringEntity("[\"100\", \"101\", \"102\"]", ContentType.APPLICATION_JSON)); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(200, response.getStatusLine().getStatusCode()); } } @Test public void testPutExtraWithNoWidget() throws Exception { HttpPut request = new HttpPut(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/extra/pin/v10"); request.setHeader("Content-Type", ContentType.APPLICATION_JSON.toString()); request.setEntity(new StringEntity("[{\"timestamp\" : 123, \"value\":\"100\"}]", ContentType.APPLICATION_JSON)); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(200, response.getStatusLine().getStatusCode()); } } @Test public void testPutWithExistingPin() throws Exception { HttpPut request = new HttpPut(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/a14"); request.setEntity(new StringEntity("[\"100\"]", ContentType.APPLICATION_JSON)); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(200, response.getStatusLine().getStatusCode()); } HttpGet getRequest = new HttpGet(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/a14"); try (CloseableHttpResponse response = httpclient.execute(getRequest)) { assertEquals(200, response.getStatusLine().getStatusCode()); List<String> values = consumeJsonPinValues(response); assertEquals(1, values.size()); assertEquals("100", values.get(0)); } } @Test public void testPutWithExistingPinWrongBody() throws Exception { HttpPut request = new HttpPut(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/a14"); request.setEntity(new StringEntity("\"100\"", ContentType.APPLICATION_JSON)); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(500, response.getStatusLine().getStatusCode()); assertEquals("Error parsing body param. \"100\"", consumeText(response)); } } @Test public void testPutWithExistingPinWrongBody2() throws Exception { HttpPut request = new HttpPut(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/a14"); request.setEntity(new StringEntity("", ContentType.APPLICATION_JSON)); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(500, response.getStatusLine().getStatusCode()); assertEquals("Error parsing body param. ", consumeText(response)); } } //----------------------------NOTIFICATION POST METHODS SECTION //----------------------------pushes @Test public void testPostNotifyNoContentType() throws Exception { HttpPost request = new HttpPost(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/notify"); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(500, response.getStatusLine().getStatusCode()); assertEquals("Unexpected content type. Expecting application/json.", consumeText(response)); } } @Test public void testPostNotifyNoBody() throws Exception { HttpPost request = new HttpPost(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/notify"); request.setHeader("Content-Type", ContentType.APPLICATION_JSON.toString()); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(500, response.getStatusLine().getStatusCode()); assertEquals("Error parsing body param. ", consumeText(response)); } } @Test public void testPostNotifyWithWrongBody() throws Exception { HttpPost request = new HttpPost(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/notify"); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 256; i++) { sb.append(i); } request.setEntity(new StringEntity("{\"body\":\"" + sb.toString() + "\"}", ContentType.APPLICATION_JSON)); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(400, response.getStatusLine().getStatusCode()); assertEquals("Body is empty or larger than 255 chars.", consumeText(response)); } } @Test public void testPostNotifyWithBody() throws Exception { HttpPost request = new HttpPost(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/notify"); String message = JsonParser.mapper.writeValueAsString(new PushMessagePojo("This is Push Message")); request.setEntity(new StringEntity(message, ContentType.APPLICATION_JSON)); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(200, response.getStatusLine().getStatusCode()); } } //----------------------------email @Test public void testPostEmailNoContentType() throws Exception { HttpPost request = new HttpPost(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/email"); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(500, response.getStatusLine().getStatusCode()); assertEquals("Unexpected content type. Expecting application/json.", consumeText(response)); } } @Test public void testPostEmailNoBody() throws Exception { HttpPost request = new HttpPost(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/email"); request.setHeader("Content-Type", ContentType.APPLICATION_JSON.toString()); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(500, response.getStatusLine().getStatusCode()); assertEquals("Error parsing body param. ", consumeText(response)); } } @Test public void testPostEmailWithBody() throws Exception { HttpPost request = new HttpPost(httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/email"); String message = JsonParser.mapper.writeValueAsString(new EmailPojo("pupkin@gmail.com", "Title", "Subject")); request.setEntity(new StringEntity(message, ContentType.APPLICATION_JSON)); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(200, response.getStatusLine().getStatusCode()); } } //------------------------------ SYNC TEST @Test public void testSync() throws Exception { String url = httpsServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/a14"; HttpPut request = new HttpPut(url); HttpGet getRequest = new HttpGet(url); for (int i = 0; i < 100; i++) { request.setEntity(new StringEntity("[\""+ i + "\"]", ContentType.APPLICATION_JSON)); try (CloseableHttpResponse response = httpclient.execute(request)) { assertEquals(200, response.getStatusLine().getStatusCode()); EntityUtils.consume(response.getEntity()); } try (CloseableHttpResponse response2 = httpclient.execute(getRequest)) { assertEquals(200, response2.getStatusLine().getStatusCode()); List<String> values = consumeJsonPinValues(response2); assertEquals(1, values.size()); assertEquals(String.valueOf(i), values.get(0)); } } } }