/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.testing.tests.jpa.validation; import java.util.HashMap; import junit.framework.Test; import junit.framework.TestSuite; import java.util.Map; import javax.persistence.*; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; import java.util.logging.Logger; import org.eclipse.persistence.config.PersistenceUnitProperties; import org.eclipse.persistence.internal.jpa.EntityManagerImpl; import org.eclipse.persistence.testing.framework.junit.JUnitTestCase; import org.eclipse.persistence.testing.framework.junit.JUnitTestCaseHelper; import org.eclipse.persistence.testing.models.jpa.advanced.Employee; public class ValidationTestSuite extends JUnitTestCase { public ValidationTestSuite() { } public ValidationTestSuite(String name) { super(name); } public void setUp () { super.setUp(); // Don't clear the cache here since it bring the default pu into play. } public static Test suite() { TestSuite suite = new TestSuite(ValidationTestSuite.class) { protected void setUp(){ } protected void tearDown() { } }; suite.setName("ValidationTestSuite"); return suite; } public void testCacheIsolation_PropertiesDefault_Config() throws Exception { // Be sure not to modify the global properties. Map properties = new HashMap(JUnitTestCaseHelper.getDatabaseProperties()); properties.put(PersistenceUnitProperties.CACHE_SHARED_DEFAULT, Boolean.FALSE.toString()); EntityManager em = createEntityManager("isolated1053", properties); assertTrue("Item descriptor did not have an isolated cache setting from a TopLink properties setting.", ((EntityManagerImpl)em).getServerSession().getClassDescriptorForAlias("Item").isIsolated()); closeEntityManager(em); // Ensure this is done to avoid consecutive tests picking up our // very specific isolated persistence unit. this.closeEntityManagerFactory("isolated1053"); } /** * This test assumes the persistence unit has the following property set: * <property name="eclipselink.cache.shared.default" value="false"/> * @throws Exception */ public void testCacheIsolation_XMLDefault_Config() throws Exception { EntityManager em = createEntityManager("isolated1053"); assertTrue("Item descriptor did not have an isolated cache setting from an XML setting.", ((EntityManagerImpl)em).getServerSession().getClassDescriptorForAlias("Item").isIsolated()); closeEntityManager(em); // Ensure this is done to avoid consecutive tests picking up our // very specific isolated persistence unit. this.closeEntityManagerFactory("isolated1053"); } /** * This tests fix for gf bug 2492, specifically testing * javax.persistence.jtaDataSource property. There is no easy way outside a container * to ensure the look up fails, but this test ensures that the datasource passed in * is used to acquire a connection on login. */ public void testJTADatasource_Config_Override() throws Exception { boolean pass = false; Map properties = new HashMap(); tmpDataSourceImp jtadatasourece = new tmpDataSourceImp(); properties.put(PersistenceUnitProperties.JTA_DATASOURCE, jtadatasourece); EntityManager em = null; try { em = createEntityManager("ignore", properties); } catch (RuntimeException expected) { pass = expected.getMessage().indexOf("tmpDataSourceImp getConnection called") != -1; if (!pass) { throw expected; } } finally { if (em != null) { closeEntityManager(em); } // Ensure this is done to avoid consecutive tests picking up our // very specific isolated persistence unit. this.closeEntityManagerFactory("ignore"); } assertTrue("JTA datasource was not set or accessed as expected through map of properties", pass); } /** * This tests fix for gf bug 2492, specifically testing * javax.persistence.jtaDataSource property. There is no easy way outside a container * to ensure the look up fails, but this test ensures that the datasource passed in * is used to acquire a connection on login. */ public void testNonJTADatasource_Config_Override() throws Exception { boolean pass = false; Map properties = new HashMap(); tmpDataSourceImp nonJTADatasourece = new tmpDataSourceImp(); properties.put(PersistenceUnitProperties.NON_JTA_DATASOURCE, nonJTADatasourece); EntityManager em = null; try { em = createEntityManager("ignore", properties); } catch (RuntimeException expected) { pass = expected.getMessage().indexOf("tmpDataSourceImp getConnection called") != -1; if (!pass) { throw expected; } } finally { if (em != null) { closeEntityManager(em); } // Ensure this is done to avoid consecutive tests picking up our // very specific isolated persistence unit. this.closeEntityManagerFactory("ignore"); } assertTrue("Non JTA datasource was not set or accessed as expected through map of properties", pass); } public void testPKClassTypeValidation(){ try{ createEntityManager().find(Employee.class, new Employee()); }catch (IllegalArgumentException ex){ return; } fail("Failed to throw expected IllegalArgumentException, when incorrect PKClass is used in find call"); } /** * Bug 367007 - map values of javax.persistence.validation.mode are incorrectly throwing exception * Create an EntityManager with valid parameter values for javax.persistence.validation.mode */ public void testValidValidationModes() { // test only applicable to JPA 2.0 and above if (isJPA10()) { return; } String property = "javax.persistence.validation.mode"; String[] validationModes = { "none", "NONE", "NoNe", ValidationMode.NONE.name(), "auto", "AUTO", "AuTo", ValidationMode.AUTO.name(), }; // close the emf first to allow properties to be specified closeEntityManagerFactory(); for (String validationMode : validationModes) { EntityManager em = null; try { Map<String, String> props = new HashMap<String, String>(); props.putAll(JUnitTestCaseHelper.getDatabaseProperties()); props.put(property, validationMode); em = createEntityManager(props); } catch (RuntimeException exception) { fail("Exception caught when passing property: [" + property + "] = [" + validationMode + "] when creating an EntityManager: " + exception.getMessage()); } finally { if (em != null) { closeEntityManager(em); } closeEntityManagerFactory(); } } } public class tmpDataSourceImp implements DataSource{ public tmpDataSourceImp(){ super(); } public Connection getConnection() throws SQLException{ RuntimeException exception = new RuntimeException("tmpDataSourceImp getConnection called"); throw exception; } public Connection getConnection(String username, String password) throws SQLException{ return getConnection(); } //rest are ignored public java.io.PrintWriter getLogWriter() throws SQLException{ return null; } public void setLogWriter(java.io.PrintWriter out) throws SQLException{} public void setLoginTimeout(int seconds) throws SQLException{} public int getLoginTimeout() throws SQLException{return 1;} public <T> T unwrap(Class<T> iface) throws SQLException { return null; } public boolean isWrapperFor(Class<?> iface) throws SQLException { return false; } public Logger getParentLogger(){return null;} } }