/*
* 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.persistence;
import static org.easymock.EasyMock.capture;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import org.apache.ambari.server.orm.entities.ViewEntity;
import org.apache.ambari.server.orm.entities.ViewEntityEntity;
import org.apache.ambari.server.orm.entities.ViewEntityTest;
import org.apache.ambari.server.orm.entities.ViewInstanceEntity;
import org.apache.ambari.server.view.configuration.EntityConfig;
import org.apache.ambari.server.view.configuration.InstanceConfig;
import org.apache.ambari.server.view.configuration.InstanceConfigTest;
import org.apache.ambari.server.view.configuration.ViewConfig;
import org.apache.ambari.server.view.configuration.ViewConfigTest;
import org.apache.ambari.view.PersistenceException;
import org.easymock.Capture;
import org.easymock.EasyMock;
import org.easymock.IAnswer;
import org.eclipse.persistence.dynamic.DynamicClassLoader;
import org.eclipse.persistence.dynamic.DynamicEntity;
import org.eclipse.persistence.dynamic.DynamicType;
import org.eclipse.persistence.jpa.JpaEntityManager;
import org.eclipse.persistence.jpa.JpaHelper;
import org.eclipse.persistence.jpa.dynamic.JPADynamicHelper;
import org.eclipse.persistence.sequencing.Sequence;
import org.eclipse.persistence.sessions.DatabaseLogin;
import org.eclipse.persistence.sessions.DatabaseSession;
import org.eclipse.persistence.sessions.server.ServerSession;
import org.eclipse.persistence.tools.schemaframework.SchemaManager;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
/**
* DataStoreImpl tests.
*/
@RunWith(PowerMockRunner.class) // Allow mocking static methods
@PrepareForTest(JpaHelper.class)
public class DataStoreImplTest {
private final static String xml = "<view>\n" +
" <name>MY_VIEW</name>\n" +
" <label>My View!</label>\n" +
" <version>1.0.0</version>\n" +
" <instance>\n" +
" <name>INSTANCE1</name>\n" +
" </instance>\n" +
" <persistence>\n" +
" <entity>\n" +
" <class>org.apache.ambari.server.view.persistence.DataStoreImplTest$TestEntity</class>\n" +
" <id-property>id</id-property>\n" +
" </entity>\n" +
" <entity>\n" +
" <class>org.apache.ambari.server.view.persistence.DataStoreImplTest$TestSubEntity</class>\n" +
" <id-property>id</id-property>\n" +
" </entity>\n" +
" </persistence>" +
"</view>";
@Test
public void testStore_create() throws Exception {
DynamicClassLoader classLoader = new DynamicClassLoader(DataStoreImplTest.class.getClassLoader());
// create mocks
EntityManagerFactory entityManagerFactory = createMock(EntityManagerFactory.class);
JpaEntityManager jpaEntityManager = createMock(JpaEntityManager.class);
ServerSession session = createMock(ServerSession.class);
DatabaseLogin databaseLogin = createMock(DatabaseLogin.class);
EntityManager entityManager = createMock(EntityManager.class);
JPADynamicHelper jpaDynamicHelper = createNiceMock(JPADynamicHelper.class);
SchemaManager schemaManager = createNiceMock(SchemaManager.class);
EntityTransaction transaction = createMock(EntityTransaction.class);
// set expectations
PowerMock.mockStatic(JpaHelper.class);
expect(JpaHelper.getEntityManager(entityManager)).andReturn(jpaEntityManager).anyTimes();
PowerMock.replay(JpaHelper.class);
expect(jpaEntityManager.getServerSession()).andReturn(session).anyTimes();
expect(session.getLogin()).andReturn(databaseLogin).anyTimes();
Capture<Sequence> sequenceCapture = EasyMock.newCapture();
databaseLogin.addSequence(capture(sequenceCapture));
EasyMock.expectLastCall().anyTimes();
Capture<DynamicEntity> entityCapture = EasyMock.newCapture();
entityManager.persist(capture(entityCapture));
EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
@Override
public Object answer() throws Throwable {
((DynamicEntity) EasyMock.getCurrentArguments()[0])
.set("DS_id", 99); // for TestSubEntity
return null;
}
});
Capture<DynamicEntity> entityCapture2 = EasyMock.newCapture();
entityManager.persist(capture(entityCapture2));
EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
@Override
public Object answer() throws Throwable {
((DynamicEntity) EasyMock.getCurrentArguments()[0])
.set("DS_id", 100); // for TestEntity
return null;
}
});
Capture<DynamicType> typeCapture = EasyMock.newCapture();
Capture<DynamicType> typeCapture2 = EasyMock.newCapture();
jpaDynamicHelper.addTypes(eq(true), eq(true), capture(typeCapture), capture(typeCapture2));
expect(entityManagerFactory.createEntityManager()).andReturn(entityManager).anyTimes();
expect(entityManager.getTransaction()).andReturn(transaction).anyTimes();
entityManager.close();
transaction.begin();
transaction.commit();
// replay mocks
replay(entityManagerFactory, entityManager, jpaDynamicHelper, transaction, schemaManager, jpaEntityManager, session, databaseLogin);
DataStoreImpl dataStore = getDataStore(entityManagerFactory, jpaDynamicHelper, classLoader, schemaManager);
dataStore.store(new TestEntity("foo", new TestSubEntity("bar")));
Assert.assertEquals("bar", entityCapture.getValue().get("DS_name"));
Assert.assertEquals(99, entityCapture.getValue().get("DS_id"));
Assert.assertEquals(100, entityCapture2.getValue().get("DS_id"));
Assert.assertEquals("foo", entityCapture2.getValue().get("DS_name"));
// verify mocks
verify(entityManagerFactory, entityManager, jpaDynamicHelper, transaction, schemaManager, jpaEntityManager, session, databaseLogin);
}
@Test
public void testStore_create_longStringValue() throws Exception {
DynamicClassLoader classLoader = new DynamicClassLoader(DataStoreImplTest.class.getClassLoader());
// create mocks
JpaEntityManager jpaEntityManager = createMock(JpaEntityManager.class);
ServerSession session = createMock(ServerSession.class);
DatabaseLogin databaseLogin = createMock(DatabaseLogin.class);
EntityManagerFactory entityManagerFactory = createMock(EntityManagerFactory.class);
EntityManager entityManager = createMock(EntityManager.class);
JPADynamicHelper jpaDynamicHelper = createNiceMock(JPADynamicHelper.class);
SchemaManager schemaManager = createNiceMock(SchemaManager.class);
EntityTransaction transaction = createMock(EntityTransaction.class);
// set expectations
PowerMock.mockStatic(JpaHelper.class);
expect(JpaHelper.getEntityManager(entityManager)).andReturn(jpaEntityManager).anyTimes();
PowerMock.replay(JpaHelper.class);
expect(jpaEntityManager.getServerSession()).andReturn(session).anyTimes();
expect(session.getLogin()).andReturn(databaseLogin).anyTimes();
Capture<Sequence> sequenceCapture = EasyMock.newCapture();
databaseLogin.addSequence(capture(sequenceCapture));
EasyMock.expectLastCall().anyTimes();
Capture<DynamicType> typeCapture = EasyMock.newCapture();
Capture<DynamicType> typeCapture2 = EasyMock.newCapture();
jpaDynamicHelper.addTypes(eq(true), eq(true), capture(typeCapture), capture(typeCapture2));
expect(entityManagerFactory.createEntityManager()).andReturn(entityManager).anyTimes();
expect(entityManager.getTransaction()).andReturn(transaction).anyTimes();
entityManager.close();
transaction.begin();
expect(transaction.isActive()).andReturn(true);
transaction.rollback();
// replay mocks
replay(entityManagerFactory, entityManager, jpaDynamicHelper, transaction, schemaManager, jpaEntityManager, session, databaseLogin);
DataStoreImpl dataStore = getDataStore(entityManagerFactory, jpaDynamicHelper, classLoader, schemaManager);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 5000; ++i) {
sb.append("A");
}
String longString = sb.toString();
try {
dataStore.store(new TestEntity(longString, new TestSubEntity("bar")));
Assert.fail("Expected PersistenceException.");
} catch (PersistenceException e) {
// expected
}
// verify mocks
verify(entityManagerFactory, entityManager, jpaDynamicHelper, transaction, schemaManager, jpaEntityManager, session, databaseLogin);
}
@Test
public void testStore_create_largeEntity() throws Exception {
DynamicClassLoader classLoader = new DynamicClassLoader(DataStoreImplTest.class.getClassLoader());
// create mocks
JpaEntityManager jpaEntityManager = createMock(JpaEntityManager.class);
ServerSession session = createMock(ServerSession.class);
DatabaseLogin databaseLogin = createMock(DatabaseLogin.class);
EntityManagerFactory entityManagerFactory = createMock(EntityManagerFactory.class);
EntityManager entityManager = createMock(EntityManager.class);
JPADynamicHelper jpaDynamicHelper = createNiceMock(JPADynamicHelper.class);
SchemaManager schemaManager = createNiceMock(SchemaManager.class);
EntityTransaction transaction = createMock(EntityTransaction.class);
// set expectations
PowerMock.mockStatic(JpaHelper.class);
expect(JpaHelper.getEntityManager(entityManager)).andReturn(jpaEntityManager).anyTimes();
PowerMock.replay(JpaHelper.class);
expect(jpaEntityManager.getServerSession()).andReturn(session).anyTimes();
expect(session.getLogin()).andReturn(databaseLogin).anyTimes();
Capture<Sequence> sequenceCapture = EasyMock.newCapture();
databaseLogin.addSequence(capture(sequenceCapture));
EasyMock.expectLastCall().anyTimes();
Capture<DynamicType> typeCapture = EasyMock.newCapture();
Capture<DynamicType> typeCapture2 = EasyMock.newCapture();
jpaDynamicHelper.addTypes(eq(true), eq(true), capture(typeCapture), capture(typeCapture2));
expect(entityManagerFactory.createEntityManager()).andReturn(entityManager).anyTimes();
expect(entityManager.getTransaction()).andReturn(transaction).anyTimes();
entityManager.close();
transaction.begin();
expect(transaction.isActive()).andReturn(true);
transaction.rollback();
// replay mocks
replay(entityManagerFactory, entityManager, jpaDynamicHelper, transaction, schemaManager, jpaEntityManager, session, databaseLogin);
DataStoreImpl dataStore = getDataStore(entityManagerFactory, jpaDynamicHelper, classLoader, schemaManager);
try {
dataStore.store(new TestLargeEntity());
Assert.fail("Expected PersistenceException.");
} catch (PersistenceException e) {
// expected
}
// verify mocks
verify(entityManagerFactory, entityManager, jpaDynamicHelper, transaction, schemaManager, jpaEntityManager, session, databaseLogin);
}
@Test
public void testStore_update() throws Exception {
DynamicClassLoader classLoader = new DynamicClassLoader(DataStoreImplTest.class.getClassLoader());
// create mocks
JpaEntityManager jpaEntityManager = createMock(JpaEntityManager.class);
ServerSession session = createMock(ServerSession.class);
DatabaseLogin databaseLogin = createMock(DatabaseLogin.class);
EntityManagerFactory entityManagerFactory = createMock(EntityManagerFactory.class);
EntityManager entityManager = createMock(EntityManager.class);
JPADynamicHelper jpaDynamicHelper = createNiceMock(JPADynamicHelper.class);
SchemaManager schemaManager = createNiceMock(SchemaManager.class);
EntityTransaction transaction = createMock(EntityTransaction.class);
DynamicEntity dynamicEntity = createMock(DynamicEntity.class);
DynamicEntity dynamicSubEntity = createMock(DynamicEntity.class);
// set expectations
PowerMock.mockStatic(JpaHelper.class);
expect(JpaHelper.getEntityManager(entityManager)).andReturn(jpaEntityManager).anyTimes();
PowerMock.replay(JpaHelper.class);
expect(jpaEntityManager.getServerSession()).andReturn(session).anyTimes();
expect(session.getLogin()).andReturn(databaseLogin).anyTimes();
Capture<Sequence> sequenceCapture = EasyMock.newCapture();
databaseLogin.addSequence(capture(sequenceCapture));
EasyMock.expectLastCall().anyTimes();
Capture<DynamicType> typeCapture = EasyMock.newCapture();
Capture<DynamicType> typeCapture2 = EasyMock.newCapture();
jpaDynamicHelper.addTypes(eq(true), eq(true), capture(typeCapture), capture(typeCapture2));
expect(entityManagerFactory.createEntityManager()).andReturn(entityManager).anyTimes();
expect(entityManager.getTransaction()).andReturn(transaction).anyTimes();
Capture<Class> entityClassCapture = EasyMock.newCapture();
expect(entityManager.find(capture(entityClassCapture), eq(100))).andReturn(dynamicEntity);
Capture<Class> entityClassCapture2 = EasyMock.newCapture();
expect(entityManager.find(capture(entityClassCapture2), eq(99))).andReturn(dynamicSubEntity);
entityManager.close();
expect(dynamicEntity.set("DS_id", 100)).andReturn(dynamicEntity);
expect(dynamicEntity.set("DS_name", "foo")).andReturn(dynamicEntity);
expect(dynamicSubEntity.set("DS_id", 99)).andReturn(dynamicSubEntity);
expect(dynamicSubEntity.set("DS_name", "bar")).andReturn(dynamicSubEntity);
Capture<DynamicEntity> subEntityCapture = EasyMock.newCapture();
expect(dynamicEntity.set(eq("DS_subEntity"), capture(subEntityCapture))).andReturn(dynamicSubEntity);
expect(dynamicEntity.get("DS_id")).andReturn(100);
expect(dynamicEntity.get("DS_name")).andReturn("foo");
expect(dynamicEntity.get("DS_subEntity")).andReturn(dynamicSubEntity);
expect(dynamicEntity.get("DS_class")).andReturn(dynamicEntity.getClass());
expect(dynamicSubEntity.get("DS_id")).andReturn(99);
expect(dynamicSubEntity.get("DS_name")).andReturn("bar");
transaction.begin();
transaction.commit();
// replay mocks
replay(entityManagerFactory, entityManager, jpaDynamicHelper, transaction, schemaManager, dynamicEntity, jpaEntityManager, session, databaseLogin, dynamicSubEntity);
DataStoreImpl dataStore = getDataStore(entityManagerFactory, jpaDynamicHelper, classLoader, schemaManager);
dataStore.store(new TestEntity(100, "foo", new TestSubEntity(99, "bar")));
if ((entityClassCapture.getValue() != typeCapture.getValue().getJavaClass()) &&
(entityClassCapture.getValue() != typeCapture2.getValue().getJavaClass())) {
Assert.fail();
}
if ((entityClassCapture2.getValue() != typeCapture.getValue().getJavaClass()) &&
(entityClassCapture2.getValue() != typeCapture2.getValue().getJavaClass())) {
Assert.fail();
}
// verify mocks
verify(entityManagerFactory, entityManager, jpaDynamicHelper, transaction, schemaManager, dynamicEntity, jpaEntityManager, session, databaseLogin, dynamicSubEntity);
}
@Test
public void testStore_update_longStringValue() throws Exception {
DynamicClassLoader classLoader = new DynamicClassLoader(DataStoreImplTest.class.getClassLoader());
// create mocks
JpaEntityManager jpaEntityManager = createMock(JpaEntityManager.class);
ServerSession session = createMock(ServerSession.class);
DatabaseLogin databaseLogin = createMock(DatabaseLogin.class);
EntityManagerFactory entityManagerFactory = createMock(EntityManagerFactory.class);
EntityManager entityManager = createMock(EntityManager.class);
JPADynamicHelper jpaDynamicHelper = createNiceMock(JPADynamicHelper.class);
SchemaManager schemaManager = createNiceMock(SchemaManager.class);
EntityTransaction transaction = createMock(EntityTransaction.class);
DynamicEntity dynamicEntity = createMock(DynamicEntity.class);
// set expectations
PowerMock.mockStatic(JpaHelper.class);
expect(JpaHelper.getEntityManager(entityManager)).andReturn(jpaEntityManager).anyTimes();
PowerMock.replay(JpaHelper.class);
expect(jpaEntityManager.getServerSession()).andReturn(session).anyTimes();
expect(session.getLogin()).andReturn(databaseLogin).anyTimes();
Capture<Sequence> sequenceCapture = EasyMock.newCapture();
databaseLogin.addSequence(capture(sequenceCapture));
EasyMock.expectLastCall().anyTimes();
Capture<DynamicType> typeCapture = EasyMock.newCapture();
Capture<DynamicType> typeCapture2 = EasyMock.newCapture();
jpaDynamicHelper.addTypes(eq(true), eq(true), capture(typeCapture), capture(typeCapture2));
expect(entityManagerFactory.createEntityManager()).andReturn(entityManager).anyTimes();
expect(entityManager.getTransaction()).andReturn(transaction).anyTimes();
Capture<Class> entityClassCapture2 = EasyMock.newCapture();
expect(entityManager.find(capture(entityClassCapture2), eq(99))).andReturn(dynamicEntity);
entityManager.close();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 5000; ++i) {
sb.append("A");
}
String longString = sb.toString();
expect(dynamicEntity.set("DS_id", 99)).andReturn(dynamicEntity).anyTimes();
transaction.begin();
expect(transaction.isActive()).andReturn(true).anyTimes();
transaction.rollback();
// replay mocks
replay(entityManagerFactory, entityManager, jpaDynamicHelper, transaction, schemaManager, dynamicEntity, jpaEntityManager, session, databaseLogin);
DataStoreImpl dataStore = getDataStore(entityManagerFactory, jpaDynamicHelper, classLoader, schemaManager);
try {
dataStore.store(new TestEntity(99, longString, new TestSubEntity("bar")));
Assert.fail();
} catch (PersistenceException e) {
// expected
}
// verify mocks
verify(entityManagerFactory, entityManager, jpaDynamicHelper, transaction, schemaManager, dynamicEntity, jpaEntityManager, session, databaseLogin);
}
@Test
public void testRemove() throws Exception {
DynamicClassLoader classLoader = new DynamicClassLoader(DataStoreImplTest.class.getClassLoader());
// create mocks
JpaEntityManager jpaEntityManager = createMock(JpaEntityManager.class);
ServerSession session = createMock(ServerSession.class);
DatabaseLogin databaseLogin = createMock(DatabaseLogin.class);
EntityManagerFactory entityManagerFactory = createMock(EntityManagerFactory.class);
EntityManager entityManager = createMock(EntityManager.class);
JPADynamicHelper jpaDynamicHelper = createNiceMock(JPADynamicHelper.class);
SchemaManager schemaManager = createNiceMock(SchemaManager.class);
EntityTransaction transaction = createMock(EntityTransaction.class);
DynamicEntity dynamicEntity = createMock(DynamicEntity.class);
// set expectations
PowerMock.mockStatic(JpaHelper.class);
expect(JpaHelper.getEntityManager(entityManager)).andReturn(jpaEntityManager).anyTimes();
PowerMock.replay(JpaHelper.class);
expect(jpaEntityManager.getServerSession()).andReturn(session).anyTimes();
expect(session.getLogin()).andReturn(databaseLogin).anyTimes();
Capture<Sequence> sequenceCapture = EasyMock.newCapture();
databaseLogin.addSequence(capture(sequenceCapture));
EasyMock.expectLastCall().anyTimes();
Capture<DynamicType> typeCapture = EasyMock.newCapture();
Capture<DynamicType> typeCapture2 = EasyMock.newCapture();
jpaDynamicHelper.addTypes(eq(true), eq(true), capture(typeCapture), capture(typeCapture2));
expect(entityManagerFactory.createEntityManager()).andReturn(entityManager).anyTimes();
expect(entityManager.getTransaction()).andReturn(transaction).anyTimes();
Capture<Class> entityClassCapture = EasyMock.newCapture();
expect(entityManager.getReference(capture(entityClassCapture), eq(99))).andReturn(dynamicEntity);
entityManager.remove(dynamicEntity);
entityManager.close();
transaction.begin();
transaction.commit();
// replay mocks
replay(entityManagerFactory, entityManager, jpaDynamicHelper, transaction, schemaManager, dynamicEntity, jpaEntityManager, session, databaseLogin);
DataStoreImpl dataStore = getDataStore(entityManagerFactory, jpaDynamicHelper, classLoader, schemaManager);
dataStore.remove(new TestEntity(99, "foo", new TestSubEntity("bar")));
if ((entityClassCapture.getValue() != typeCapture.getValue().getJavaClass()) &&
(entityClassCapture.getValue() != typeCapture2.getValue().getJavaClass())) {
Assert.fail();
}
// verify mocks
verify(entityManagerFactory, entityManager, jpaDynamicHelper, transaction, schemaManager, dynamicEntity, jpaEntityManager, session, databaseLogin);
}
@Test
public void testFind() throws Exception {
DynamicClassLoader classLoader = new DynamicClassLoader(DataStoreImplTest.class.getClassLoader());
// create mocks
JpaEntityManager jpaEntityManager = createMock(JpaEntityManager.class);
ServerSession session = createMock(ServerSession.class);
DatabaseLogin databaseLogin = createMock(DatabaseLogin.class);
EntityManagerFactory entityManagerFactory = createMock(EntityManagerFactory.class);
EntityManager entityManager = createMock(EntityManager.class);
JPADynamicHelper jpaDynamicHelper = createNiceMock(JPADynamicHelper.class);
SchemaManager schemaManager = createNiceMock(SchemaManager.class);
DynamicEntity dynamicEntity = createMock(DynamicEntity.class);
// set expectations
PowerMock.mockStatic(JpaHelper.class);
expect(JpaHelper.getEntityManager(entityManager)).andReturn(jpaEntityManager).anyTimes();
PowerMock.replay(JpaHelper.class);
expect(jpaEntityManager.getServerSession()).andReturn(session).anyTimes();
expect(session.getLogin()).andReturn(databaseLogin).anyTimes();
Capture<Sequence> sequenceCapture = EasyMock.newCapture();
databaseLogin.addSequence(capture(sequenceCapture));
EasyMock.expectLastCall().anyTimes();
Capture<DynamicType> typeCapture = EasyMock.newCapture();
Capture<DynamicType> typeCapture2 = EasyMock.newCapture();
jpaDynamicHelper.addTypes(eq(true), eq(true), capture(typeCapture), capture(typeCapture2));
expect(entityManagerFactory.createEntityManager()).andReturn(entityManager).anyTimes();
Capture<Class> entityClassCapture = EasyMock.newCapture();
expect(entityManager.find(capture(entityClassCapture), eq(99))).andReturn(dynamicEntity);
entityManager.close();
expect(dynamicEntity.get("DS_id")).andReturn(99);
expect(dynamicEntity.get("DS_name")).andReturn("foo");
TestSubEntity subEntity = new TestSubEntity("bar");
expect(dynamicEntity.get("DS_subEntity")).andReturn(subEntity);
// replay mocks
replay(entityManagerFactory, entityManager, jpaDynamicHelper, dynamicEntity, schemaManager, jpaEntityManager, session, databaseLogin);
DataStoreImpl dataStore = getDataStore(entityManagerFactory, jpaDynamicHelper, classLoader, schemaManager);
TestEntity entity = dataStore.find(TestEntity.class, 99);
// Ensure the requested class type is one of the available types....
if ((entityClassCapture.getValue() != typeCapture.getValue().getJavaClass()) &&
(entityClassCapture.getValue() != typeCapture2.getValue().getJavaClass())) {
Assert.fail();
}
Assert.assertEquals(99, (int) entity.getId());
Assert.assertEquals("foo", entity.getName());
// verify mocks
verify(entityManagerFactory, entityManager, jpaDynamicHelper, dynamicEntity, schemaManager, jpaEntityManager, session, databaseLogin);
}
@Test
public void testFindAll() throws Exception {
DynamicClassLoader classLoader = new DynamicClassLoader(DataStoreImplTest.class.getClassLoader());
// create mocks
JpaEntityManager jpaEntityManager = createMock(JpaEntityManager.class);
ServerSession session = createMock(ServerSession.class);
DatabaseLogin databaseLogin = createMock(DatabaseLogin.class);
EntityManagerFactory entityManagerFactory = createMock(EntityManagerFactory.class);
EntityManager entityManager = createMock(EntityManager.class);
JPADynamicHelper jpaDynamicHelper = createNiceMock(JPADynamicHelper.class);
SchemaManager schemaManager = createNiceMock(SchemaManager.class);
DynamicEntity dynamicEntity = createMock(DynamicEntity.class);
Query query = createMock(Query.class);
// set expectations
PowerMock.mockStatic(JpaHelper.class);
expect(JpaHelper.getEntityManager(entityManager)).andReturn(jpaEntityManager).anyTimes();
PowerMock.replay(JpaHelper.class);
expect(jpaEntityManager.getServerSession()).andReturn(session).anyTimes();
expect(session.getLogin()).andReturn(databaseLogin).anyTimes();
Capture<Sequence> sequenceCapture = EasyMock.newCapture();
databaseLogin.addSequence(capture(sequenceCapture));
EasyMock.expectLastCall().anyTimes();
Capture<DynamicType> typeCapture = EasyMock.newCapture();
Capture<DynamicType> typeCapture2 = EasyMock.newCapture();
jpaDynamicHelper.addTypes(eq(true), eq(true), capture(typeCapture), capture(typeCapture2));
expect(entityManagerFactory.createEntityManager()).andReturn(entityManager).anyTimes();
expect(entityManager.createQuery(
"SELECT e FROM DS_DataStoreImplTest$TestEntity_1 e WHERE e.DS_id=99")).andReturn(query);
entityManager.close();
expect(query.getResultList()).andReturn(Collections.singletonList(dynamicEntity));
expect(dynamicEntity.get("DS_id")).andReturn(99);
expect(dynamicEntity.get("DS_name")).andReturn("foo");
TestSubEntity subEntity = new TestSubEntity("bar");
expect(dynamicEntity.get("DS_subEntity")).andReturn(subEntity);
// replay mocks
replay(entityManagerFactory, entityManager, jpaDynamicHelper, dynamicEntity, query, schemaManager, jpaEntityManager, session, databaseLogin);
DataStoreImpl dataStore = getDataStore(entityManagerFactory, jpaDynamicHelper, classLoader, schemaManager);
Collection<TestEntity> entities = dataStore.findAll(TestEntity.class, "id=99");
Assert.assertEquals(1, entities.size());
TestEntity entity = entities.iterator().next();
Assert.assertEquals(99, (int) entity.getId());
Assert.assertEquals("foo", entity.getName());
// verify mocks
verify(entityManagerFactory, entityManager, jpaDynamicHelper, dynamicEntity, query, schemaManager, jpaEntityManager, session, databaseLogin);
}
@Test
public void testFindAll_multiple() throws Exception {
DynamicClassLoader classLoader = new DynamicClassLoader(DataStoreImplTest.class.getClassLoader());
// create mocks
JpaEntityManager jpaEntityManager = createMock(JpaEntityManager.class);
ServerSession session = createMock(ServerSession.class);
DatabaseLogin databaseLogin = createMock(DatabaseLogin.class);
EntityManagerFactory entityManagerFactory = createMock(EntityManagerFactory.class);
EntityManager entityManager = createMock(EntityManager.class);
JPADynamicHelper jpaDynamicHelper = createNiceMock(JPADynamicHelper.class);
SchemaManager schemaManager = createNiceMock(SchemaManager.class);
DynamicEntity dynamicEntity1 = createMock(DynamicEntity.class);
DynamicEntity dynamicEntity2 = createMock(DynamicEntity.class);
DynamicEntity dynamicEntity3 = createMock(DynamicEntity.class);
Query query = createMock(Query.class);
// set expectations
PowerMock.mockStatic(JpaHelper.class);
expect(JpaHelper.getEntityManager(entityManager)).andReturn(jpaEntityManager).anyTimes();
PowerMock.replay(JpaHelper.class);
expect(jpaEntityManager.getServerSession()).andReturn(session).anyTimes();
expect(session.getLogin()).andReturn(databaseLogin).anyTimes();
Capture<Sequence> sequenceCapture = EasyMock.newCapture();
databaseLogin.addSequence(capture(sequenceCapture));
EasyMock.expectLastCall().anyTimes();
Capture<DynamicType> typeCapture = EasyMock.newCapture();
Capture<DynamicType> typeCapture2 = EasyMock.newCapture();
jpaDynamicHelper.addTypes(eq(true), eq(true), capture(typeCapture), capture(typeCapture2));
expect(entityManagerFactory.createEntityManager()).andReturn(entityManager).anyTimes();
expect(entityManager.createQuery(
"SELECT e FROM DS_DataStoreImplTest$TestEntity_1 e WHERE e.DS_name='foo'")).andReturn(query);
entityManager.close();
List<DynamicEntity> entityList = new LinkedList<>();
entityList.add(dynamicEntity1);
entityList.add(dynamicEntity2);
entityList.add(dynamicEntity3);
expect(query.getResultList()).andReturn(entityList);
expect(dynamicEntity1.get("DS_id")).andReturn(99);
expect(dynamicEntity1.get("DS_name")).andReturn("foo");
TestSubEntity subEntity1 = new TestSubEntity("bar");
expect(dynamicEntity1.get("DS_subEntity")).andReturn(subEntity1);
expect(dynamicEntity2.get("DS_id")).andReturn(100);
expect(dynamicEntity2.get("DS_name")).andReturn("foo");
TestSubEntity subEntity2 = new TestSubEntity("bar");
expect(dynamicEntity2.get("DS_subEntity")).andReturn(subEntity2);
expect(dynamicEntity3.get("DS_id")).andReturn(101);
expect(dynamicEntity3.get("DS_name")).andReturn("foo");
TestSubEntity subEntity3 = new TestSubEntity("bar");
expect(dynamicEntity3.get("DS_subEntity")).andReturn(subEntity3);
// replay mocks
replay(entityManagerFactory, entityManager, jpaDynamicHelper,
dynamicEntity1, dynamicEntity2, dynamicEntity3, query, schemaManager, jpaEntityManager, session, databaseLogin);
DataStoreImpl dataStore = getDataStore(entityManagerFactory, jpaDynamicHelper, classLoader, schemaManager);
Collection<TestEntity> entities = dataStore.findAll(TestEntity.class, "name='foo'");
Assert.assertEquals(3, entities.size());
for (TestEntity entity : entities) {
Assert.assertEquals("foo", entity.getName());
}
// verify mocks
verify(entityManagerFactory, entityManager, jpaDynamicHelper,
dynamicEntity1, dynamicEntity2, dynamicEntity3, query, schemaManager, jpaEntityManager, session, databaseLogin);
}
private DataStoreImpl getDataStore(EntityManagerFactory entityManagerFactory,
JPADynamicHelper jpaDynamicHelper,
DynamicClassLoader classLoader,
SchemaManager schemaManager)
throws Exception {
ViewConfig viewConfig = ViewConfigTest.getConfig(xml);
ViewEntity viewDefinition = ViewEntityTest.getViewEntity(viewConfig);
InstanceConfig instanceConfig = InstanceConfigTest.getInstanceConfigs().get(0);
ViewInstanceEntity viewInstanceEntity = new ViewInstanceEntity(viewDefinition, instanceConfig);
setPersistenceEntities(viewInstanceEntity);
Injector injector = Guice.createInjector(
new TestModule(viewInstanceEntity, entityManagerFactory, jpaDynamicHelper, classLoader, schemaManager));
return injector.getInstance(DataStoreImpl.class);
}
// TODO : move to ViewEntityEntity test.
private static void setPersistenceEntities(ViewInstanceEntity viewInstanceDefinition) {
ViewEntity viewDefinition = viewInstanceDefinition.getViewEntity();
Collection<ViewEntityEntity> entities = new HashSet<>();
ViewConfig viewConfig = viewDefinition.getConfiguration();
for (EntityConfig entityConfiguration : viewConfig.getPersistence().getEntities()) {
ViewEntityEntity viewEntityEntity = new ViewEntityEntity();
viewEntityEntity.setId(1L);
viewEntityEntity.setViewName(viewDefinition.getName());
viewEntityEntity.setViewInstanceName(viewInstanceDefinition.getName());
viewEntityEntity.setClassName(entityConfiguration.getClassName());
viewEntityEntity.setIdProperty(entityConfiguration.getIdProperty());
viewEntityEntity.setViewInstance(viewInstanceDefinition);
entities.add(viewEntityEntity);
}
viewInstanceDefinition.setEntities(entities);
}
public static class TestEntity {
public TestEntity() {
}
TestEntity(int id, String name, TestSubEntity subEntity) {
this.id = id;
this.name = name;
this.subEntity = subEntity;
}
TestEntity(String name, TestSubEntity subEntity) {
this.name = name;
this.subEntity = subEntity;
}
Integer id = null;
String name;
TestSubEntity subEntity;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public TestSubEntity getSubEntity() {
return subEntity;
}
public void setSubEntity(TestSubEntity subEntity) {
this.subEntity = subEntity;
}
}
public static class TestSubEntity {
private Integer id = null;
public TestSubEntity() {
}
TestSubEntity(String name) {
this.name = name;
}
TestSubEntity(Integer id, String name) {
this.id = id;
this.name = name;
}
String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static class TestLargeEntity {
public TestLargeEntity() {
}
public TestLargeEntity(int id) {
this.id = id;
}
Integer id = null;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
private static class TestModule implements Module, SchemaManagerFactory {
private final ViewInstanceEntity viewInstanceEntity;
private final EntityManagerFactory entityManagerFactory;
private final JPADynamicHelper jpaDynamicHelper;
private final DynamicClassLoader classLoader;
private final SchemaManager schemaManager;
private TestModule(ViewInstanceEntity viewInstanceEntity, EntityManagerFactory entityManagerFactory,
JPADynamicHelper jpaDynamicHelper, DynamicClassLoader classLoader,
SchemaManager schemaManager) {
this.viewInstanceEntity = viewInstanceEntity;
this.entityManagerFactory = entityManagerFactory;
this.jpaDynamicHelper = jpaDynamicHelper;
this.classLoader = classLoader;
this.schemaManager = schemaManager;
}
@Override
public void configure(Binder binder) {
binder.bind(ViewInstanceEntity.class).toInstance(viewInstanceEntity);
binder.bind(EntityManagerFactory.class).toInstance(entityManagerFactory);
binder.bind(JPADynamicHelper.class).toInstance(jpaDynamicHelper);
binder.bind(DynamicClassLoader.class).toInstance(classLoader);
binder.bind(SchemaManagerFactory.class).toInstance(this);
}
@Override
public SchemaManager getSchemaManager(DatabaseSession session) {
return schemaManager;
}
}
}