Search in sources :

Example 11 with Result

use of org.eclipse.hono.service.management.Result in project hono by eclipse.

the class DeviceAndGatewayAutoProvisionerTest method provisionAndVerifySuccessfulResult.

@SuppressWarnings("unchecked")
private void provisionAndVerifySuccessfulResult(final VertxTestContext ctx, final boolean isGateway, final String expectedDeviceId) throws CertificateEncodingException {
    final JsonObject clientContext = new JsonObject().put(CredentialsConstants.FIELD_CLIENT_CERT, cert.getEncoded());
    // WHEN provisioning a device/gateway from a certificate
    deviceAndGatewayAutoProvisioner.provisionIfEnabled(tenantId, tenant, subjectDn, clientContext, NoopSpan.INSTANCE).onComplete(ctx.succeeding(result -> {
        ctx.verify(() -> {
            // VERIFY that that the device/gateway has been registered.
            final ArgumentCaptor<Device> deviceCaptor = ArgumentCaptor.forClass(Device.class);
            verify(deviceManagementService).createDevice(eq(tenantId), any(), deviceCaptor.capture(), any());
            if (isGateway) {
                // VERIFY that a gateway has been provisioned by checking the relevant property
                assertThat(deviceCaptor.getValue().getAuthorities()).contains(RegistryManagementConstants.AUTHORITY_AUTO_PROVISIONING_ENABLED);
            }
            // VERIFY that the correct credentials are stored
            final ArgumentCaptor<List<CommonCredential>> credentialsCaptor = ArgumentCaptor.forClass(List.class);
            verify(credentialsManagementService).updateCredentials(eq(tenantId), eq(expectedDeviceId), credentialsCaptor.capture(), any(), any());
            final List<CommonCredential> credentialsCaptorValue = credentialsCaptor.getValue();
            assertThat(credentialsCaptorValue.size()).isEqualTo(1);
            assertThat(credentialsCaptorValue.get(0).getType()).isEqualTo(RegistryManagementConstants.SECRETS_TYPE_X509_CERT);
            assertThat(credentialsCaptorValue.get(0).getAuthId()).isEqualTo(subjectDn);
            // VERIFY the returned credentials result after successful auto-provisioning
            assertThat(result.getStatus()).isEqualTo(HttpURLConnection.HTTP_CREATED);
            final JsonObject returnedCredential = result.getPayload();
            assertThat(returnedCredential.getString(RegistryManagementConstants.FIELD_PAYLOAD_DEVICE_ID)).isEqualTo(expectedDeviceId);
            assertThat(returnedCredential.getString(RegistryManagementConstants.FIELD_AUTH_ID)).isEqualTo(subjectDn);
            assertThat(returnedCredential.getString(RegistryManagementConstants.FIELD_TYPE)).isEqualTo(RegistryManagementConstants.SECRETS_TYPE_X509_CERT);
            // VERIFY that a auto-provisioning notification has been sent
            final ArgumentCaptor<Map<String, Object>> messagePropertiesArgumentCaptor = ArgumentCaptor.forClass(Map.class);
            verify(sender).sendEvent(argThat(tenant -> tenant.getTenantId().equals(tenantId)), argThat(assertion -> assertion.getDeviceId().equals(expectedDeviceId)), eq(EventConstants.CONTENT_TYPE_DEVICE_PROVISIONING_NOTIFICATION), any(), messagePropertiesArgumentCaptor.capture(), any());
            final Map<String, Object> eventProperties = messagePropertiesArgumentCaptor.getValue();
            assertThat(eventProperties.get(MessageHelper.APP_PROPERTY_REGISTRATION_STATUS)).isEqualTo(EventConstants.RegistrationStatus.NEW.name());
            assertThat(eventProperties.get(MessageHelper.APP_PROPERTY_TENANT_ID)).isEqualTo(tenantId);
            // VERIFY that the device registration has been updated as the auto-provisioning event has been
            // successfully sent
            verify(deviceManagementService).updateDevice(eq(tenantId), eq(expectedDeviceId), deviceCaptor.capture(), any(), any());
            final DeviceStatus deviceStatus = deviceCaptor.getValue().getStatus();
            assertThat(deviceStatus.isAutoProvisioned()).isTrue();
            assertThat(deviceStatus.isAutoProvisioningNotificationSent()).isTrue();
        });
        ctx.completeNow();
    }));
}
Also used : HttpURLConnection(java.net.HttpURLConnection) X509Certificate(java.security.cert.X509Certificate) BeforeEach(org.junit.jupiter.api.BeforeEach) CredentialsManagementService(org.eclipse.hono.service.management.credentials.CredentialsManagementService) CertificateFactory(java.security.cert.CertificateFactory) ArgumentMatchers.argThat(org.mockito.ArgumentMatchers.argThat) ArgumentMatchers.eq(org.mockito.ArgumentMatchers.eq) Tenant(org.eclipse.hono.service.management.tenant.Tenant) GeneralSecurityException(java.security.GeneralSecurityException) MessagingType(org.eclipse.hono.util.MessagingType) ExtendWith(org.junit.jupiter.api.extension.ExtendWith) TrustedCertificateAuthority(org.eclipse.hono.service.management.tenant.TrustedCertificateAuthority) Mockito.doAnswer(org.mockito.Mockito.doAnswer) Map(java.util.Map) JsonObject(io.vertx.core.json.JsonObject) EventSender(org.eclipse.hono.client.telemetry.EventSender) RegistrationAssertion(org.eclipse.hono.util.RegistrationAssertion) UUID(java.util.UUID) MessageHelper(org.eclipse.hono.util.MessageHelper) VertxExtension(io.vertx.junit5.VertxExtension) EventConstants(org.eclipse.hono.util.EventConstants) Future(io.vertx.core.Future) Test(org.junit.jupiter.api.Test) List(java.util.List) Optional(java.util.Optional) OperationResult(org.eclipse.hono.service.management.OperationResult) Id(org.eclipse.hono.service.management.Id) Mockito.mock(org.mockito.Mockito.mock) CertificateEncodingException(java.security.cert.CertificateEncodingException) ArgumentMatchers.any(org.mockito.ArgumentMatchers.any) VertxTestContext(io.vertx.junit5.VertxTestContext) X500Principal(javax.security.auth.x500.X500Principal) SelfSignedCertificate(io.vertx.core.net.SelfSignedCertificate) ServiceInvocationException(org.eclipse.hono.client.ServiceInvocationException) ArgumentCaptor(org.mockito.ArgumentCaptor) RegistryManagementConstants(org.eclipse.hono.util.RegistryManagementConstants) MessagingClientProvider(org.eclipse.hono.client.util.MessagingClientProvider) Vertx(io.vertx.core.Vertx) IOException(java.io.IOException) Mockito.when(org.mockito.Mockito.when) FileInputStream(java.io.FileInputStream) Truth.assertThat(com.google.common.truth.Truth.assertThat) Result(org.eclipse.hono.service.management.Result) CredentialsConstants(org.eclipse.hono.util.CredentialsConstants) Mockito.verify(org.mockito.Mockito.verify) TenantObject(org.eclipse.hono.util.TenantObject) Mockito.never(org.mockito.Mockito.never) CommonCredential(org.eclipse.hono.service.management.credentials.CommonCredential) NoopSpan(io.opentracing.noop.NoopSpan) ArgumentMatchers.anyString(org.mockito.ArgumentMatchers.anyString) ArgumentCaptor(org.mockito.ArgumentCaptor) CommonCredential(org.eclipse.hono.service.management.credentials.CommonCredential) JsonObject(io.vertx.core.json.JsonObject) List(java.util.List) JsonObject(io.vertx.core.json.JsonObject) TenantObject(org.eclipse.hono.util.TenantObject) ArgumentMatchers.anyString(org.mockito.ArgumentMatchers.anyString) Map(java.util.Map)

Example 12 with Result

use of org.eclipse.hono.service.management.Result in project hono by eclipse.

the class AbstractRegistrationServiceTest method testAssertRegistrationContainsDeviceInfo.

/**
 * Verifies that the payload returned for a request to assert the registration
 * of an existing device contains the information registered for the device.
 *
 * @param ctx The vert.x test context.
 */
@Test
public void testAssertRegistrationContainsDeviceInfo(final VertxTestContext ctx) {
    final JsonObject registeredDevice = new JsonObject().put(RegistrationConstants.FIELD_DOWNSTREAM_MESSAGE_MAPPER, "mapping-service").put(RegistrationConstants.FIELD_PAYLOAD_DEFAULTS, new JsonObject().put("foo", "bar")).put(RegistrationConstants.FIELD_VIA, new JsonArray().add("gw1").add("gw2")).put("ext", new JsonObject().put("key", "value"));
    when(service.getRegistrationInformation(any(DeviceKey.class), any(Span.class))).thenReturn(Future.succeededFuture(RegistrationResult.from(HttpURLConnection.HTTP_OK, new JsonObject().put(RegistrationConstants.FIELD_PAYLOAD_DEVICE_ID, "device").put(RegistrationConstants.FIELD_DATA, registeredDevice))));
    service.assertRegistration(Constants.DEFAULT_TENANT, "device", span).onComplete(ctx.succeeding(result -> {
        ctx.verify(() -> {
            assertThat(result.getStatus()).isEqualTo(HttpURLConnection.HTTP_OK);
            assertThat(result.getPayload().getString(RegistrationConstants.FIELD_DOWNSTREAM_MESSAGE_MAPPER)).isEqualTo("mapping-service");
            assertThat(result.getPayload().getJsonArray(RegistrationConstants.FIELD_VIA)).containsExactly("gw1", "gw2");
            assertThat(result.getPayload().getJsonObject(RegistrationConstants.FIELD_PAYLOAD_DEFAULTS)).containsExactly(Map.entry("foo", "bar"));
            assertThat(result.getPayload().containsKey("ext")).isFalse();
        });
        ctx.completeNow();
    }));
}
Also used : JsonArray(io.vertx.core.json.JsonArray) ArgumentMatchers.any(org.mockito.ArgumentMatchers.any) HttpURLConnection(java.net.HttpURLConnection) VertxTestContext(io.vertx.junit5.VertxTestContext) BeforeEach(org.junit.jupiter.api.BeforeEach) ArgumentMatchers.eq(org.mockito.ArgumentMatchers.eq) Mockito.spy(org.mockito.Mockito.spy) Constants(org.eclipse.hono.util.Constants) Tenant(org.eclipse.hono.service.management.tenant.Tenant) Mockito.verifyNoInteractions(org.mockito.Mockito.verifyNoInteractions) ArgumentCaptor(org.mockito.ArgumentCaptor) ExtendWith(org.junit.jupiter.api.extension.ExtendWith) StatusCodeMapper(org.eclipse.hono.client.StatusCodeMapper) Map(java.util.Map) RegistrationResult(org.eclipse.hono.util.RegistrationResult) TracingMockSupport(org.eclipse.hono.test.TracingMockSupport) JsonObject(io.vertx.core.json.JsonObject) TenantInformationService(org.eclipse.hono.deviceregistry.service.tenant.TenantInformationService) RegistryManagementConstants(org.eclipse.hono.util.RegistryManagementConstants) Device(org.eclipse.hono.service.management.device.Device) RegistrationConstants(org.eclipse.hono.util.RegistrationConstants) Mockito.when(org.mockito.Mockito.when) Truth.assertThat(com.google.common.truth.Truth.assertThat) VertxExtension(io.vertx.junit5.VertxExtension) Result(org.eclipse.hono.service.management.Result) Future(io.vertx.core.Future) Mockito.verify(org.mockito.Mockito.verify) Test(org.junit.jupiter.api.Test) JsonArray(io.vertx.core.json.JsonArray) Mockito.never(org.mockito.Mockito.never) List(java.util.List) Optional(java.util.Optional) TenantKey(org.eclipse.hono.deviceregistry.service.tenant.TenantKey) OperationResult(org.eclipse.hono.service.management.OperationResult) Span(io.opentracing.Span) Collections(java.util.Collections) ArgumentMatchers.anyString(org.mockito.ArgumentMatchers.anyString) Mockito.mock(org.mockito.Mockito.mock) JsonObject(io.vertx.core.json.JsonObject) Span(io.opentracing.Span) Test(org.junit.jupiter.api.Test)

Example 13 with Result

use of org.eclipse.hono.service.management.Result in project hono by eclipse.

the class AbstractTenantManagementServiceTest method testNotificationOnCreateTenant.

/**
 * Verifies that {@link AbstractTenantManagementService#createTenant(Optional, Tenant, Span)} publishes the expected
 * notification.
 *
 * @param context The vert.x test context.
 */
@Test
public void testNotificationOnCreateTenant(final VertxTestContext context) {
    final var notificationArgumentCaptor = ArgumentCaptor.forClass(TenantChangeNotification.class);
    tenantManagementService.createTenant(Optional.of(DEFAULT_TENANT_ID), new Tenant().setEnabled(false), SPAN).onComplete(context.succeeding(result -> {
        context.verify(() -> {
            verify(eventBus).publish(eq(NotificationEventBusSupport.getEventBusAddress(TenantChangeNotification.TYPE)), notificationArgumentCaptor.capture(), any());
            assertThat(notificationArgumentCaptor.getAllValues().size()).isEqualTo(1);
            final var notification = notificationArgumentCaptor.getValue();
            assertThat(notification).isNotNull();
            assertThat(notification.getChange()).isEqualTo(LifecycleChange.CREATE);
            assertThat(notification.getTenantId()).isEqualTo(DEFAULT_TENANT_ID);
            assertThat(notification.getCreationTime()).isNotNull();
            assertThat(notification.isEnabled()).isFalse();
        });
        context.completeNow();
    }));
}
Also used : ArgumentMatchers.any(org.mockito.ArgumentMatchers.any) HttpURLConnection(java.net.HttpURLConnection) VertxTestContext(io.vertx.junit5.VertxTestContext) BeforeEach(org.junit.jupiter.api.BeforeEach) LifecycleChange(org.eclipse.hono.notification.deviceregistry.LifecycleChange) ArgumentMatchers.eq(org.mockito.ArgumentMatchers.eq) Tenant(org.eclipse.hono.service.management.tenant.Tenant) ArgumentCaptor(org.mockito.ArgumentCaptor) EventBus(io.vertx.core.eventbus.EventBus) ExtendWith(org.junit.jupiter.api.extension.ExtendWith) TenantChangeNotification(org.eclipse.hono.notification.deviceregistry.TenantChangeNotification) Vertx(io.vertx.core.Vertx) Mockito.times(org.mockito.Mockito.times) Mockito.when(org.mockito.Mockito.when) Truth.assertThat(com.google.common.truth.Truth.assertThat) VertxExtension(io.vertx.junit5.VertxExtension) Result(org.eclipse.hono.service.management.Result) Future(io.vertx.core.Future) Mockito.verify(org.mockito.Mockito.verify) Test(org.junit.jupiter.api.Test) Optional(java.util.Optional) OperationResult(org.eclipse.hono.service.management.OperationResult) Span(io.opentracing.Span) NotificationEventBusSupport(org.eclipse.hono.notification.NotificationEventBusSupport) NoopSpan(io.opentracing.noop.NoopSpan) Id(org.eclipse.hono.service.management.Id) Mockito.mock(org.mockito.Mockito.mock) Tenant(org.eclipse.hono.service.management.tenant.Tenant) Test(org.junit.jupiter.api.Test)

Example 14 with Result

use of org.eclipse.hono.service.management.Result in project hono by eclipse.

the class AbstractDeviceManagementServiceTest method testNotificationOnDeleteDevice.

/**
 * Verifies that {@link AbstractDeviceManagementService#deleteDevice(String, String, Optional, Span)} publishes the
 * expected notification.
 *
 * @param context The vert.x test context.
 */
@Test
public void testNotificationOnDeleteDevice(final VertxTestContext context) {
    final var notificationArgumentCaptor = ArgumentCaptor.forClass(DeviceChangeNotification.class);
    deviceManagementService.createDevice(DEFAULT_TENANT_ID, Optional.of(DEFAULT_DEVICE_ID), new Device(), SPAN).compose(result -> deviceManagementService.deleteDevice(DEFAULT_TENANT_ID, DEFAULT_DEVICE_ID, Optional.empty(), SPAN)).onComplete(context.succeeding(result -> {
        context.verify(() -> {
            verify(eventBus, times(2)).publish(eq(NotificationEventBusSupport.getEventBusAddress(DeviceChangeNotification.TYPE)), notificationArgumentCaptor.capture(), any());
            assertThat(notificationArgumentCaptor.getAllValues().size()).isEqualTo(2);
            final var notification = notificationArgumentCaptor.getValue();
            assertThat(notification).isNotNull();
            assertThat(notification.getChange()).isEqualTo(LifecycleChange.DELETE);
            assertThat(notification.getTenantId()).isEqualTo(DEFAULT_TENANT_ID);
            assertThat(notification.getDeviceId()).isEqualTo(DEFAULT_DEVICE_ID);
            assertThat(notification.getCreationTime()).isNotNull();
            assertThat(notification.isEnabled()).isFalse();
        });
        context.completeNow();
    }));
}
Also used : ArgumentMatchers.any(org.mockito.ArgumentMatchers.any) HttpURLConnection(java.net.HttpURLConnection) VertxTestContext(io.vertx.junit5.VertxTestContext) BeforeEach(org.junit.jupiter.api.BeforeEach) LifecycleChange(org.eclipse.hono.notification.deviceregistry.LifecycleChange) ArgumentMatchers.eq(org.mockito.ArgumentMatchers.eq) DeviceChangeNotification(org.eclipse.hono.notification.deviceregistry.DeviceChangeNotification) ArgumentCaptor(org.mockito.ArgumentCaptor) EventBus(io.vertx.core.eventbus.EventBus) ExtendWith(org.junit.jupiter.api.extension.ExtendWith) AllDevicesOfTenantDeletedNotification(org.eclipse.hono.notification.deviceregistry.AllDevicesOfTenantDeletedNotification) Device(org.eclipse.hono.service.management.device.Device) Vertx(io.vertx.core.Vertx) Mockito.times(org.mockito.Mockito.times) Mockito.when(org.mockito.Mockito.when) Truth.assertThat(com.google.common.truth.Truth.assertThat) VertxExtension(io.vertx.junit5.VertxExtension) Result(org.eclipse.hono.service.management.Result) Future(io.vertx.core.Future) Mockito.verify(org.mockito.Mockito.verify) Test(org.junit.jupiter.api.Test) Optional(java.util.Optional) OperationResult(org.eclipse.hono.service.management.OperationResult) Span(io.opentracing.Span) NotificationEventBusSupport(org.eclipse.hono.notification.NotificationEventBusSupport) NoopSpan(io.opentracing.noop.NoopSpan) Id(org.eclipse.hono.service.management.Id) Mockito.mock(org.mockito.Mockito.mock) Device(org.eclipse.hono.service.management.device.Device) Test(org.junit.jupiter.api.Test)

Example 15 with Result

use of org.eclipse.hono.service.management.Result in project hono by eclipse.

the class AbstractTenantManagementService method createTenant.

@Override
public final Future<OperationResult<Id>> createTenant(final Optional<String> tenantId, final Tenant tenantObj, final Span span) {
    Objects.requireNonNull(tenantId);
    Objects.requireNonNull(tenantObj);
    Objects.requireNonNull(span);
    final Promise<Void> tenantCheck = Promise.promise();
    try {
        tenantObj.assertTrustAnchorIdUniquenessAndCreateMissingIds();
        tenantCheck.complete();
    } catch (final IllegalStateException e) {
        log.debug("error creating tenant", e);
        TracingHelper.logError(span, e);
        tenantCheck.fail(new ClientErrorException(tenantId.orElse("N/A"), HttpURLConnection.HTTP_BAD_REQUEST, e.getMessage()));
    }
    final String tenantIdValue = tenantId.orElseGet(this::createId);
    return tenantCheck.future().compose(ok -> processCreateTenant(tenantIdValue, tenantObj, span)).onSuccess(result -> NotificationEventBusSupport.sendNotification(vertx, new TenantChangeNotification(LifecycleChange.CREATE, tenantIdValue, Instant.now(), tenantObj.isEnabled()))).recover(t -> DeviceRegistryUtils.mapError(t, tenantId.get()));
}
Also used : HttpURLConnection(java.net.HttpURLConnection) LifecycleChange(org.eclipse.hono.notification.deviceregistry.LifecycleChange) Filter(org.eclipse.hono.service.management.Filter) LoggerFactory(org.slf4j.LoggerFactory) ClientErrorException(org.eclipse.hono.client.ClientErrorException) Tenant(org.eclipse.hono.service.management.tenant.Tenant) Sort(org.eclipse.hono.service.management.Sort) SearchResult(org.eclipse.hono.service.management.SearchResult) TenantManagementService(org.eclipse.hono.service.management.tenant.TenantManagementService) TracingHelper(org.eclipse.hono.tracing.TracingHelper) TenantChangeNotification(org.eclipse.hono.notification.deviceregistry.TenantChangeNotification) Logger(org.slf4j.Logger) Promise(io.vertx.core.Promise) TenantWithId(org.eclipse.hono.service.management.tenant.TenantWithId) Vertx(io.vertx.core.Vertx) ServerErrorException(org.eclipse.hono.client.ServerErrorException) Instant(java.time.Instant) Result(org.eclipse.hono.service.management.Result) Future(io.vertx.core.Future) Objects(java.util.Objects) List(java.util.List) Optional(java.util.Optional) OperationResult(org.eclipse.hono.service.management.OperationResult) Span(io.opentracing.Span) NotificationEventBusSupport(org.eclipse.hono.notification.NotificationEventBusSupport) DeviceRegistryUtils(org.eclipse.hono.deviceregistry.util.DeviceRegistryUtils) Id(org.eclipse.hono.service.management.Id) ClientErrorException(org.eclipse.hono.client.ClientErrorException) TenantChangeNotification(org.eclipse.hono.notification.deviceregistry.TenantChangeNotification)

Aggregations

Future (io.vertx.core.Future)18 HttpURLConnection (java.net.HttpURLConnection)18 Optional (java.util.Optional)18 OperationResult (org.eclipse.hono.service.management.OperationResult)18 Result (org.eclipse.hono.service.management.Result)18 Vertx (io.vertx.core.Vertx)17 Id (org.eclipse.hono.service.management.Id)17 Span (io.opentracing.Span)15 NotificationEventBusSupport (org.eclipse.hono.notification.NotificationEventBusSupport)14 LifecycleChange (org.eclipse.hono.notification.deviceregistry.LifecycleChange)14 Truth.assertThat (com.google.common.truth.Truth.assertThat)11 VertxExtension (io.vertx.junit5.VertxExtension)11 VertxTestContext (io.vertx.junit5.VertxTestContext)11 List (java.util.List)11 BeforeEach (org.junit.jupiter.api.BeforeEach)11 Test (org.junit.jupiter.api.Test)11 ExtendWith (org.junit.jupiter.api.extension.ExtendWith)11 ArgumentCaptor (org.mockito.ArgumentCaptor)11 ArgumentMatchers.any (org.mockito.ArgumentMatchers.any)11 ArgumentMatchers.eq (org.mockito.ArgumentMatchers.eq)11