/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.ambari.server.view;
import static org.easymock.EasyMock.anyObject;
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.createStrictMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.apache.ambari.server.orm.entities.ViewEntity;
import org.apache.ambari.server.orm.entities.ViewInstanceEntity;
import org.apache.ambari.view.migration.ViewDataMigrationContext;
import org.apache.ambari.view.migration.ViewDataMigrationException;
import org.apache.ambari.view.migration.ViewDataMigrator;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import junit.framework.Assert;
/**
* ViewDataMigrationUtility Tests.
*/
public class ViewDataMigrationUtilityTest {
private static String viewName = "MY_VIEW";
private static String instanceName = "INSTANCE1";
private static String version1 = "1.0.0";
private static String version2 = "2.0.0";
@Rule
public ExpectedException thrown = ExpectedException.none();
ViewRegistry viewRegistry;
@Before
public void setUp() throws Exception {
viewRegistry = createNiceMock(ViewRegistry.class);
viewRegistry.copyPrivileges(anyObject(ViewInstanceEntity.class), anyObject(ViewInstanceEntity.class));
expectLastCall().anyTimes();
replay(viewRegistry);
ViewRegistry.initInstance(viewRegistry);
}
@Test
public void testMigrateDataSameVersions() throws Exception {
TestViewDataMigrationUtility migrationUtility = new TestViewDataMigrationUtility(viewRegistry);
ViewDataMigrationContextImpl context = getViewDataMigrationContext(42, 42);
migrationUtility.setMigrationContext(context);
ViewDataMigrator migrator = migrationUtility.getViewDataMigrator(
getInstanceDefinition(viewName, version2, instanceName), context);
Assert.assertTrue(migrator instanceof ViewDataMigrationUtility.CopyAllDataMigrator);
}
@Test
public void testMigrateDataDifferentVersions() throws Exception {
TestViewDataMigrationUtility migrationUtility = new TestViewDataMigrationUtility(viewRegistry);
ViewDataMigrationContextImpl context = getViewDataMigrationContext(2, 1);
migrationUtility.setMigrationContext(context);
ViewDataMigrator migrator = createStrictMock(ViewDataMigrator.class);
expect(migrator.beforeMigration()).andReturn(true);
migrator.migrateEntity(anyObject(Class.class), anyObject(Class.class)); expectLastCall();
migrator.migrateInstanceData(); expectLastCall();
migrator.afterMigration(); expectLastCall();
replay(migrator);
ViewInstanceEntity targetInstance = getInstanceDefinition(viewName, version2, instanceName, migrator);
ViewInstanceEntity sourceInstance = getInstanceDefinition(viewName, version1, instanceName);
migrationUtility.migrateData(targetInstance, sourceInstance, false);
verify(migrator);
}
@Test
public void testMigrateDataDifferentVersionsCancel() throws Exception {
TestViewDataMigrationUtility migrationUtility = new TestViewDataMigrationUtility(viewRegistry);
ViewDataMigrationContextImpl context = getViewDataMigrationContext(2, 1);
migrationUtility.setMigrationContext(context);
ViewDataMigrator migrator = createStrictMock(ViewDataMigrator.class);
expect(migrator.beforeMigration()).andReturn(false);
ViewInstanceEntity targetInstance = getInstanceDefinition(viewName, version2, instanceName, migrator);
ViewInstanceEntity sourceInstance = getInstanceDefinition(viewName, version1, instanceName);
thrown.expect(ViewDataMigrationException.class);
migrationUtility.migrateData(targetInstance, sourceInstance, false);
}
private static ViewDataMigrationContextImpl getViewDataMigrationContext(int currentVersion, int originVersion) {
Map<String, Class> entities = Collections.<String, Class>singletonMap("MyEntityClass", Object.class);
ViewDataMigrationContextImpl context = createNiceMock(ViewDataMigrationContextImpl.class);
expect(context.getOriginDataVersion()).andReturn(originVersion).anyTimes();
expect(context.getCurrentDataVersion()).andReturn(currentVersion).anyTimes();
expect(context.getOriginEntityClasses()).andReturn(entities).anyTimes();
expect(context.getCurrentEntityClasses()).andReturn(entities).anyTimes();
expect(context.getCurrentInstanceDataByUser()).andReturn(new HashMap<String, Map<String, String>>());
replay(context);
return context;
}
private static class TestViewDataMigrationUtility extends ViewDataMigrationUtility {
private ViewDataMigrationContextImpl migrationContext;
public TestViewDataMigrationUtility(ViewRegistry viewRegistry) {
super(viewRegistry);
}
@Override
protected ViewDataMigrationContextImpl getViewDataMigrationContext(ViewInstanceEntity targetInstanceDefinition,
ViewInstanceEntity sourceInstanceDefinition) {
if (migrationContext == null) {
return super.getViewDataMigrationContext(targetInstanceDefinition, sourceInstanceDefinition);
}
return migrationContext;
}
public ViewDataMigrationContextImpl getMigrationContext() {
return migrationContext;
}
public void setMigrationContext(ViewDataMigrationContextImpl migrationContext) {
this.migrationContext = migrationContext;
}
}
private ViewInstanceEntity getInstanceDefinition(String viewName, String viewVersion, String instanceName) {
ViewDataMigrator migrator = createNiceMock(ViewDataMigrator.class);
replay(migrator);
return getInstanceDefinition(viewName, viewVersion, instanceName, migrator);
}
private ViewInstanceEntity getInstanceDefinition(String viewName, String viewVersion, String instanceName,
ViewDataMigrator migrator) {
ViewEntity viewEntity = createNiceMock(ViewEntity.class);
expect(viewEntity.getViewName()).andReturn(viewName);
expect(viewEntity.getVersion()).andReturn(viewVersion);
replay(viewEntity);
ViewInstanceEntity instanceEntity = createNiceMock(ViewInstanceEntity.class);
expect(instanceEntity.getViewEntity()).andReturn(viewEntity);
expect(instanceEntity.getViewName()).andReturn(viewName);
expect(instanceEntity.getInstanceName()).andReturn(instanceName);
try {
expect(instanceEntity.getDataMigrator(anyObject(ViewDataMigrationContext.class))).
andReturn(migrator);
} catch (Exception e) {
e.printStackTrace();
}
replay(instanceEntity);
return instanceEntity;
}
}