Skip to content

Commit

Permalink
add validation (+tests) of enforcement for amqp 0.9.1 connections
Browse files Browse the repository at this point in the history
  • Loading branch information
dguggemos committed Oct 17, 2018
1 parent 7afbfbe commit ad5c681
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 3 deletions.
Expand Up @@ -133,7 +133,7 @@ private static void validateSourceEnforcement(@Nullable final Enforcement enforc
final DittoHeaders dittoHeaders, final Supplier<String> sourceDescription) {
if (enforcement != null) {

validateEnforcementOrigin(enforcement, sourceDescription, dittoHeaders);
validateEnforcementInput(enforcement, sourceDescription, dittoHeaders);

final String dummyThingId = "namespace:name";
final Map<String, String> filtersMap = PlaceholderFilter.filterAddressesAsMap(enforcement.getFilters(),
Expand All @@ -155,7 +155,7 @@ private static void validateSourceEnforcement(@Nullable final Enforcement enforc
}
}

private static void validateEnforcementOrigin(final Enforcement enforcement,
private static void validateEnforcementInput(final Enforcement enforcement,
final Supplier<String> sourceDescription, final DittoHeaders dittoHeaders) {
final SourceAddressPlaceholder sourceAddressPlaceholder = PlaceholderFactory.newSourceAddressPlaceholder();
try {
Expand Down
Expand Up @@ -23,6 +23,7 @@
import org.eclipse.ditto.model.connectivity.Source;
import org.eclipse.ditto.model.connectivity.Target;
import org.eclipse.ditto.services.connectivity.messaging.validation.AbstractProtocolValidator;
import org.eclipse.ditto.services.models.connectivity.placeholder.PlaceholderFactory;

/**
* Connection specification for RabbitMQ protocol.
Expand All @@ -45,7 +46,12 @@ public static RabbitMQValidator newInstance() {
@Override
protected void validateSource(final Source source, final DittoHeaders dittoHeaders,
final Supplier<String> sourceDescription) {
// noop

source.getEnforcement().ifPresent(enforcement -> {
validateEnforcement(enforcement.getInput(), PlaceholderFactory.newHeadersPlaceholder(), dittoHeaders);
enforcement.getFilters().forEach(filterTemplate -> validateEnforcement(filterTemplate,
PlaceholderFactory.newThingPlaceholder(), dittoHeaders));
});
}

@Override
Expand Down
Expand Up @@ -13,6 +13,14 @@
import static org.mutabilitydetector.unittesting.MutabilityAssert.assertInstancesOf;
import static org.mutabilitydetector.unittesting.MutabilityMatchers.areImmutable;

import org.assertj.core.api.Assertions;
import org.eclipse.ditto.model.base.headers.DittoHeaders;
import org.eclipse.ditto.model.connectivity.ConnectionConfigurationInvalidException;
import org.eclipse.ditto.model.connectivity.ConnectivityModelFactory;
import org.eclipse.ditto.model.connectivity.Source;
import org.eclipse.ditto.model.connectivity.SourceBuilder;
import org.eclipse.ditto.model.connectivity.UnresolvedPlaceholderException;
import org.eclipse.ditto.services.connectivity.messaging.TestConstants;
import org.junit.Test;

/**
Expand All @@ -24,4 +32,48 @@ public final class RabbitMQValidatorTest {
public void testImmutability() {
assertInstancesOf(RabbitMQValidator.class, areImmutable());
}

private static final RabbitMQValidator UNDER_TEST = RabbitMQValidator.newInstance();


@Test
public void testValidationOfEnforcement() {
final Source source = newSourceBuilder()
.enforcement(ConnectivityModelFactory.newEnforcement(
"{{ header:device_id }}", "{{ thing:id }}", "{{ thing:name }}", "{{ thing:namespace }}"))
.build();

UNDER_TEST.validateSource(source, DittoHeaders.empty(), () -> "testSource");
}

@Test
public void testInvalidInputThrowsException() {
final Source source = newSourceBuilder()
.enforcement(ConnectivityModelFactory.newEnforcement("{{ thing:id }}", "{{ thing:namespace }}"))
.build();

Assertions.assertThatExceptionOfType(ConnectionConfigurationInvalidException.class)
.isThrownBy(() -> UNDER_TEST.validateSource(source, DittoHeaders.empty(), () -> "testSource"))
.withCauseInstanceOf(UnresolvedPlaceholderException.class);
}

@Test
public void testInvalidMatcherThrowsException() {
final Source source = newSourceBuilder()
.enforcement(ConnectivityModelFactory.newEnforcement(
"{{ header:device_id }}", "{{ header:ditto }}"))
.build();

Assertions.assertThatExceptionOfType(ConnectionConfigurationInvalidException.class)
.isThrownBy(() -> UNDER_TEST.validateSource(source, DittoHeaders.empty(), () -> "testSource"))
.withCauseInstanceOf(UnresolvedPlaceholderException.class);
}

private static SourceBuilder newSourceBuilder() {
return ConnectivityModelFactory.newSourceBuilder()
.address("telemetry/device")
.authorizationContext(
TestConstants.Authorization.AUTHORIZATION_CONTEXT);
}

}

0 comments on commit ad5c681

Please sign in to comment.