/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.apache.atlas.type; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import org.apache.atlas.AtlasErrorCode; import org.apache.atlas.exception.AtlasBaseException; import org.apache.atlas.model.ModelTestUtil; import org.apache.atlas.model.instance.AtlasStruct; import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_INT; import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_DATE; import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_BIGINTEGER; import org.apache.atlas.model.typedef.AtlasBaseTypeDef; import org.apache.atlas.model.typedef.AtlasStructDef; import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef; import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef.Cardinality; import org.testng.annotations.Test; import static org.testng.Assert.*; public class TestAtlasStructType { private static final String MULTI_VAL_ATTR_NAME_MIN_MAX = "multiValMinMax"; private static final String MULTI_VAL_ATTR_NAME_MIN = "multiValMin"; private static final String MULTI_VAL_ATTR_NAME_MAX = "multiValMax"; private static final int MULTI_VAL_ATTR_MIN_COUNT = 2; private static final int MULTI_VAL_ATTR_MAX_COUNT = 5; private final AtlasStructType structType; private final List<Object> validValues; private final List<Object> invalidValues; { AtlasAttributeDef multiValuedAttribMinMax = new AtlasAttributeDef(); AtlasAttributeDef multiValuedAttribMin = new AtlasAttributeDef(); AtlasAttributeDef multiValuedAttribMax = new AtlasAttributeDef(); multiValuedAttribMinMax.setName(MULTI_VAL_ATTR_NAME_MIN_MAX); multiValuedAttribMinMax.setTypeName(AtlasBaseTypeDef.getArrayTypeName(ATLAS_TYPE_INT)); multiValuedAttribMinMax.setCardinality(Cardinality.LIST); multiValuedAttribMinMax.setValuesMinCount(MULTI_VAL_ATTR_MIN_COUNT); multiValuedAttribMinMax.setValuesMaxCount(MULTI_VAL_ATTR_MAX_COUNT); multiValuedAttribMin.setName(MULTI_VAL_ATTR_NAME_MIN); multiValuedAttribMin.setTypeName(AtlasBaseTypeDef.getArrayTypeName(ATLAS_TYPE_INT)); multiValuedAttribMin.setCardinality(Cardinality.SET); multiValuedAttribMin.setValuesMinCount(MULTI_VAL_ATTR_MIN_COUNT); multiValuedAttribMax.setName(MULTI_VAL_ATTR_NAME_MAX); multiValuedAttribMax.setTypeName(AtlasBaseTypeDef.getArrayTypeName(ATLAS_TYPE_INT)); multiValuedAttribMax.setCardinality(Cardinality.LIST); multiValuedAttribMax.setValuesMaxCount(MULTI_VAL_ATTR_MAX_COUNT); AtlasStructDef structDef = ModelTestUtil.newStructDef(); structDef.addAttribute(multiValuedAttribMinMax); structDef.addAttribute(multiValuedAttribMin); structDef.addAttribute(multiValuedAttribMax); structType = getStructType(structDef); validValues = new ArrayList<>(); invalidValues = new ArrayList<>(); AtlasStruct invalidValue1 = structType.createDefaultValue(); AtlasStruct invalidValue2 = structType.createDefaultValue(); AtlasStruct invalidValue3 = structType.createDefaultValue(); AtlasStruct invalidValue4 = structType.createDefaultValue(); AtlasStruct invalidValue5 = structType.createDefaultValue(); AtlasStruct invalidValue6 = structType.createDefaultValue(); AtlasStruct invalidValue7 = structType.createDefaultValue(); // invalid value for int invalidValue1.setAttribute(ModelTestUtil.getDefaultAttributeName(ATLAS_TYPE_INT), "xyz"); // invalid value for date invalidValue2.setAttribute(ModelTestUtil.getDefaultAttributeName(ATLAS_TYPE_DATE), "xyz"); // invalid value for bigint invalidValue3.setAttribute(ModelTestUtil.getDefaultAttributeName(ATLAS_TYPE_BIGINTEGER), "xyz"); // minCount is less than required invalidValue4.setAttribute(MULTI_VAL_ATTR_NAME_MIN_MAX, new Integer[] { 1 }); // maxCount is more than allowed invalidValue5.setAttribute(MULTI_VAL_ATTR_NAME_MIN_MAX, new Integer[] { 1, 2, 3, 4, 5, 6 }); // minCount is less than required invalidValue6.setAttribute(MULTI_VAL_ATTR_NAME_MIN, new Integer[] { }); // maxCount is more than allowed invalidValue7.setAttribute(MULTI_VAL_ATTR_NAME_MAX, new Integer[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); validValues.add(null); validValues.add(structType.createDefaultValue()); validValues.add(structType.createDefaultValue().getAttributes()); // Map<String, Object> invalidValues.add(invalidValue1); invalidValues.add(invalidValue2); invalidValues.add(invalidValue3); invalidValues.add(invalidValue4); invalidValues.add(invalidValue5); invalidValues.add(invalidValue6); invalidValues.add(invalidValue7); invalidValues.add(new AtlasStruct()); // no values for mandatory attributes invalidValues.add(new HashMap<>()); // no values for mandatory attributes invalidValues.add(1); // incorrect datatype invalidValues.add(new HashSet()); // incorrect datatype invalidValues.add(new ArrayList()); // incorrect datatype invalidValues.add(new String[] {}); // incorrect datatype } @Test public void testStructTypeDefaultValue() { AtlasStruct defValue = structType.createDefaultValue(); assertNotNull(defValue); assertEquals(defValue.getTypeName(), structType.getTypeName()); } @Test public void testStructTypeIsValidValue() { for (Object value : validValues) { assertTrue(structType.isValidValue(value), "value=" + value); } for (Object value : invalidValues) { assertFalse(structType.isValidValue(value), "value=" + value); } } @Test public void testStructTypeGetNormalizedValue() { assertNull(structType.getNormalizedValue(null), "value=" + null); for (Object value : validValues) { if (value == null) { continue; } Object normalizedValue = structType.getNormalizedValue(value); assertNotNull(normalizedValue, "value=" + value); } for (Object value : invalidValues) { assertNull(structType.getNormalizedValue(value), "value=" + value); } } @Test public void testStructTypeValidateValue() { List<String> messages = new ArrayList<>(); for (Object value : validValues) { assertTrue(structType.validateValue(value, "testObj", messages)); assertEquals(messages.size(), 0, "value=" + value); } for (Object value : invalidValues) { assertFalse(structType.validateValue(value, "testObj", messages)); assertTrue(messages.size() > 0, "value=" + value); messages.clear(); } } @Test public void testInvalidStructDef_MultiValuedAttributeNotArray() { AtlasAttributeDef invalidMultiValuedAttrib = new AtlasAttributeDef("invalidAttributeDef", ATLAS_TYPE_INT); invalidMultiValuedAttrib.setCardinality(Cardinality.LIST); AtlasStructDef invalidStructDef = ModelTestUtil.newStructDef(); invalidStructDef.addAttribute(invalidMultiValuedAttrib); try { AtlasStructType invalidStructType = new AtlasStructType(invalidStructDef, ModelTestUtil.getTypesRegistry()); fail("invalidStructDef not detected: structDef=" + invalidStructDef + "; structType=" + invalidStructType); } catch (AtlasBaseException excp) { assertTrue(excp.getAtlasErrorCode() == AtlasErrorCode.INVALID_ATTRIBUTE_TYPE_FOR_CARDINALITY); invalidStructDef.removeAttribute("invalidAttributeDef"); } } private static AtlasStructType getStructType(AtlasStructDef structDef) { try { return new AtlasStructType(structDef, ModelTestUtil.getTypesRegistry()); } catch (AtlasBaseException excp) { return null; } } }