Index: jpa/eclipselink.jpa.test/build.xml =================================================================== --- jpa/eclipselink.jpa.test/build.xml (revision 2699) +++ jpa/eclipselink.jpa.test/build.xml (working copy) @@ -1129,6 +1129,23 @@ + + + + + + + + + + + + + + + Index: jpa/eclipselink.jpa.test/resource/server/persistence.xml =================================================================== --- jpa/eclipselink.jpa.test/resource/server/persistence.xml (revision 2673) +++ jpa/eclipselink.jpa.test/resource/server/persistence.xml (working copy) @@ -5,6 +5,7 @@ + Index: jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/jpa/sessionbean/SessionBeanHATests.java =================================================================== --- jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/jpa/sessionbean/SessionBeanHATests.java (revision 0) +++ jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/jpa/sessionbean/SessionBeanHATests.java (revision 0) @@ -0,0 +1,154 @@ +/******************************************************************************* + * Copyright (c) 1998, 2008 Oracle. 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: + * etang - initial API and implementation from Oracle TopLink + ******************************************************************************/ + package org.eclipse.persistence.testing.tests.jpa.sessionbean; + +import java.util.Random; +import java.util.Iterator; +import java.util.List; +import java.util.Properties; +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.NameNotFoundException; +import javax.rmi.PortableRemoteObject; + +import junit.framework.*; + +import org.eclipse.persistence.sessions.server.ServerSession; + +import org.eclipse.persistence.exceptions.ValidationException; +import org.eclipse.persistence.testing.framework.junit.JUnitTestCase; +import org.eclipse.persistence.testing.models.jpa.fieldaccess.advanced.Department; +import org.eclipse.persistence.testing.models.jpa.fieldaccess.advanced.Employee; +import org.eclipse.persistence.testing.models.jpa.fieldaccess.advanced.Address; +import org.eclipse.persistence.testing.models.jpa.fieldaccess.advanced.AdvancedTableCreator; +import org.eclipse.persistence.testing.models.jpa.sessionbean.EmployeeService; + +/** + * EJB 3 SessionBean tests using EclipseLink JPA + * These tests can only be run in Oracle High Availability environment - + * a WebLogic server configured with Multi Data Sources to connect to Oracle RAC database + * They read/write entity bean repeatly for 300 times, in the meantime, RAC database failures can be simulated, + * to ensure no exceptions would be caused the RAC database failures. + */ +public class SessionBeanHATests extends JUnitTestCase { + protected EmployeeService service; + + public SessionBeanHATests() { + super(); + } + + public SessionBeanHATests(String name) { + super(name); + } + + public SessionBeanHATests(String name, boolean shouldRunTestOnServer) { + super(name); + this.shouldRunTestOnServer = shouldRunTestOnServer; + } + + public static Test suite() { + TestSuite suite = new TestSuite("SessionBeanHATests"); + suite.addTest(new SessionBeanHATests("testSetup", true)); + suite.addTest(new SessionBeanHATests("testFindAll", false)); + suite.addTest(new SessionBeanHATests("testUpdate", false)); + + return suite; + } + + public void testSetup() throws Exception { + new AdvancedTableCreator().replaceTables(JUnitTestCase.getServerSession("sessionbean")); + 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); + } + + public EmployeeService getEmployeeService() throws Exception { + if (service == null) { + 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); + + try { + service = (EmployeeService) PortableRemoteObject.narrow(context.lookup("EmployeeService#org.eclipse.persistence.testing.models.jpa.sessionbean.EmployeeService"), EmployeeService.class); + } catch (NameNotFoundException notFoundException) { + throw new Error("Lookup failed.", notFoundException); + } + } + return service; + } + + public void testFindAll() throws Exception { + int repeatTimes = 300; + + for (int i = 1; i <= repeatTimes; i++) { + try { + System.out.println("===FindAll iteration " + i); + List result = getEmployeeService().findAll(); + int employCount = 0; + for (Iterator iterator = result.iterator(); iterator.hasNext(); ) { + Employee employee = (Employee)iterator.next(); + employCount++; + } + if (employCount != 2) { + fail("The count is " + employCount +", Failed to find all employees"); + } + Thread.currentThread().sleep(3000); + } catch (Exception e) { + fail(e.toString()); + } + } + } + + public void testUpdate() 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); + + int repeatTimes = 300; + Random generator = new Random(); + + for (int i = 1; i <= repeatTimes; i++) { + try { + System.out.println("===Update iteration " + i); + + employee = getEmployeeService().findById(id); + employee.setLastName(String.valueOf(generator.nextInt())); + employee.getAddress().setCity(String.valueOf(generator.nextInt())); + getEmployeeService().update(employee); + Thread.currentThread().sleep(3000); + } catch (Exception e) { + fail(e.toString()); + } + } + } +}