// Copyright 2010 Google Inc. // // 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 com.google.enterprise.connector.persist; import com.google.common.collect.ImmutableMap; import com.google.enterprise.connector.instantiator.Configuration; import com.google.enterprise.connector.scheduler.Schedule; import junit.framework.AssertionFailedError; import junit.framework.TestCase; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.List; public class StoreMigratorTest extends TestCase { private PersistentStore emptyStore; @Override protected void setUp() { emptyStore = new MockPersistentStore(); } public void testZero() { List<PersistentStore> emptyList = Collections.<PersistentStore>emptyList(); StoreMigrator migrator = new StoreMigrator(emptyStore, emptyList); migrator.migrate(); assertTrue(emptyStore.toString(), emptyStore.getInventory().isEmpty()); } public void testEmpty() { List<PersistentStore> emptyStores = Arrays.asList(new PersistentStore[] { new MockPersistentStore(), new MockPersistentStore() }); StoreMigrator migrator = new StoreMigrator(emptyStore, emptyStores); migrator.migrate(); assertTrue(emptyStore.toString(), emptyStore.getInventory().isEmpty()); } public void testSingle() { ArrayList<PersistentStore> singleStore; singleStore = new ArrayList<PersistentStore>(); PersistentStore store = new MockPersistentStore(); StoreContext context = new StoreContext("name", "type"); storeObjects(store, context, true, true, true); singleStore.add(store); StoreMigrator migrator = new StoreMigrator(emptyStore, singleStore); migrator.migrate(); assertFalse(emptyStore.toString(), emptyStore.getInventory().isEmpty()); checkEquals(singleStore.get(0), emptyStore); } public void testMultiple() { ArrayList<PersistentStore> multipleStores; multipleStores = new ArrayList<PersistentStore>(); final boolean[] isObjects = { false, true }; for (int i = 0; i < 3; i++) { StoreContext context; PersistentStore store; store = new MockPersistentStore(); for (int icp = 0; icp < isObjects.length; icp++) { for (int ic = 0; ic < isObjects.length; ic++) { for (int is = 0; is < isObjects.length; is++) { context = new StoreContext("name" + i + icp + ic + is, "type"); storeObjects(store, context, isObjects[icp], isObjects[ic], isObjects[is]); } } } // One of the iterations is false, false, false and stores nothing. assertEquals(7, store.getInventory().size()); multipleStores.add(store); } StoreMigrator migrator = new StoreMigrator(emptyStore, multipleStores); migrator.migrate(); assertFalse(emptyStore.toString(), emptyStore.getInventory().isEmpty()); int instances = 0; for (PersistentStore store : multipleStores) { instances += store.getInventory().size(); } assertEquals(instances, emptyStore.getInventory().size()); } /** * Adds objects to the given store entry as defined by the booleans, * where <code>true</code> means store an object, and * <code>false</code> means do nothing for that object type. */ private void storeObjects(PersistentStore store, StoreContext context, boolean isCheckpoint, boolean isConfig, boolean isSched) { if (isCheckpoint) { store.storeConnectorState(context, new Date().toString()); } if (isConfig) { store.storeConnectorConfiguration(context, new Configuration( "testType", Collections.<String, String>emptyMap(), null)); } if (isSched) { store.storeConnectorSchedule(context, new Schedule("name:200:300000:0-0")); } } /** * Compares two persistent stores to ensure they have the same contents. * * @throws AssertionFailedError if the inventory or stored objects * are different */ private void checkEquals(PersistentStore expectedStore, PersistentStore actualStore) { ImmutableMap<StoreContext, ConnectorStamps> inventory = expectedStore.getInventory(); assertEquals(inventory.keySet(), actualStore.getInventory().keySet()); for (StoreContext context : inventory.keySet()) { Configuration econfig = expectedStore.getConnectorConfiguration(context); Configuration aconfig = actualStore.getConnectorConfiguration(context); if (econfig == null) { assertNull(aconfig); } else { // TODO: Implement equals and hashCode for Configuration? assertNotNull(aconfig); assertEquals(econfig.getTypeName(), aconfig.getTypeName()); assertEquals(econfig.getMap(), aconfig.getMap()); assertEquals(econfig.getXml(), aconfig.getXml()); } Schedule esched = expectedStore.getConnectorSchedule(context); Schedule asched = actualStore.getConnectorSchedule(context); if (esched == null) { assertNull(asched); } else { // TODO: Implement equals and hashCode for Schedule? assertEquals(esched.toString(), asched.toString()); } String echeckpoint = expectedStore.getConnectorState(context); String acheckpoint = actualStore.getConnectorState(context); if (echeckpoint == null) { assertNull(acheckpoint); } else { assertEquals(echeckpoint, acheckpoint); } // If there's an entry in the inventory, we should have at least // one object. assertTrue(Arrays.asList( new Object[] { econfig, esched, echeckpoint }).toString(), econfig != null || esched != null || echeckpoint != null); } } }