/*
* 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.core.algorithms.generation;
import org.apache.avro.generic.GenericRecord;
import org.junit.Assert;
import org.junit.Test;
import org.kaaproject.kaa.common.avro.AvroDataCanonizationUtils;
import org.kaaproject.kaa.common.avro.GenericAvroConverter;
import org.kaaproject.kaa.server.common.core.configuration.BaseDataFactory;
import org.kaaproject.kaa.server.common.core.configuration.KaaData;
import org.kaaproject.kaa.server.common.core.schema.BaseSchema;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
/**
* Class for testing
* {@link org.kaaproject.kaa.server.common.dao.configuration.DefaultConfigurationProcessor}
*/
public class DefaultGenerationAlgorithmTest {
/**
* Checks generation of a complex default configuration.
*/
@Test
public void testGenerateComplexDefaultConfigurationSuccess() throws Exception {
// Read Configuration Schema
Path schemaPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("generation/complexSchema.json").toURI());
BaseSchema configuraionSchema = new BaseSchema(new String(Files.readAllBytes(schemaPath)));
// generated default configuration
DefaultRecordGenerationAlgorithm configurationProcessor = new DefaultRecordGenerationAlgorithmImpl(configuraionSchema, new BaseDataFactory());
KaaData generatedConfiguration = configurationProcessor.getRootData();
// Read expected generated Configuration
Path expectedGeneratedConfigurationPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("generation/expectedDefaultConfigurationForComplexSchema.json").toURI());
String expectedGeneratedConfiguration = new String(Files.readAllBytes(expectedGeneratedConfigurationPath));
GenericAvroConverter<GenericRecord> converter = new GenericAvroConverter<>(configuraionSchema.getRawSchema());
GenericRecord generatedConfigurationGenericRecord = converter.decodeJson(generatedConfiguration.getRawData());
GenericRecord expectedGeneratedConfigurationGenericRecord = converter.decodeJson(expectedGeneratedConfiguration);
AvroDataCanonizationUtils.removeUuid(generatedConfigurationGenericRecord);
AvroDataCanonizationUtils.removeUuid(expectedGeneratedConfigurationGenericRecord);
Assert.assertTrue(generatedConfigurationGenericRecord.equals(expectedGeneratedConfigurationGenericRecord));
}
/**
* Verifies that configuration generation fails when schema contains field
* of type map.
*/
@Test(expected = ConfigurationGenerationException.class)
public void testConfigurationGenerationFailedForSchemaWithMapField() throws Exception {
// Read Configuration Schema
Path schemaPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("generation/schemaWithMapType.json").toURI());
BaseSchema configuraionSchema = new BaseSchema(new String(Files.readAllBytes(schemaPath)));
// generated default configuration
DefaultRecordGenerationAlgorithm configurationProcessor = new DefaultRecordGenerationAlgorithmImpl(configuraionSchema, new BaseDataFactory());
KaaData generatedConfiguration = configurationProcessor.getRootData();
}
/**
* Verifies that configuration generation fails when schema contains "by_default" field
* doesn't match to the actual field type.
*/
@Test(expected = ConfigurationGenerationException.class)
public void testConfigurationGenerationFailedForSchemaWithUnsuitableDefault() throws Exception {
// Read Configuration Schema
Path schemaPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("generation/schemaWithUnsuitableDefault.json").toURI());
BaseSchema configuraionSchema = new BaseSchema(new String(Files.readAllBytes(schemaPath)));
// generated default configuration
DefaultRecordGenerationAlgorithm configurationProcessor = new DefaultRecordGenerationAlgorithmImpl(configuraionSchema, new BaseDataFactory());
KaaData generatedConfiguration = configurationProcessor.getRootData();
}
/**
* Checks generation of a default configuration for a schema with fixed
* type.
*/
@Test
public void testGenerateDefaultConfigurationForSchemaWithFixedType() throws Exception {
// Read Configuration Schema
Path schemaPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("generation/schemaWithFixedType.json").toURI());
BaseSchema configuraionSchema = new BaseSchema(new String(Files.readAllBytes(schemaPath)));
// generated default configuration
DefaultRecordGenerationAlgorithm configurationProcessor = new DefaultRecordGenerationAlgorithmImpl(configuraionSchema, new BaseDataFactory());
KaaData generatedConfiguration = configurationProcessor.getRootData();
// Read expected generated Configuration
Path expectedGeneratedConfigurationPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("generation/expectedDefaultConfigurationWithFixedType.json").toURI());
String expectedGeneratedConfiguration = new String(Files.readAllBytes(expectedGeneratedConfigurationPath));
GenericAvroConverter<GenericRecord> converter = new GenericAvroConverter<>(configuraionSchema.getRawSchema());
GenericRecord generatedConfigurationGenericRecord = converter.decodeJson(generatedConfiguration.getRawData());
GenericRecord expectedGeneratedConfigurationGenericRecord = converter.decodeJson(expectedGeneratedConfiguration);
AvroDataCanonizationUtils.removeUuid(generatedConfigurationGenericRecord);
AvroDataCanonizationUtils.removeUuid(expectedGeneratedConfigurationGenericRecord);
Assert.assertTrue(generatedConfigurationGenericRecord.equals(expectedGeneratedConfigurationGenericRecord));
}
/**
* Checks generation of a default configuration for a schema with reused
* type.
*/
@Test
public void testGenerateDefaultConfigurationForSchemaWithReusedType() throws Exception {
// Read Configuration Schema
Path schemaPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("generation/schemaWithReusedType.json").toURI());
BaseSchema configuraionSchema = new BaseSchema(new String(Files.readAllBytes(schemaPath)));
// generated default configuration
DefaultRecordGenerationAlgorithm configurationProcessor = new DefaultRecordGenerationAlgorithmImpl(configuraionSchema, new BaseDataFactory());
KaaData generatedConfiguration = configurationProcessor.getRootData();
// Read expected generated Configuration
Path expectedGeneratedConfigurationPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("generation/expectedDefaultConfigurationForSchemaWithReusedType.json").toURI());
String expectedGeneratedConfiguration = new String(Files.readAllBytes(expectedGeneratedConfigurationPath));
GenericAvroConverter<GenericRecord> converter = new GenericAvroConverter<>(configuraionSchema.getRawSchema());
GenericRecord generatedConfigurationGenericRecord = converter.decodeJson(generatedConfiguration.getRawData());
GenericRecord expectedGeneratedConfigurationGenericRecord = converter.decodeJson(expectedGeneratedConfiguration);
AvroDataCanonizationUtils.removeUuid(generatedConfigurationGenericRecord);
AvroDataCanonizationUtils.removeUuid(expectedGeneratedConfigurationGenericRecord);
Assert.assertTrue(generatedConfigurationGenericRecord.equals(expectedGeneratedConfigurationGenericRecord));
}
@Test
public void testGetRootBinaryConfigurationFailsWhenByDefauleIsMissed() throws Exception {
// Read Configuration Schema
Path schemaPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("generation/schemaWithMissedByDefault.json").toURI());
BaseSchema configuraionSchema = new BaseSchema(new String(Files.readAllBytes(schemaPath)));
// generated default configuration
DefaultRecordGenerationAlgorithm configurationProcessor = new DefaultRecordGenerationAlgorithmImpl(configuraionSchema, new BaseDataFactory());
GenericRecord generatedConfiguration = configurationProcessor.getRootConfiguration();
Assert.assertEquals(0, generatedConfiguration.get("testField5"));
}
@Test
public void testGetConfigurationByNameForNullNameParameter() throws Exception {
// Read Configuration Schema
Path schemaPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("generation/complexSchema.json").toURI());
BaseSchema configuraionSchema = new BaseSchema(new String(Files.readAllBytes(schemaPath)));
// generated default configuration
DefaultRecordGenerationAlgorithm configurationProcessor = new DefaultRecordGenerationAlgorithmImpl(configuraionSchema, new BaseDataFactory());
GenericRecord generatedConfiguration = configurationProcessor.getConfigurationByName(null, "org.kaa.config");
Assert.assertNull(generatedConfiguration);
}
@Test
public void testGetConfigurationByNameForNullNamespaceParameter() throws Exception {
// Read Configuration Schema
Path schemaPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("generation/complexSchema.json").toURI());
BaseSchema configuraionSchema = new BaseSchema(new String(Files.readAllBytes(schemaPath)));
// generated default configuration
DefaultRecordGenerationAlgorithm configurationProcessor = new DefaultRecordGenerationAlgorithmImpl(configuraionSchema, new BaseDataFactory());
GenericRecord generatedConfiguration = configurationProcessor.getConfigurationByName("testT", null);
Assert.assertNull(generatedConfiguration);
}
@Test
public void testGetConfigurationByNameForMissedSchema() throws Exception {
// Read Configuration Schema
Path schemaPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("generation/complexSchema.json").toURI());
BaseSchema configuraionSchema = new BaseSchema(new String(Files.readAllBytes(schemaPath)));
// generated default configuration
DefaultRecordGenerationAlgorithm configurationProcessor = new DefaultRecordGenerationAlgorithmImpl(configuraionSchema, new BaseDataFactory());
GenericRecord generatedConfiguration = configurationProcessor.getConfigurationByName("missed", "org.kaa.config");
Assert.assertNull(generatedConfiguration);
}
@Test
public void testGetConfigurationByNameForNestedType() throws Exception {
// Read Configuration Schema
Path schemaPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("generation/complexSchema.json").toURI());
BaseSchema configuraionSchema = new BaseSchema(new String(Files.readAllBytes(schemaPath)));
// generated default configuration
DefaultRecordGenerationAlgorithm configurationProcessor = new DefaultRecordGenerationAlgorithmImpl(configuraionSchema, new BaseDataFactory());
configurationProcessor.getConfigurationByName("testRecordItemT", "org.kaa.config");
GenericRecord generatedConfiguration = configurationProcessor.getConfigurationByName("testRecordItemT", "org.kaa.config");
Assert.assertNotNull(generatedConfiguration);
Assert.assertEquals(4, generatedConfiguration.get("testField4"));
}
}