org.kaaproject.kaa.server.common.dao.AbstractTest.java Source code

Java tutorial

Introduction

Here is the source code for org.kaaproject.kaa.server.common.dao.AbstractTest.java

Source

/*
 * 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.common.dao;

import static org.apache.commons.lang.StringUtils.isBlank;
import static org.apache.commons.lang.StringUtils.isNotBlank;

import org.junit.Assert;
import org.kaaproject.kaa.common.dto.ApplicationDto;
import org.kaaproject.kaa.common.dto.ChangeConfigurationNotification;
import org.kaaproject.kaa.common.dto.ChangeProfileFilterNotification;
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.EndpointGroupStateDto;
import org.kaaproject.kaa.common.dto.EndpointNotificationDto;
import org.kaaproject.kaa.common.dto.EndpointProfileDto;
import org.kaaproject.kaa.common.dto.EndpointProfileSchemaDto;
import org.kaaproject.kaa.common.dto.EndpointUserConfigurationDto;
import org.kaaproject.kaa.common.dto.EndpointUserDto;
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.UpdateNotificationDto;
import org.kaaproject.kaa.common.dto.UserDto;
import org.kaaproject.kaa.common.dto.ctl.CTLSchemaDto;
import org.kaaproject.kaa.common.dto.ctl.CtlSchemaMetaInfoDto;
import org.kaaproject.kaa.common.dto.logs.LogAppenderDto;
import org.kaaproject.kaa.common.dto.logs.LogHeaderStructureDto;
import org.kaaproject.kaa.common.dto.logs.LogSchemaDto;
import org.kaaproject.kaa.common.dto.user.UserVerifierDto;
import org.kaaproject.kaa.server.common.core.algorithms.generation.DefaultRecordGenerationAlgorithmImpl;
import org.kaaproject.kaa.server.common.core.configuration.BaseDataFactory;
import org.kaaproject.kaa.server.common.core.configuration.OverrideDataFactory;
import org.kaaproject.kaa.server.common.core.schema.BaseSchema;
import org.kaaproject.kaa.server.common.core.schema.KaaSchema;
import org.kaaproject.kaa.server.common.core.schema.OverrideSchema;
import org.kaaproject.kaa.server.common.dao.exception.DatabaseProcessingException;
import org.kaaproject.kaa.server.common.dao.impl.ApplicationDao;
import org.kaaproject.kaa.server.common.dao.impl.ApplicationEventFamilyMapDao;
import org.kaaproject.kaa.server.common.dao.impl.ConfigurationDao;
import org.kaaproject.kaa.server.common.dao.impl.ConfigurationSchemaDao;
import org.kaaproject.kaa.server.common.dao.impl.CtlSchemaDao;
import org.kaaproject.kaa.server.common.dao.impl.CtlSchemaMetaInfoDao;
import org.kaaproject.kaa.server.common.dao.impl.EndpointGroupDao;
import org.kaaproject.kaa.server.common.dao.impl.EventClassDao;
import org.kaaproject.kaa.server.common.dao.impl.EventClassFamilyDao;
import org.kaaproject.kaa.server.common.dao.impl.HistoryDao;
import org.kaaproject.kaa.server.common.dao.impl.LogAppenderDao;
import org.kaaproject.kaa.server.common.dao.impl.LogSchemaDao;
import org.kaaproject.kaa.server.common.dao.impl.NotificationDao;
import org.kaaproject.kaa.server.common.dao.impl.NotificationSchemaDao;
import org.kaaproject.kaa.server.common.dao.impl.ProfileFilterDao;
import org.kaaproject.kaa.server.common.dao.impl.ProfileSchemaDao;
import org.kaaproject.kaa.server.common.dao.impl.SdkProfileDao;
import org.kaaproject.kaa.server.common.dao.impl.ServerProfileSchemaDao;
import org.kaaproject.kaa.server.common.dao.impl.TenantDao;
import org.kaaproject.kaa.server.common.dao.impl.TopicDao;
import org.kaaproject.kaa.server.common.dao.impl.UserDao;
import org.kaaproject.kaa.server.common.dao.impl.UserVerifierDao;
import org.kaaproject.kaa.server.common.dao.impl.sql.H2DBTestRunner;
import org.kaaproject.kaa.server.common.dao.impl.sql.MariaDBTestRunner;
import org.kaaproject.kaa.server.common.dao.impl.sql.PostgreDBTestRunner;
import org.kaaproject.kaa.server.common.dao.model.Notification;
import org.kaaproject.kaa.server.common.dao.model.sql.Application;
import org.kaaproject.kaa.server.common.dao.model.sql.ApplicationEventFamilyMap;
import org.kaaproject.kaa.server.common.dao.model.sql.Configuration;
import org.kaaproject.kaa.server.common.dao.model.sql.ConfigurationSchema;
import org.kaaproject.kaa.server.common.dao.model.sql.CtlSchema;
import org.kaaproject.kaa.server.common.dao.model.sql.CtlSchemaMetaInfo;
import org.kaaproject.kaa.server.common.dao.model.sql.EndpointGroup;
import org.kaaproject.kaa.server.common.dao.model.sql.EndpointProfileSchema;
import org.kaaproject.kaa.server.common.dao.model.sql.EventClass;
import org.kaaproject.kaa.server.common.dao.model.sql.EventClassFamily;
import org.kaaproject.kaa.server.common.dao.model.sql.GenericModel;
import org.kaaproject.kaa.server.common.dao.model.sql.History;
import org.kaaproject.kaa.server.common.dao.model.sql.LogAppender;
import org.kaaproject.kaa.server.common.dao.model.sql.LogSchema;
import org.kaaproject.kaa.server.common.dao.model.sql.NotificationSchema;
import org.kaaproject.kaa.server.common.dao.model.sql.ProfileFilter;
import org.kaaproject.kaa.server.common.dao.model.sql.SdkProfile;
import org.kaaproject.kaa.server.common.dao.model.sql.ServerProfileSchema;
import org.kaaproject.kaa.server.common.dao.model.sql.Tenant;
import org.kaaproject.kaa.server.common.dao.model.sql.Topic;
import org.kaaproject.kaa.server.common.dao.model.sql.User;
import org.kaaproject.kaa.server.common.dao.model.sql.UserVerifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ActiveProfiles;

import javax.sql.DataSource;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.Charset;
import java.nio.file.FileSystem;
import java.nio.file.FileSystemAlreadyExistsException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
import java.util.UUID;

@ActiveProfiles({ "h2" })
public class AbstractTest {

    public static final String DEFAULT_FQN = "org.kaaproject.kaa.ctl.TestSchema";
    public static final String TEST_PROFILE_BODY_PATH = "dao/schema/testProfileBody.json";
    private static final byte[] EPS_CONFIG_HASH = "eps_hash_conf".getBytes();
    protected static final Random RANDOM = new Random(0);
    protected static final String SUPER_TENANT = "SuperTenant";
    protected static final String TENANT_NAME = "Generated Test Tenant";
    protected static final String USER_NAME = "Generated Test Username";
    protected static final String TOPIC_NAME = "Generated Topic Name";
    protected static final String NOTIFICATION_SCHEMA_NAME = "Generated Notification Schema Name";
    protected static final String ENDPOINT_USER_EXTERNAL_ID = "Generated Test Endpoint User External Id";
    protected static final String ENDPOINT_USER_NAME = "Generated Test Endpoint User Name";
    private static final Logger LOG = LoggerFactory.getLogger(AbstractTest.class);
    @Autowired
    protected DataSource dataSource;
    @Autowired
    protected LogSchemaService logSchemaService;
    @Autowired
    protected ApplicationService applicationService;
    @Autowired
    protected TopicService topicService;
    @Autowired
    protected UserService userService;
    @Autowired
    protected UserVerifierService verifierService;
    @Autowired
    protected UserConfigurationService userConfigurationService;
    @Autowired
    protected EndpointService endpointService;
    @Autowired
    protected HistoryService historyService;
    @Autowired
    protected ProfileService profileService;
    @Autowired
    protected ConfigurationService configurationService;
    @Autowired
    protected NotificationService notificationService;
    @Autowired
    protected LogAppendersService logAppendersService;
    @Autowired
    protected CtlService ctlService;
    @Autowired
    protected ServerProfileService serverProfileService;

    @Autowired
    protected LogAppenderDao<LogAppender> appenderDao;
    @Autowired
    protected UserDao<User> userDao;
    @Autowired
    protected TenantDao<Tenant> tenantDao;
    @Autowired
    protected ApplicationDao<Application> applicationDao;
    @Autowired
    protected EndpointGroupDao<EndpointGroup> endpointGroupDao;
    @Autowired
    protected ConfigurationSchemaDao<ConfigurationSchema> configurationSchemaDao;
    @Autowired
    protected ConfigurationDao<Configuration> configurationDao;
    @Autowired
    protected ProfileSchemaDao<EndpointProfileSchema> profileSchemaDao;
    @Autowired
    protected ProfileFilterDao<ProfileFilter> profileFilterDao;
    @Autowired
    protected TopicDao<Topic> topicDao;
    @Autowired
    protected HistoryDao<History> historyDao;
    @Autowired
    protected EventClassFamilyDao<EventClassFamily> eventClassFamilyDao;
    @Autowired
    protected EventClassDao<EventClass> eventClassDao;
    @Autowired
    protected ApplicationEventFamilyMapDao<ApplicationEventFamilyMap> applicationEventFamilyMapDao;
    @Autowired
    protected LogSchemaDao<LogSchema> logSchemaDao;
    @Autowired
    protected NotificationSchemaDao<NotificationSchema> notificationSchemaDao;
    @Autowired(required = false)
    protected NotificationDao<Notification> notificationDao;
    @Autowired
    protected UserVerifierDao<UserVerifier> verifierDao;
    @Autowired
    protected SdkProfileDao<SdkProfile> sdkProfileDao;
    @Autowired
    protected CtlSchemaDao<CtlSchema> ctlSchemaDao;
    @Autowired
    protected CtlSchemaMetaInfoDao<CtlSchemaMetaInfo> ctlSchemaMetaInfoDao;
    @Autowired
    protected ServerProfileSchemaDao<ServerProfileSchema> serverProfileSchemaDao;

    protected Application application;

    public AbstractTest() {
    }

    protected String generateString(String string) {
        return string + "_" + UUID.randomUUID().toString();
    }

    protected void clearDBData() {
        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 if (url.contains("postgres")) {
                LOG.info("Deleting data from PostgreSQL database");
                new PostgreDBTestRunner().truncateTables(dataSource);
            } else {
                LOG.info("Deleting data from MariaDB database");
                new MariaDBTestRunner().truncateTables(dataSource);
            }
        } catch (SQLException ex) {
            LOG.error("Can't delete data from databases.", ex);
        }
    }

    protected String readSchemaFileAsString(String filePath) throws IOException {
        try {
            URI uri = this.getClass().getClassLoader().getResource(filePath).toURI();
            String[] array = uri.toString().split("!");
            Path path;
            if (array.length > 1) {
                LOG.info("Creating fs for {}", array[0]);
                FileSystem fs;
                try {
                    fs = FileSystems.newFileSystem(URI.create(array[0]), new HashMap<String, String>());
                } catch (FileSystemAlreadyExistsException e) {
                    fs = FileSystems.getFileSystem(URI.create(array[0]));
                }
                path = fs.getPath(array[1]);
            } else {
                path = Paths.get(uri);
            }
            return new String(Files.readAllBytes(path));
        } catch (URISyntaxException e) {
            LOG.error("Can't generate configs {}", e);
        }
        return null;
    }

    protected ApplicationDto generateApplicationDto() {
        return generateApplicationDto(null);
    }

    protected ApplicationDto generateApplicationDto(String tenantId) {
        return generateApplicationDto(tenantId, null);
    }

    protected ApplicationDto generateApplicationDto(String tenantId, String appName) {
        ApplicationDto app = new ApplicationDto();
        if (isBlank(tenantId)) {
            app.setTenantId(generateTenantDto().getId());
        } else {
            app.setTenantId(tenantId);
        }
        if (!isBlank(appName)) {
            app.setName(appName);
        } else {
            app.setName("Test app");
        }
        return applicationService.saveApp(app);
    }

    protected EndpointGroupDto generateEndpointGroupDto(String appId) {
        return generateEndpointGroupDto(appId, generateString("GROUP_ALL"));
    }

    protected EndpointGroupDto generateEndpointGroupDto(String appId, String endpointGroupName) {
        EndpointGroupDto group = new EndpointGroupDto();
        if (isBlank(appId)) {
            appId = generateApplicationDto(null).getId();
        }
        group.setApplicationId(appId);
        group.setName(endpointGroupName);
        group.setWeight(RANDOM.nextInt());
        return endpointService.saveEndpointGroup(group);
    }

    protected List<ConfigurationSchemaDto> generateConfSchemaDto(String tenantId, String appId, int count) {
        List<ConfigurationSchemaDto> schemas = Collections.emptyList();
        try {
            if (isBlank(tenantId)) {
                tenantId = generateTenantDto().getId();
            }
            if (isBlank(appId)) {
                appId = generateApplicationDto().getId();
            }

            ConfigurationSchemaDto schemaDto;
            CTLSchemaDto ctlSchemaDto = ctlService.saveCtlSchema(generateCTLSchemaDto(tenantId));
            schemas = new ArrayList<>(count);

            for (int i = 0; i < count; i++) {
                schemaDto = new ConfigurationSchemaDto();
                schemaDto.setApplicationId(appId);
                schemaDto.setCtlSchemaId(ctlSchemaDto.getId());
                schemaDto.setCreatedUsername("Test User");
                schemaDto.setName("Test Name");
                schemaDto = configurationService.saveConfSchema(schemaDto);
                Assert.assertNotNull(schemaDto);
                schemas.add(schemaDto);
            }

        } catch (Exception e) {
            LOG.error("Can't generate configs {}", e);
            Assert.fail("Can't generate configuration schemas." + e.getMessage());
        }
        return schemas;
    }

    protected List<ConfigurationDto> generateConfigurationDto(String schemaId, String groupId, int count,
            boolean activate, boolean useBaseSchema) {
        List<ConfigurationDto> ids = Collections.emptyList();
        try {
            ConfigurationSchemaDto schemaDto;
            if (isNotBlank(schemaId)) {
                schemaDto = configurationService.findConfSchemaById(schemaId);
            } else {
                schemaDto = generateConfSchemaDto(null, null, 1).get(0);
            }
            Assert.assertNotNull(schemaDto);
            KaaSchema kaaSchema = useBaseSchema ? new BaseSchema(schemaDto.getBaseSchema())
                    : new OverrideSchema(schemaDto.getOverrideSchema());
            DefaultRecordGenerationAlgorithmImpl configurationProcessor = new DefaultRecordGenerationAlgorithmImpl(
                    kaaSchema, useBaseSchema ? new BaseDataFactory() : new OverrideDataFactory());
            ids = new ArrayList<>();
            for (int i = 0; i < count; i++) {
                ConfigurationDto dto = new ConfigurationDto();
                dto.setId(null);
                dto.setStatus(null);
                dto.setBody(configurationProcessor.getRootData().getRawData());
                dto.setSchemaId(schemaDto.getId());
                if (isBlank(groupId)) {
                    groupId = generateEndpointGroupDto(schemaDto.getApplicationId()).getId();
                }
                dto.setEndpointGroupId(groupId);
                ConfigurationDto saved = configurationService.saveConfiguration(dto);
                Assert.assertNotNull(saved);
                if (activate) {
                    ChangeConfigurationNotification notification = configurationService
                            .activateConfiguration(saved.getId(), schemaDto.getCreatedUsername());
                    saved = notification.getConfigurationDto();
                }
                ids.add(saved);
            }
        } catch (Exception e) {
            LOG.error("Can't generate configs {}", e);
            Assert.fail("Can't generate configurations. " + e.getMessage());
        }
        return ids;
    }

    protected List<EndpointProfileSchemaDto> generateProfSchemaDto(String tenantId, String appId, int count) {
        List<EndpointProfileSchemaDto> schemas = Collections.emptyList();
        try {
            if (isBlank(tenantId)) {
                tenantId = generateTenantDto().getId();
            }
            if (isBlank(appId)) {
                appId = generateApplicationDto(tenantId).getId();
            }
            EndpointProfileSchemaDto schemaDto;
            CTLSchemaDto ctlSchemaDto = ctlService.saveCtlSchema(generateCTLSchemaDto(tenantId));
            schemas = new ArrayList<>(count);
            for (int i = 0; i < count; i++) {
                schemaDto = new EndpointProfileSchemaDto();
                schemaDto.setApplicationId(appId);
                schemaDto.setCtlSchemaId(ctlSchemaDto.getId());
                schemaDto.setCreatedUsername("Test User");
                schemaDto.setName("Test Name");
                schemaDto = profileService.saveProfileSchema(schemaDto);
                Assert.assertNotNull(schemaDto);
                schemas.add(schemaDto);
            }
        } catch (Exception e) {
            LOG.error("Can't generate configs {}", e);
            Assert.fail("Can't generate configurations.");
        }
        return schemas;
    }

    protected List<ProfileFilterDto> generateFilterDto(String schemaId, String serverSchemaId, String groupId,
            int count, boolean activate) {
        List<ProfileFilterDto> filters = Collections.emptyList();
        try {
            EndpointProfileSchemaDto schemaDto;
            if (isBlank(schemaId)) {
                schemaDto = generateProfSchemaDto(null, null, 1).get(0);
            } else {
                schemaDto = profileService.findProfileSchemaById(schemaId);
            }
            ApplicationDto app = applicationService.findAppById(schemaDto.getApplicationId());

            ServerProfileSchemaDto serverProfileSchemaDto;
            if (isBlank(serverSchemaId)) {
                serverProfileSchemaDto = generateServerProfileSchema(app.getId(), app.getTenantId());
            } else {
                serverProfileSchemaDto = serverProfileService.findServerProfileSchema(serverSchemaId);
            }

            filters = new ArrayList<>();
            for (int i = 0; i < count; i++) {
                ProfileFilterDto dto = new ProfileFilterDto();
                dto.setId(null);
                dto.setStatus(null);
                if (isBlank(groupId)) {
                    groupId = generateEndpointGroupDto(schemaDto.getApplicationId()).getId();
                }
                dto.setEndpointGroupId(groupId);
                dto.setEndpointProfileSchemaId(schemaDto.getId());
                dto.setEndpointProfileSchemaVersion(schemaDto.getVersion());
                dto.setServerProfileSchemaId(serverProfileSchemaDto.getId());
                dto.setServerProfileSchemaVersion(serverProfileSchemaDto.getVersion());
                dto.setApplicationId(schemaDto.getApplicationId());
                ProfileFilterDto saved = profileService.saveProfileFilter(dto);
                Assert.assertNotNull(saved);
                if (activate) {
                    ChangeProfileFilterNotification notification = profileService
                            .activateProfileFilter(saved.getId(), schemaDto.getCreatedUsername());
                    saved = notification.getProfileFilterDto();
                }
                filters.add(saved);
            }
        } catch (Exception e) {
            LOG.error("Can't generate configs {}", e);
            Assert.fail("Can't generate configurations.");
        }
        return filters;
    }

    protected TenantDto generateTenantDto() {
        return generateTenantDto(generateString(TENANT_NAME));
    }

    protected TenantDto generateTenantDto(String name) {
        TenantDto tn = new TenantDto();
        tn.setName(name);
        return userService.saveTenant(tn);
    }

    protected List<LogSchemaDto> generateLogSchemaDto(String appId, int count) {
        List<LogSchemaDto> schemas = Collections.emptyList();
        ApplicationDto app = null;
        try {
            if (isBlank(appId)) {
                app = generateApplicationDto();
                appId = app.getId();
            } else {
                app = applicationService.findAppById(appId);
            }
            LogSchemaDto schemaDto;
            schemas = new ArrayList<>(count);
            for (int i = 0; i < count; i++) {
                schemaDto = new LogSchemaDto();
                schemaDto.setApplicationId(appId);
                CTLSchemaDto ctlSchema = null;
                try {
                    ctlSchema = ctlService.saveCtlSchema(generateCTLSchemaDto(app.getTenantId()));
                } catch (DatabaseProcessingException e) {
                    ctlSchema = ctlService.getOrCreateEmptySystemSchema(USER_NAME);

                }
                schemaDto.setCtlSchemaId(ctlSchema.getId());
                schemaDto.setCreatedUsername("Test User");
                schemaDto.setName("Test Name");
                schemaDto = logSchemaService.saveLogSchema(schemaDto);
                Assert.assertNotNull(schemaDto);
                schemas.add(schemaDto);
            }
        } catch (Exception e) {
            LOG.error("Can't generate log schemas {}", e);
            Assert.fail("Can't generate log schemas.");
        }
        return schemas;
    }

    protected UserDto generateTenantAdmin(TenantDto tenantDto, String userId) {
        UserDto tenant = new UserDto();
        tenant.setUsername(generateString(TENANT_NAME));
        if (tenantDto == null) {
            tenantDto = generateTenantDto();
        }
        tenant.setTenantId(tenantDto.getId());
        if (isBlank(userId)) {
            List<UserDto> users = generateUsersDto(tenantDto.getId(), KaaAuthorityDto.TENANT_ADMIN, 1);
            tenant.setId(users.get(0).getId());
        } else {
            tenant.setId(userId);
        }
        tenant.setExternalUid(UUID.randomUUID().toString());
        tenant = userService.saveUser(tenant);
        return tenant;
    }

    protected UserVerifierDto generateUserVerifierDto(String appId, String verifierToken) {
        UserVerifierDto verifier = new UserVerifierDto();
        verifier.setName("GENERATED test Verifier");
        if (isBlank(appId)) {
            appId = generateApplicationDto().getId();
        }
        verifier.setApplicationId(appId);
        if (verifierToken == null) {
            verifierToken = "token";
        }
        verifier.setVerifierToken(verifierToken);
        return verifierService.saveUserVerifier(verifier);
    }

    protected List<UserDto> generateUsersDto(String tenantId, KaaAuthorityDto authority, int count) {
        List<UserDto> users = new ArrayList<>(count);
        UserDto userDto = null;
        for (int i = 0; i < count; i++) {
            userDto = new UserDto();
            userDto.setUsername(generateString(USER_NAME));
            userDto.setTenantId(tenantId);
            userDto.setExternalUid(UUID.randomUUID().toString());
            userDto.setAuthority(authority);
            userDto = userService.saveUser(userDto);
            users.add(userDto);
        }
        return users;
    }

    protected TopicDto generateTopicDto(String appId, TopicTypeDto type) {
        TopicDto topic = new TopicDto();
        topic.setName(TOPIC_NAME);
        if (isBlank(appId)) {
            appId = generateApplicationDto().getId();
        }
        topic.setApplicationId(appId);
        if (type == null) {
            type = TopicTypeDto.MANDATORY;
        }
        topic.setType(type);
        return topicService.saveTopic(topic);
    }

    protected NotificationSchemaDto generateNotificationSchemaDto(String appId, NotificationTypeDto type) {
        NotificationSchemaDto schema = new NotificationSchemaDto();
        ApplicationDto app = null;
        if (isBlank(appId)) {
            app = generateApplicationDto();
            appId = app.getId();
        } else {
            app = applicationService.findAppById(appId);
        }
        schema.setApplicationId(appId);
        schema.setName(NOTIFICATION_SCHEMA_NAME);
        schema.setType(type != null ? type : NotificationTypeDto.USER);
        CTLSchemaDto ctlSchema = null;
        try {
            ctlSchema = ctlService.saveCtlSchema(generateCTLSchemaDto(app.getTenantId()));
        } catch (DatabaseProcessingException e) {
            ctlSchema = ctlService.getOrCreateEmptySystemSchema(USER_NAME);

        }
        schema.setCtlSchemaId(ctlSchema.getId());
        return notificationService.saveNotificationSchema(schema);
    }

    protected List<NotificationDto> generateNotificationsDto(String schemaId, String topicId, int count,
            NotificationTypeDto type) {
        List<NotificationDto> notifications = new ArrayList<>(count);
        NotificationDto notification = null;
        NotificationSchemaDto schema;
        for (int i = 0; i < count; i++) {
            notification = new NotificationDto();
            if (isBlank(schemaId)) {
                schema = generateNotificationSchemaDto(null, NotificationTypeDto.USER);
            } else {
                schema = notificationService.findNotificationSchemaById(schemaId);
            }
            notification.setApplicationId(schema.getApplicationId());
            notification.setSchemaId(schema.getId());
            if (isBlank(topicId)) {
                topicId = generateTopicDto(schema.getApplicationId(), null).getId();
            }
            notification.setTopicId(topicId);
            notification.setType(type != null ? type : NotificationTypeDto.USER);
            byte[] body = null;
            try {
                body = readSchemaFileAsString("dao/schema/testBaseData.json").getBytes(Charset.forName("UTF-8"));
            } catch (IOException e) {
                e.printStackTrace();
                Assert.fail(e.getMessage());
            }
            notification.setBody(body);
            UpdateNotificationDto<NotificationDto> update = notificationService.saveNotification(notification);
            notifications.add(update.getPayload());
        }
        return notifications;
    }

    protected EndpointNotificationDto generateUnicastNotificationDto(String schemaId, String topicId,
            byte[] keyHash) {
        EndpointNotificationDto endpointNotification = new EndpointNotificationDto();
        endpointNotification.setEndpointKeyHash(keyHash);
        NotificationDto notification = new NotificationDto();
        NotificationSchemaDto schema;
        if (isBlank(schemaId)) {
            schema = generateNotificationSchemaDto(null, NotificationTypeDto.USER);
        } else {
            schema = notificationService.findNotificationSchemaById(schemaId);
        }
        if (isBlank(topicId)) {
            topicId = generateTopicDto(schema.getApplicationId(), null).getId();
        }
        notification.setTopicId(topicId);
        notification.setApplicationId(schema.getApplicationId());
        notification.setSchemaId(schema.getId());
        notification.setType(NotificationTypeDto.USER);
        byte[] body = null;
        try {
            body = readSchemaFileAsString("dao/schema/testBaseData.json").getBytes(Charset.forName("UTF-8"));
        } catch (IOException e) {
            e.printStackTrace();
            Assert.fail(e.getMessage());
        }
        notification.setBody(body);
        endpointNotification.setNotificationDto(notification);
        UpdateNotificationDto<EndpointNotificationDto> update = notificationService
                .saveUnicastNotification(endpointNotification);
        return update.getPayload();
    }

    protected EndpointUserDto generateEndpointUserDto(String tenantId) {
        EndpointUserDto endpointUser = new EndpointUserDto();
        endpointUser.setExternalId(ENDPOINT_USER_EXTERNAL_ID + UUID.randomUUID().toString());
        endpointUser.setUsername(ENDPOINT_USER_NAME + UUID.randomUUID().toString());
        if (tenantId == null) {
            tenantId = UUID.randomUUID().toString();
        }
        endpointUser.setTenantId(tenantId);
        endpointUser = endpointService.saveEndpointUser(endpointUser);
        return endpointUser;
    }

    protected LogAppenderDto generateLogAppenderDto(String appId, String schemaId) {
        LogAppenderDto logAppender = null;
        ApplicationDto app = null;
        LogSchemaDto schema = null;
        if (isBlank(appId)) {
            app = generateApplicationDto();
            appId = app.getId();
        } else {
            app = applicationService.findAppById(appId);
        }
        if (isBlank(schemaId)) {
            schema = generateLogSchemaDto(appId, 1).get(0);
        }
        logAppender = new LogAppenderDto();
        logAppender.setApplicationId(appId);
        logAppender.setName("Generated Appender");
        int version = schema.getVersion();
        logAppender.setMinLogSchemaVersion(version);
        logAppender.setMaxLogSchemaVersion(version);
        logAppender.setTenantId(app.getTenantId());
        logAppender.setHeaderStructure(Arrays.asList(LogHeaderStructureDto.values()));
        return logAppendersService.saveLogAppender(logAppender);
    }

    protected EndpointUserConfigurationDto generateEndpointUserConfigurationDto(EndpointUserDto endpointUser,
            ApplicationDto applicationDto, ConfigurationSchemaDto configurationSchema) {
        return generateEndpointUserConfigurationDto(endpointUser, applicationDto, configurationSchema,
                UUID.randomUUID().toString());
    }

    protected EndpointUserConfigurationDto generateEndpointUserConfigurationDto(EndpointUserDto endpointUser,
            ApplicationDto applicationDto, ConfigurationSchemaDto configurationSchema, String body) {
        return generateEndpointUserConfigurationDto(endpointUser, applicationDto, configurationSchema, body, false);
    }

    protected EndpointUserConfigurationDto generateEndpointUserConfigurationDto(EndpointUserDto endpointUser,
            ApplicationDto applicationDto, ConfigurationSchemaDto configurationSchema, String body,
            boolean isNullAppDto) {
        EndpointUserConfigurationDto configurationDto = new EndpointUserConfigurationDto();
        configurationDto.setBody(body);

        if (endpointUser == null) {
            endpointUser = generateEndpointUserDto(null);
        }
        if (!isNullAppDto) {
            if (applicationDto == null) {
                applicationDto = generateApplicationDto();
            }
            configurationDto.setAppToken(applicationDto.getApplicationToken());
        } else {
            return userConfigurationService.saveUserConfiguration(configurationDto);
        }
        configurationDto.setUserId(endpointUser.getId());

        if (configurationSchema == null) {
            configurationSchema = generateConfSchemaDto(null, applicationDto.getId(), 1).get(0);
        }
        configurationDto.setSchemaVersion(configurationSchema.getVersion());

        return userConfigurationService.saveUserConfiguration(configurationDto);
    }

    protected EndpointProfileDto generateEndpointProfileDto(String appId, List<String> topicIds) {
        if (isBlank(appId)) {
            appId = generateApplicationDto().getId();
        }
        EndpointProfileDto profileDto = new EndpointProfileDto();
        profileDto.setApplicationId(appId);
        profileDto.setSubscriptions(topicIds);
        profileDto.setEndpointKeyHash("TEST_KEY_HASH".getBytes());
        profileDto.setServerProfileBody("{\"serverTitle\": \"SERVER_TEST\"}");
        profileDto.setEpsConfigurationHash(EPS_CONFIG_HASH);
        try {
            profileDto.setClientProfileBody(readSchemaFileAsString(TEST_PROFILE_BODY_PATH));
        } catch (IOException e) {
            LOG.error("Can't set client-side EP body {}", e);
        }
        profileDto.setSdkToken(UUID.randomUUID().toString());
        return endpointService.saveEndpointProfile(profileDto);
    }

    protected EndpointProfileDto generateEndpointProfileDtoWithSchemaVersion(String appId, int schemaVersion,
            String srvProfileBody) {
        EndpointProfileDto profileDto = new EndpointProfileDto();
        profileDto.setApplicationId(appId);
        profileDto.setServerProfileVersion(schemaVersion);
        profileDto.setEndpointKeyHash("TEST_KEY_HASH".getBytes());
        profileDto.setEpsConfigurationHash(EPS_CONFIG_HASH);
        try {
            profileDto.setClientProfileBody(readSchemaFileAsString(TEST_PROFILE_BODY_PATH));
        } catch (IOException e) {
            LOG.error("Can't set client-side EP body {}", e);
        }
        profileDto.setSdkToken(UUID.randomUUID().toString());
        profileDto.setServerProfileBody(srvProfileBody);
        return endpointService.saveEndpointProfile(profileDto);
    }

    protected EndpointProfileDto generateEndpointProfileWithGroupIdDto(String endpointGroupId) {
        EndpointProfileDto profileDto = new EndpointProfileDto();
        profileDto.setEndpointKeyHash(generateString("TEST_KEY_HASH").getBytes());
        String appId = generateApplicationDto().getId();
        profileDto.setApplicationId(appId);
        List<EndpointGroupStateDto> groupState = new ArrayList<>();
        groupState.add(new EndpointGroupStateDto(endpointGroupId, null, null));
        profileDto.setGroupState(groupState);
        try {
            profileDto.setClientProfileBody(readSchemaFileAsString(TEST_PROFILE_BODY_PATH));
        } catch (IOException e) {
            LOG.error("Can't set client-side EP body {}", e);
        }
        profileDto.setServerProfileBody("{\"serverTitle\": \"SERVER_TEST\"}");
        profileDto.setSdkToken(UUID.randomUUID().toString());
        return endpointService.saveEndpointProfile(profileDto);
    }

    protected CTLSchemaDto generateCTLSchemaDto(String tenantId) {
        return generateCTLSchemaDto(DEFAULT_FQN, tenantId, null, 100);
    }

    protected CTLSchemaDto generateCTLSchemaDto(String fqn, String tenantId, String applicationId, int version) {
        CTLSchemaDto ctlSchema = new CTLSchemaDto();
        ctlSchema.setMetaInfo(new CtlSchemaMetaInfoDto(fqn, tenantId, applicationId));
        ctlSchema.setVersion(version);
        String name = fqn.substring(fqn.lastIndexOf(".") + 1);
        String namespace = fqn.substring(0, fqn.lastIndexOf("."));
        StringBuilder body = new StringBuilder("{\"type\": \"record\",");
        body = body.append("\"name\": \"").append(name).append("\",");
        body = body.append("\"namespace\": \"").append(namespace).append("\",");
        body = body.append("\"version\": ").append(version).append(",");
        body = body.append("\"dependencies\": [], \"fields\": []}");
        ctlSchema.setBody(body.toString());
        return ctlSchema;
    }

    protected String ctlRandomFqn() {
        return DEFAULT_FQN + RANDOM.nextInt(100000);
    }

    protected ServerProfileSchemaDto generateServerProfileSchema(String appId, String tenantId) {
        return generateServerProfileSchema(appId, tenantId, RANDOM.nextInt(100000));
    }

    protected ServerProfileSchemaDto generateServerProfileSchema(String appId, String tenantId, int version) {
        ServerProfileSchemaDto schemaDto = new ServerProfileSchemaDto();
        if (isBlank(tenantId)) {
            ApplicationDto applicationDto = generateApplicationDto();
            appId = applicationDto.getId();
            tenantId = applicationDto.getTenantId();
        }
        schemaDto.setApplicationId(appId);
        schemaDto.setCreatedTime(System.currentTimeMillis());

        CTLSchemaDto ctlSchema = ctlService
                .saveCtlSchema(generateCTLSchemaDto(ctlRandomFqn(), tenantId, appId, version));
        schemaDto.setCtlSchemaId(ctlSchema.getId());
        return serverProfileService.saveServerProfileSchema(schemaDto);
    }

    protected List<String> getIds(List<? extends GenericModel> modelList) {
        List<String> ids = new ArrayList<>();
        for (GenericModel gm : modelList) {
            ids.add(gm.getStringId());
        }
        Collections.sort(ids);
        return ids;
    }

    protected List<String> getIdsDto(List<? extends HasId> hId) {
        List<String> ids = new ArrayList<>();
        for (HasId id : hId) {
            ids.add(id.getId());
        }
        Collections.sort(ids);
        return ids;
    }
}