/* * Copyright 2010 Outerthought bvba * * 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.lilyproject.repository.impl.test; import java.util.UUID; import org.junit.Test; import org.lilyproject.repository.api.FieldType; import org.lilyproject.repository.api.FieldTypeExistsException; import org.lilyproject.repository.api.FieldTypeNotFoundException; import org.lilyproject.repository.api.FieldTypeUpdateException; import org.lilyproject.repository.api.QName; import org.lilyproject.repository.api.SchemaId; import org.lilyproject.repository.api.Scope; import org.lilyproject.repository.api.TypeManager; import org.lilyproject.repository.api.ValueType; import org.lilyproject.repository.impl.id.SchemaIdImpl; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; public abstract class AbstractTypeManagerFieldTypeTest { private static String namespace = "NS"; protected static TypeManager typeManager; protected static boolean avro = false; @Test public void testCreate() throws Exception { QName name = new QName(namespace, "testCreate"); ValueType valueType = typeManager.getValueType("STRING"); FieldType fieldType = typeManager.newFieldType(valueType , name, Scope.NON_VERSIONED); fieldType = typeManager.createFieldType(fieldType); assertEquals(fieldType, typeManager.getFieldTypeById(fieldType.getId())); assertEquals(fieldType, typeManager.getFieldTypeByName(fieldType.getName())); assertEquals(typeManager.getFieldTypeById(fieldType.getId()), typeManager.getFieldTypeByName(name)); } @Test public void testCreateIgnoresGivenId() throws Exception { SchemaId id = new SchemaIdImpl(UUID.randomUUID()); ValueType valueType = typeManager.getValueType("STRING"); FieldType fieldType = typeManager.newFieldType(id, valueType , new QName(namespace, "aName"), Scope.VERSIONED_MUTABLE); fieldType = typeManager.createFieldType(fieldType); assertFalse(fieldType.getId().equals(id)); } @Test public void testCreateSameNameFails() throws Exception { QName name = new QName(namespace, "testCreateSameNameFails"); ValueType valueType = typeManager.getValueType("STRING"); FieldType fieldType = typeManager.newFieldType(valueType , name, Scope.NON_VERSIONED); fieldType = typeManager.createFieldType(fieldType); ValueType valueType2 = typeManager.getValueType("INTEGER"); FieldType fieldType2 = typeManager.newFieldType(valueType2, name, Scope.NON_VERSIONED); try { if (avro) { System.out.println("Expecting FieldTypeExistsException"); } fieldType = typeManager.createFieldType(fieldType2); fail(); } catch (FieldTypeExistsException expected) { } } @Test public void testUpdate() throws Exception { QName name = new QName(namespace, "testUpdate"); ValueType valueType = typeManager.getValueType("STRING"); FieldType fieldTypeCreate = typeManager.newFieldType(valueType , name, Scope.VERSIONED); fieldTypeCreate = typeManager.createFieldType(fieldTypeCreate); // Update name FieldType fieldTypeNewName = typeManager.newFieldType(fieldTypeCreate.getId(), valueType , new QName(namespace, "newName"), Scope.VERSIONED); fieldTypeNewName = typeManager.updateFieldType(fieldTypeNewName); assertEquals(fieldTypeCreate.getId(), fieldTypeNewName.getId()); assertEquals(fieldTypeNewName, typeManager.getFieldTypeById(fieldTypeCreate.getId())); assertEquals(typeManager.getFieldTypeById(fieldTypeCreate.getId()), typeManager.getFieldTypeByName(new QName(namespace, "newName"))); // Create new fieldType with first name ValueType valueType2 = typeManager.getValueType("INTEGER"); FieldType fieldType2 = typeManager.newFieldType(valueType2 , name, Scope.NON_VERSIONED); fieldType2 = typeManager.createFieldType(fieldTypeCreate); assertEquals(fieldType2, typeManager.getFieldTypeByName(name)); } @Test public void testUpdateValueTypeFails() throws Exception { QName name = new QName(namespace, "testUpdateValueTypeFails"); ValueType valueType = typeManager.getValueType("STRING"); FieldType fieldType = typeManager.newFieldType(valueType , name, Scope.VERSIONED); fieldType = typeManager.createFieldType(fieldType); fieldType.setValueType(typeManager.getValueType("INTEGER")); try { if (avro) { System.out.println("Expecting FieldTypeUpdateException"); } typeManager.updateFieldType(fieldType); fail("Changing the valueType of a fieldType is not allowed."); } catch (FieldTypeUpdateException e) { } } @Test public void testUpdateScopeFails() throws Exception { QName name = new QName(namespace, "testUpdateScopeFails"); ValueType valueType = typeManager.getValueType("STRING"); FieldType fieldType = typeManager.newFieldType(valueType , name, Scope.VERSIONED); fieldType = typeManager.createFieldType(fieldType); fieldType.setScope(Scope.NON_VERSIONED); try { if (avro) { System.out.println("Expecting FieldTypeUpdateException"); } typeManager.updateFieldType(fieldType); fail("Changing the scope of a fieldType is not allowed."); } catch (FieldTypeUpdateException e) { } } @Test public void testUpdateToAnExistingNameFails() throws Exception { QName name1 = new QName(namespace, "testUpdateToAnExistingNameFails1"); ValueType valueType = typeManager.getValueType("STRING"); FieldType fieldType = typeManager.newFieldType(valueType , name1, Scope.VERSIONED); fieldType = typeManager.createFieldType(fieldType); QName name2 = new QName(namespace, "testUpdateToAnExistingNameFails2"); ValueType valueType2 = typeManager.getValueType("STRING"); FieldType fieldType2 = typeManager.newFieldType(valueType2 , name2, Scope.VERSIONED); fieldType2 = typeManager.createFieldType(fieldType2); fieldType.setName(name2); try { if (avro) { System.out.println("Expecting FieldTypeUpdateException"); } typeManager.updateFieldType(fieldType); fail("Updating to a fieldType with an existing name is not allowed."); } catch (FieldTypeUpdateException e) { } } @Test public void testCreateOrUpdate() throws Exception { String NS = "testCreateOrUpdateFieldType"; // // Use createOrUpdate to create a new field type // FieldType fieldType = typeManager.newFieldType("STRING", new QName(NS, "field1"), Scope.NON_VERSIONED); fieldType = typeManager.createOrUpdateFieldType(fieldType); assertNotNull(fieldType.getId()); assertEquals(new QName(NS, "field1"), fieldType.getName()); // // Do a createOrUpdate with nothing changed // fieldType = typeManager.createOrUpdateFieldType(fieldType); assertNotNull(fieldType.getId()); assertEquals(new QName(NS, "field1"), fieldType.getName()); // // Use createOrUpdate to update the field type // fieldType.setName(new QName(NS, "field2")); fieldType = typeManager.createOrUpdateFieldType(fieldType); assertNotNull(fieldType.getId()); assertEquals(new QName(NS, "field2"), fieldType.getName()); // // Call createOrUpdate without name: should just return the complete type // fieldType.setName(null); fieldType = typeManager.createOrUpdateFieldType(fieldType); assertNotNull(fieldType.getId()); assertEquals(new QName(NS, "field2"), fieldType.getName()); // // Call createOrUpdate with a conflicting field type state // FieldType conflictFieldType = fieldType.clone(); conflictFieldType.setScope(Scope.VERSIONED); try { typeManager.createOrUpdateFieldType(conflictFieldType); fail("expected exception"); } catch (FieldTypeUpdateException e) { // expected } conflictFieldType = fieldType.clone(); conflictFieldType.setValueType(typeManager.getValueType("LIST<STRING>")); try { typeManager.createOrUpdateFieldType(conflictFieldType); fail("expected exception"); } catch (FieldTypeUpdateException e) { // expected } // // Call createOrUpdate without name and with conflicting state // conflictFieldType = fieldType.clone(); conflictFieldType.setName(null); conflictFieldType.setScope(Scope.VERSIONED_MUTABLE); try { typeManager.createOrUpdateFieldType(conflictFieldType); fail("expected exception"); } catch (FieldTypeUpdateException e) { // expected } // // Call createOrUpdate with name and without id // SchemaId expectedId = fieldType.getId(); fieldType.setId(null); fieldType = typeManager.createOrUpdateFieldType(fieldType); assertEquals(expectedId, fieldType.getId()); assertEquals(new QName(NS, "field2"), fieldType.getName()); // // Call createOrUpdate without scope // fieldType.setScope(null); fieldType = typeManager.createOrUpdateFieldType(fieldType); assertEquals(Scope.NON_VERSIONED, fieldType.getScope()); // // Call createOrUpdate without value type // fieldType.setValueType(null); fieldType = typeManager.createOrUpdateFieldType(fieldType); assertEquals(typeManager.getValueType("STRING"), fieldType.getValueType()); } @Test public void testFieldTypeBuilder() throws Exception { String NS = "testFieldTypeBuilder"; FieldType fieldType = typeManager .fieldTypeBuilder() .name(NS, "field1") .create(); // Verify setting of defaults assertEquals(Scope.NON_VERSIONED, fieldType.getScope()); assertEquals(typeManager.getValueType("STRING"), fieldType.getValueType()); // Supplying ID only should be enough for createOrUpdate to return the stored state fieldType = typeManager .fieldTypeBuilder() .id(fieldType.getId()) .createOrUpdate(); assertEquals(new QName(NS, "field1"), fieldType.getName()); assertEquals(Scope.NON_VERSIONED, fieldType.getScope()); assertEquals(typeManager.getValueType("STRING"), fieldType.getValueType()); fieldType = typeManager .fieldTypeBuilder() .name(NS, "field2") .type("LIST<STRING>") .scope(Scope.VERSIONED) .createOrUpdate(); assertEquals(Scope.VERSIONED, fieldType.getScope()); assertEquals(typeManager.getValueType("LIST<STRING>"), fieldType.getValueType()); try { typeManager .fieldTypeBuilder() .id(new SchemaIdImpl(UUID.randomUUID())) .name(NS, "field3") .update(); fail("expected exception"); } catch (FieldTypeNotFoundException e) { // expected } } }