/*- * See the file LICENSE for redistribution information. * * Copyright (c) 2000, 2015 Oracle and/or its affiliates. All rights reserved. * */ package com.sleepycat.persist.test; import java.util.Iterator; import java.util.List; import junit.framework.TestCase; import com.sleepycat.db.DatabaseException; import com.sleepycat.db.Environment; import com.sleepycat.persist.EntityStore; import com.sleepycat.persist.StoreConfig; import com.sleepycat.persist.evolve.Mutations; import com.sleepycat.persist.model.ClassMetadata; import com.sleepycat.persist.model.EntityModel; import com.sleepycat.persist.model.Persistent; import com.sleepycat.persist.raw.RawStore; import com.sleepycat.persist.raw.RawType; @Persistent abstract class EvolveCase { static final String STORE_NAME = "foo"; transient boolean updated; transient boolean newMetadataWritten; Mutations getMutations() { return null; } void configure(EntityModel model, StoreConfig config) { } String getStoreOpenException() { return null; } int getNRecordsExpected() { return 1; } void checkUnevolvedModel(EntityModel model, Environment env) { } void checkEvolvedModel(EntityModel model, Environment env, boolean oldTypesExist) { } /** * @throws DatabaseException from subclasses. */ void writeObjects(EntityStore store) throws DatabaseException { } /** * @throws DatabaseException from subclasses. */ void readObjects(EntityStore store, boolean doUpdate) throws DatabaseException { } /** * @throws DatabaseException from subclasses. */ void readRawObjects(RawStore store, boolean expectEvolved, boolean expectUpdated) throws DatabaseException { } /** * @throws DatabaseException from subclasses. */ void copyRawObjects(RawStore rawStore, EntityStore newStore) throws DatabaseException { } /** * Checks for equality and prints the entire values rather than * abbreviated values like TestCase.assertEquals does. */ static void checkEquals(Object expected, Object got) { if ((expected != null) ? (!expected.equals(got)) : (got != null)) { TestCase.fail("Expected:\n" + expected + "\nBut got:\n" + got); } } /** * Asserts than an entity database exists or does not exist. */ void assertDbExists(boolean expectExists, Environment env, String entityClassName) { assertDbExists(expectExists, env, entityClassName, null); } /** * Checks that an entity class exists or does not exist. */ void checkEntity(boolean exists, EntityModel model, Environment env, String className, int version, String secKeyName) { if (exists) { TestCase.assertNotNull(model.getEntityMetadata(className)); ClassMetadata meta = model.getClassMetadata(className); TestCase.assertNotNull(meta); TestCase.assertEquals(version, meta.getVersion()); TestCase.assertTrue(meta.isEntityClass()); RawType raw = model.getRawType(className); TestCase.assertNotNull(raw); TestCase.assertEquals(version, raw.getVersion()); RawType rawVersion = model.getRawTypeVersion(className, version); TestCase.assertNotNull(rawVersion); TestCase.assertTrue(!rawVersion.isDeleted()); } else { TestCase.assertNull(model.getEntityMetadata(className)); TestCase.assertNull(model.getClassMetadata(className)); TestCase.assertNull(model.getRawType(className)); RawType rawVersion = model.getRawTypeVersion(className, version); TestCase.assertTrue(rawVersion == null || rawVersion.isDeleted()); } assertDbExists(exists, env, className); if (secKeyName != null) { assertDbExists(exists, env, className, secKeyName); } } /** * Checks that a non-entity class exists or does not exist. */ void checkNonEntity(boolean exists, EntityModel model, Environment env, String className, int version) { if (exists) { ClassMetadata meta = model.getClassMetadata(className); TestCase.assertNotNull(meta); TestCase.assertEquals(version, meta.getVersion()); TestCase.assertTrue(!meta.isEntityClass()); RawType raw = model.getRawType(className); TestCase.assertNotNull(raw); TestCase.assertEquals(version, raw.getVersion()); RawType rawVersion = model.getRawTypeVersion(className, version); TestCase.assertNotNull(rawVersion); TestCase.assertTrue(!rawVersion.isDeleted()); } else { TestCase.assertNull(model.getClassMetadata(className)); TestCase.assertNull(model.getRawType(className)); RawType rawVersion = model.getRawTypeVersion(className, version); TestCase.assertTrue(rawVersion == null || rawVersion.isDeleted()); } TestCase.assertNull(model.getEntityMetadata(className)); assertDbExists(false, env, className); } /** * Asserts than a database expectExists or does not exist. If keyName is * null, checks an entity database. If keyName is non-null, checks a * secondary database. */ void assertDbExists(boolean expectExists, Environment env, String entityClassName, String keyName) { /* * If the evolved metadata has not been written (e.g., we're in * read-only mode), then class evolution will not yet have created, * removed or renamed databases, and we cannot check their existence. */ if (newMetadataWritten) { PersistTestUtils.assertDbExists (expectExists, env, STORE_NAME, entityClassName, keyName); } } static void checkVersions(EntityModel model, String name, int version) { checkVersions(model, new String[] {name}, new int[] {version}); } static void checkVersions(EntityModel model, String name1, int version1, String name2, int version2) { checkVersions (model, new String[] {name1, name2}, new int[] {version1, version2}); } private static void checkVersions(EntityModel model, String[] names, int[] versions) { List<RawType> all = model.getAllRawTypeVersions(names[0]); TestCase.assertNotNull(all); assert names.length == versions.length; TestCase.assertEquals(all.toString(), names.length, all.size()); Iterator<RawType> iter = all.iterator(); for (int i = 0; i < names.length; i += 1) { RawType type = iter.next(); TestCase.assertEquals(versions[i], type.getVersion()); TestCase.assertEquals(names[i], type.getClassName()); } } }