/* * 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.service; import org.apache.avro.generic.GenericContainer; import org.junit.Assert; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.kaaproject.kaa.common.avro.GenericAvroConverter; import org.kaaproject.kaa.common.dto.ApplicationDto; import org.kaaproject.kaa.common.dto.ChangeConfigurationNotification; import org.kaaproject.kaa.common.dto.ConfigurationDto; import org.kaaproject.kaa.common.dto.ConfigurationRecordDto; import org.kaaproject.kaa.common.dto.ConfigurationSchemaDto; import org.kaaproject.kaa.common.dto.EndpointGroupDto; import org.kaaproject.kaa.common.dto.StructureRecordDto; import org.kaaproject.kaa.common.dto.UpdateStatus; import org.kaaproject.kaa.common.dto.VersionDto; import org.kaaproject.kaa.server.common.core.algorithms.generation.ConfigurationGenerationException; import org.kaaproject.kaa.server.common.core.algorithms.schema.SchemaCreationException; import org.kaaproject.kaa.server.common.core.algorithms.schema.SchemaGenerationAlgorithm; import org.kaaproject.kaa.server.common.core.algorithms.schema.SchemaGenerationAlgorithmFactory; import org.kaaproject.kaa.server.common.core.algorithms.schema.SchemaGenerationAlgorithmFactoryImpl; import org.kaaproject.kaa.server.common.core.schema.DataSchema; import org.kaaproject.kaa.server.common.core.schema.KaaSchema; import org.kaaproject.kaa.server.common.dao.AbstractTest; import org.kaaproject.kaa.server.common.dao.exception.IncorrectParameterException; import org.kaaproject.kaa.server.common.dao.exception.UpdateStatusConflictException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.List; @Ignore("This test should be extended and initialized with proper context in each NoSQL submodule") public class ConfigurationServiceImplTest extends AbstractTest { private static final Logger LOG = LoggerFactory.getLogger(ConfigurationServiceImplTest.class); private static final String INCORRECT_SQL_ID = "incorrect id"; @Before public void before() throws Exception { clearDBData(); } @Test(expected = IncorrectParameterException.class) public void saveConfigurationWithIncorrectIdTestFail() throws SchemaCreationException { ConfigurationDto configurationDto = new ConfigurationDto(); configurationDto.setId(INCORRECT_SQL_ID); configurationService.saveConfiguration(configurationDto); } @Test(expected = UpdateStatusConflictException.class) public void saveConfigurationWithIncorrectStatusTestFail() throws SchemaCreationException { List<ConfigurationDto> configurations = generateConfigurationDto(null, null, 1, true, false); ConfigurationDto configurationDto = configurationService.findConfigurationById(configurations.get(0).getId()); configurationService.saveConfiguration(configurationDto); } @Test public void saveConfigurationObjectWithIdTest() throws SchemaCreationException, IOException, ConfigurationGenerationException { List<ConfigurationDto> configs = generateConfigurationDto(null, null, 1, false, false); ConfigurationDto saved = configurationService.findConfigurationById(configs.get(0).getId()); ConfigurationDto updated = configurationService.saveConfiguration(saved); // update one more time (nothing should change) updated = configurationService.saveConfiguration(updated); Assert.assertNotNull(saved); Assert.assertEquals(updated.getStatus(), UpdateStatus.INACTIVE); } @Test public void saveConfigurationObjectWithoutIdTest() throws SchemaCreationException { List<ConfigurationDto> configs = generateConfigurationDto(null, null, 1, false, false); ConfigurationDto saved = configurationService.findConfigurationById(configs.get(0).getId()); String inactiveId = saved.getId(); saved.setId(null); ConfigurationDto updated = configurationService.saveConfiguration(saved); Assert.assertNotNull(saved); Assert.assertEquals(saved.getStatus(), UpdateStatus.INACTIVE); Assert.assertEquals(inactiveId, updated.getId()); } @Test public void saveConfigurationObjectWithoutInactiveConfigurationTest() throws SchemaCreationException { List<ConfigurationDto> configs = generateConfigurationDto(null, null, 3, true, false); ConfigurationDto saved = configurationService.findConfigurationById(configs.get(2).getId()); String id = saved.getId(); saved.setId(null); ConfigurationDto updated = configurationService.saveConfiguration(saved); Assert.assertNotNull(updated); Assert.assertEquals(updated.getStatus(), UpdateStatus.INACTIVE); Assert.assertEquals(saved.getSequenceNumber(), updated.getSequenceNumber()); Assert.assertNotEquals(id, updated.getId()); } @Test(expected = IncorrectParameterException.class) public void saveConfigurationObjectWithIncorrectSchemaIdTest() throws SchemaCreationException { List<ConfigurationDto> configurations = generateConfigurationDto(null, null, 1, false, false); ConfigurationDto configurationDto = configurationService.findConfigurationById(configurations.get(0).getId()); configurationDto.setId(null); configurationDto.setSchemaId(100500 + ""); configurationService.saveConfiguration(configurationDto); } @Test public void editConfigurationObjectTest() { List<ConfigurationDto> configs = generateConfigurationDto(null, null, 1, false, false); ConfigurationDto saved = configurationService.findConfigurationById(configs.get(0).getId()); ConfigurationDto configurationToEdit = new ConfigurationDto(); configurationToEdit.setId(saved.getId()); configurationToEdit.setApplicationId(saved.getApplicationId()); configurationToEdit.setEndpointGroupId(saved.getEndpointGroupId()); configurationToEdit.setSchemaId(saved.getSchemaId()); configurationToEdit.setVersion(saved.getVersion()); configurationToEdit.setBody(saved.getBody()); ConfigurationDto updated = configurationService.saveConfiguration(configurationToEdit); Assert.assertNotNull(saved); Assert.assertNotNull(updated); Assert.assertEquals(saved.getSchemaVersion(), updated.getSchemaVersion()); Assert.assertEquals(saved.getCreatedTime(), updated.getCreatedTime()); Assert.assertEquals(saved.getCreatedUsername(), updated.getCreatedUsername()); } @Test public void findConfSchemaByIdTest() { List<ConfigurationSchemaDto> schemas = generateConfSchemaDto(null, null, 1); ConfigurationSchemaDto schema = schemas.get(0); ConfigurationSchemaDto foundSchema = configurationService.findConfSchemaById(schema.getId()); Assert.assertNotNull(foundSchema); Assert.assertEquals(schema, foundSchema); } @Test(expected = IncorrectParameterException.class) public void findConfSchemaByIdTestFail() { configurationService.findConfSchemaById(INCORRECT_SQL_ID); } @Test public void findLatestConfigurationByAppIdTest() { List<ConfigurationDto> configurations = generateConfigurationDto(null, null, 1, false, false); ConfigurationDto expected = configurations.get(0); ConfigurationDto found = configurationService.findConfigurationByAppIdAndVersion(expected.getApplicationId(), 1); Assert.assertNotNull(found); } @Test(expected = IncorrectParameterException.class) public void findLatestConfigurationByAppIdTestFail() { configurationService.findConfigurationByAppIdAndVersion(INCORRECT_SQL_ID, 1); } @Test public void findConfigurationByIdTest() { List<ConfigurationDto> configurations = generateConfigurationDto(null, null, 1, false, false); ConfigurationDto configuration = configurations.get(0); ConfigurationDto foundConfiguration = configurationService.findConfigurationById(configuration.getId()); Assert.assertNotNull(foundConfiguration); Assert.assertEquals(configuration, foundConfiguration); } @Test(expected = IncorrectParameterException.class) public void findConfigurationByIdTestFail() { configurationService.findConfigurationById(INCORRECT_SQL_ID); } @Test public void activateConfiguration() { List<ConfigurationDto> configurations = generateConfigurationDto(null, null, 1, false, false); String configId = configurations.get(0).getId(); ConfigurationDto found = configurationService.findConfigurationById(configId); ChangeConfigurationNotification notification = configurationService.activateConfiguration(configId, null); Assert.assertNotNull(notification); ConfigurationDto dto = notification.getConfigurationDto(); Assert.assertNotNull(dto); Assert.assertEquals(dto.getStatus(), UpdateStatus.ACTIVE); Assert.assertEquals(dto.getId(), configId); Assert.assertNotEquals(dto.getSequenceNumber(), found.getSequenceNumber()); } @Test(expected = UpdateStatusConflictException.class) public void activateConfigurationTestFail() { List<ConfigurationDto> configurations = generateConfigurationDto(null, null, 1, true, false); ConfigurationDto configuration = configurations.get(0); configurationService.activateConfiguration(configuration.getId(), null); } @Test(expected = IncorrectParameterException.class) public void activateConfigurationWithIncorrectIdTestFail() { configurationService.activateConfiguration(INCORRECT_SQL_ID, null); } @Test public void findConfigurationsByEndpointGroupIdTest() { EndpointGroupDto group = generateEndpointGroupDto(null); List<ConfigurationDto> configurations = generateConfigurationDto(null, group.getId(), 1, true, false); List<ConfigurationDto> dtoList = configurationService.findConfigurationsByEndpointGroupId(group.getId()); Assert.assertNotNull(dtoList); Assert.assertEquals(configurations, dtoList); } @Test public void findConfSchemaByAppIdAndVersionTest() { String appId = generateApplicationDto().getId(); ConfigurationSchemaDto dto = configurationService.findConfSchemaByAppIdAndVersion(appId, 1); Assert.assertNotNull(dto); } @Test public void saveConfSchemaTest() throws SchemaCreationException, IOException { String id = generateConfSchemaDto(null, null, 1).get(0).getId(); ConfigurationSchemaDto schema = configurationService.findConfSchemaById(id); Assert.assertNotNull(schema); int version = schema.getVersion(); schema.setId(null); ConfigurationSchemaDto saved = configurationService.saveConfSchema(schema); Assert.assertNotNull(saved); Assert.assertNotEquals(version, saved.getVersion()); Assert.assertNotEquals(schema.getId(), saved.getId()); } @Test public void removeConfSchemasByAppIdTest() { ApplicationDto application = generateApplicationDto(); String appId = application.getId(); List<ConfigurationSchemaDto> dtoList = configurationService.findConfSchemasByAppId(appId); Assert.assertNotNull(dtoList); Assert.assertFalse(dtoList.isEmpty()); configurationService.removeConfSchemasByAppId(appId); dtoList = configurationService.findConfSchemasByAppId(appId); Assert.assertNotNull(dtoList); Assert.assertTrue(dtoList.isEmpty()); } @Test public void createApplicationTest() throws IOException { String schema = readSchemaFileAsString("dao/schema/testOverrideSchema.json"); String config = readSchemaFileAsString("dao/schema/testOverrideData.json"); GenericAvroConverter<GenericContainer> converter = new GenericAvroConverter<GenericContainer>(schema); GenericContainer container = converter.decodeJson(config); LOG.debug("JSON {}", container); LOG.debug("Converted JSON {} ", new String(converter.encodeToJsonBytes(container))); Assert.assertEquals(converter.encodeToJson(container), new String(converter.encodeToJsonBytes(container))); } @Test public void createSchemaTest() throws Exception { DataSchema schema = new DataSchema(readSchemaFileAsString("dao/schema/dataSchema.json")); SchemaGenerationAlgorithmFactory factory = new SchemaGenerationAlgorithmFactoryImpl(); SchemaGenerationAlgorithm generator = factory.createSchemaGenerator(schema); KaaSchema protocolSchema = generator.getProtocolSchema(); KaaSchema baseSchema = generator.getBaseSchema(); KaaSchema overrideSchema = generator.getOverrideSchema(); LOG.debug("Created Override schema JSON {} ", overrideSchema.getRawSchema()); LOG.debug("Created Base schema JSON {} ", baseSchema.getRawSchema()); LOG.debug("Created Protocol schema JSON {} ", protocolSchema.getRawSchema()); } @Test public void createDefaultSchemaTest() { String id = generateApplicationDto().getId(); ConfigurationSchemaDto schema = generateConfSchemaDto(null, id, 1).get(0); ConfigurationDto config = configurationService.findConfigurationByAppIdAndVersion(id, schema.getVersion()); Assert.assertEquals(config.getStatus(), UpdateStatus.ACTIVE); } @Test public void findDefaultConfigurationBySchemaIdTest() { ConfigurationSchemaDto schema = generateConfSchemaDto(null, null, 1).get(0); ConfigurationDto configuration = configurationService.findDefaultConfigurationBySchemaId(schema.getId()); Assert.assertNotNull(configuration); Assert.assertEquals(UpdateStatus.ACTIVE, configuration.getStatus()); Assert.assertEquals(schema.getId(), configuration.getSchemaId()); } @Test public void findConfigurationByEndpointGroupIdAndVersionTest() { ConfigurationSchemaDto schema = generateConfSchemaDto(null, null, 1).get(0); String groupId = generateEndpointGroupDto(schema.getApplicationId()).getId(); ConfigurationDto config = generateConfigurationDto(schema.getId(), groupId, 1, true, false).get(0); ConfigurationDto configuration = configurationService.findConfigurationByEndpointGroupIdAndVersion(groupId, schema.getVersion()); Assert.assertNotNull(configuration); Assert.assertEquals(config, configuration); } @Test(expected = IncorrectParameterException.class) public void deactivateInactiveConfigurationTest() { ConfigurationDto config = generateConfigurationDto(null, null, 1, false, false).get(0); configurationService.deactivateConfiguration(config.getId(), null); } @Test(expected = IncorrectParameterException.class) public void deactivateIncorrectConfigurationTest() { configurationService.deactivateConfiguration(INCORRECT_SQL_ID, null); } @Test public void deactivateConfigurationTest() { ConfigurationDto config = generateConfigurationDto(null, null, 1, true, false).get(0); configurationService.deactivateConfiguration(config.getId(), null); config = configurationService.findConfigurationById(config.getId()); Assert.assertNotNull(config); Assert.assertEquals(UpdateStatus.DEPRECATED, config.getStatus()); } @Test public void deleteConfigurationRecordTest() { ConfigurationSchemaDto schemaDto = generateConfSchemaDto(null, null, 1).get(0); EndpointGroupDto group = generateEndpointGroupDto(schemaDto.getApplicationId()); generateConfigurationDto(schemaDto.getId(), group.getId(), 1, true, false); ChangeConfigurationNotification notification = configurationService.deleteConfigurationRecord(schemaDto.getId(), group.getId(), null); Assert.assertNotNull(notification); ConfigurationDto configurationDto = notification.getConfigurationDto(); Assert.assertEquals(UpdateStatus.DEPRECATED, configurationDto.getStatus()); StructureRecordDto<ConfigurationDto> records = configurationService .findConfigurationRecordBySchemaIdAndEndpointGroupId(schemaDto.getId(), group.getId()); Assert.assertNull(records.getInactiveStructureDto()); Assert.assertEquals(UpdateStatus.DEPRECATED, records.getActiveStructureDto().getStatus()); } @Test public void findAllConfigurationRecordsByEndpointGroupIdTest() { String id = generateApplicationDto().getId(); ConfigurationSchemaDto schema = generateConfSchemaDto(null, id, 1).get(0); EndpointGroupDto group = generateEndpointGroupDto(id); generateConfigurationDto(schema.getId(), group.getId(), 1, true, false); List<ConfigurationRecordDto> records = (List<ConfigurationRecordDto>) configurationService .findAllConfigurationRecordsByEndpointGroupId(group.getId(), false); Assert.assertNotNull(records); Assert.assertEquals(1, records.size()); ConfigurationDto activeConfiguration = records.get(0).getActiveStructureDto(); Assert.assertEquals(UpdateStatus.ACTIVE, activeConfiguration.getStatus()); ConfigurationDto inactiveConfiguration = records.get(0).getInactiveStructureDto(); Assert.assertNull(inactiveConfiguration); } @Test public void findConfigurationRecordBySchemaIdAndEndpointGroupIdTest() { ConfigurationSchemaDto schema = generateConfSchemaDto(null, null, 1).get(0); EndpointGroupDto group = generateEndpointGroupDto(schema.getApplicationId()); ConfigurationDto activeConfig = generateConfigurationDto(schema.getId(), group.getId(), 1, true, false).get(0); ConfigurationDto inactiveConfig = generateConfigurationDto(schema.getId(), group.getId(), 1, false, false).get(0); StructureRecordDto<ConfigurationDto> record = configurationService .findConfigurationRecordBySchemaIdAndEndpointGroupId(schema.getId(), group.getId()); Assert.assertEquals(activeConfig, record.getActiveStructureDto()); Assert.assertEquals(inactiveConfig, record.getInactiveStructureDto()); } @Test public void findVacantSchemasByEndpointGroupIdTest() { ApplicationDto application = generateApplicationDto(); List<ConfigurationSchemaDto> schemas = generateConfSchemaDto(null, application.getId(), 4); EndpointGroupDto groupOne = generateEndpointGroupDto(application.getId()); ConfigurationSchemaDto schemaOne = schemas.get(0); generateConfigurationDto(schemaOne.getId(), groupOne.getId(), 1, true, false); EndpointGroupDto groupTwo = generateEndpointGroupDto(application.getId()); List<VersionDto> schemasOne = configurationService.findVacantSchemasByEndpointGroupId(groupOne.getId()); Assert.assertFalse(schemasOne.isEmpty()); Assert.assertEquals(4, schemasOne.size()); List<VersionDto> schemasTwo = configurationService.findVacantSchemasByEndpointGroupId(groupTwo.getId()); Assert.assertFalse(schemasTwo.isEmpty()); Assert.assertEquals(5, schemasTwo.size()); } @Test public void findConfigurationSchemaVersionsByAppIdTest() { ConfigurationSchemaDto schemaDto = generateConfSchemaDto(null, null, 1).get(0); List<VersionDto> versions = configurationService.findConfigurationSchemaVersionsByAppId(schemaDto.getApplicationId()); Assert.assertFalse(versions.isEmpty()); Assert.assertEquals(2, versions.size()); Assert.assertEquals(versions.get(0).getVersion(), 1); Assert.assertEquals(versions.get(1).getVersion(), 2); } @Test(expected = IncorrectParameterException.class) public void validateConfigurationWithoutGroupIdTest() { ConfigurationDto configuration = new ConfigurationDto(); configuration.setSchemaId("Incorrect Id"); configurationService.saveConfiguration(configuration); } @Test(expected = IncorrectParameterException.class) public void validateConfigurationWithoutSchemaIdTest() { ConfigurationDto configuration = new ConfigurationDto(); configurationService.saveConfiguration(configuration); } }