/* * Copyright 2014-2016 CyberVision, Inc. * * 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.kaaproject.kaa.server.control; import com.mongodb.DB; import org.apache.avro.Schema; import org.apache.commons.lang.StringUtils; import org.apache.xerces.impl.dv.util.Base64; import org.codehaus.jackson.node.ArrayNode; import org.codehaus.jackson.node.JsonNodeFactory; import org.codehaus.jackson.node.ObjectNode; import org.junit.After; import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.runner.RunWith; import org.kaaproject.avro.ui.shared.FqnVersion; import org.kaaproject.kaa.common.avro.GenericAvroConverter; import org.kaaproject.kaa.common.dto.ApplicationDto; import org.kaaproject.kaa.common.dto.ConfigurationDto; import org.kaaproject.kaa.common.dto.ConfigurationSchemaDto; import org.kaaproject.kaa.common.dto.EndpointGroupDto; import org.kaaproject.kaa.common.dto.EndpointNotificationDto; import org.kaaproject.kaa.common.dto.EndpointProfileSchemaDto; import org.kaaproject.kaa.common.dto.HasId; import org.kaaproject.kaa.common.dto.KaaAuthorityDto; import org.kaaproject.kaa.common.dto.NotificationDto; import org.kaaproject.kaa.common.dto.NotificationSchemaDto; import org.kaaproject.kaa.common.dto.NotificationTypeDto; import org.kaaproject.kaa.common.dto.ProfileFilterDto; import org.kaaproject.kaa.common.dto.ServerProfileSchemaDto; import org.kaaproject.kaa.common.dto.TenantDto; import org.kaaproject.kaa.common.dto.TopicDto; import org.kaaproject.kaa.common.dto.TopicTypeDto; import org.kaaproject.kaa.common.dto.UpdateStatus; import org.kaaproject.kaa.common.dto.VersionDto; import org.kaaproject.kaa.common.dto.admin.UserDto; import org.kaaproject.kaa.common.dto.ctl.CTLSchemaDto; import org.kaaproject.kaa.common.dto.event.ApplicationEventAction; import org.kaaproject.kaa.common.dto.event.ApplicationEventFamilyMapDto; import org.kaaproject.kaa.common.dto.event.ApplicationEventMapDto; import org.kaaproject.kaa.common.dto.event.EventClassDto; import org.kaaproject.kaa.common.dto.event.EventClassFamilyDto; import org.kaaproject.kaa.common.dto.event.EventClassFamilyVersionDto; import org.kaaproject.kaa.common.dto.event.EventClassType; import org.kaaproject.kaa.common.dto.logs.LogAppenderDto; import org.kaaproject.kaa.common.dto.logs.LogSchemaDto; import org.kaaproject.kaa.server.appenders.file.config.FileSystemAppenderConfig; import org.kaaproject.kaa.server.common.admin.AdminClient; import org.kaaproject.kaa.server.common.core.algorithms.generation.DefaultRecordGenerationAlgorithm; import org.kaaproject.kaa.server.common.core.algorithms.generation.DefaultRecordGenerationAlgorithmImpl; import org.kaaproject.kaa.server.common.core.configuration.RawData; import org.kaaproject.kaa.server.common.core.configuration.RawDataFactory; import org.kaaproject.kaa.server.common.core.schema.RawSchema; import org.kaaproject.kaa.server.common.dao.AbstractTest; import org.kaaproject.kaa.server.common.dao.EventClassService; import org.kaaproject.kaa.server.common.dao.impl.sql.H2DBTestRunner; import org.kaaproject.kaa.server.common.dao.impl.sql.PostgreDBTestRunner; import org.kaaproject.kaa.server.common.nosql.mongo.dao.MongoDBTestRunner; import org.kaaproject.kaa.server.node.service.initialization.KaaNodeInitializationService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.web.client.HttpStatusCodeException; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.net.URL; import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import javax.sql.DataSource; /** * The Class AbstractTestControlServer. */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "/common-test-context.xml") @DirtiesContext(classMode = ClassMode.AFTER_CLASS) public abstract class AbstractTestControlServer extends AbstractTest { /** * The Constant TENANT. */ protected static final String TENANT = "Tenant"; /** * The Constant TENANT_ADMIN_USERNAME. */ protected static final String TENANT_ADMIN_USERNAME = "TenantUsername"; /** * The Constant USERNAME. */ protected static final String USERNAME = "Username"; /** * The Constant USER. */ protected static final String USER = "User"; /** * The Constant APPLICATION. */ protected static final String APPLICATION = "Application"; /** * The Constant ENDPOINT_GROUP. */ protected static final String ENDPOINT_GROUP = "EndpointGroup"; /** * The Constant EVENT_CLASS_FAMILY. */ protected static final String EVENT_CLASS_FAMILY = "EventClassFamily"; /** * The Constant EVENT_CLASS_FAMILY_NAMESPACE. */ protected static final String EVENT_CLASS_FAMILY_NAMESPACE = "org.kaaproject.event"; /** * The Constant EVENT_CLASS_FAMILY_CLASS_NAME. */ protected static final String EVENT_CLASS_FAMILY_CLASS_NAME = "DefaultEventClassFamily"; /** * The Constant TEST_CONFIG_SCHEMA. */ protected static final String TEST_CONFIG_SCHEMA = "control/data/testConfigSchema.json"; /** * The Constant TEST_INVALID_CONFIG_SCHEMA. */ protected static final String TEST_INVALID_CONFIG_SCHEMA = "control/data/testInvalidConfigSchema.json"; /** * The Constant TEST_CONFIG_SCHEMA_UPDATED. */ protected static final String TEST_CONFIG_SCHEMA_UPDATED = "control/data/testConfigSchemaUpdated.json"; /** * The Constant TEST_PROFILE_SCHEMA. */ protected static final String TEST_PROFILE_SCHEMA = "control/data/testProfileSchema.json"; /** * The Constant TEST_PROFILE_SCHEMA_UPDATED. */ protected static final String TEST_PROFILE_SCHEMA_UPDATED = "control/data/testProfileSchemaUpdated.json"; /** * The Constant TEST_USER_NOTIFICATION_SCHEMA. */ protected static final String TEST_USER_NOTIFICATION_SCHEMA = "control/data/testUserNotificationSchema.json"; /** * The Constant TEST_PROFILE_FILTER. */ protected static final String TEST_PROFILE_FILTER = "control/data/testProfileFilter.json"; /** * The Constant TEST_PROFILE_FILTER_UPDATED. */ protected static final String TEST_PROFILE_FILTER_UPDATED = "control/data/testProfileFilterUpdated.json"; /** * The Constant TEST_CONFIGURATION. */ protected static final String TEST_CONFIGURATION = "control/data/testConfig.json"; /** * The Constant TEST_CONFIGURATION_UPDATED. */ protected static final String TEST_CONFIGURATION_UPDATED = "control/data/testConfigUpdated.json"; /** * The Constant TOPIC. */ protected static final String TOPIC = "Topic"; /** * The Constant TEST_EVENT_CLASS_FAMILY_SCHEMA. */ protected static final String TEST_EVENT_CLASS_FAMILY_SCHEMA = "control/data/testEventClassFamilySchema.json"; /** * The Constant ENDPOINT_USER_EXTERNAL_ID. */ protected static final String ENDPOINT_USER_EXTERNAL_ID = "Generated Test Endpoint User External Id"; /** * The Constant ENDPOINT_USER_NAME. */ protected static final String ENDPOINT_USER_NAME = "Generated Test Endpoint User Name"; /** * The Constant TEST_LOG_SCHEMA. */ protected static final String TEST_LOG_SCHEMA = "control/data/testLogSchema.json"; protected static final String CTL_DEFAULT_NAME = "name"; protected static final String CTL_DEFAULT_NAMESPACE = "org.kaaproject.kaa"; protected static final String CTL_DEFAULT_TYPE = "Type"; protected static final String TEST_CTL_SCHEMA_ALPHA = "control/data/ctl/alpha.json"; protected static final String TEST_CTL_SCHEMA_BETA = "control/data/ctl/beta.json"; protected static final String TEST_CTL_SCHEMA_GAMMA = "control/data/ctl/gamma.json"; /** * The Constant LOG. */ private static final Logger LOG = LoggerFactory .getLogger(AbstractTestControlServer.class); /** * The Constant HOST. */ private static final String HOST = "localhost"; /** * The Constant PORT. */ private static final int PORT = 9080; /** * The Constant DEFAULT_KAA_ADMIN_USER. */ private static final String DEFAULT_KAA_ADMIN_USER = "kaa"; /** * The Constant DEFAULT_KAA_ADMIN_PASSWORD. */ private static final String DEFAULT_KAA_ADMIN_PASSWORD = "kaa123"; /** * The Constant DEFAULT_TENANT_ADMIN_USER. */ private static final String DEFAULT_TENANT_ADMIN_USER = "admin"; /** * The Constant DEFAULT_TENANT_ADMIN_PASSWORD. */ private static final String DEFAULT_TENANT_ADMIN_PASSWORD = "admin123"; /** * The Constant DEFAULT_TENANT_DEVELOPER_USER. */ private static final String DEFAULT_TENANT_DEVELOPER_USER = "devuser"; /** * The Constant DEFAULT_TENANT_DEVELOPER_PASSWORD. */ private static final String DEFAULT_TENANT_DEVELOPER_PASSWORD = "devuser123"; /** * The kaa admin user. */ protected static String kaaAdminUser = DEFAULT_KAA_ADMIN_USER; /** * The kaa admin password. */ protected static String kaaAdminPassword = DEFAULT_KAA_ADMIN_PASSWORD; /** * The tenant admin user. */ protected static String tenantAdminUser = DEFAULT_TENANT_ADMIN_USER; /** * The tenant admin password. */ protected static String tenantAdminPassword = DEFAULT_TENANT_ADMIN_PASSWORD; /** * The tenant developer user. */ protected static String tenantDeveloperUser = DEFAULT_TENANT_DEVELOPER_USER; /** * The tenant developer password. */ protected static String tenantDeveloperPassword = DEFAULT_TENANT_DEVELOPER_PASSWORD; /** * The random. */ private final Random random = new Random(); private final AtomicInteger seq = new AtomicInteger(0); /** * The tenant admin dto. */ protected org.kaaproject.kaa.common.dto.admin.UserDto tenantAdminDto; /** * The tenant developer dto. */ protected UserDto tenantDeveloperDto; /** * The event class service. */ @Autowired protected EventClassService eventClassService; /** * The client. */ protected AdminClient client; /** * The kaa node initialization service. */ @Autowired private KaaNodeInitializationService kaaNodeInitializationService; /** * The data source. */ @Autowired private DataSource dataSource; /** * Inits the. * * @throws Exception the exception */ @BeforeClass public static void init() throws Exception { MongoDBTestRunner.setUp(); } /** * After. * * @throws Exception the exception */ @AfterClass public static void after() throws Exception { TestCluster.stop(); MongoDBTestRunner.tearDown(); } /** * Str is empty. * * @param str the str * @return true, if successful */ protected static boolean strIsEmpty(String str) { return str == null || str.trim().equals(""); } /** * Gets the resource as string. * * @param path the path * @return the resource as string * @throws IOException Signals that an I/O exception has occurred. */ protected static String getResourceAsString(String path) throws IOException { URL url = Thread.currentThread().getContextClassLoader().getResource(path); File file = new File(url.getPath()); String result; BufferedReader br = new BufferedReader(new FileReader(file)); try { StringBuilder sb = new StringBuilder(); String line = br.readLine(); while (line != null) { sb.append(line); sb.append(System.lineSeparator()); line = br.readLine(); } result = sb.toString(); } finally { br.close(); } return result; } /** * Before test. * * @throws Exception the exception */ @Before public void beforeTest() throws Exception { TestCluster.checkStarted(kaaNodeInitializationService); client = new AdminClient(HOST, PORT); createUsers(); } /** * After test. * * @throws Exception the exception */ @After public void afterTest() throws Exception { clearDBData(); } /** * Clear db data. */ protected void clearDBData() { LOG.info("Deleting data from MongoDB database"); DB db = MongoDBTestRunner.getDB(); if (db != null) { db.dropDatabase(); } try { String url; try (Connection connection = dataSource.getConnection()) { url = connection.getMetaData().getURL(); } if (url.contains("h2")) { LOG.info("Deleting data from H2 database"); new H2DBTestRunner().truncateTables(dataSource); } else { LOG.info("Deleting data from PostgreSQL database"); new PostgreDBTestRunner().truncateTables(dataSource); } } catch (SQLException ex) { LOG.error("Can't delete data from databases.", ex); } } /** * Login kaa admin. * * @throws Exception the exception */ protected void loginKaaAdmin() throws Exception { client.login(kaaAdminUser, kaaAdminPassword); } // // /** // * Generate string. // * // * @param string the string // * @return the string // */ // protected static String generateString(String string) { // return string + "_" + UUID.randomUUID().toString(); // } /** * Login tenant admin. * * @param username the username * @throws Exception the exception */ protected void loginTenantAdmin(String username) throws Exception { client.login(username, tenantAdminPassword); } /** * Login tenant developer. * * @param username the username * @throws Exception the exception */ protected void loginTenantDeveloper(String username) throws Exception { client.login(username, tenantDeveloperPassword); } /** * Creates the tenant admin needed. * * @return true, if successful */ protected boolean createTenantAdminNeeded() { return true; } /** * Creates the tenant developer needed. * * @return true, if successful */ protected boolean createTenantDeveloperNeeded() { return true; } /** * Creates the users. * * @throws Exception the exception */ private void createUsers() throws Exception { LOG.info("Creating users..."); client.createKaaAdmin(kaaAdminUser, kaaAdminPassword); if (createTenantAdminNeeded()) { tenantAdminDto = createTenantAdmin(tenantAdminUser); loginTenantAdmin(tenantAdminUser); if (createTenantDeveloperNeeded()) { tenantDeveloperDto = createTenantDeveloper(tenantDeveloperUser); loginTenantDeveloper(tenantDeveloperUser); } } } /** * Check not found. * * @param restCall the rest call * @throws Exception the exception */ protected void checkNotFound(TestRestCall restCall) throws Exception { checkRestErrorStatusCode(restCall, HttpStatus.NOT_FOUND); } /** * Check bad request. * * @param restCall the rest call * @throws Exception the exception */ protected void checkBadRequest(TestRestCall restCall) throws Exception { checkRestErrorStatusCode(restCall, HttpStatus.BAD_REQUEST); } /** * Check forbidden. * * @param restCall the rest call * @throws Exception the exception */ protected void checkForbidden(TestRestCall restCall) throws Exception { checkRestErrorStatusCode(restCall, HttpStatus.FORBIDDEN); } protected void checkRestErrorStatusCode(TestRestCall restCall, HttpStatus expectedStatus) throws Exception { HttpStatus errorStatus = null; try { restCall.executeRestCall(); } catch (HttpStatusCodeException e) { errorStatus = e.getStatusCode(); } Assert.assertNotNull(errorStatus); Assert.assertEquals(expectedStatus, errorStatus); } protected TenantDto createTenant() throws Exception { loginKaaAdmin(); TenantDto tenantDto = new TenantDto(); tenantDto.setName(generateString(TENANT_NAME)); tenantDto = client.editTenant(tenantDto); return tenantDto; } /** * Creates the tenant. * * @return the tenant user dto * @throws Exception the exception */ protected org.kaaproject.kaa.common.dto.admin.UserDto createTenantAdmin() throws Exception { return createTenantAdmin(null); } /** * Creates the tenant. * * @param username the username * @return the tenant user dto * @throws Exception the exception */ protected org.kaaproject.kaa.common.dto.admin.UserDto createTenantAdmin(String username) throws Exception { loginKaaAdmin(); if (username == null) { username = generateString(TENANT_ADMIN_USERNAME); } TenantDto tenantDto = new TenantDto(); if (client.getTenants().isEmpty()) { tenantDto.setName(TENANT_NAME); tenantDto = client.editTenant(tenantDto); } else { for (TenantDto t : client.getTenants()) { if (t.getName().equals(TENANT_NAME)) tenantDto = t; } } org.kaaproject.kaa.common.dto.admin.UserDto tenAdmin = new org.kaaproject.kaa.common.dto.admin.UserDto(); tenAdmin.setAuthority(KaaAuthorityDto.TENANT_ADMIN); tenAdmin.setUsername(username); tenAdmin.setMail(username + "@demoproject.org"); tenAdmin.setFirstName("Tenant"); tenAdmin.setLastName("Admin"); tenAdmin.setTenantId(tenantDto.getId()); tenAdmin = client.editUser(tenAdmin); if (StringUtils.isNotBlank(tenAdmin.getTempPassword())) { client.clearCredentials(); client.changePassword(tenAdmin.getUsername(), tenAdmin.getTempPassword(), tenantAdminPassword); } return tenAdmin; } /** * Creates the tenant developer. * * @param username the username * @return the org.kaaproject.kaa.common.dto.admin. user dto * @throws Exception the exception */ private org.kaaproject.kaa.common.dto.admin.UserDto createTenantDeveloper(String username) throws Exception { org.kaaproject.kaa.common.dto.admin.UserDto tenantDeveloper = new org.kaaproject.kaa.common.dto.admin.UserDto(); tenantDeveloper.setAuthority(KaaAuthorityDto.TENANT_DEVELOPER); tenantDeveloper.setUsername(username); tenantDeveloper.setMail(username + "@demoproject.org"); tenantDeveloper.setFirstName("Tenant"); tenantDeveloper.setLastName("Developer"); tenantDeveloper.setTenantId(tenantAdminDto.getTenantId()); tenantDeveloper = client.editUser(tenantDeveloper); if (StringUtils.isNotBlank(tenantDeveloper.getTempPassword())) { client.clearCredentials(); client.changePassword(tenantDeveloper.getUsername(), tenantDeveloper.getTempPassword(), tenantDeveloperPassword); } return tenantDeveloper; } /** * Creates the user. * * @param authority the authority * @return the user dto * @throws Exception the exception */ protected UserDto createUser(KaaAuthorityDto authority) throws Exception { return createUser(null, authority); } /** * Creates the user. * * @param tenant the tenant * @param authority the authority * @return the user dto * @throws Exception the exception */ protected UserDto createUser(org.kaaproject.kaa.common.dto.admin.UserDto tenant, KaaAuthorityDto authority) throws Exception { UserDto user = new UserDto(); String username = generateString(USERNAME); user.setUsername(username); user.setMail(username + "@demoproject.org"); user.setFirstName(generateString("Test")); user.setLastName(generateString("User")); user.setAuthority(authority); if (tenant == null) { tenant = createTenantAdmin(); } user.setTenantId(tenantAdminDto.getTenantId()); loginTenantAdmin(tenant.getUsername()); UserDto savedUser = client.editUser(user); return savedUser; } /** * Creates the application. * * @return the application dto * @throws Exception the exception */ protected ApplicationDto createApplication() throws Exception { return createApplication(null); } /** * Creates the application. * * @param tenant the tenant * @return the application dto * @throws Exception the exception */ protected ApplicationDto createApplication(org.kaaproject.kaa.common.dto.admin.UserDto tenant) throws Exception { ApplicationDto application = new ApplicationDto(); application.setName(generateString(APPLICATION)); if (tenant == null) { tenant = createTenantAdmin(); } loginTenantAdmin(tenant.getUsername()); ApplicationDto savedApplication = client .editApplication(application); return savedApplication; } /** * Creates the configuration schema. * * @return the configuration schema dto * @throws Exception the exception */ protected ConfigurationSchemaDto createConfigurationSchema() throws Exception { return createConfigurationSchema(null, null); } /** * Creates the configuration schema. * * @param applicationId the application id * @return the configuration schema dto * @throws Exception the exception */ protected ConfigurationSchemaDto createConfigurationSchema(String applicationId, String ctlSchemaId) throws Exception { ConfigurationSchemaDto configurationSchema = new ConfigurationSchemaDto(); configurationSchema.setStatus(UpdateStatus.ACTIVE); configurationSchema.setName(generateString("Test Schema")); configurationSchema.setDescription(generateString("Test Desc")); if (strIsEmpty(applicationId)) { ApplicationDto application = createApplication(tenantAdminDto); configurationSchema.setApplicationId(application.getId()); } else { configurationSchema.setApplicationId(applicationId); } if (strIsEmpty(ctlSchemaId)) { CTLSchemaDto ctlSchema = this.createCTLSchema(this.ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, tenantAdminDto.getTenantId(), null, null, null); configurationSchema.setCtlSchemaId(ctlSchema.getId()); } else { configurationSchema.setCtlSchemaId(ctlSchemaId); } loginTenantDeveloper(tenantDeveloperDto.getUsername()); ConfigurationSchemaDto savedConfigurationSchema = client.saveConfigurationSchema(configurationSchema); return savedConfigurationSchema; } /** * Creates the profile schema. * * @return the profile schema dto * @throws Exception the exception */ protected EndpointProfileSchemaDto createProfileSchema() throws Exception { return createEndpointProfileSchema(null, null); } /** * Creates the profile schema. * * @param applicationId the application id * @return the profile schema dto * @throws Exception the exception */ protected EndpointProfileSchemaDto createEndpointProfileSchema(String applicationId, String ctlSchemaId) throws Exception { EndpointProfileSchemaDto profileSchema = new EndpointProfileSchemaDto(); profileSchema.setName(generateString("Test Schema")); profileSchema.setDescription(generateString("Test Desc")); if (strIsEmpty(applicationId)) { ApplicationDto application = createApplication(tenantAdminDto); profileSchema.setApplicationId(application.getId()); } else { profileSchema.setApplicationId(applicationId); } if (strIsEmpty(ctlSchemaId)) { CTLSchemaDto ctlSchema = this.createCTLSchema(this.ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, tenantAdminDto.getTenantId(), null, null, null); profileSchema.setCtlSchemaId(ctlSchema.getId()); } else { profileSchema.setCtlSchemaId(ctlSchemaId); } loginTenantDeveloper(tenantDeveloperDto.getUsername()); EndpointProfileSchemaDto savedProfileSchema = client .saveProfileSchema(profileSchema); return savedProfileSchema; } /** * Creates the profile schema. * * @param applicationId the application id * @return the profile schema dto * @throws Exception the exception */ protected ServerProfileSchemaDto createServerProfileSchema(String applicationId, String ctlSchemaId) throws Exception { ServerProfileSchemaDto profileSchema = new ServerProfileSchemaDto(); profileSchema.setName(generateString("Test Schema")); profileSchema.setDescription(generateString("Test Desc")); if (strIsEmpty(applicationId)) { ApplicationDto application = createApplication(tenantAdminDto); profileSchema.setApplicationId(application.getId()); } else { profileSchema.setApplicationId(applicationId); } if (strIsEmpty(ctlSchemaId)) { CTLSchemaDto ctlSchema = this.createCTLSchema(this.ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, tenantAdminDto.getTenantId(), null, null, null); profileSchema.setCtlSchemaId(ctlSchema.getId()); } loginTenantDeveloper(tenantDeveloperDto.getUsername()); ServerProfileSchemaDto savedProfileSchema = client .saveServerProfileSchema(profileSchema); return savedProfileSchema; } /** * Creates the endpoint group. * * @return the endpoint group dto * @throws Exception the exception */ protected EndpointGroupDto createEndpointGroup() throws Exception { return createEndpointGroup(null); } /** * Creates the endpoint group. * * @param applicationId the application id * @return the endpoint group dto * @throws Exception the exception */ protected EndpointGroupDto createEndpointGroup(String applicationId) throws Exception { EndpointGroupDto endpointGroup = new EndpointGroupDto(); endpointGroup.setName(generateString(ENDPOINT_GROUP)); endpointGroup.setWeight(Math.abs(random.nextInt())); if (strIsEmpty(applicationId)) { ApplicationDto application = createApplication(tenantAdminDto); endpointGroup.setApplicationId(application.getId()); } else { endpointGroup.setApplicationId(applicationId); } loginTenantDeveloper(tenantDeveloperDto.getUsername()); EndpointGroupDto savedEndpointGroup = client .editEndpointGroup(endpointGroup); return savedEndpointGroup; } /** * Creates the profile filter. * * @return the profile filter dto * @throws Exception the exception */ protected ProfileFilterDto createProfileFilter() throws Exception { return createProfileFilter(null, null, null); } /** * Creates the profile filter. * * @param endpointPfSchemaId the profile schema id * @param endpointGroupId the endpoint group id * @return the profile filter dto * @throws Exception the exception */ protected ProfileFilterDto createProfileFilter(String endpointPfSchemaId, String serverPfSchemaId, String endpointGroupId) throws Exception { ApplicationDto application = createApplication(tenantAdminDto); return createProfileFilter(endpointPfSchemaId, serverPfSchemaId, endpointGroupId, application.getId()); } /** * Creates the profile filter. * * @param endpointPfSchemaId the profile schema id * @param serverPfSchemaId the profile schema id * @param endpointGroupId the endpoint group id * @param applicationId the application id * @return the profile filter dto * @throws Exception the exception */ protected ProfileFilterDto createProfileFilter(String endpointPfSchemaId, String serverPfSchemaId, String endpointGroupId, String applicationId) throws Exception { ProfileFilterDto profileFilter = new ProfileFilterDto(); String filter = getResourceAsString(TEST_PROFILE_FILTER); profileFilter.setBody(filter); profileFilter.setStatus(UpdateStatus.INACTIVE); if (strIsEmpty(applicationId)) { ApplicationDto application = createApplication(tenantAdminDto); profileFilter.setApplicationId(application.getId()); applicationId = application.getId(); } else { profileFilter.setApplicationId(applicationId); } if (strIsEmpty(endpointPfSchemaId)) { EndpointProfileSchemaDto profileSchema = createEndpointProfileSchema(applicationId, null); profileFilter.setEndpointProfileSchemaId(profileSchema.getId()); } else { profileFilter.setEndpointProfileSchemaId(endpointPfSchemaId); } if (strIsEmpty(serverPfSchemaId)) { ServerProfileSchemaDto profileSchema = createServerProfileSchema(applicationId, null); profileFilter.setServerProfileSchemaId(profileSchema.getId()); } else { profileFilter.setServerProfileSchemaId(serverPfSchemaId); } if (strIsEmpty(endpointGroupId)) { EndpointGroupDto endpointGroup = createEndpointGroup(applicationId); profileFilter.setEndpointGroupId(endpointGroup.getId()); } else { profileFilter.setEndpointGroupId(endpointGroupId); } loginTenantDeveloper(tenantDeveloperDto.getUsername()); ProfileFilterDto savedProfileFilter = client .editProfileFilter(profileFilter); return savedProfileFilter; } /** * Creates the configuration. * * @return the configuration dto * @throws Exception the exception */ protected ConfigurationDto createConfiguration() throws Exception { return createConfiguration(null, null); } /** * Creates the configuration. * * @param configurationSchemaId the configuration schema id * @param endpointGroupId the endpoint group id * @return the configuration dto * @throws Exception the exception */ protected ConfigurationDto createConfiguration(String configurationSchemaId, String endpointGroupId) throws Exception { ApplicationDto application = createApplication(tenantAdminDto); return createConfiguration(configurationSchemaId, endpointGroupId, application.getId()); } /** * Creates the configuration. * * @param configurationSchemaId the configuration schema id * @param endpointGroupId the endpoint group id * @param applicationId the application id * @return the configuration dto * @throws Exception the exception */ protected ConfigurationDto createConfiguration(String configurationSchemaId, String endpointGroupId, String applicationId) throws Exception { ConfigurationDto configuration = new ConfigurationDto(); String config = getResourceAsString(TEST_CONFIGURATION); // configuration.setBody(config.getBytes()); configuration.setStatus(UpdateStatus.INACTIVE); if (strIsEmpty(applicationId)) { ApplicationDto application = createApplication(tenantAdminDto); configuration.setApplicationId(application.getId()); applicationId = application.getId(); } else { configuration.setApplicationId(applicationId); } ConfigurationSchemaDto configSchema = null; if (strIsEmpty(configurationSchemaId)) { configSchema = createConfigurationSchema(applicationId, null); configuration.setSchemaId(configSchema.getId()); } else { loginTenantDeveloper(tenantDeveloperDto.getUsername()); configuration.setSchemaId(configurationSchemaId); configSchema = client.getConfigurationSchema(configurationSchemaId); } if (strIsEmpty(endpointGroupId)) { EndpointGroupDto endpointGroup = createEndpointGroup(applicationId); configuration.setEndpointGroupId(endpointGroup.getId()); } else { configuration.setEndpointGroupId(endpointGroupId); } GenericAvroConverter converter = new GenericAvroConverter(configSchema.getOverrideSchema()); configuration.setBody(converter.encodeToJson(converter.decodeJson(config))); loginTenantDeveloper(tenantDeveloperDto.getUsername()); ConfigurationDto savedConfiguration = client .editConfiguration(configuration); return savedConfiguration; } /** * Creates the topic. * * @param appId the app id * @param type the type * @return the topic dto * @throws Exception the exception */ protected TopicDto createTopic(String appId, TopicTypeDto type) throws Exception { TopicDto topicDto = new TopicDto(); topicDto.setName(generateString(TOPIC)); topicDto.setType(type); if (strIsEmpty(appId)) { ApplicationDto applicationDto = createApplication(tenantAdminDto); topicDto.setApplicationId(applicationDto.getId()); } else { topicDto.setApplicationId(appId); } loginTenantDeveloper(tenantDeveloperDto.getUsername()); TopicDto savedTopic = client.createTopic(topicDto); return savedTopic; } /** * Creates the notification schema. * * @param appId the app id * @param type the type * @return the notification schema dto * @throws Exception the exception */ protected NotificationSchemaDto createNotificationSchema(String appId, NotificationTypeDto type) throws Exception { NotificationSchemaDto notificationSchema = new NotificationSchemaDto(); notificationSchema.setName(generateString("Test Schema")); notificationSchema.setDescription(generateString("Test Desc")); notificationSchema.setType(type); if (strIsEmpty(appId)) { ApplicationDto applicationDto = createApplication(tenantAdminDto); notificationSchema.setApplicationId(applicationDto.getId()); } else { notificationSchema.setApplicationId(appId); } CTLSchemaDto ctlSchema = this.createCTLSchema(this.ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, tenantAdminDto.getTenantId(), null, null, null); notificationSchema.setCtlSchemaId(ctlSchema.getId()); loginTenantDeveloper(tenantDeveloperDto.getUsername()); NotificationSchemaDto savedSchema = client .createNotificationSchema(notificationSchema); return savedSchema; } /** * Creates the user notification schema. * * @param appId the app id * @return the notification schema dto * @throws Exception the exception */ protected NotificationSchemaDto createUserNotificationSchema(String appId) throws Exception { NotificationSchemaDto notificationSchema = new NotificationSchemaDto(); notificationSchema.setType(NotificationTypeDto.USER); if (strIsEmpty(appId)) { ApplicationDto applicationDto = createApplication(tenantAdminDto); notificationSchema.setApplicationId(applicationDto.getId()); } else { notificationSchema.setApplicationId(appId); } CTLSchemaDto ctlSchema = this.createCTLSchema(this.ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, tenantAdminDto.getTenantId(), null, null, null); notificationSchema.setCtlSchemaId(ctlSchema.getId()); loginTenantDeveloper(tenantDeveloperDto.getUsername()); NotificationSchemaDto savedSchema = client .createNotificationSchema(notificationSchema); return savedSchema; } /** * Creates the log schema. * * @return the log schema dto * @throws Exception the exception */ protected LogSchemaDto createLogSchema() throws Exception { return createLogSchema(null); } /** * Creates the log schema. * * @param applicationId the application id * @return the log schema dto * @throws Exception the exception */ protected LogSchemaDto createLogSchema(String applicationId) throws Exception { LogSchemaDto logSchema = new LogSchemaDto(); logSchema.setName(generateString("Test Schema")); logSchema.setDescription(generateString("Test Desc")); if (strIsEmpty(applicationId)) { ApplicationDto application = createApplication(tenantAdminDto); logSchema.setApplicationId(application.getId()); } else { logSchema.setApplicationId(applicationId); } CTLSchemaDto ctlSchema = this.createCTLSchema(this.ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, tenantAdminDto.getTenantId(), null, null, null); logSchema.setCtlSchemaId(ctlSchema.getId()); loginTenantDeveloper(tenantDeveloperDto.getUsername()); LogSchemaDto savedLogSchema = client.createLogSchema(logSchema); return savedLogSchema; } /** * Creates the log appender. * * @param application the application * @param schema the schema * @return the log appender dto * @throws Exception the exception */ protected LogAppenderDto createLogAppender(ApplicationDto application, LogSchemaDto schema) throws Exception { LogAppenderDto appender = new LogAppenderDto(); appender.setName(generateString("Test Schema")); appender.setDescription(generateString("Test Desc")); if (application == null) { application = createApplication(tenantAdminDto); } appender.setApplicationId(application.getId()); appender.setApplicationToken(application.getApplicationToken()); appender.setTenantId(application.getTenantId()); FileSystemAppenderConfig config = new FileSystemAppenderConfig(); appender.setPluginClassName(config.getPluginClassName()); Schema pluginSchema = config.getPluginConfigSchema(); RawSchema rawSchema = new RawSchema(pluginSchema.toString()); DefaultRecordGenerationAlgorithm<RawData> algotithm = new DefaultRecordGenerationAlgorithmImpl<>(rawSchema, new RawDataFactory()); RawData rawData = algotithm.getRootData(); appender.setJsonConfiguration(rawData.getRawData()); if (schema == null) { schema = createLogSchema(application.getId()); } appender.setMinLogSchemaVersion(schema.getVersion()); appender.setMaxLogSchemaVersion(schema.getVersion()); loginTenantDeveloper(tenantDeveloperDto.getUsername()); LogAppenderDto savedLogAppender = client.editLogAppenderDto(appender); return savedLogAppender; } /** * Send notification. * * @param appId the app id * @param schemaId the schema id * @param type the type * @return the notification dto * @throws Exception the exception */ protected NotificationDto sendNotification(String appId, String schemaId, NotificationTypeDto type) throws Exception { NotificationDto notification = new NotificationDto(); if (strIsEmpty(appId)) { ApplicationDto applicationDto = createApplication(tenantAdminDto); notification.setApplicationId(applicationDto.getId()); } else { notification.setApplicationId(appId); } if (strIsEmpty(schemaId)) { NotificationSchemaDto schema = createNotificationSchema(appId, type); notification.setSchemaId(schema.getId()); } else { notification.setSchemaId(schemaId); } TopicDto topic = createTopic(appId, TopicTypeDto.MANDATORY); notification.setTopicId(topic.getId()); loginTenantDeveloper(tenantDeveloperDto.getUsername()); NotificationDto savedNotification = client .sendNotification(notification, "body", "{\"notificationBody\":\"dummy\", \"systemNotificationParam1\":42, \"systemNotificationParam2\":43}"); return savedNotification; } /** * Send unicast notification. * * @param keyHash the key hash * @param appId the app id * @param schemaId the schema id * @param type the type * @return the endpoint notification dto * @throws Exception the exception */ protected EndpointNotificationDto sendUnicastNotification(byte[] keyHash, String appId, String schemaId, NotificationTypeDto type) throws Exception { NotificationDto notification = new NotificationDto(); if (strIsEmpty(appId)) { ApplicationDto applicationDto = createApplication(tenantAdminDto); notification.setApplicationId(applicationDto.getId()); } else { notification.setApplicationId(appId); } if (strIsEmpty(schemaId)) { NotificationSchemaDto schema = createNotificationSchema(appId, type); notification.setSchemaId(schema.getId()); } else { notification.setSchemaId(schemaId); } TopicDto topic = createTopic(appId, TopicTypeDto.MANDATORY); notification.setTopicId(topic.getId()); loginTenantDeveloper(tenantDeveloperDto.getUsername()); EndpointNotificationDto savedUnicast = client .sendUnicastNotification(notification, Base64.encode(keyHash), "body", "{\"notificationBody\":\"dummy\", \"systemNotificationParam1\":42, \"systemNotificationParam2\":43}"); return savedUnicast; } /** * Creates the event class family. * * @return the event class family dto * @throws Exception the exception */ protected EventClassFamilyDto createEventClassFamily() throws Exception { return createEventClassFamily(null, null); } /** * Creates the event class family. * * @param tenantId the tenant id * @return the event class family dto * @throws Exception the exception */ protected EventClassFamilyDto createEventClassFamily(String tenantId) throws Exception { return createEventClassFamily(tenantId, null); } /** * Creates the event class family. * * @param tenantId the tenant id * @param classNameSuffix the class name suffix * @return the event class family dto * @throws Exception the exception */ protected EventClassFamilyDto createEventClassFamily(String tenantId, String classNameSuffix) throws Exception { EventClassFamilyDto eventClassFamily = new EventClassFamilyDto(); eventClassFamily.setName(generateString(EVENT_CLASS_FAMILY)); eventClassFamily.setNamespace(EVENT_CLASS_FAMILY_NAMESPACE); String className = EVENT_CLASS_FAMILY_CLASS_NAME; if (StringUtils.isNotBlank(classNameSuffix)) { className += classNameSuffix; } eventClassFamily.setClassName(className); if (strIsEmpty(tenantId)) { org.kaaproject.kaa.common.dto.admin.UserDto tenant = createTenantAdmin(tenantAdminUser); eventClassFamily.setTenantId(tenant.getId()); } else { eventClassFamily.setTenantId(tenantId); } loginTenantAdmin(tenantAdminUser); EventClassFamilyDto savedEventClassFamily = client .editEventClassFamily(eventClassFamily); return savedEventClassFamily; } protected EventClassFamilyVersionDto createEventClassFamilyVersion(String tenantId) throws Exception { EventClassFamilyVersionDto eventClassFamilyVersion = new EventClassFamilyVersionDto(); List<EventClassDto> records = new ArrayList<>(); String className = "Test" + seq.incrementAndGet(); CTLSchemaDto ctlSchema = this.createCTLSchema(className, EVENT_CLASS_FAMILY_NAMESPACE, 1, tenantId, null, null, null); EventClassDto ec = new EventClassDto(); ec.setFqn(EVENT_CLASS_FAMILY_NAMESPACE + "." + className); ec.setType(EventClassType.EVENT); ec.setCtlSchemaId(ctlSchema.getId()); ec.setName("test"); records.add(ec); eventClassFamilyVersion.setRecords(records); return eventClassFamilyVersion; } /** * Creates the application event family map. * * @return the application event family map dto * @throws Exception the exception */ protected ApplicationEventFamilyMapDto createApplicationEventFamilyMap() throws Exception { return createApplicationEventFamilyMap(null, null, 1); } /** * Creates the application event family map. * * @param applicationToken the application token * @param ecfId the ecf id * @param version the version * @return the application event family map dto * @throws Exception the exception */ protected ApplicationEventFamilyMapDto createApplicationEventFamilyMap(String applicationToken, String ecfId, int version) throws Exception { ApplicationEventFamilyMapDto applicationEventFamilyMap = new ApplicationEventFamilyMapDto(); String tenantId = null; if (strIsEmpty(applicationToken)) { ApplicationDto application = createApplication(tenantAdminDto); tenantId = application.getTenantId(); applicationEventFamilyMap.setApplicationId(application.getId()); } else { ApplicationDto application = client.getApplicationByApplicationToken(applicationToken); applicationEventFamilyMap.setApplicationId(application.getId()); tenantId = application.getTenantId(); } EventClassFamilyDto eventClassFamily = null; if (strIsEmpty(ecfId)) { eventClassFamily = createEventClassFamily(tenantId); ecfId = eventClassFamily.getId(); } else { loginTenantAdmin(tenantAdminUser); eventClassFamily = client.getEventClassFamilyById(ecfId); } applicationEventFamilyMap.setEcfId(eventClassFamily.getId()); applicationEventFamilyMap.setEcfName(eventClassFamily.getName()); List<EventClassFamilyVersionDto> storedECFVersions = client.getEventClassFamilyVersionsById(ecfId); loginTenantAdmin(tenantAdminUser); EventClassFamilyVersionDto testECFVersion = createEventClassFamilyVersion(tenantAdminDto.getTenantId()); if (storedECFVersions == null || storedECFVersions.size() < version) { client.addEventClassFamilyVersion(eventClassFamily.getId(), testECFVersion); } loginTenantDeveloper(tenantDeveloperUser); applicationEventFamilyMap.setVersion(version); List<EventClassDto> eventClasses = client.getEventClassesByFamilyIdVersionAndType(eventClassFamily.getId(), version, EventClassType.EVENT); List<ApplicationEventMapDto> eventMaps = new ArrayList<>(eventClasses.size()); for (EventClassDto eventClass : eventClasses) { ApplicationEventMapDto eventMap = new ApplicationEventMapDto(); eventMap.setEventClassId(eventClass.getId()); eventMap.setFqn(eventClass.getFqn()); eventMap.setAction(ApplicationEventAction.BOTH); eventMaps.add(eventMap); } applicationEventFamilyMap.setEventMaps(eventMaps); ApplicationEventFamilyMapDto savedApplicationEventFamilyMap = client .editApplicationEventFamilyMap(applicationEventFamilyMap); return savedApplicationEventFamilyMap; } protected String ctlRandomFieldName() { return CTL_DEFAULT_NAME + random.nextInt(100000); } protected String ctlRandomFieldType() { return CTL_DEFAULT_TYPE + random.nextInt(100000); } protected CTLSchemaDto createCTLSchema(String name, String namespace, int version, String tenantId, String applicationToken, Set<FqnVersion> dependencies, Map<String, String> fields) throws Exception { LOG.debug("Generating CTL schema..."); JsonNodeFactory factory = JsonNodeFactory.instance; ObjectNode body = factory.objectNode(); body.put("type", "record"); body.put("name", name); body.put("namespace", namespace); body.put("version", version); if (dependencies != null && !dependencies.isEmpty()) { ArrayNode array = factory.arrayNode(); for (FqnVersion dependency : dependencies) { ObjectNode object = factory.objectNode(); object.put("fqn", dependency.getFqnString()); object.put("version", dependency.getVersion()); array.add(object); } body.put("dependencies", array); } ArrayNode array = factory.arrayNode(); if (fields != null) { for (Map.Entry<String, String> field : fields.entrySet()) { ObjectNode object = factory.objectNode(); object.put("name", field.getKey()); object.put("type", field.getValue()); array.add(object); } } body.put("fields", array); LOG.debug("CTL schema generated: " + body); return client.saveCTLSchemaWithAppToken(body.toString(), tenantId, applicationToken); } /** * Assert schemas equals. * * @param schema the schema * @param storedSchema the stored schema */ protected void assertSchemasEquals(VersionDto schema, VersionDto storedSchema) { Assert.assertEquals(schema.getId(), storedSchema.getId()); Assert.assertEquals(schema.getVersion(), storedSchema.getVersion()); } /** * The Interface TestRestCall. */ protected interface TestRestCall { /** * Execute rest call. * * @throws Exception the exception */ void executeRestCall() throws Exception; } /** * The Class IdComparator. */ protected class IdComparator implements Comparator<HasId> { /* (non-Javadoc) * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ @Override public int compare(HasId o1, HasId o2) { return o1.getId().compareTo(o2.getId()); } } }