blob: a37dd46b16d8861fa504704a4a636365878b0315 [file] [log] [blame]
/**
* 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;
}
}
}