/* * Copyright (c) 2016 EMC Corporation * All Rights Reserved */ package com.emc.storageos.db.server.upgrade.impl.callback; import static org.junit.Assert.assertEquals; import java.lang.reflect.Field; import org.junit.Test; import com.emc.storageos.db.client.URIUtil; import com.emc.storageos.db.client.impl.CompositeColumnName; import com.emc.storageos.db.client.impl.DataObjectType; import com.emc.storageos.db.client.impl.DbClientImpl; import com.emc.storageos.db.client.impl.DbConsistencyChecker; import com.emc.storageos.db.client.impl.DbConsistencyCheckerHelper; import com.emc.storageos.db.client.impl.RowMutator; import com.emc.storageos.db.client.impl.TypeMap; import com.emc.storageos.db.client.model.FileShare; import com.emc.storageos.db.client.upgrade.callbacks.RebuildIndexDuplicatedCFNameMigration; import com.emc.storageos.db.server.DbsvcTestBase; import com.netflix.astyanax.connectionpool.OperationResult; import com.netflix.astyanax.model.Column; import com.netflix.astyanax.model.ColumnList; import com.netflix.astyanax.util.TimeUUIDUtils; public class RebuildIndexDuplicatedCFNameMigrationTest extends DbsvcTestBase { private RebuildIndexDuplicatedCFNameMigration target; @Test public void testHandleDataObjectClass() throws Exception { DataObjectType doType = TypeMap.getDoType(FileShare.class); for (int i = 0; i < 5; i++) { FileShare testData = new FileShare(); testData.setId(URIUtil.createId(FileShare.class)); testData.setPath("duplicated_value" + i); testData.setMountPath("duplicated_value" + i); getDbClient().updateObject(testData); } //create data object whose index are neede to be rebuild resetRowMutatorTimeStampOffSet(0); FileShare[] testDataArray = new FileShare[10]; for (int i = 0; i < 10; i++) { FileShare testData = new FileShare(); testData.setId(URIUtil.createId(FileShare.class)); testData.setPath("duplicated_value" + i); testData.setMountPath("duplicated_value" + i); testDataArray[i] = testData; getDbClient().updateObject(testData); } resetRowMutatorTimeStampOffSet(1); target = new RebuildIndexDuplicatedCFNameMigration(); target.setDbClient(getDbClient()); target.process(); assertEquals(testDataArray.length, target.getTotalProcessedIndexCount()); for (FileShare testData : testDataArray) { FileShare targetData = (FileShare)getDbClient().queryObject(testData.getId()); assertEquals(testData.getPath(), targetData.getPath()); assertEquals(testData.getMountPath(), targetData.getMountPath()); OperationResult<ColumnList<CompositeColumnName>> result = ((DbClientImpl)getDbClient()).getLocalContext().getKeyspace().prepareQuery(doType.getCF()) .getKey(testData.getId().toString()) .execute(); long pathTime = 0; long mountPathTime = 0; for (Column<CompositeColumnName> column : result.getResult()) { if (column.getName().getOne().equals("path")) { pathTime = TimeUUIDUtils.getMicrosTimeFromUUID(column.getName().getTimeUUID()); } else if (column.getName().getOne().equals("mountPath")) { mountPathTime = TimeUUIDUtils.getMicrosTimeFromUUID(column.getName().getTimeUUID()); } } assertEquals(1, Math.abs(pathTime - mountPathTime)); } } private void resetRowMutatorTimeStampOffSet(int newValue) throws Exception { Field field = RowMutator.class.getDeclaredField("TIME_STAMP_OFFSET"); field.setAccessible(true); field.set(null, newValue); } }