From 8a37560b98877e16e71bd59317e053150ebca687 Mon Sep 17 00:00:00 2001 From: mp-loki Date: Fri, 18 Aug 2017 07:24:31 -0400 Subject: [PATCH] Fixing Mqtt Integration tests --- .../controller/AbstractControllerTest.java | 121 ++++++++++++------ ...TestSuite.java => MqttNoSqlTestSuite.java} | 4 +- .../server/mqtt/MqttSqlTestSuite.java | 37 ++++++ ...ractMqttServerSideRpcIntegrationTest.java} | 40 +++--- ...MqttServerSideRpcNoSqlIntegrationTest.java | 26 ++++ .../MqttServerSideRpcSqlIntegrationTest.java | 27 ++++ ...AbstractMqttTelemetryIntegrationTest.java} | 23 ++-- .../MqttTelemetryNoSqlIntegrationTest.java | 26 ++++ .../sql/MqttTelemetrySqlIntegrationTest.java | 27 ++++ 9 files changed, 256 insertions(+), 75 deletions(-) rename application/src/test/java/org/thingsboard/server/mqtt/{MqttTestSuite.java => MqttNoSqlTestSuite.java} (93%) create mode 100644 application/src/test/java/org/thingsboard/server/mqtt/MqttSqlTestSuite.java rename application/src/test/java/org/thingsboard/server/mqtt/rpc/{MqttServerSideRpcIntegrationTest.java => AbstractMqttServerSideRpcIntegrationTest.java} (85%) create mode 100644 application/src/test/java/org/thingsboard/server/mqtt/rpc/nosql/MqttServerSideRpcNoSqlIntegrationTest.java create mode 100644 application/src/test/java/org/thingsboard/server/mqtt/rpc/sql/MqttServerSideRpcSqlIntegrationTest.java rename application/src/test/java/org/thingsboard/server/mqtt/telemetry/{MqttTelemetryIntegrationTest.java => AbstractMqttTelemetryIntegrationTest.java} (79%) create mode 100644 application/src/test/java/org/thingsboard/server/mqtt/telemetry/nosql/MqttTelemetryNoSqlIntegrationTest.java create mode 100644 application/src/test/java/org/thingsboard/server/mqtt/telemetry/sql/MqttTelemetrySqlIntegrationTest.java diff --git a/application/src/test/java/org/thingsboard/server/controller/AbstractControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/AbstractControllerTest.java index 94cef57ea1..689f3164f6 100644 --- a/application/src/test/java/org/thingsboard/server/controller/AbstractControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/AbstractControllerTest.java @@ -41,6 +41,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.mock.http.MockHttpInputMessage; import org.springframework.mock.http.MockHttpOutputMessage; @@ -51,6 +52,7 @@ import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.ResultMatcher; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; @@ -97,28 +99,31 @@ public abstract class AbstractControllerTest { protected static final String SYS_ADMIN_EMAIL = "sysadmin@thingsboard.org"; private static final String SYS_ADMIN_PASSWORD = "sysadmin"; - + protected static final String TENANT_ADMIN_EMAIL = "testtenant@thingsboard.org"; private static final String TENANT_ADMIN_PASSWORD = "tenant"; protected static final String CUSTOMER_USER_EMAIL = "testcustomer@thingsboard.org"; private static final String CUSTOMER_USER_PASSWORD = "customer"; - + protected MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); protected MockMvc mockMvc; - + protected String token; protected String refreshToken; protected String username; private TenantId tenantId; - + @SuppressWarnings("rawtypes") private HttpMessageConverter mappingJackson2HttpMessageConverter; - + + @SuppressWarnings("rawtypes") + private HttpMessageConverter stringHttpMessageConverter; + @Autowired private WebApplicationContext webApplicationContext; @@ -132,7 +137,7 @@ public abstract class AbstractControllerTest { log.info("Finished test: {}", description.getMethodName()); } }; - + @Autowired void setConverters(HttpMessageConverter[] converters) { @@ -141,10 +146,15 @@ public abstract class AbstractControllerTest { .findAny() .get(); + this.stringHttpMessageConverter = Arrays.stream(converters) + .filter(hmc -> hmc instanceof StringHttpMessageConverter) + .findAny() + .get(); + Assert.assertNotNull("the JSON message converter must not be null", this.mappingJackson2HttpMessageConverter); } - + @Before public void setup() throws Exception { log.info("Executing setup"); @@ -188,7 +198,7 @@ public abstract class AbstractControllerTest { public void teardown() throws Exception { log.info("Executing teardown"); loginSysAdmin(); - doDelete("/api/tenant/"+tenantId.getId().toString()) + doDelete("/api/tenant/" + tenantId.getId().toString()) .andExpect(status().isOk()); log.info("Executed teardown"); } @@ -196,7 +206,7 @@ public abstract class AbstractControllerTest { protected void loginSysAdmin() throws Exception { login(SYS_ADMIN_EMAIL, SYS_ADMIN_PASSWORD); } - + protected void loginTenantAdmin() throws Exception { login(TENANT_ADMIN_EMAIL, TENANT_ADMIN_PASSWORD); } @@ -204,13 +214,13 @@ public abstract class AbstractControllerTest { protected void loginCustomerUser() throws Exception { login(CUSTOMER_USER_EMAIL, CUSTOMER_USER_PASSWORD); } - + protected User createUserAndLogin(User user, String password) throws Exception { User savedUser = doPost("/api/user", user, User.class); logout(); doGet("/api/noauth/activate?activateToken={activateToken}", TestMailService.currentActivateToken) - .andExpect(status().isSeeOther()) - .andExpect(header().string(HttpHeaders.LOCATION, "/login/createPassword?activateToken=" + TestMailService.currentActivateToken)); + .andExpect(status().isSeeOther()) + .andExpect(header().string(HttpHeaders.LOCATION, "/login/createPassword?activateToken=" + TestMailService.currentActivateToken)); JsonNode tokenInfo = readResponse(doPost("/api/noauth/activate", "activateToken", TestMailService.currentActivateToken, "password", password).andExpect(status().isOk()), JsonNode.class); validateAndSetJwtToken(tokenInfo, user.getEmail()); return savedUser; @@ -247,14 +257,14 @@ public abstract class AbstractControllerTest { Assert.assertNotNull(token); Assert.assertFalse(token.isEmpty()); int i = token.lastIndexOf('.'); - Assert.assertTrue(i>0); - String withoutSignature = token.substring(0, i+1); - Jwt jwsClaims = Jwts.parser().parseClaimsJwt(withoutSignature); + Assert.assertTrue(i > 0); + String withoutSignature = token.substring(0, i + 1); + Jwt jwsClaims = Jwts.parser().parseClaimsJwt(withoutSignature); Claims claims = jwsClaims.getBody(); String subject = claims.getSubject(); Assert.assertEquals(username, subject); } - + protected void logout() throws Exception { this.token = null; this.refreshToken = null; @@ -266,24 +276,35 @@ public abstract class AbstractControllerTest { request.header(ThingsboardSecurityConfiguration.JWT_TOKEN_HEADER_PARAM, "Bearer " + this.token); } } - + protected ResultActions doGet(String urlTemplate, Object... urlVariables) throws Exception { MockHttpServletRequestBuilder getRequest = get(urlTemplate, urlVariables); setJwtToken(getRequest); return mockMvc.perform(getRequest); } - + protected T doGet(String urlTemplate, Class responseClass, Object... urlVariables) throws Exception { return readResponse(doGet(urlTemplate, urlVariables).andExpect(status().isOk()), responseClass); } - + + protected T doGetAsync(String urlTemplate, Class responseClass, Object... urlVariables) throws Exception { + return readResponse(doGetAsync(urlTemplate, urlVariables).andExpect(status().isOk()), responseClass); + } + + protected ResultActions doGetAsync(String urlTemplate, Object... urlVariables) throws Exception { + MockHttpServletRequestBuilder getRequest; + getRequest = get(urlTemplate, urlVariables); + setJwtToken(getRequest); + return mockMvc.perform(asyncDispatch(mockMvc.perform(getRequest).andExpect(request().asyncStarted()).andReturn())); + } + protected T doGetTyped(String urlTemplate, TypeReference responseType, Object... urlVariables) throws Exception { return readResponse(doGet(urlTemplate, urlVariables).andExpect(status().isOk()), responseType); } - + protected T doGetTypedWithPageLink(String urlTemplate, TypeReference responseType, - TextPageLink pageLink, - Object... urlVariables) throws Exception { + TextPageLink pageLink, + Object... urlVariables) throws Exception { List pageLinkVariables = new ArrayList<>(); urlTemplate += "limit={limit}"; pageLinkVariables.add(pageLink.getLimit()); @@ -299,75 +320,93 @@ public abstract class AbstractControllerTest { urlTemplate += "&textOffset={textOffset}"; pageLinkVariables.add(pageLink.getTextOffset()); } - - Object[] vars = new Object[urlVariables.length + pageLinkVariables.size()]; + + Object[] vars = new Object[urlVariables.length + pageLinkVariables.size()]; System.arraycopy(urlVariables, 0, vars, 0, urlVariables.length); System.arraycopy(pageLinkVariables.toArray(), 0, vars, urlVariables.length, pageLinkVariables.size()); - + return readResponse(doGet(urlTemplate, vars).andExpect(status().isOk()), responseType); } - + protected T doPost(String urlTemplate, Class responseClass, String... params) throws Exception { return readResponse(doPost(urlTemplate, params).andExpect(status().isOk()), responseClass); } - + + protected T doPost(String urlTemplate, T content, Class responseClass, ResultMatcher resultMatcher, String... params) throws Exception { + return readResponse(doPost(urlTemplate, params).andExpect(resultMatcher), responseClass); + } + protected T doPost(String urlTemplate, T content, Class responseClass, String... params) throws Exception { return readResponse(doPost(urlTemplate, content, params).andExpect(status().isOk()), responseClass); } + protected T doPostAsync(String urlTemplate, T content, Class responseClass, ResultMatcher resultMatcher, String... params) throws Exception { + return readResponse(doPostAsync(urlTemplate, content, params).andExpect(resultMatcher), responseClass); + } + protected T doDelete(String urlTemplate, Class responseClass, String... params) throws Exception { return readResponse(doDelete(urlTemplate, params).andExpect(status().isOk()), responseClass); } - + protected ResultActions doPost(String urlTemplate, String... params) throws Exception { MockHttpServletRequestBuilder postRequest = post(urlTemplate); setJwtToken(postRequest); populateParams(postRequest, params); return mockMvc.perform(postRequest); } - - protected ResultActions doPost(String urlTemplate, T content, String... params) throws Exception { + + protected ResultActions doPost(String urlTemplate, T content, String... params) throws Exception { MockHttpServletRequestBuilder postRequest = post(urlTemplate); setJwtToken(postRequest); String json = json(content); postRequest.contentType(contentType).content(json); - populateParams(postRequest, params); return mockMvc.perform(postRequest); } - + + protected ResultActions doPostAsync(String urlTemplate, T content, String... params) throws Exception { + MockHttpServletRequestBuilder postRequest = post(urlTemplate); + setJwtToken(postRequest); + String json = json(content); + postRequest.contentType(contentType).content(json); + MvcResult result = mockMvc.perform(postRequest).andReturn(); + return mockMvc.perform(asyncDispatch(result)); + } + protected ResultActions doDelete(String urlTemplate, String... params) throws Exception { MockHttpServletRequestBuilder deleteRequest = delete(urlTemplate); setJwtToken(deleteRequest); populateParams(deleteRequest, params); return mockMvc.perform(deleteRequest); } - + protected void populateParams(MockHttpServletRequestBuilder request, String... params) { if (params != null && params.length > 0) { Assert.assertEquals(params.length % 2, 0); MultiValueMap paramsMap = new LinkedMultiValueMap(); - for (int i=0;i T readResponse(ResultActions result, Class responseClass) throws Exception { byte[] content = result.andReturn().getResponse().getContentAsByteArray(); MockHttpInputMessage mockHttpInputMessage = new MockHttpInputMessage(content); - return (T) this.mappingJackson2HttpMessageConverter.read(responseClass, mockHttpInputMessage); + HttpMessageConverter converter = responseClass.equals(String.class) ? stringHttpMessageConverter : mappingJackson2HttpMessageConverter; + return (T) converter.read(responseClass, mockHttpInputMessage); } - + protected T readResponse(ResultActions result, TypeReference type) throws Exception { byte[] content = result.andReturn().getResponse().getContentAsByteArray(); ObjectMapper mapper = new ObjectMapper(); diff --git a/application/src/test/java/org/thingsboard/server/mqtt/MqttTestSuite.java b/application/src/test/java/org/thingsboard/server/mqtt/MqttNoSqlTestSuite.java similarity index 93% rename from application/src/test/java/org/thingsboard/server/mqtt/MqttTestSuite.java rename to application/src/test/java/org/thingsboard/server/mqtt/MqttNoSqlTestSuite.java index cf3bc71532..cbde335f8f 100644 --- a/application/src/test/java/org/thingsboard/server/mqtt/MqttTestSuite.java +++ b/application/src/test/java/org/thingsboard/server/mqtt/MqttNoSqlTestSuite.java @@ -25,8 +25,8 @@ import java.util.Arrays; @RunWith(ClasspathSuite.class) @ClasspathSuite.ClassnameFilters({ - "org.thingsboard.server.mqtt.*.*Test"}) -public class MqttTestSuite { + "org.thingsboard.server.mqtt.*.nosql.*Test"}) +public class MqttNoSqlTestSuite { @ClassRule public static CustomCassandraCQLUnit cassandraUnit = diff --git a/application/src/test/java/org/thingsboard/server/mqtt/MqttSqlTestSuite.java b/application/src/test/java/org/thingsboard/server/mqtt/MqttSqlTestSuite.java new file mode 100644 index 0000000000..e92cbe715c --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/mqtt/MqttSqlTestSuite.java @@ -0,0 +1,37 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.mqtt; + +import org.cassandraunit.dataset.cql.ClassPathCQLDataSet; +import org.junit.ClassRule; +import org.junit.extensions.cpsuite.ClasspathSuite; +import org.junit.runner.RunWith; +import org.thingsboard.server.dao.CustomCassandraCQLUnit; +import org.thingsboard.server.dao.CustomSqlUnit; + +import java.util.Arrays; + +@RunWith(ClasspathSuite.class) +@ClasspathSuite.ClassnameFilters({ + "org.thingsboard.server.mqtt.rpc.sql.*Test", "org.thingsboard.server.mqtt.telemetry.sql.*Test"}) +public class MqttSqlTestSuite { + + @ClassRule + public static CustomSqlUnit sqlUnit = new CustomSqlUnit( + Arrays.asList("sql/schema.sql", "sql/system-data.sql"), + "sql/drop-all-tables.sql", + "sql-test.properties"); +} diff --git a/application/src/test/java/org/thingsboard/server/mqtt/rpc/MqttServerSideRpcIntegrationTest.java b/application/src/test/java/org/thingsboard/server/mqtt/rpc/AbstractMqttServerSideRpcIntegrationTest.java similarity index 85% rename from application/src/test/java/org/thingsboard/server/mqtt/rpc/MqttServerSideRpcIntegrationTest.java rename to application/src/test/java/org/thingsboard/server/mqtt/rpc/AbstractMqttServerSideRpcIntegrationTest.java index a3a2355387..ac474b818e 100644 --- a/application/src/test/java/org/thingsboard/server/mqtt/rpc/MqttServerSideRpcIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/mqtt/rpc/AbstractMqttServerSideRpcIntegrationTest.java @@ -16,6 +16,7 @@ package org.thingsboard.server.mqtt.rpc; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.eclipse.paho.client.mqttv3.*; import org.junit.*; import org.springframework.http.HttpStatus; @@ -26,6 +27,7 @@ import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.security.DeviceCredentials; import org.thingsboard.server.controller.AbstractControllerTest; +import org.thingsboard.server.dao.service.DaoNoSqlTest; import java.util.UUID; @@ -37,7 +39,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. * @author Valerii Sosliuk */ @Slf4j -public class MqttServerSideRpcIntegrationTest extends AbstractControllerTest { +public abstract class AbstractMqttServerSideRpcIntegrationTest extends AbstractControllerTest { private static final String MQTT_URL = "tcp://localhost:1883"; private static final String FAIL_MSG_IF_HTTP_CLIENT_ERROR_NOT_ENCOUNTERED = "HttpClientErrorException expected, but not encountered"; @@ -67,13 +69,13 @@ public class MqttServerSideRpcIntegrationTest extends AbstractControllerTest { @After public void afterTest() throws Exception { loginSysAdmin(); - - doDelete("/api/tenant/" + savedTenant.getId().getId().toString()) - .andExpect(status().isOk()); + if (savedTenant != null) { + doDelete("/api/tenant/" + savedTenant.getId().getId().toString()) + .andExpect(status().isOk()); + } } @Test - @Ignore public void testServerMqttOneWayRpc() throws Exception { Device device = new Device(); device.setName("Test One-Way Server-Side RPC"); @@ -95,12 +97,12 @@ public class MqttServerSideRpcIntegrationTest extends AbstractControllerTest { String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"23\",\"value\": 1}}"; String deviceId = savedDevice.getId().getId().toString(); - String result = doPost("api/plugins/rpc/oneway/" + deviceId, setGpioRequest, String.class); - Assert.assertNull(result); + String result = doPostAsync("/api/plugins/rpc/oneway/" + deviceId, setGpioRequest, String.class, status().isOk()); + Assert.assertTrue(StringUtils.isEmpty(result)); } @Test - @Ignore + @Ignore // TODO: figure out the right error code for this case. Ignored due to failure: expected 408 but was: 200 public void testServerMqttOneWayRpcDeviceOffline() throws Exception { Device device = new Device(); device.setName("Test One-Way Server-Side RPC Device Offline"); @@ -114,7 +116,7 @@ public class MqttServerSideRpcIntegrationTest extends AbstractControllerTest { String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"23\",\"value\": 1}}"; String deviceId = savedDevice.getId().getId().toString(); try { - doPost("api/plugins/rpc/oneway/" + deviceId, setGpioRequest, String.class); + doPost("/api/plugins/rpc/oneway/" + deviceId, setGpioRequest, String.class, status().is(408)); Assert.fail(FAIL_MSG_IF_HTTP_CLIENT_ERROR_NOT_ENCOUNTERED); } catch (HttpClientErrorException e) { log.error(e.getMessage(), e); @@ -124,12 +126,12 @@ public class MqttServerSideRpcIntegrationTest extends AbstractControllerTest { } @Test - @Ignore + @Ignore // TODO: figure out the right error code for this case. Ignored due to failure: expected 400 (404?) but was: 401 public void testServerMqttOneWayRpcDeviceDoesNotExist() throws Exception { String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"23\",\"value\": 1}}"; String nonExistentDeviceId = UUID.randomUUID().toString(); try { - doPost("api/plugins/rpc/oneway/" + nonExistentDeviceId, setGpioRequest, String.class); + doPostAsync("/api/plugins/rpc/oneway/" + nonExistentDeviceId, setGpioRequest, String.class, status().is(400)); Assert.fail(FAIL_MSG_IF_HTTP_CLIENT_ERROR_NOT_ENCOUNTERED); } catch (HttpClientErrorException e) { log.error(e.getMessage(), e); @@ -139,7 +141,6 @@ public class MqttServerSideRpcIntegrationTest extends AbstractControllerTest { } @Test - @Ignore public void testServerMqttTwoWayRpc() throws Exception { Device device = new Device(); device.setName("Test Two-Way Server-Side RPC"); @@ -161,12 +162,13 @@ public class MqttServerSideRpcIntegrationTest extends AbstractControllerTest { String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"23\",\"value\": 1}}"; String deviceId = savedDevice.getId().getId().toString(); - String result = getStringResult(setGpioRequest, "twoway", deviceId); + + String result = doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setGpioRequest, String.class, status().isOk()); Assert.assertEquals("{\"value1\":\"A\",\"value2\":\"B\"}", result); } @Test - @Ignore + @Ignore // TODO: figure out the right error code for this case. Ignored due to failure: expected 408 but was: 200 public void testServerMqttTwoWayRpcDeviceOffline() throws Exception { Device device = new Device(); device.setName("Test Two-Way Server-Side RPC Device Offline"); @@ -180,7 +182,7 @@ public class MqttServerSideRpcIntegrationTest extends AbstractControllerTest { String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"23\",\"value\": 1}}"; String deviceId = savedDevice.getId().getId().toString(); try { - doPost("api/plugins/rpc/twoway/" + deviceId, setGpioRequest, String.class); + doPost("/api/plugins/rpc/twoway/" + deviceId, setGpioRequest, String.class, status().is(408)); Assert.fail(FAIL_MSG_IF_HTTP_CLIENT_ERROR_NOT_ENCOUNTERED); } catch (HttpClientErrorException e) { log.error(e.getMessage(), e); @@ -190,12 +192,12 @@ public class MqttServerSideRpcIntegrationTest extends AbstractControllerTest { } @Test - @Ignore + @Ignore // TODO: figure out the right error code for this case. Ignored due to failure: expected 400 (404?) but was: 401 public void testServerMqttTwoWayRpcDeviceDoesNotExist() throws Exception { String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"23\",\"value\": 1}}"; String nonExistentDeviceId = UUID.randomUUID().toString(); try { - doPost("api/plugins/rpc/oneway/" + nonExistentDeviceId, setGpioRequest, String.class); + doPostAsync("/api/plugins/rpc/oneway/" + nonExistentDeviceId, setGpioRequest, String.class, status().is(400)); Assert.fail(FAIL_MSG_IF_HTTP_CLIENT_ERROR_NOT_ENCOUNTERED); } catch (HttpClientErrorException e) { log.error(e.getMessage(), e); @@ -212,10 +214,6 @@ public class MqttServerSideRpcIntegrationTest extends AbstractControllerTest { return doGet("/api/device/" + savedDevice.getId().getId().toString() + "/credentials", DeviceCredentials.class); } - private String getStringResult(String requestData, String callType, String deviceId) throws Exception { - return doPost("api/plugins/rpc/" + callType + "/" + deviceId, requestData, String.class); - } - private static class TestMqttCallback implements MqttCallback { private final MqttAsyncClient client; diff --git a/application/src/test/java/org/thingsboard/server/mqtt/rpc/nosql/MqttServerSideRpcNoSqlIntegrationTest.java b/application/src/test/java/org/thingsboard/server/mqtt/rpc/nosql/MqttServerSideRpcNoSqlIntegrationTest.java new file mode 100644 index 0000000000..7cd9efb8f8 --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/mqtt/rpc/nosql/MqttServerSideRpcNoSqlIntegrationTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.mqtt.rpc.nosql; + +import org.thingsboard.server.dao.service.DaoNoSqlTest; +import org.thingsboard.server.mqtt.rpc.AbstractMqttServerSideRpcIntegrationTest; + +/** + * Created by Valerii Sosliuk on 8/22/2017. + */ +@DaoNoSqlTest +public class MqttServerSideRpcNoSqlIntegrationTest extends AbstractMqttServerSideRpcIntegrationTest { +} diff --git a/application/src/test/java/org/thingsboard/server/mqtt/rpc/sql/MqttServerSideRpcSqlIntegrationTest.java b/application/src/test/java/org/thingsboard/server/mqtt/rpc/sql/MqttServerSideRpcSqlIntegrationTest.java new file mode 100644 index 0000000000..b520798947 --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/mqtt/rpc/sql/MqttServerSideRpcSqlIntegrationTest.java @@ -0,0 +1,27 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.mqtt.rpc.sql; + +import org.thingsboard.server.dao.service.DaoNoSqlTest; +import org.thingsboard.server.dao.service.DaoSqlTest; +import org.thingsboard.server.mqtt.rpc.AbstractMqttServerSideRpcIntegrationTest; + +/** + * Created by Valerii Sosliuk on 8/22/2017. + */ +@DaoSqlTest +public class MqttServerSideRpcSqlIntegrationTest extends AbstractMqttServerSideRpcIntegrationTest { +} diff --git a/application/src/test/java/org/thingsboard/server/mqtt/telemetry/MqttTelemetryIntegrationTest.java b/application/src/test/java/org/thingsboard/server/mqtt/telemetry/AbstractMqttTelemetryIntegrationTest.java similarity index 79% rename from application/src/test/java/org/thingsboard/server/mqtt/telemetry/MqttTelemetryIntegrationTest.java rename to application/src/test/java/org/thingsboard/server/mqtt/telemetry/AbstractMqttTelemetryIntegrationTest.java index b0b628a8a1..c42eae8bb3 100644 --- a/application/src/test/java/org/thingsboard/server/mqtt/telemetry/MqttTelemetryIntegrationTest.java +++ b/application/src/test/java/org/thingsboard/server/mqtt/telemetry/AbstractMqttTelemetryIntegrationTest.java @@ -26,11 +26,10 @@ import org.springframework.web.util.UriComponentsBuilder; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.security.DeviceCredentials; import org.thingsboard.server.controller.AbstractControllerTest; +import org.thingsboard.server.dao.service.DaoNoSqlTest; import java.net.URI; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import java.util.*; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -39,7 +38,7 @@ import static org.junit.Assert.assertNotNull; * @author Valerii Sosliuk */ @Slf4j -public class MqttTelemetryIntegrationTest extends AbstractControllerTest { +public abstract class AbstractMqttTelemetryIntegrationTest extends AbstractControllerTest { private static final String MQTT_URL = "tcp://localhost:1883"; @@ -64,7 +63,6 @@ public class MqttTelemetryIntegrationTest extends AbstractControllerTest { } @Test - @Ignore public void testPushMqttRpcData() throws Exception { String clientId = MqttAsyncClient.generateClientId(); MqttAsyncClient client = new MqttAsyncClient(MQTT_URL, clientId); @@ -80,13 +78,16 @@ public class MqttTelemetryIntegrationTest extends AbstractControllerTest { String deviceId = savedDevice.getId().getId().toString(); Thread.sleep(1000); - Object keys = doGet("/api/plugins/telemetry/" + deviceId + "/keys/timeseries", Object.class); - assertEquals(Arrays.asList("key1", "key2", "key3", "key4"), keys); + List actualKeys = doGetAsync("/api/plugins/telemetry/DEVICE/" + deviceId + "/keys/timeseries", List.class); + Set actualKeySet = new HashSet<>(actualKeys); - UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("/api/plugins/telemetry/" + deviceId + "/values/timeseries") - .queryParam("keys", String.join(",", (CharSequence[]) keys)); - URI uri = builder.build().encode().toUri(); - Map>> values = doGet(uri.getPath(), Map.class); + List expectedKeys = Arrays.asList("key1", "key2", "key3", "key4"); + Set expectedKeySet = new HashSet<>(expectedKeys); + + assertEquals(expectedKeySet, actualKeySet); + + String getTelemetryValuesUrl = "/api/plugins/telemetry/DEVICE/" + deviceId + "/values/timeseries?keys=" + String.join(",", actualKeySet); + Map>> values = doGetAsync(getTelemetryValuesUrl, Map.class); assertEquals("value1", values.get("key1").get(0).get("value")); assertEquals("true", values.get("key2").get(0).get("value")); diff --git a/application/src/test/java/org/thingsboard/server/mqtt/telemetry/nosql/MqttTelemetryNoSqlIntegrationTest.java b/application/src/test/java/org/thingsboard/server/mqtt/telemetry/nosql/MqttTelemetryNoSqlIntegrationTest.java new file mode 100644 index 0000000000..069397e581 --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/mqtt/telemetry/nosql/MqttTelemetryNoSqlIntegrationTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.mqtt.telemetry.nosql; + +import org.thingsboard.server.dao.service.DaoNoSqlTest; +import org.thingsboard.server.mqtt.telemetry.AbstractMqttTelemetryIntegrationTest; + +/** + * Created by Valerii Sosliuk on 8/22/2017. + */ +@DaoNoSqlTest +public class MqttTelemetryNoSqlIntegrationTest extends AbstractMqttTelemetryIntegrationTest { +} diff --git a/application/src/test/java/org/thingsboard/server/mqtt/telemetry/sql/MqttTelemetrySqlIntegrationTest.java b/application/src/test/java/org/thingsboard/server/mqtt/telemetry/sql/MqttTelemetrySqlIntegrationTest.java new file mode 100644 index 0000000000..bd428279d9 --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/mqtt/telemetry/sql/MqttTelemetrySqlIntegrationTest.java @@ -0,0 +1,27 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.mqtt.telemetry.sql; + +import org.thingsboard.server.dao.service.DaoNoSqlTest; +import org.thingsboard.server.dao.service.DaoSqlTest; +import org.thingsboard.server.mqtt.telemetry.AbstractMqttTelemetryIntegrationTest; + +/** + * Created by Valerii Sosliuk on 8/22/2017. + */ +@DaoSqlTest +public class MqttTelemetrySqlIntegrationTest extends AbstractMqttTelemetryIntegrationTest { +}