/******************************************************************************* | |
* Copyright (c) 1998, 2013 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.nativeapitest; | |
import java.util.Arrays; | |
import java.util.Iterator; | |
import java.util.List; | |
import java.util.Properties; | |
import javax.naming.Context; | |
import javax.naming.InitialContext; | |
import javax.naming.NamingException; | |
import javax.rmi.PortableRemoteObject; | |
import junit.framework.Test; | |
import junit.framework.TestSuite; | |
import org.eclipse.persistence.exceptions.ValidationException; | |
import org.eclipse.persistence.sessions.factories.SessionManager; | |
import org.eclipse.persistence.sessions.server.ServerSession; | |
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase; | |
import org.eclipse.persistence.testing.models.nativeapitest.Address; | |
import org.eclipse.persistence.testing.models.nativeapitest.Department; | |
import org.eclipse.persistence.testing.models.nativeapitest.Employee; | |
import org.eclipse.persistence.testing.models.nativeapitest.EmployeeService; | |
import org.eclipse.persistence.testing.models.nativeapitest.NativeAPITestTableCreator; | |
/** | |
* EJB 3 NativeAPITests tests. Testing using EclipseLink Native ORM API in a JEE | |
* EJB 3 SessionBean environment. These tests can only be run with a server. | |
*/ | |
public class NativeAPITests extends JUnitTestCase { | |
protected EmployeeService service; | |
public NativeAPITests() { | |
super(); | |
} | |
public NativeAPITests(String name) { | |
super(name); | |
} | |
public NativeAPITests(String name, boolean shouldRunTestOnServer) { | |
super(name); | |
this.shouldRunTestOnServer = shouldRunTestOnServer; | |
} | |
public static Test suite() { | |
TestSuite suite = new TestSuite("NativeAPITests"); | |
suite.addTest(new NativeAPITests("testSetup", true)); | |
suite.addTest(new NativeAPITests("testFindAll", false)); | |
suite.addTest(new NativeAPITests("testFindAllServer", true)); | |
suite.addTest(new NativeAPITests("testMerge", false)); | |
suite.addTest(new NativeAPITests("testMergeServer", true)); | |
return suite; | |
} | |
/** | |
* The setup is done as a test, both to record its failure, and to alow | |
* execution in the server. | |
*/ | |
public void testSetup() throws Exception { | |
new NativeAPITestTableCreator().replaceTables((ServerSession)SessionManager.getManager().getSession("NativeAPITest", this.getClass().getClassLoader())); | |
Employee bob = new Employee(); | |
bob.setFirstName("Bob"); | |
bob.setLastName("Jones"); | |
bob.setAddress(new Address()); | |
bob.setDepartment(new Department()); | |
getEmployeeService().insert(bob); | |
Employee joe = new Employee(); | |
joe.setFirstName("Joe"); | |
joe.setLastName("Smith"); | |
joe.setAddress(new Address()); | |
joe.setDepartment(new Department()); | |
getEmployeeService().insert(joe); | |
} | |
private static final String[] LOOKUP_STRINGS = new String[] { | |
// server, Oc4j | |
"java:comp/env/ejb/EmployeeService", "ejb/EmployeeService", | |
// WLS | |
"EmployeeService#org.eclipse.persistence.testing.models.nativeapitest.EmployeeService", | |
// WAS | |
"org.eclipse.persistence.testing.models.nativeapitest.EmployeeService", | |
// jboss | |
"eclipselink-nativeapitest-model/EmployeeServiceBean/remote-org.eclipse.persistence.testing.models.nativeapitest.EmployeeService", | |
// NetWeaver | |
"JavaEE/servertest/REMOTE/EmployeeServiceBean/org.eclipse.persistence.testing.models.nativeapitest.EmployeeService" }; | |
public EmployeeService getEmployeeService() throws Exception { | |
if (service != null) { | |
return service; | |
} | |
Properties properties = new Properties(); | |
String url = System.getProperty("server.url"); | |
if (url != null) { | |
properties.put("java.naming.provider.url", url); | |
} | |
Context context = new InitialContext(properties); | |
for (String candidate : LOOKUP_STRINGS) { | |
try { | |
service = (EmployeeService) PortableRemoteObject.narrow(context.lookup(candidate), EmployeeService.class); | |
return service; | |
} catch (NamingException namingException) { | |
// OK, try next | |
} | |
} | |
throw new RuntimeException("EmployeeService bean could not be looked up under any of the following names:\n" + Arrays.asList(LOOKUP_STRINGS)); | |
} | |
public void testFindAll() throws Exception { | |
List result = getEmployeeService().findAll(); | |
for (Iterator iterator = result.iterator(); iterator.hasNext();) { | |
Employee employee = (Employee) iterator.next(); | |
employee.getFirstName(); | |
employee.getLastName(); | |
boolean caughtError = false; | |
Address address = null; | |
try { | |
address = employee.getAddress(); | |
} catch (ValidationException exception) { | |
caughtError = true; | |
if (exception.getErrorCode() != ValidationException.INSTANTIATING_VALUEHOLDER_WITH_NULL_SESSION) { | |
throw exception; | |
} | |
} | |
// May not serialize on server, so may be ok. | |
if (address == null) { | |
if (isOnServer() && !caughtError) { | |
fail("INSTANTIATING_VALUEHOLDER_WITH_NULL_SESSION error not thrown."); | |
} else { | |
warning("Client serialization nulls non-instantiated 1-1s."); | |
} | |
} | |
if (employee.getDepartment() == null) { | |
fail("Department is null, failed to serialize eager."); | |
} | |
caughtError = false; | |
try { | |
employee.getPhoneNumbers().size(); | |
} catch (ValidationException exception) { | |
caughtError = true; | |
if (exception.getErrorCode() != ValidationException.INSTANTIATING_VALUEHOLDER_WITH_NULL_SESSION) { | |
throw exception; | |
} | |
} | |
if (address == null && !caughtError) { | |
fail("INSTANTIATING_VALUEHOLDER_WITH_NULL_SESSION error not thrown."); | |
} | |
} | |
} | |
public void testFindAllServer() throws Exception { | |
testFindAll(); | |
} | |
public void testMerge() throws Exception { | |
Employee employee = new Employee(); | |
employee.setFirstName("Bob"); | |
employee.setLastName("Smith"); | |
Employee manager = new Employee(); | |
manager.setFirstName("Jon"); | |
manager.setLastName("Way"); | |
employee.setAddress(new Address()); | |
employee.getAddress().setCity("Nepean"); | |
employee.setManager(manager); | |
int id = getEmployeeService().insert(employee); | |
employee = getEmployeeService().findById(id); | |
employee.setLastName("Wayy"); | |
employee.getAddress().setCity("Kanata"); | |
getEmployeeService().update(employee); | |
employee = getEmployeeService().findById(id); | |
if (!employee.getLastName().equals("Wayy")) { | |
fail("Last name not updated."); | |
} | |
if (!employee.getAddress().getCity().equals("Kanata")) { | |
fail("City not updated."); | |
} | |
employee = getEmployeeService().fetchById(id); | |
if (employee.getManager() == null) { | |
if (isOnServer()) { | |
fail("Manager merged to null."); | |
} else { | |
warning("Merge from client serialization nulls non-instantiated 1-1s."); | |
} | |
} | |
} | |
public void testMergeServer() throws Exception { | |
testMerge(); | |
} | |
} |