/** * 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.capture; import static org.easymock.EasyMock.createNiceMock; import static org.easymock.EasyMock.createStrictMock; import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.expectLastCall; import static org.easymock.EasyMock.isNull; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; import org.apache.ambari.server.orm.entities.ViewEntity; import org.apache.ambari.server.orm.entities.ViewInstanceDataEntity; import org.apache.ambari.server.orm.entities.ViewInstanceEntity; import org.apache.ambari.server.view.configuration.EntityConfig; import org.apache.ambari.server.view.configuration.PersistenceConfig; import org.apache.ambari.server.view.configuration.ViewConfig; import org.apache.ambari.view.DataStore; import org.apache.ambari.view.migration.EntityConverter; import org.easymock.Capture; import org.junit.Test; import junit.framework.Assert; /** * ViewDataMigrationContextImpl tests. */ public class ViewDataMigrationContextImplTest { public static final String VERSION_1 = "1.0.0"; public static final String VERSION_2 = "2.0.0"; public static final String INSTANCE = "INSTANCE_1"; public static final String VIEW_NAME = "MY_VIEW"; @Test public void getDataVersion() throws Exception { ViewEntity entity1 = getViewEntityMock(VERSION_1); ViewEntity entity2 = getViewEntityMock(VERSION_2); ViewConfig config1 = createNiceMock(ViewConfig.class); expect(config1.getDataVersion()).andReturn(41); ViewConfig config2 = createNiceMock(ViewConfig.class); expect(config2.getDataVersion()).andReturn(42); replay(config1, config2); expect(entity1.getConfiguration()).andReturn(config1); expect(entity2.getConfiguration()).andReturn(config2); replay(entity1, entity2); ViewInstanceEntity instanceEntity1 = getViewInstanceEntityMock(entity1); ViewInstanceEntity instanceEntity2 = getViewInstanceEntityMock(entity2); replay(instanceEntity1, instanceEntity2); ViewDataMigrationContextImpl context = new TestViewDataMigrationContextImpl(instanceEntity1, instanceEntity2); Assert.assertEquals(41, context.getOriginDataVersion()); Assert.assertEquals(42, context.getCurrentDataVersion()); } @Test public void getDataStore() throws Exception { ViewEntity entity1 = getViewEntityMock(VERSION_1); ViewEntity entity2 = getViewEntityMock(VERSION_2); replay(entity1, entity2); ViewInstanceEntity instanceEntity1 = getViewInstanceEntityMock(entity1); ViewInstanceEntity instanceEntity2 = getViewInstanceEntityMock(entity2); replay(instanceEntity1, instanceEntity2); ViewDataMigrationContextImpl context = new TestViewDataMigrationContextImpl(instanceEntity1, instanceEntity2); Assert.assertNotSame(context.getCurrentDataStore(), context.getOriginDataStore()); } @Test public void putCurrentInstanceData() throws Exception { ViewEntity entity1 = getViewEntityMock(VERSION_1); ViewEntity entity2 = getViewEntityMock(VERSION_2); replay(entity1, entity2); ViewInstanceEntity instanceEntity1 = getViewInstanceEntityMock(entity1); List<ViewInstanceDataEntity> data1 = new ArrayList<>(); expect(instanceEntity1.getData()).andReturn(data1).anyTimes(); ViewInstanceEntity instanceEntity2 = getViewInstanceEntityMock(entity2); List<ViewInstanceDataEntity> data2 = new ArrayList<>(); expect(instanceEntity2.getData()).andReturn(data2).anyTimes(); replay(instanceEntity1, instanceEntity2); ViewDataMigrationContextImpl context = new TestViewDataMigrationContextImpl(instanceEntity1, instanceEntity2); context.putOriginInstanceData("user1", "key1", "val1"); context.putCurrentInstanceData("user2", "key2", "val2"); Assert.assertEquals(1, data1.size()); Assert.assertEquals("user1", data1.get(0).getUser()); Assert.assertEquals("key1", data1.get(0).getName()); Assert.assertEquals("val1", data1.get(0).getValue()); Assert.assertEquals(1, data2.size()); Assert.assertEquals("user2", data2.get(0).getUser()); Assert.assertEquals("key2", data2.get(0).getName()); Assert.assertEquals("val2", data2.get(0).getValue()); } @Test public void copyAllObjects() throws Exception { ViewEntity entity1 = getViewEntityMock(VERSION_1); ViewEntity entity2 = getViewEntityMock(VERSION_2); replay(entity1, entity2); ViewInstanceEntity instanceEntity1 = getViewInstanceEntityMock(entity1); ViewInstanceEntity instanceEntity2 = getViewInstanceEntityMock(entity2); replay(instanceEntity1, instanceEntity2); TestViewDataMigrationContextImpl context = new TestViewDataMigrationContextImpl(instanceEntity1, instanceEntity2); DataStore dataStore1 = createStrictMock(DataStore.class); expect(dataStore1.findAll(eq(SampleEntity.class), (String) isNull())).andReturn( Arrays.asList(new SampleEntity("data1"), new SampleEntity("data2"))); replay(dataStore1); DataStore dataStore2 = createStrictMock(DataStore.class); Capture<SampleEntity> copiedEntity1 = Capture.newInstance(); Capture<SampleEntity> copiedEntity2 = Capture.newInstance(); dataStore2.store(capture(copiedEntity1)); expectLastCall(); dataStore2.store(capture(copiedEntity2)); expectLastCall(); replay(dataStore2); context.setMockOriginDataStore(dataStore1); context.setMockCurrentDataStore(dataStore2); context.copyAllObjects(SampleEntity.class, SampleEntity.class); verify(dataStore1); verify(dataStore2); Assert.assertEquals("data1", copiedEntity1.getValue().getField()); Assert.assertEquals("data2", copiedEntity2.getValue().getField()); } @Test public void copyAllObjectsWithCustomConverter() throws Exception { ViewEntity entity1 = getViewEntityMock(VERSION_1); ViewEntity entity2 = getViewEntityMock(VERSION_2); replay(entity1, entity2); ViewInstanceEntity instanceEntity1 = getViewInstanceEntityMock(entity1); ViewInstanceEntity instanceEntity2 = getViewInstanceEntityMock(entity2); replay(instanceEntity1, instanceEntity2); TestViewDataMigrationContextImpl context = new TestViewDataMigrationContextImpl(instanceEntity1, instanceEntity2); DataStore dataStore1 = createStrictMock(DataStore.class); SampleEntity sampleEntity1 = new SampleEntity("data1"); SampleEntity sampleEntity2 = new SampleEntity("data2"); expect(dataStore1.findAll(eq(SampleEntity.class), (String) isNull())).andReturn( Arrays.asList(sampleEntity1, sampleEntity2)); replay(dataStore1); DataStore dataStore2 = createStrictMock(DataStore.class); Capture<SampleEntity> copiedEntity1 = Capture.newInstance(); Capture<SampleEntity> copiedEntity2 = Capture.newInstance(); Capture<SampleEntity> convertedEntity1 = Capture.newInstance(); Capture<SampleEntity> convertedEntity2 = Capture.newInstance(); dataStore2.store(capture(copiedEntity1)); expectLastCall(); dataStore2.store(capture(copiedEntity2)); expectLastCall(); replay(dataStore2); context.setMockOriginDataStore(dataStore1); context.setMockCurrentDataStore(dataStore2); EntityConverter converter = createStrictMock(EntityConverter.class); converter.convert(eq(sampleEntity1), capture(convertedEntity1)); expectLastCall(); converter.convert(eq(sampleEntity2), capture(convertedEntity2)); expectLastCall(); replay(converter); context.copyAllObjects(SampleEntity.class, SampleEntity.class, converter); verify(dataStore1); verify(dataStore2); verify(converter); Assert.assertSame(copiedEntity1.getValue(), convertedEntity1.getValue()); Assert.assertSame(copiedEntity2.getValue(), convertedEntity2.getValue()); } @Test public void copyAllInstanceData() throws Exception { ViewEntity entity1 = getViewEntityMock(VERSION_1); ViewEntity entity2 = getViewEntityMock(VERSION_2); replay(entity1, entity2); ViewInstanceDataEntity dataEntity = new ViewInstanceDataEntity(); dataEntity.setName("name1"); dataEntity.setValue("value1"); dataEntity.setUser("user1"); Collection<ViewInstanceDataEntity> data1 = Arrays.asList(dataEntity); List<ViewInstanceDataEntity> data2 = new ArrayList<>(); ViewInstanceEntity instanceEntity1 = getViewInstanceEntityMock(entity1); expect(instanceEntity1.getData()).andReturn(data1).anyTimes(); ViewInstanceEntity instanceEntity2 = getViewInstanceEntityMock(entity2); expect(instanceEntity2.getData()).andReturn(data2).anyTimes(); replay(instanceEntity1, instanceEntity2); ViewDataMigrationContextImpl context = new TestViewDataMigrationContextImpl(instanceEntity1, instanceEntity2); context.copyAllInstanceData(); Assert.assertEquals(1, data2.size()); Assert.assertEquals("user1", data2.get(0).getUser()); Assert.assertEquals("name1", data2.get(0).getName()); Assert.assertEquals("value1", data2.get(0).getValue()); } @Test public void getEntityClasses() throws Exception { ViewEntity entity1 = getViewEntityMock(VERSION_1); ViewEntity entity2 = getViewEntityMock(VERSION_2); EntityConfig entityConfig = createNiceMock(EntityConfig.class); expect(entityConfig.getClassName()).andReturn(SampleEntity.class.getName()).anyTimes(); replay(entityConfig); PersistenceConfig persistenceConfig1 = createStrictMock(PersistenceConfig.class); expect(persistenceConfig1.getEntities()).andReturn(Arrays.asList(entityConfig)); PersistenceConfig persistenceConfig2 = createStrictMock(PersistenceConfig.class); expect(persistenceConfig2.getEntities()).andReturn(Arrays.asList(entityConfig)); replay(persistenceConfig1, persistenceConfig2); ViewConfig config1 = createNiceMock(ViewConfig.class); expect(config1.getPersistence()).andReturn(persistenceConfig1); ViewConfig config2 = createNiceMock(ViewConfig.class); expect(config2.getPersistence()).andReturn(persistenceConfig2); replay(config1, config2); expect(entity1.getConfiguration()).andReturn(config1); expect(entity2.getConfiguration()).andReturn(config2); replay(entity1, entity2); ViewInstanceEntity instanceEntity1 = getViewInstanceEntityMock(entity1); ViewInstanceEntity instanceEntity2 = getViewInstanceEntityMock(entity2); replay(instanceEntity1, instanceEntity2); ViewDataMigrationContextImpl context = new TestViewDataMigrationContextImpl(instanceEntity1, instanceEntity2); Map<String, Class> current = context.getCurrentEntityClasses(); Assert.assertEquals(1, current.size()); Assert.assertEquals(SampleEntity.class.getName(), current.entrySet().iterator().next().getKey()); Assert.assertEquals(SampleEntity.class, current.entrySet().iterator().next().getValue()); Map<String, Class> origin = context.getOriginEntityClasses(); Assert.assertEquals(1, origin.size()); Assert.assertEquals(SampleEntity.class.getName(), origin.entrySet().iterator().next().getKey()); Assert.assertEquals(SampleEntity.class, origin.entrySet().iterator().next().getValue()); } @Test public void getInstanceDataByUser() throws Exception { ViewEntity entity1 = getViewEntityMock(VERSION_1); ViewEntity entity2 = getViewEntityMock(VERSION_2); replay(entity1, entity2); ViewInstanceDataEntity dataEntityUser1 = new ViewInstanceDataEntity(); dataEntityUser1.setName("key1"); dataEntityUser1.setUser("user1"); ViewInstanceDataEntity dataEntityUser2 = new ViewInstanceDataEntity(); dataEntityUser2.setName("key1"); dataEntityUser2.setUser("user2"); ViewInstanceDataEntity dataEntity2User2 = new ViewInstanceDataEntity(); dataEntity2User2.setName("key2"); dataEntity2User2.setUser("user2"); Collection<ViewInstanceDataEntity> data2 = Arrays.asList(dataEntityUser2, dataEntity2User2); Collection<ViewInstanceDataEntity> data1 = Arrays.asList(dataEntityUser1, dataEntityUser2, dataEntity2User2); ViewInstanceEntity instanceEntity1 = getViewInstanceEntityMock(entity1); expect(instanceEntity1.getData()).andReturn(data1); ViewInstanceEntity instanceEntity2 = getViewInstanceEntityMock(entity2); expect(instanceEntity2.getData()).andReturn(data2); replay(instanceEntity1, instanceEntity2); ViewDataMigrationContextImpl context = new TestViewDataMigrationContextImpl(instanceEntity1, instanceEntity2); Map<String, Map<String,String>> instanceData2 = context.getCurrentInstanceDataByUser(); Assert.assertEquals(1, instanceData2.size()); Assert.assertEquals(2, instanceData2.get("user2").size()); Map<String, Map<String,String>> instanceData1 = context.getOriginInstanceDataByUser(); Assert.assertEquals(2, instanceData1.size()); Assert.assertEquals(1, instanceData1.get("user1").size()); Assert.assertEquals(2, instanceData1.get("user2").size()); } private ViewInstanceEntity getViewInstanceEntityMock(ViewEntity viewEntity) { ViewInstanceEntity instanceEntity = createNiceMock(ViewInstanceEntity.class); expect(instanceEntity.getViewEntity()).andReturn(viewEntity).anyTimes(); expect(instanceEntity.getViewName()).andReturn(VIEW_NAME).anyTimes(); expect(instanceEntity.getInstanceName()).andReturn(INSTANCE).anyTimes(); return instanceEntity; } private ViewEntity getViewEntityMock(String version) { ViewEntity viewEntity = createNiceMock(ViewEntity.class); expect(viewEntity.getViewName()).andReturn(VIEW_NAME).anyTimes(); expect(viewEntity.getVersion()).andReturn(version).anyTimes(); expect(viewEntity.getClassLoader()).andReturn(getClass().getClassLoader()).anyTimes(); return viewEntity; } //Avoid accessing DB private static class TestViewDataMigrationContextImpl extends ViewDataMigrationContextImpl { private DataStore mockOriginDataStore; private DataStore mockCurrentDataStore; public TestViewDataMigrationContextImpl(ViewInstanceEntity originInstanceDefinition, ViewInstanceEntity currentInstanceDefinition) { super(originInstanceDefinition, currentInstanceDefinition); } @Override protected DataStore getDataStore(ViewInstanceEntity instanceDefinition) { if (instanceDefinition.getViewEntity().getVersion().equals(VERSION_1)) { if (mockOriginDataStore == null) { return createDataStoreMock(); } return mockOriginDataStore; } if (instanceDefinition.getViewEntity().getVersion().equals(VERSION_2)) { if (mockCurrentDataStore == null) { return createDataStoreMock(); } return mockCurrentDataStore; } return null; } private DataStore createDataStoreMock() { DataStore dataStoreMock = createNiceMock(DataStore.class); replay(dataStoreMock); return dataStoreMock; } public DataStore getMockOriginDataStore() { return mockOriginDataStore; } public void setMockOriginDataStore(DataStore mockOriginDataStore) { this.mockOriginDataStore = mockOriginDataStore; } public DataStore getMockCurrentDataStore() { return mockCurrentDataStore; } public void setMockCurrentDataStore(DataStore mockCurrentDataStore) { this.mockCurrentDataStore = mockCurrentDataStore; } } private static class SampleEntity { private String field; public SampleEntity() { } public SampleEntity(String field) { this.field = field; } public String getField() { return field; } public void setField(String field) { this.field = field; } } }