Java tutorial
/** * Copyright 2016-2018 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.msa; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.ImmutableMap; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomStringUtils; import org.apache.http.config.Registry; import org.apache.http.config.RegistryBuilder; import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.TrustStrategy; import org.apache.http.conn.ssl.X509HostnameVerifier; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.ssl.SSLContextBuilder; import org.apache.http.ssl.SSLContexts; import org.junit.*; import org.junit.rules.TestRule; import org.junit.rules.TestWatcher; import org.junit.runner.Description; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.thingsboard.client.tools.RestClient; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.msa.mapper.WsTelemetryResponse; import javax.net.ssl.*; import java.net.URI; import java.security.cert.X509Certificate; import java.util.List; import java.util.Map; import java.util.Random; @Slf4j public abstract class AbstractContainerTest { protected static final String HTTPS_URL = "https://localhost"; protected static final String WSS_URL = "wss://localhost"; protected static RestClient restClient; protected ObjectMapper mapper = new ObjectMapper(); @BeforeClass public static void before() throws Exception { restClient = new RestClient(HTTPS_URL); restClient.getRestTemplate().setRequestFactory(getRequestFactoryForSelfSignedCert()); } @Rule public TestRule watcher = new TestWatcher() { protected void starting(Description description) { log.info("================================================="); log.info("STARTING TEST: {}", description.getMethodName()); log.info("================================================="); } /** * Invoked when a test succeeds */ protected void succeeded(Description description) { log.info("================================================="); log.info("SUCCEEDED TEST: {}", description.getMethodName()); log.info("================================================="); } /** * Invoked when a test fails */ protected void failed(Throwable e, Description description) { log.info("================================================="); log.info("FAILED TEST: {}", description.getMethodName(), e); log.info("================================================="); } }; protected Device createDevice(String name) { return restClient.createDevice(name + RandomStringUtils.randomAlphanumeric(7), "DEFAULT"); } protected WsClient subscribeToWebSocket(DeviceId deviceId, String scope, CmdsType property) throws Exception { WsClient wsClient = new WsClient( new URI(WSS_URL + "/api/ws/plugins/telemetry?token=" + restClient.getToken())); SSLContextBuilder builder = SSLContexts.custom(); builder.loadTrustMaterial(null, (TrustStrategy) (chain, authType) -> true); wsClient.setSocket(builder.build().getSocketFactory().createSocket()); wsClient.connectBlocking(); JsonObject cmdsObject = new JsonObject(); cmdsObject.addProperty("entityType", EntityType.DEVICE.name()); cmdsObject.addProperty("entityId", deviceId.toString()); cmdsObject.addProperty("scope", scope); cmdsObject.addProperty("cmdId", new Random().nextInt(100)); JsonArray cmd = new JsonArray(); cmd.add(cmdsObject); JsonObject wsRequest = new JsonObject(); wsRequest.add(property.toString(), cmd); wsClient.send(wsRequest.toString()); wsClient.waitForFirstReply(); return wsClient; } protected Map<String, Long> getExpectedLatestValues(long ts) { return ImmutableMap.<String, Long>builder().put("booleanKey", ts).put("stringKey", ts).put("doubleKey", ts) .put("longKey", ts).build(); } protected boolean verify(WsTelemetryResponse wsTelemetryResponse, String key, Long expectedTs, String expectedValue) { List<Object> list = wsTelemetryResponse.getDataValuesByKey(key); return expectedTs.equals(list.get(0)) && expectedValue.equals(list.get(1)); } protected boolean verify(WsTelemetryResponse wsTelemetryResponse, String key, String expectedValue) { List<Object> list = wsTelemetryResponse.getDataValuesByKey(key); return expectedValue.equals(list.get(1)); } protected JsonObject createPayload(long ts) { JsonObject values = createPayload(); JsonObject payload = new JsonObject(); payload.addProperty("ts", ts); payload.add("values", values); return payload; } protected JsonObject createPayload() { JsonObject values = new JsonObject(); values.addProperty("stringKey", "value1"); values.addProperty("booleanKey", true); values.addProperty("doubleKey", 42.0); values.addProperty("longKey", 73L); return values; } protected enum CmdsType { TS_SUB_CMDS("tsSubCmds"), HISTORY_CMDS("historyCmds"), ATTR_SUB_CMDS("attrSubCmds"); private final String text; CmdsType(final String text) { this.text = text; } @Override public String toString() { return text; } } private static HttpComponentsClientHttpRequestFactory getRequestFactoryForSelfSignedCert() throws Exception { SSLContextBuilder builder = SSLContexts.custom(); builder.loadTrustMaterial(null, (TrustStrategy) (chain, authType) -> true); SSLContext sslContext = builder.build(); SSLConnectionSocketFactory sslSelfSigned = new SSLConnectionSocketFactory(sslContext, new X509HostnameVerifier() { @Override public void verify(String host, SSLSocket ssl) { } @Override public void verify(String host, X509Certificate cert) { } @Override public void verify(String host, String[] cns, String[] subjectAlts) { } @Override public boolean verify(String s, SSLSession sslSession) { return true; } }); Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() .register("https", sslSelfSigned).build(); PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry); CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build(); return new HttpComponentsClientHttpRequestFactory(httpClient); } }