blob: 56ea391ebacf03324f2d686f1cf8d3370c9d9e06 [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 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 v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// etang - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.tests.jpa.sessionbean;
import java.sql.Date;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Random;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Vector;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NameNotFoundException;
import javax.rmi.PortableRemoteObject;
import junit.framework.*;
import jakarta.persistence.EntityManager;
import org.eclipse.persistence.internal.helper.Helper;
import org.eclipse.persistence.sessions.server.ServerSession;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
import org.eclipse.persistence.testing.models.jpa.fieldaccess.advanced.*;
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, the test steps are:
* 1. Only run testSetup() with JTA to insert a certain amount of objects like defined below 2514
* 2. Test Read using JTA and NonJTA
* 2.1 JTA: Repeat 300 times, swap/crash 5 times RAC DB, you will get java.sql.SQLRecoverableException: No more data to read from
* socket immediately when shutdown happended in middle of transaction during read query
* 2.2 NonJTA: repeat 121 times, swap or crash RAC DB 5 times, you will get "No more data to read from socket" exception, but tests continue
* 3. Test Update only using JTA
* 3.1 JTA: repeat 60 times, stop/kill one instance, keep the instance down, you will see unexpected exception when trying to insert
* address, the tests should continue after ignore the first exception
*/
public class SessionBeanHATests extends JUnitTestCase {
protected EmployeeService service;
static ServerSession serverSession;
static int jtaCount = 2514;
static int nonJTACount = 2514;
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", true));
//suite.addTest(new SessionBeanHATests("testFindAllNonJTA", true));
suite.addTest(new SessionBeanHATests("testUpdate", false));
//following test is not used in RAC testing
//suite.addTest(new SessionBeanHATests("testFindAllMultipleThread", true));
return suite;
}
public void testSetup() throws Exception {
new AdvancedTableCreator().replaceTables(JUnitTestCase.getServerSession("sessionbean"));
for (int i = 1; i <= jtaCount; i++)
{
Employee bob = new Employee();
bob.setFirstName("Bob");
String lastName = ""+System.currentTimeMillis();
bob.setLastName(lastName);
bob.setAddress(new Address());
bob.setDepartment(new Department());
getEmployeeService().insert(bob);
}
}
public void testFindAll() throws Exception {
int repeatTimes = 50;
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 != jtaCount) {
fail("The count is " + employCount +", Failed to find all employees");
}
Thread.sleep(3000);
} catch (Exception e) {
fail(e.toString());
}
}
}
public void testFindAllNonJTA() throws Exception {
int repeatTimes = 121;
for (int i = 1; i <= repeatTimes; i++) {
EntityManager em = getServerPlatform().getEntityManagerFactory("sessionbean").createEntityManager();
try {
System.out.println("===FindAllNonJTA iteration " + i);
List result = em.createQuery("Select e from Employee e").getResultList();
int employCount = 0;
for (Iterator iterator = result.iterator(); iterator.hasNext(); ) {
Employee employee = (Employee)iterator.next();
employCount++;
}
if (employCount != nonJTACount) {
fail("The count is " + employCount +", Failed to find all employees");
}
Thread.sleep(3000);
} catch (Exception e) {
fail(e.toString());
}
}
}
public void testUpdate() throws Exception {
//create a new employee for updating
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 = 500;
int repeatTimes = 60;
int exceptTimes = 0;
for (int i = 1; i <= repeatTimes; i++) {
try {
System.out.println("===Update iteration " + i);
employee = getEmployeeService().findById(id);
employee.setFirstName("Small Romantic Moon Over The Lake");
employee.setLastName("Big White Horse who gallops the grass");
Address address = new Address();
address.setCountry("Canada");
address.setProvince("Newfoundland and Labrador");
address.setCity("Harbour Main-Chapel Cove-Lakeview");
address.setStreet("96 Brownskill");
address.setPostalCode("K1P1A6");
employee.setAddress(address);
employee.setMale();
employee.setSalary(150000);
employee.setRoomNumber(407);
Department dept = new Department();
dept.setName("Software Quality Assurance");
dept.addManager(employee);
employee.setDepartment(dept);
Vector reps = new Vector(2);
reps.add("scrum everyday, weekly status report and abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
reps.add("unit test, integration and system test abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
employee.setResponsibilities(reps);
EmploymentPeriod period = new EmploymentPeriod();
period.setStartDate(Date.valueOf("2010-11-12"));
period.setEndDate(Date.valueOf("2010-11-13"));
employee.setPeriod(period);
employee.setWorkWeek(new HashSet<Employee.Weekdays>());
employee.getWorkWeek().add(Employee.Weekdays.MONDAY);
employee.getWorkWeek().add(Employee.Weekdays.TUESDAY);
employee.getWorkWeek().add(Employee.Weekdays.WEDNESDAY);
employee.getWorkWeek().add(Employee.Weekdays.THURSDAY);
employee.setStatus(Employee.EmployeeStatus.FULL_TIME);
employee.setPayScale(Employee.SalaryRate.EXECUTIVE);
employee.setFormerEmployment(new FormerEmployment("Original", new EmploymentPeriod(Helper.dateFromYearMonthDate(1990, 0, 1), Helper.dateFromYearMonthDate(1993, 11, 31))));
Vector emps = new Vector(2);
Employee emp1 = new Employee();
emp1.setFirstName("Hemavatinandan");
emp1.setLastName("Padmabandhu");
emp1.setManager(employee);
emps.add(emp1);
Employee emp2 = new Employee();
emp2.setFirstName("Deepaprabha");
emp2.setLastName("Kanchanprabha");
emp2.setManager(employee);
emps.add(emp2);
employee.setManagedEmployees(emps);
Vector projs = new Vector(3);
Project proj1 = new SmallProject();
proj1.setName("Persistence Enabled in Cloud");
projs.add(proj1);
Project proj2 = new LargeProject();
proj2.setName("Session Data Affinity Test");
projs.add(proj2);
Project proj3 = new LargeProject();
proj3.setName("Release Exit Criteria Testing");
proj3.setTeamLeader(employee);
projs.add(proj3);
employee.setProjects(projs);
Vector phones = new Vector(2);
PhoneNumber phone = new PhoneNumber("work", "613", "1234567");
phones.add(phone);
phone.setOwner(employee);
phone = new PhoneNumber("home", "613", "8888666");
phones.add(phone);
phone.setOwner(employee);
employee.setPhoneNumbers(phones);
getEmployeeService().update(employee);
Thread.sleep(3000);
} catch (Exception e) {
exceptTimes++;
//When shutdown one instance, and keep it down forever, we should except one exception during the shutdown, tests should continue after that
System.out.println("=====the exceptTimes is " + exceptTimes);
if (exceptTimes != 1)
{
fail(e.toString());
}
}
}
}
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 testFindAllMultipleThread() throws Exception {
// Initialize and launch threads to find Employees
FindAllThread[] helperRunnable = new FindAllThread[10];
for (int i = 0; i < helperRunnable.length; i++) {
helperRunnable[i] = new FindAllThread(i);
}
org.eclipse.persistence.platform.server.ServerPlatform platform = JUnitTestCase.getServerSession("sessionbean").getServerPlatform();
for (int i = 0; i < helperRunnable.length; i++) {
platform.launchContainerRunnable(helperRunnable[i]);
}
// wait all FindAllConcurrentlyThread's for finishing FindAll queries
while(true){
Thread.sleep(3000);
boolean finished = true;
for (int i = 0; i < helperRunnable.length; i++)
{
finished = finished && helperRunnable[i].finished;
}
if (finished) break;
}
// verify if all FindAllConcurrentlyThread's are succeeded
for (int i = 0; i < helperRunnable.length; i++) {
if (!helperRunnable[i].succeeded)
fail("RAC failure caused some other exception: "+helperRunnable[i].relatedException);
}
}
}