/* * 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.validator; import org.apache.avro.Schema; import org.apache.avro.generic.GenericArray; import org.apache.avro.generic.GenericData; import org.apache.avro.generic.GenericFixed; import org.apache.avro.generic.GenericRecord; import org.junit.Assert; import org.junit.Test; import org.kaaproject.kaa.common.avro.GenericAvroConverter; import org.kaaproject.kaa.server.common.core.algorithms.AvroUtils; import org.kaaproject.kaa.server.common.core.algorithms.CommonConstants; import org.kaaproject.kaa.server.common.core.configuration.BaseData; 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; public class DefaultUuidValidatorTest { @Test public void testGeneration() throws Exception { // Read Configuration Schema Path schemaPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("generation/simpleSchema.json").toURI()); BaseSchema configuraionSchema = new BaseSchema(new String(Files.readAllBytes(schemaPath))); Path configurationPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("generation/simpleConfiguration.json").toURI()); String configuraion = new String(Files.readAllBytes(configurationPath)); GenericAvroConverter<GenericRecord> converter = new GenericAvroConverter<>(configuraionSchema.getRawSchema()); // generated default configuration DefaultUuidValidator uuidGenerator = new DefaultUuidValidator(configuraionSchema, new BaseDataFactory()); KaaData processedConfigurationBody = uuidGenerator.validateUuidFields(new BaseData(configuraionSchema, configuraion), null); GenericRecord processedConfiguration = converter.decodeJson(processedConfigurationBody.getRawData()); Object uuid = processedConfiguration.get(CommonConstants.UUID_FIELD); Assert.assertNotNull(uuid); Assert.assertTrue(uuid instanceof GenericFixed); Assert.assertEquals(CommonConstants.KAA_NAMESPACE + "." + CommonConstants.UUID_TYPE, ((GenericFixed) uuid).getSchema().getFullName()); } @Test public void testValidationWithoutOldConfiguration() throws Exception { // Read Configuration Schema Path schemaPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("generation/simpleSchema.json").toURI()); BaseSchema configuraionSchema = new BaseSchema(new String(Files.readAllBytes(schemaPath))); Schema avroSchema = new Schema.Parser().parse(configuraionSchema.getRawSchema()); GenericRecord record = new GenericData.Record(avroSchema); record.put("intField", 5); GenericFixed uuid = AvroUtils.generateUuidObject(); record.put(CommonConstants.UUID_FIELD, uuid); GenericAvroConverter<GenericRecord> converter = new GenericAvroConverter<>(avroSchema); String configurationBody = converter.encodeToJson(record); DefaultUuidValidator uuidGenerator = new DefaultUuidValidator(configuraionSchema, new BaseDataFactory()); KaaData processedConfigurationBody = uuidGenerator.validateUuidFields(new BaseData(configuraionSchema, configurationBody), null); GenericRecord processedConfiguration = converter.decodeJson(processedConfigurationBody.getRawData()); Assert.assertNotEquals(processedConfiguration.get(CommonConstants.UUID_FIELD), uuid); } @Test public void testValidationWithOldConfiguration() throws Exception { // Read Configuration Schema Path schemaPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("generation/simpleSchema.json").toURI()); BaseSchema configuraionSchema = new BaseSchema(new String(Files.readAllBytes(schemaPath))); Schema avroSchema = new Schema.Parser().parse(configuraionSchema.getRawSchema()); GenericRecord recordNew = new GenericData.Record(avroSchema); recordNew.put("intField", 4); GenericFixed uuidNew = AvroUtils.generateUuidObject(); recordNew.put(CommonConstants.UUID_FIELD, uuidNew); GenericRecord recordOld = new GenericData.Record(avroSchema); recordOld.put("intField", 5); GenericFixed uuidOld = AvroUtils.generateUuidObject(); recordOld.put(CommonConstants.UUID_FIELD, uuidOld); GenericAvroConverter<GenericRecord> converter = new GenericAvroConverter<>(avroSchema); String configurationBodyNew = converter.encodeToJson(recordNew); String configurationBodyOld = converter.encodeToJson(recordOld); DefaultUuidValidator uuidGenerator = new DefaultUuidValidator(configuraionSchema, new BaseDataFactory()); KaaData processedConfigurationBody = uuidGenerator.validateUuidFields(recordNew, recordOld); GenericRecord processedConfiguration = converter.decodeJson(processedConfigurationBody.getRawData()); Assert.assertEquals(processedConfiguration.get(CommonConstants.UUID_FIELD), uuidOld); } @Test public void testValidationOfArrayFields() throws Exception { // Read Configuration Schema Path schemaPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("generation/arraySchema.json").toURI()); BaseSchema configuraionSchema = new BaseSchema(new String(Files.readAllBytes(schemaPath))); Schema.Parser schemaParser = new Schema.Parser(); Schema avroSchema = schemaParser.parse(configuraionSchema.getRawSchema()); GenericRecord recordNew1 = new GenericData.Record(schemaParser.getTypes().get("org.kaaproject.recordT")); recordNew1.put("intField", 4); GenericFixed uuidNew1 = AvroUtils.generateUuidObject(); recordNew1.put(CommonConstants.UUID_FIELD, uuidNew1); GenericRecord recordNew2 = new GenericData.Record(schemaParser.getTypes().get("org.kaaproject.recordT")); recordNew2.put("intField", 5); GenericFixed uuidNew2 = AvroUtils.generateUuidObject(); recordNew2.put(CommonConstants.UUID_FIELD, uuidNew2); GenericRecord rootNew = new GenericData.Record(avroSchema); GenericArray arrayNew = new GenericData.Array<>(2, rootNew.getSchema().getField("complexArrayField").schema()); arrayNew.add(recordNew1); arrayNew.add(recordNew2); rootNew.put("complexArrayField", arrayNew); GenericRecord recordOld1 = new GenericData.Record(schemaParser.getTypes().get("org.kaaproject.recordT")); recordOld1.put("intField", 6); recordOld1.put(CommonConstants.UUID_FIELD, uuidNew1); GenericRecord recordOld2 = new GenericData.Record(schemaParser.getTypes().get("org.kaaproject.recordT")); recordOld2.put("intField", 7); GenericFixed uuidOld2 = AvroUtils.generateUuidObject(); recordOld2.put(CommonConstants.UUID_FIELD, uuidOld2); GenericRecord rootOld = new GenericData.Record(avroSchema); GenericArray arrayOld = new GenericData.Array<>(2, rootOld.getSchema().getField("complexArrayField").schema()); arrayOld.add(recordOld1); arrayOld.add(recordOld2); rootOld.put("complexArrayField", arrayOld); rootOld.put(CommonConstants.UUID_FIELD, AvroUtils.generateUuidObject()); GenericAvroConverter<GenericRecord> converter = new GenericAvroConverter<>(avroSchema); String configurationBodyNew = converter.encodeToJson(rootNew); String configurationBodyOld = converter.encodeToJson(rootOld); DefaultUuidValidator uuidGenerator = new DefaultUuidValidator(configuraionSchema, new BaseDataFactory()); KaaData processedConfigurationBody = uuidGenerator.validateUuidFields(rootNew, rootOld); GenericRecord processedConfiguration = converter.decodeJson(processedConfigurationBody.getRawData()); GenericArray processedArray = (GenericArray) processedConfiguration.get("complexArrayField"); GenericRecord record1 = (GenericRecord) processedArray.get(0); GenericRecord record2 = (GenericRecord) processedArray.get(1); Assert.assertEquals(uuidNew1, record1.get(CommonConstants.UUID_FIELD)); Assert.assertNotEquals(uuidNew2, record2.get(CommonConstants.UUID_FIELD)); Assert.assertNotNull(processedConfiguration.get(CommonConstants.UUID_FIELD)); } @Test public void testValidationOfDifferentTypes() throws Exception { // Read Configuration Schema Path schemaPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("generation/arraySchema.json").toURI()); BaseSchema configuraionSchema = new BaseSchema(new String(Files.readAllBytes(schemaPath))); Schema.Parser schemaParser = new Schema.Parser(); Schema avroSchema = schemaParser.parse(configuraionSchema.getRawSchema()); GenericRecord recordNew1 = new GenericData.Record(schemaParser.getTypes().get("org.kaaproject.recordT")); recordNew1.put("intField", 4); GenericFixed uuidNew1 = AvroUtils.generateUuidObject(); recordNew1.put(CommonConstants.UUID_FIELD, uuidNew1); GenericRecord recordNew2 = new GenericData.Record(schemaParser.getTypes().get("org.kaaproject.recordT")); recordNew2.put("intField", 5); GenericFixed uuidNew2 = AvroUtils.generateUuidObject(); recordNew2.put(CommonConstants.UUID_FIELD, uuidNew2); GenericRecord rootNew = new GenericData.Record(avroSchema); GenericArray arrayNew = new GenericData.Array<>(2, rootNew.getSchema().getField("complexArrayField").schema()); arrayNew.add(recordNew1); arrayNew.add(recordNew2); rootNew.put("complexArrayField", arrayNew); rootNew.put(CommonConstants.UUID_FIELD, uuidNew2); GenericRecord recordOld1 = new GenericData.Record(schemaParser.getTypes().get("org.kaaproject.recordT")); recordOld1.put("intField", 6); recordOld1.put(CommonConstants.UUID_FIELD, uuidNew1); GenericRecord recordOld2 = new GenericData.Record(schemaParser.getTypes().get("org.kaaproject.recordT")); recordOld2.put("intField", 7); GenericFixed uuidOld2 = AvroUtils.generateUuidObject(); recordOld2.put(CommonConstants.UUID_FIELD, uuidOld2); GenericRecord rootOld = new GenericData.Record(avroSchema); GenericArray arrayOld = new GenericData.Array<>(2, rootOld.getSchema().getField("complexArrayField").schema()); arrayOld.add(recordOld1); arrayOld.add(recordOld2); rootOld.put("complexArrayField", arrayOld); rootOld.put(CommonConstants.UUID_FIELD, uuidNew2); GenericAvroConverter<GenericRecord> converter = new GenericAvroConverter<>(avroSchema); String configurationBodyNew = converter.encodeToJson(rootNew); String configurationBodyOld = converter.encodeToJson(rootOld); DefaultUuidValidator uuidGenerator = new DefaultUuidValidator(configuraionSchema, new BaseDataFactory()); KaaData processedConfigurationBody = uuidGenerator.validateUuidFields(rootNew, rootOld); GenericRecord processedConfiguration = converter.decodeJson(processedConfigurationBody.getRawData()); GenericArray processedArray = (GenericArray) processedConfiguration.get("complexArrayField"); GenericRecord record1 = (GenericRecord) processedArray.get(0); GenericRecord record2 = (GenericRecord) processedArray.get(1); Assert.assertEquals(uuidNew1, record1.get(CommonConstants.UUID_FIELD)); Assert.assertNotEquals(uuidNew2, record2.get(CommonConstants.UUID_FIELD)); Assert.assertEquals(uuidNew2, processedConfiguration.get(CommonConstants.UUID_FIELD)); } @Test public void testValidationOfIdenticalUuids() throws Exception { // Read Configuration Schema Path schemaPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("generation/arraySchema.json").toURI()); BaseSchema configuraionSchema = new BaseSchema(new String(Files.readAllBytes(schemaPath))); Schema.Parser schemaParser = new Schema.Parser(); Schema avroSchema = schemaParser.parse(configuraionSchema.getRawSchema()); GenericRecord recordNew1 = new GenericData.Record(schemaParser.getTypes().get("org.kaaproject.recordT")); recordNew1.put("intField", 4); GenericFixed uuidNew1 = AvroUtils.generateUuidObject(); recordNew1.put(CommonConstants.UUID_FIELD, uuidNew1); GenericRecord recordNew2 = new GenericData.Record(schemaParser.getTypes().get("org.kaaproject.recordT")); recordNew2.put("intField", 5); recordNew2.put(CommonConstants.UUID_FIELD, uuidNew1); GenericRecord rootNew = new GenericData.Record(avroSchema); GenericArray arrayNew = new GenericData.Array<>(2, rootNew.getSchema().getField("complexArrayField").schema()); arrayNew.add(recordNew1); arrayNew.add(recordNew2); rootNew.put("complexArrayField", arrayNew); GenericRecord recordOld1 = new GenericData.Record(schemaParser.getTypes().get("org.kaaproject.recordT")); recordOld1.put("intField", 6); recordOld1.put(CommonConstants.UUID_FIELD, uuidNew1); GenericRecord recordOld2 = new GenericData.Record(schemaParser.getTypes().get("org.kaaproject.recordT")); recordOld2.put("intField", 7); GenericFixed uuidOld2 = AvroUtils.generateUuidObject(); recordOld2.put(CommonConstants.UUID_FIELD, uuidOld2); GenericRecord rootOld = new GenericData.Record(avroSchema); GenericArray arrayOld = new GenericData.Array<>(2, rootOld.getSchema().getField("complexArrayField").schema()); arrayOld.add(recordOld1); arrayOld.add(recordOld2); rootOld.put("complexArrayField", arrayOld); rootOld.put(CommonConstants.UUID_FIELD, AvroUtils.generateUuidObject()); GenericAvroConverter<GenericRecord> converter = new GenericAvroConverter<>(avroSchema); String configurationBodyNew = converter.encodeToJson(rootNew); String configurationBodyOld = converter.encodeToJson(rootOld); DefaultUuidValidator uuidGenerator = new DefaultUuidValidator(configuraionSchema, new BaseDataFactory()); KaaData processedConfigurationBody = uuidGenerator.validateUuidFields(rootNew, rootOld); GenericRecord processedConfiguration = converter.decodeJson(processedConfigurationBody.getRawData()); GenericArray processedArray = (GenericArray) processedConfiguration.get("complexArrayField"); GenericRecord record1 = (GenericRecord) processedArray.get(0); GenericRecord record2 = (GenericRecord) processedArray.get(1); Assert.assertEquals(uuidNew1, record1.get(CommonConstants.UUID_FIELD)); Assert.assertNotEquals(uuidNew1, record2.get(CommonConstants.UUID_FIELD)); Assert.assertNotNull(processedConfiguration.get(CommonConstants.UUID_FIELD)); } @Test public void testValidationOfComplexTypes() throws Exception { // Read Configuration Schema Path schemaPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("generation/simpleComplexSchema.json").toURI()); BaseSchema configuraionSchema = new BaseSchema(new String(Files.readAllBytes(schemaPath))); Schema.Parser schemaParser = new Schema.Parser(); Schema avroSchema = schemaParser.parse(configuraionSchema.getRawSchema()); GenericRecord recordNew1 = new GenericData.Record(schemaParser.getTypes().get("org.kaaproject.recordT")); recordNew1.put("intField", 4); GenericFixed uuidNew1 = AvroUtils.generateUuidObject(); recordNew1.put(CommonConstants.UUID_FIELD, uuidNew1); GenericRecord rootNew = new GenericData.Record(avroSchema); rootNew.put("recordField", recordNew1); GenericRecord recordOld1 = new GenericData.Record(schemaParser.getTypes().get("org.kaaproject.recordT")); recordOld1.put("intField", 6); recordOld1.put(CommonConstants.UUID_FIELD, uuidNew1); GenericRecord rootOld = new GenericData.Record(avroSchema); rootOld.put("recordField", recordOld1); rootOld.put(CommonConstants.UUID_FIELD, AvroUtils.generateUuidObject()); GenericAvroConverter<GenericRecord> converter = new GenericAvroConverter<>(avroSchema); String configurationBodyNew = converter.encodeToJson(rootNew); String configurationBodyOld = converter.encodeToJson(rootOld); DefaultUuidValidator uuidGenerator = new DefaultUuidValidator(configuraionSchema, new BaseDataFactory()); KaaData processedConfigurationBody = uuidGenerator.validateUuidFields(rootNew, rootOld); GenericRecord processedConfiguration = converter.decodeJson(processedConfigurationBody.getRawData()); GenericRecord processedRecord = (GenericRecord) processedConfiguration.get("recordField"); Assert.assertEquals(uuidNew1, processedRecord.get(CommonConstants.UUID_FIELD)); Assert.assertNotNull(processedConfiguration.get(CommonConstants.UUID_FIELD)); } @Test public void testValidationOfComplexWithoutOldConfiguration() throws Exception { // Read Configuration Schema Path schemaPath = Paths.get(Thread.currentThread().getContextClassLoader().getResource("generation/simpleComplexSchema.json").toURI()); BaseSchema configuraionSchema = new BaseSchema(new String(Files.readAllBytes(schemaPath))); Schema.Parser schemaParser = new Schema.Parser(); Schema avroSchema = schemaParser.parse(configuraionSchema.getRawSchema()); GenericRecord recordNew1 = new GenericData.Record(schemaParser.getTypes().get("org.kaaproject.recordT")); recordNew1.put("intField", 4); GenericFixed uuidNew1 = AvroUtils.generateUuidObject(); recordNew1.put(CommonConstants.UUID_FIELD, uuidNew1); GenericRecord rootNew = new GenericData.Record(avroSchema); rootNew.put("recordField", recordNew1); GenericAvroConverter<GenericRecord> converter = new GenericAvroConverter<>(avroSchema); String configurationBodyNew = converter.encodeToJson(rootNew); DefaultUuidValidator uuidGenerator = new DefaultUuidValidator(configuraionSchema, new BaseDataFactory()); KaaData processedConfigurationBody = uuidGenerator.validateUuidFields(rootNew, null); GenericRecord processedConfiguration = converter.decodeJson(processedConfigurationBody.getRawData()); GenericRecord processedRecord = (GenericRecord) processedConfiguration.get("recordField"); Assert.assertNotEquals(uuidNew1, processedRecord.get(CommonConstants.UUID_FIELD)); Assert.assertNotNull(processedConfiguration.get(CommonConstants.UUID_FIELD)); } }