blob: 29187ae3dc38e7971419844e71b3a838c2f6d9fa [file] [log] [blame]
/*
* 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 WARRANTIESOR 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.aries.tx.control.itests;
import static java.util.Arrays.stream;
import static org.junit.Assert.assertEquals;
import java.util.List;
import java.util.Optional;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import org.apache.aries.tx.control.itests.entity.Message;
import org.junit.Test;
import org.osgi.framework.Bundle;
import org.osgi.service.transaction.control.TransactionControl;
import org.osgi.service.transaction.control.jpa.JPAEntityManagerProvider;
import org.osgi.service.transaction.control.jpa.JPAEntityManagerProviderFactory;
public abstract class AbstractSimpleTransactionTest extends AbstractJPATransactionTest {
@Test
public void testTx() {
Message message = new Message();
message.message = "Hello World!";
txControl.required(() -> {
em.persist(message);
return null;
});
assertEquals("Hello World!", txControl.notSupported(() -> {
return em.find(Message.class, message.id).message;
}));
}
@Test
public void testRollback() {
Message message = new Message();
message.message = "Hello World!";
txControl.required(() -> {
em.persist(message);
txControl.setRollbackOnly();
return null;
});
assertEquals(Long.valueOf(0), txControl.notSupported(() -> {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> countQuery = cb.createQuery(Long.class);
countQuery.select(cb.count(countQuery.from(Message.class)));
return em.createQuery(countQuery).getSingleResult();
}));
}
@Test
public void testNestedTx() {
Message message = new Message();
message.message = "Hello World!";
Message message2 = new Message();
message2.message = "Hello Nested World!";
txControl.required(() -> {
em.persist(message);
txControl.requiresNew(() -> {
em.persist(message2);
return null;
});
return null;
});
List<Message> results = txControl.notSupported(() -> {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Message> query = cb.createQuery(Message.class);
query.orderBy(cb.asc(query.from(Message.class).get("message")));
return em.createQuery(query).getResultList();
});
System.out.println(results);
assertEquals(2, results.size());
assertEquals("Hello Nested World!", results.get(0).message);
assertEquals("Hello World!", results.get(1).message);
}
@Test
public void testNestedTxOuterRollback() {
Message message = new Message();
message.message = "Hello World!";
Message message2 = new Message();
message2.message = "Hello Nested World!";
txControl.required(() -> {
// This will not end up in the database
em.persist(message);
// This should only apply to the current transaction level
txControl.setRollbackOnly();
// This nested transaction will commit
txControl.requiresNew(() -> {
em.persist(message2);
return null;
});
return null;
});
List<Message> results = txControl.notSupported(() -> {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Message> query = cb.createQuery(Message.class);
query.orderBy(cb.asc(query.from(Message.class).get("message")));
return em.createQuery(query).getResultList();
});
System.out.println(results);
assertEquals(1, results.size());
assertEquals("Hello Nested World!", results.get(0).message);
}
@Test
public void testNestedTxInnerRollback() {
Message message = new Message();
message.message = "Hello World!";
Message message2 = new Message();
message2.message = "Hello Nested World!";
txControl.required(() -> {
// This will end up in the database
em.persist(message);
// This nested transaction will not commit
txControl.requiresNew(() -> {
em.persist(message2);
txControl.setRollbackOnly();
return null;
});
return null;
});
List<Message> results = txControl.notSupported(() -> {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Message> query = cb.createQuery(Message.class);
query.orderBy(cb.asc(query.from(Message.class).get("message")));
return em.createQuery(query).getResultList();
});
System.out.println(results);
assertEquals(1, results.size());
assertEquals("Hello World!", results.get(0).message);
}
@Test
public void testRequiredInheritsTx() {
Message message = new Message();
message.message = "Hello World!";
Message message2 = new Message();
message2.message = "Hello Nested World!";
txControl.required(() -> {
em.persist(message);
txControl.required(() -> {
em.persist(message2);
return null;
});
return null;
});
List<Message> results = txControl.notSupported(() -> {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Message> query = cb.createQuery(Message.class);
query.orderBy(cb.asc(query.from(Message.class).get("message")));
return em.createQuery(query).getResultList();
});
System.out.println(results);
assertEquals(2, results.size());
assertEquals("Hello Nested World!", results.get(0).message);
assertEquals("Hello World!", results.get(1).message);
}
@Test
public void testSuspendedTx() {
Message message = new Message();
message.message = "Hello World!";
txControl.required(() -> {
em.persist(message);
assertEquals(Long.valueOf(0), txControl.notSupported(() -> {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> countQuery = cb.createQuery(Long.class);
countQuery.select(cb.count(countQuery.from(Message.class)));
return em.createQuery(countQuery).getSingleResult();
}));
return null;
});
}
@Test
public void reassignTxControl() throws Exception {
Optional<Bundle> bundle = stream(context.getBundles())
.filter(b -> b.getSymbolicName().startsWith("tx-control-provider-jpa"))
.findAny();
bundle.get().stop();
bundle.get().start();
txControl = getService(TransactionControl.class,
System.getProperty(TX_CONTROL_FILTER), 5000);
if(isConfigured()) {
em = getService(JPAEntityManagerProvider.class, 5000).getResource(txControl);
} else {
em = getService(JPAEntityManagerProviderFactory.class, 5000)
.getProviderFor(builder, jpaProps, providerProps).getResource(txControl);
}
testTx();
}
}