use of org.eclipse.hono.util.ResourceIdentifier in project hono by eclipse.
the class KuraProtocolAdapterTest method testMapTopicMapsKuraControlMessagesToEventApi.
/**
* Verifies that the adapter maps control messages with QoS 1 published from a Kura gateway to
* the Event endpoint.
*
* @param ctx The helper to use for running tests on vert.x.
*/
@Test
public void testMapTopicMapsKuraControlMessagesToEventApi(final TestContext ctx) {
// GIVEN an adapter configured to use the standard topic.control-prefix $EDC
// WHEN a message is published to a topic with the Kura $EDC prefix as endpoint
final MqttContext context = newContext(MqttQoS.AT_LEAST_ONCE, "$EDC/my-scope/4711");
final Async determineAddressSuccess = ctx.async();
final Future<ResourceIdentifier> addressTracker = adapter.mapTopic(context).map(msg -> {
determineAddressSuccess.complete();
return msg;
});
// THEN the message is mapped to the event API
determineAddressSuccess.await();
assertAddress(addressTracker.result(), EventConstants.EVENT_ENDPOINT, "my-scope", "4711");
// and has the control message content type
assertThat(context.contentType(), is(config.getCtrlMsgContentType()));
}
use of org.eclipse.hono.util.ResourceIdentifier in project hono by eclipse.
the class KuraProtocolAdapterTest method testMapTopicMapsKuraDataMessagesToTelemetryApi.
/**
* Verifies that the adapter forwards data messages with QoS 0 published from a Kura gateway to
* the Telemetry endpoint.
*
* @param ctx The helper to use for running tests on vert.x.
*/
@Test
public void testMapTopicMapsKuraDataMessagesToTelemetryApi(final TestContext ctx) {
// GIVEN an adapter configured with a custom data message content type
config.setDataMsgContentType("data-msg");
// WHEN a message is published to an application topic with QoS 0
final MqttContext context = newContext(MqttQoS.AT_MOST_ONCE, "my-scope/4711");
final Async determineAddressSuccess = ctx.async();
final Future<ResourceIdentifier> addressTracker = adapter.mapTopic(context).map(msg -> {
determineAddressSuccess.complete();
return msg;
});
// THEN the message is mapped to the telemetry API
determineAddressSuccess.await();
assertAddress(addressTracker.result(), TelemetryConstants.TELEMETRY_ENDPOINT, "my-scope", "4711");
// and has the configured data message content type
assertThat(context.contentType(), is(config.getDataMsgContentType()));
}
use of org.eclipse.hono.util.ResourceIdentifier in project hono by eclipse.
the class AbstractVertxBasedMqttProtocolAdapterTest method testUploadMessageSupportsShortAndLongEndpointNames.
/**
* Verifies that the adapter will accept uploading messages to valid endpoint names.
*
* @param ctx The vert.x test context.
*/
@Test
public void testUploadMessageSupportsShortAndLongEndpointNames(final TestContext ctx) {
// GIVEN an adapter with a downstream event consumer
final MqttServer server = getMqttServer(false);
final AbstractVertxBasedMqttProtocolAdapter<ProtocolAdapterProperties> adapter = getAdapter(server);
givenATelemetrySenderForOutcome(Future.succeededFuture(mock(ProtonDelivery.class)));
givenAnEventSenderForOutcome(Future.succeededFuture(mock(ProtonDelivery.class)));
// WHEN a device publishes an event
final MqttEndpoint endpoint = mock(MqttEndpoint.class);
when(endpoint.isConnected()).thenReturn(Boolean.TRUE);
final Buffer payload = Buffer.buffer("some payload");
final MqttPublishMessage messageFromDevice = mock(MqttPublishMessage.class);
when(messageFromDevice.qosLevel()).thenReturn(MqttQoS.AT_LEAST_ONCE);
when(messageFromDevice.messageId()).thenReturn(5555555);
when(messageFromDevice.payload()).thenReturn(payload);
final MqttContext context = new MqttContext(messageFromDevice, endpoint);
ResourceIdentifier resourceId = ResourceIdentifier.from("telemetry", "my-tenant", "4712");
adapter.uploadMessage(context, resourceId, payload).setHandler(ctx.asyncAssertSuccess());
resourceId = ResourceIdentifier.from("event", "my-tenant", "4712");
adapter.uploadMessage(context, resourceId, payload).setHandler(ctx.asyncAssertSuccess());
resourceId = ResourceIdentifier.from("t", "my-tenant", "4712");
adapter.uploadMessage(context, resourceId, payload).setHandler(ctx.asyncAssertSuccess());
resourceId = ResourceIdentifier.from("e", "my-tenant", "4712");
adapter.uploadMessage(context, resourceId, payload).setHandler(ctx.asyncAssertSuccess());
resourceId = ResourceIdentifier.from("unknown", "my-tenant", "4712");
adapter.uploadMessage(context, resourceId, payload).setHandler(ctx.asyncAssertFailure());
}
use of org.eclipse.hono.util.ResourceIdentifier in project hono by eclipse.
the class VertxBasedMqttProtocolAdapterTest method testOnPublishedMessageUsesDeviceIdentityForTopicWithoutTenant.
/**
* Verifies that the adapter uses an authenticated device's identity when mapping a topic without tenant ID.
*
* @param ctx The helper to use for running tests on vert.x.
*/
@Test
public void testOnPublishedMessageUsesDeviceIdentityForTopicWithoutTenant(final TestContext ctx) {
givenAnAdapter();
// WHEN an authenticated device publishes a message to a topic that does not contain a tenant ID
final MqttPublishMessage message = newMessage(MqttQoS.AT_MOST_ONCE, TelemetryConstants.TELEMETRY_ENDPOINT);
final MqttContext context = newContext(message, new Device("my-tenant", "4711"));
final Async addressCheck = ctx.async();
final Future<ResourceIdentifier> checkedAddress = adapter.mapTopic(message).compose(address -> adapter.checkAddress(context, address)).map(address -> {
addressCheck.complete();
return address;
});
// THEN the mapped address contains the authenticated device's tenant and device ID
addressCheck.await();
final ResourceIdentifier downstreamAddress = checkedAddress.result();
assertThat(downstreamAddress.getEndpoint(), is(TelemetryConstants.TELEMETRY_ENDPOINT));
assertThat(downstreamAddress.getTenantId(), is("my-tenant"));
}
use of org.eclipse.hono.util.ResourceIdentifier in project hono by eclipse.
the class HonoMessagingMessageFilterTest method testVerifyDetectsDeviceIdMismatch.
@Test
public void testVerifyDetectsDeviceIdMismatch() {
// GIVEN a valid telemetry message with device id not matching the link target
final Message msg = givenAMessageHavingProperties(MY_DEVICE + "_1", MY_TENANT);
// WHEN receiving the message via a link with mismatching tenant
final ResourceIdentifier linkTarget = getResourceIdentifier(MY_TENANT, MY_DEVICE);
// THEN message validation fails
assertFalse(HonoMessagingMessageFilter.verify(linkTarget, msg));
}
Aggregations