/* * Copyright (c) 2008-2013 EMC Corporation * All Rights Reserved */ package com.emc.storageos.db.common; import java.util.ArrayList; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.db.client.model.AlternateId; import com.emc.storageos.db.client.model.Cf; import com.emc.storageos.db.client.model.DataObject; import com.emc.storageos.db.client.model.DbKeyspace; import com.emc.storageos.db.client.model.Encrypt; import com.emc.storageos.db.client.model.Name; import com.emc.storageos.db.client.model.NamedRelationIndex; import com.emc.storageos.db.client.model.Project; import com.emc.storageos.db.client.model.Shards; import com.emc.storageos.db.client.model.DbKeyspace.Keyspaces; import com.emc.storageos.db.client.upgrade.BaseCustomMigrationCallback; import com.emc.storageos.db.client.upgrade.CustomMigrationCallback; import com.emc.storageos.db.common.diff.DbSchemasDiff; import com.emc.storageos.db.common.schema.DataObjectSchema; import com.emc.storageos.db.common.schema.DbSchema; import com.emc.storageos.db.common.schema.DbSchemas; import com.emc.storageos.svcs.errorhandling.resources.MigrationCallbackException; public class BaseDbSchemaCheckerTest { protected DbSchema srcSchema; protected DbSchema tgtSchema; protected DbSchemas srcSchemas; protected DbSchemas tgtSchemas; protected DbSchemasDiff diff; @Before public void initialize() { srcSchema = new DataObjectSchema(ClassUT.class); srcSchemas = new DbSchemas(); srcSchemas.addSchema(srcSchema); tgtSchemas = new DbSchemas(); } @Test public void testMoveFieldToBaseClass() { srcSchemas.setSchemas(new ArrayList<DbSchema>()); tgtSchemas.setSchemas(new ArrayList<DbSchema>()); srcSchema = new DataObjectSchema(ChildClassUTBefore.class); srcSchema.setType(srcSchema.getType()); srcSchemas.addSchema(srcSchema); tgtSchema = new DataObjectSchema(ChildClassUTAfter1.class); tgtSchema.setType(tgtSchema.getType()); tgtSchemas.addSchema(tgtSchema); tgtSchema = new DataObjectSchema(ChildClassUTAfter2.class); tgtSchema.setType(tgtSchema.getType()); tgtSchemas.addSchema(tgtSchema); diff = new DbSchemasDiff(srcSchemas, tgtSchemas); Assert.assertTrue(diff.isUpgradable()); Assert.assertTrue(diff.isChanged()); } @Test public void testCustomMigrationExistingField() { tgtSchema = new DataObjectSchema(CustomMigrationExistingField.class); tgtSchema.setType(tgtSchema.getType()); tgtSchemas.addSchema(tgtSchema); diff = new DbSchemasDiff(srcSchemas, tgtSchemas); Assert.assertTrue(diff.isUpgradable()); Assert.assertFalse(diff.isChanged()); } @Test public void testCustomMigrationPreUpgrade() { srcSchemas.setSchemas(new ArrayList<DbSchema>()); tgtSchemas.setSchemas(new ArrayList<DbSchema>()); srcSchema = new DataObjectSchema(CustomMigrationExistingField.class); srcSchema.setType(srcSchema.getType()); srcSchemas.addSchema(srcSchema); tgtSchema = new DataObjectSchema(CustomMigrationExistingAndNewField.class); tgtSchema.setType(tgtSchema.getType()); tgtSchemas.addSchema(tgtSchema); diff = new DbSchemasDiff(srcSchemas, tgtSchemas); Assert.assertTrue(diff.isUpgradable()); Assert.assertTrue(diff.isChanged()); } /** * a DataObject derived class under test */ @Cf("schema_ut") protected static class ClassUT extends DataObject { private String fieldUT; @Name("field_ut") public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } } @Cf("schema_ut") @Shards(10) protected static class NewClassAnnotation extends DataObject { private String fieldUT; @Name("field_ut") public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } } protected static class RemovedClassAnnotation extends DataObject { private String fieldUT; @Name("field_ut") public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } } @Cf("schema_ut") protected static class WithIndexAnnotation extends DataObject { private String fieldUT; @Name("field_ut") @AlternateId("altIdName") public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } } @Cf("schema_ut") protected static class WithRemovedIndexAnnotation extends DataObject { private String fieldUT; @Name("field_ut") public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } } @Cf("class_new_annotation_value") protected static class NewClassAnnotationValue extends DataObject { private String fieldUT; @Name("field_ut") public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } } @Cf("schema_ut") protected static class RemovedField extends DataObject { } @Cf("schema_ut") protected static class NewField extends DataObject { private String fieldUT; private String newFieldUT; @Name("field_ut") public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } @Name("new_field_ut") public String getNewFieldUT() { return newFieldUT; } public void setNewFieldUT(String newFieldUT) { this.newFieldUT = newFieldUT; } } @Cf("schema_ut") protected static class NewFieldType extends DataObject { private Boolean fieldUT; @Name("field_ut") public Boolean getFieldUT() { return fieldUT; } public void setFieldUT(Boolean fieldUT) { this.fieldUT = fieldUT; } } @Cf("schema_ut") protected static class NewFieldAnnotation extends DataObject { private String fieldUT; @Name("field_ut") @AlternateId("field_ut") public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } } @Cf("schema_ut") protected static class RemovedFieldAnnotation extends DataObject { private String fieldUT; public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } } @Cf("schema_ut") protected static class WithChangedAnnotationValue extends DataObject { private String fieldUT; @Name("new_field_name_ut") public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } } @Cf("schema_ut") protected static class NewPermittedFieldAnnotation extends DataObject { private String fieldUT; @Name("field_ut") @AlternateId("PermittedNewIndex") public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } } @Cf("schema_ut") protected static class NewNotPermittedFieldAnnotation extends DataObject { private String fieldUT; @Name("field_ut") @Encrypt public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } } @Cf("schema_ut2") protected static class classUT2 extends DataObject { private String fieldUT; @Name("field_ut") public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } } @Cf("schema_ut") protected static class DuplicateCF1 extends DataObject { private String fieldUT; @Name("field_ut") public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } } @Cf("schema_ut") protected static class DuplicateCF2 extends DataObject { private String fieldUT; @Name("field_ut") public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } } @Cf("schema_ut_2") protected static class ClassUT7 extends DataObject { private String fieldUT; @Name("field_ut") public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } } @Cf("schema_ut_2") protected static class ClassUT3 extends DataObject { private String fieldUT; @Name("field_ut") @Encrypt public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } } @Cf("schema_ut_3") protected static class ClassUT4 extends DataObject { private String fieldUT; @Name("field_ut") public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } } @Cf("schema_ut_4") protected static class ClassUT5 extends DataObject { private String fieldUT; @Name("field_ut") public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } } @Cf("schema_ut_4") protected static class ClassUT6 extends DataObject { private String fieldUT; public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } } @Cf("schema_ut") protected static class WithNamedRelationIndex extends DataObject { private String fieldUT; @NamedRelationIndex(cf = "NamedRelation", type = Project.class) @Name("field_ut") public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } } protected static class BaseClassUTBefore extends DataObject { } @Cf("schema_ut") protected static class ChildClassUTBefore extends BaseClassUTBefore { private String fieldUT; private String unchangedField; @Name("field_ut") public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } @Name("unchnaged_field") public String getUnchangedField() { return unchangedField; } public void setUnchangedField(String unchangedField) { this.unchangedField = unchangedField; } } protected static class BaseClassUTAfter extends DataObject { private String fieldUT; @Name("field_ut") @CustomMigrationCallback(callback = MyTestMigrationCallback.class) public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } } @Cf("schema_ut") protected static class ChildClassUTAfter1 extends BaseClassUTAfter { private String unchangedField; @Name("unchnaged_field") @AlternateId("AltIdName") public String getUnchangedField() { return unchangedField; } public void setUnchangedField(String unchangedField) { this.unchangedField = unchangedField; } } @Cf("schema_ut2") protected static class ChildClassUTAfter2 extends BaseClassUTAfter { } protected static class MyTestMigrationCallback extends BaseCustomMigrationCallback { private static final Logger log = LoggerFactory.getLogger(MyTestMigrationCallback.class); public MyTestMigrationCallback() { } @Override public void process() throws MigrationCallbackException { log.info("in custom migration process()"); } } protected static class MyTestMigrationCallback2 extends BaseCustomMigrationCallback { private static final Logger log = LoggerFactory.getLogger(MyTestMigrationCallback2.class); public MyTestMigrationCallback2() { } @Override public void process() throws MigrationCallbackException { log.info("in custom migration 2 process()"); } } @Cf("schema_ut") protected static class CustomMigrationExistingField extends DataObject { private String fieldUT; @Name("field_ut") @CustomMigrationCallback(callback = MyTestMigrationCallback2.class) public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } } @Cf("schema_ut") protected static class CustomMigrationExistingAndNewField extends DataObject { private String fieldUT; private String newField; @Name("field_ut") @CustomMigrationCallback(callback = MyTestMigrationCallback2.class) public String getFieldUT() { return fieldUT; } public void setFieldUT(String fieldUT) { this.fieldUT = fieldUT; } @Name("new_field") @CustomMigrationCallback(callback = MyTestMigrationCallback.class) public String getNewField() { return newField; } public void setNewField(String newField) { this.newField = newField; } } @Cf("geoSchema_ut") @DbKeyspace(Keyspaces.GLOBAL) protected static class GeoClassUT extends DataObject { private String geoFieldUT; @Name("geoField_ut") public String getGeoFieldUT() { return geoFieldUT; } public void setGeoFieldUT(String geoFieldUT) { this.geoFieldUT = geoFieldUT; } } @Cf("geoSchema_ut") @DbKeyspace(Keyspaces.GLOBAL) protected static class GeoNewAnnotationOnExistingField extends DataObject { private String geoFieldUT; @Name("geoField_ut") @AlternateId("geoField_ut") public String getGeoFieldUT() { return geoFieldUT; } public void setGeoFieldUT(String geoFieldUT) { this.geoFieldUT = geoFieldUT; } } @Cf("geoSchema_ut") @DbKeyspace(Keyspaces.GLOBAL) protected static class GeoNewField extends DataObject { private String geoFieldUT; private String newField; @Name("geoField_ut") public String getGeoFieldUT() { return geoFieldUT; } public void setGeoFieldUT(String geoFieldUT) { this.geoFieldUT = geoFieldUT; } @Name("new_field") @AlternateId("geoField_ut") public String getNewField() { return newField; } public void setNewField(String newField) { this.newField = newField; } } @Cf("geoSchema_ut_new") @DbKeyspace(Keyspaces.GLOBAL) protected static class GeoNewCF extends DataObject { private String geoFieldUT; @Name("geoField_ut") @AlternateId("geoField_ut") public String getGeoFieldUT() { return geoFieldUT; } public void setGeoFieldUT(String geoFieldUT) { this.geoFieldUT = geoFieldUT; } } }