use of org.eclipse.hono.auth.Device in project hono by eclipse.
the class CoapContextTest method testStartAckTimerHandlesNonNumberPropertyValue.
/**
* Verifies that the global ACK timeout is used if a tenant specific value is configured that is not a number.
*/
@Test
void testStartAckTimerHandlesNonNumberPropertyValue() {
final CoapExchange exchange = mock(CoapExchange.class);
final Adapter coapConfig = new Adapter(Constants.PROTOCOL_ADAPTER_TYPE_COAP);
coapConfig.putExtension(CoapConstants.TIMEOUT_TO_ACK, "not-a-number");
final TenantObject tenant = TenantObject.from("tenant", true).addAdapter(coapConfig);
final Device authenticatedDevice = new Device(tenant.getTenantId(), "device-id");
final CoapContext ctx = CoapContext.fromRequest(exchange, authenticatedDevice, authenticatedDevice, "4711", span);
ctx.startAcceptTimer(vertx, tenant, 500);
verify(vertx).setTimer(eq(500L), VertxMockSupport.anyHandler());
}
use of org.eclipse.hono.auth.Device in project hono by eclipse.
the class DeviceInfoSupplier method getInfo.
/**
* {@inheritDoc}
*/
@Override
public AdditionalInfo getInfo(final Principal clientIdentity, final Object customArgument) {
if (customArgument instanceof AdditionalInfo) {
final AdditionalInfo info = (AdditionalInfo) customArgument;
final String authId = info.get(EXT_INFO_KEY_HONO_AUTH_ID, String.class);
final Device device = info.get(EXT_INFO_KEY_HONO_DEVICE, Device.class);
LOG.debug("get additional info auth-id: {}, device: {}@{}", authId, device.getDeviceId(), device.getTenantId());
return info;
}
LOG.debug("get no additional info");
return AdditionalInfo.empty();
}
use of org.eclipse.hono.auth.Device in project hono by eclipse.
the class MqttContextTest method verifyPropertyBagRetrievedFromTopic.
/**
* Verifies the values retrieved from the <em>property-bag</em> of a message's topic.
*/
@Test
public void verifyPropertyBagRetrievedFromTopic() {
final Device device = new Device("tenant", "device");
final MqttPublishMessage msg = mock(MqttPublishMessage.class);
when(msg.topicName()).thenReturn("event/tenant/device/?param1=value1¶m2=value2");
final MqttContext context = MqttContext.fromPublishPacket(msg, mock(MqttEndpoint.class), span, device);
assertNotNull(context.propertyBag());
assertEquals("value1", context.propertyBag().getProperty("param1"));
assertEquals("value2", context.propertyBag().getProperty("param2"));
assertEquals("event/tenant/device", context.topic().toString());
}
use of org.eclipse.hono.auth.Device in project hono by eclipse.
the class MqttContextTest method verifyContentType.
/**
* Verifies the <em>content-type</em> value retrieved from the <em>property-bag</em> in a message's topic.
*/
@Test
public void verifyContentType() {
final String contentType = "application/vnd.eclipse.ditto+json";
final String encodedContentType = URLEncoder.encode(contentType, StandardCharsets.UTF_8);
final Device device = new Device("tenant", "device");
final MqttPublishMessage msg = mock(MqttPublishMessage.class);
when(msg.topicName()).thenReturn(String.format("event/tenant/device/?Content-Type=%s¶m2=value2¶m3=value3", encodedContentType));
final MqttContext context = MqttContext.fromPublishPacket(msg, mock(MqttEndpoint.class), span, device);
assertNotNull(context.propertyBag());
assertEquals(contentType, context.propertyBag().getProperty(MessageHelper.SYS_PROPERTY_CONTENT_TYPE));
}
use of org.eclipse.hono.auth.Device in project hono by eclipse.
the class HttpBasedMessageMappingTest method testMapMessageSucceeds.
/**
* Verifies that the result returned by the mapping service contains the
* mapped payload, device ID and additional properties.
*
* @param ctx The helper to use for running tests on vert.x.
*/
@SuppressWarnings("unchecked")
@Test
public void testMapMessageSucceeds(final VertxTestContext ctx) {
config.setMapperEndpoints(Map.of("mapper", MapperEndpoint.from("host", 1234, "/uri", false)));
final ResourceIdentifier targetAddress = ResourceIdentifier.from(TelemetryConstants.TELEMETRY_ENDPOINT, TEST_TENANT_ID, "gateway");
final String newDeviceId = "new-device";
final HttpRequest<Buffer> httpRequest = mock(HttpRequest.class, withSettings().defaultAnswer(RETURNS_SELF));
final MultiMap responseHeaders = MultiMap.caseInsensitiveMultiMap();
responseHeaders.add(MessageHelper.APP_PROPERTY_DEVICE_ID, newDeviceId);
responseHeaders.add("foo", "bar");
final Buffer responseBody = Buffer.buffer("changed");
final HttpResponse<Buffer> httpResponse = mock(HttpResponse.class);
when(httpResponse.headers()).thenReturn(responseHeaders);
when(httpResponse.bodyAsBuffer()).thenReturn(responseBody);
when(httpResponse.statusCode()).thenReturn(HttpURLConnection.HTTP_OK);
when(mapperWebClient.post(anyInt(), anyString(), anyString())).thenReturn(httpRequest);
final String topic = String.format("%s/?content-type=%s", TelemetryConstants.TELEMETRY_ENDPOINT, URLEncoder.encode("text/plain", StandardCharsets.UTF_8));
final MqttPublishMessage message = newMessage(MqttQoS.AT_LEAST_ONCE, topic);
final MqttContext context = newContext(message, span, new Device(TEST_TENANT_ID, "gateway"));
final RegistrationAssertion assertion = new RegistrationAssertion("gateway").setDownstreamMessageMapper("mapper");
messageMapping.mapDownstreamMessage(context, targetAddress, assertion).onComplete(ctx.succeeding(mappedMessage -> {
ctx.verify(() -> {
assertThat(mappedMessage.getTargetAddress().getResourceId()).isEqualTo("new-device");
assertThat(mappedMessage.getPayload()).isEqualTo(responseBody);
assertThat(mappedMessage.getAdditionalProperties()).doesNotContainKey(MessageHelper.APP_PROPERTY_DEVICE_ID);
assertThat(mappedMessage.getAdditionalProperties()).containsEntry("foo", "bar");
});
ctx.completeNow();
}));
final ArgumentCaptor<Handler<AsyncResult<HttpResponse<Buffer>>>> handleCaptor = VertxMockSupport.argumentCaptorHandler();
verify(httpRequest).sendBuffer(any(Buffer.class), handleCaptor.capture());
handleCaptor.getValue().handle(Future.succeededFuture(httpResponse));
final ArgumentCaptor<MultiMap> headersCaptor = ArgumentCaptor.forClass(MultiMap.class);
verify(httpRequest).putHeaders(headersCaptor.capture());
final MultiMap addedHeaders = headersCaptor.getValue();
assertThat(addedHeaders.contains(MessageHelper.APP_PROPERTY_ORIG_ADDRESS, topic, false)).isTrue();
assertThat(addedHeaders.contains(HttpHeaders.CONTENT_TYPE.toString(), "text/plain", false));
}
Aggregations