Author: rwatler
Date: Mon Nov 24 15:01:25 2014
New Revision: 1641403
URL: http://svn.apache.org/r1641403
Log:
JS2-1307: Refactor Jexl Scriptable Test Case for Reuse.
Added:
portals/jetspeed-2/portal/trunk/components/jetspeed-cm/src/main/java/org/apache/jetspeed/components/test/AbstractJexlSpringTestCase.java
portals/jetspeed-2/portal/trunk/components/jetspeed-cm/src/main/java/org/apache/jetspeed/components/test/AbstractJexlSpringTestServer.java
Modified:
portals/jetspeed-2/portal/trunk/components/jetspeed-cm/pom.xml
portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/test/java/org/apache/jetspeed/page/cache/DatabasePageManagerServer.java
portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/test/java/org/apache/jetspeed/page/cache/TestDatabasePageManagerCache.java
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-cm/pom.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-cm/pom.xml?rev=1641403&r1=1641402&r2=1641403&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-cm/pom.xml (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-cm/pom.xml Mon Nov 24 15:01:25 2014
@@ -46,6 +46,11 @@
<scope>provided</scope>
</dependency>
<dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>jetspeed-commons</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
@@ -125,6 +130,18 @@
<artifactId>junit</artifactId>
<scope>provided</scope>
</dependency>
+ <!--
+ again, abstract test cases require jexl... mark as
+ provided to keep jexl out of runtime. requires jexl
+ be included as test dependencies where used. should
+ be fixed if the project structure is reworked; see
+ junit dependency above.
+ -->
+ <dependency>
+ <groupId>commons-jexl</groupId>
+ <artifactId>commons-jexl</artifactId>
+ <scope>provided</scope>
+ </dependency>
<!-- Test Dependencies -->
<dependency>
Added: portals/jetspeed-2/portal/trunk/components/jetspeed-cm/src/main/java/org/apache/jetspeed/components/test/AbstractJexlSpringTestCase.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-cm/src/main/java/org/apache/jetspeed/components/test/AbstractJexlSpringTestCase.java?rev=1641403&view=auto
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-cm/src/main/java/org/apache/jetspeed/components/test/AbstractJexlSpringTestCase.java (added)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-cm/src/main/java/org/apache/jetspeed/components/test/AbstractJexlSpringTestCase.java Mon Nov 24 15:01:25 2014
@@ -0,0 +1,253 @@
+/*
+ * 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 WARRANTIES OR 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.jetspeed.components.test;
+
+import junit.framework.TestCase;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Abstract Jexl scriptable test case.
+ *
+ * @author <a href="mailto:[email protected]">Randy Watler</a>
+ * @version $Id:$
+ */
+public abstract class AbstractJexlSpringTestCase extends TestCase {
+
+ private static final long LOGGING_PUMP_WAIT = 50;
+
+ private Logger log = LoggerFactory.getLogger(getClass());
+
+ private String osExecutableExtension;
+ private String fileSeparator;
+ private File javaExecutablePath;
+ private String classPathSeparator;
+ private File projectDirectoryPath;
+ private Map<String,String> systemProperties;
+ private String classPath;
+
+ @Override
+ protected void setUp() throws Exception {
+ // environment setup
+ osExecutableExtension = (System.getProperty("os.name").startsWith("Windows") ? ".exe" : "");
+ fileSeparator = System.getProperty("file.separator");
+ javaExecutablePath = new File(System.getProperty("java.home")+fileSeparator+"bin"+fileSeparator+"java"+osExecutableExtension);
+ classPathSeparator = System.getProperty("path.separator");
+ projectDirectoryPath = new File(System.getProperty("basedir"));
+ systemProperties = new HashMap<String,String>();
+ for (Map.Entry<Object,Object> systemProperty : System.getProperties().entrySet()) {
+ String propertyName = systemProperty.getKey().toString();
+ String propertyValue = systemProperty.getValue().toString();
+ if (propertyName.startsWith("org.apache.jetspeed.") || propertyName.startsWith("java.net.") || propertyName.equals("basedir")) {
+ systemProperties.put(propertyName, propertyValue);
+ }
+ }
+
+ // construct launcher classpath from current class loader
+ StringBuilder classPathBuilder = new StringBuilder();
+ ClassLoader loader = this.getClass().getClassLoader();
+ assertTrue(loader instanceof URLClassLoader);
+ URLClassLoader urlLoader = (URLClassLoader)loader;
+ assertNotNull(urlLoader.getURLs());
+ for (URL pathURL : urlLoader.getURLs()) {
+ // convert path URL to file path
+ String path = new File(pathURL.toURI()).getCanonicalPath();
+
+ // build class path
+ if (classPathBuilder.length() > 0) {
+ classPathBuilder.append(classPathSeparator);
+ }
+ classPathBuilder.append(path);
+ }
+ classPath = classPathBuilder.toString();
+ assertTrue(classPath.length() > 0);
+
+ // continue setup
+ super.setUp();
+ }
+
+ protected String testProgramSystemPropertyValueFilter(String propertyName, int index, String propertyValue) {
+ // return original property value by default
+ return propertyValue;
+ }
+
+ protected Map<String,String> testProgramSystemProperties() {
+ return new HashMap<String,String>();
+ }
+
+ protected void sleep(TestProgram server0, TestProgram server1, long millis) throws IOException, InterruptedException {
+ long slept = 0;
+ while (slept < millis) {
+ // poll servers for logging
+ server0.poll();
+ server1.poll();
+ // sleep for interval
+ long sleep = Math.min(millis-slept, LOGGING_PUMP_WAIT);
+ Thread.sleep(sleep);
+ slept += sleep;
+ }
+ }
+
+ protected class TestProgram {
+
+ private String name;
+ private Class<?> mainClass;
+ private int index;
+
+ private Process process;
+ private BufferedWriter processInput;
+ private BufferedReader processOutput;
+
+ public TestProgram(String name, Class<?> mainClass, int index) {
+ this.name = name;
+ this.mainClass = mainClass;
+ this.index = index;
+ }
+
+ public synchronized void start() throws IOException {
+ assertNull(process);
+
+ // configure launcher with paths, properties, and indexed properties
+ ProcessBuilder launcher = new ProcessBuilder();
+ List<String> commandAndArgs = new ArrayList<String>();
+ commandAndArgs.add(javaExecutablePath.getCanonicalPath());
+ for (Map.Entry<String,String> systemProperty : systemProperties.entrySet()) {
+ String propertyName = systemProperty.getKey();
+ String propertyValue = testProgramSystemPropertyValueFilter(propertyName, index, systemProperty.getValue());
+ commandAndArgs.add( "-D"+propertyName+"="+propertyValue);
+ }
+ for (Map.Entry<String,String> systemProperty : testProgramSystemProperties().entrySet()) {
+ String propertyName = systemProperty.getKey();
+ String propertyValue = testProgramSystemPropertyValueFilter(propertyName, index, systemProperty.getValue());
+ commandAndArgs.add( "-D"+propertyName+"="+propertyValue);
+ }
+ commandAndArgs.add("-classpath");
+ commandAndArgs.add(classPath);
+ commandAndArgs.add(mainClass.getName());
+ log.info("Launcher command for "+name+": "+commandAndArgs);
+ launcher.command(commandAndArgs);
+ launcher.directory(projectDirectoryPath);
+ launcher.redirectErrorStream(true);
+
+ // launch test programs
+ process = launcher.start();
+
+ // setup I/O for process
+ processInput = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
+ processOutput = new BufferedReader(new InputStreamReader(process.getInputStream()));
+
+ // read messages from process
+ for (String line; (processOutput.ready() && ((line = processOutput.readLine()) != null));) {
+ logProcessLine(line);
+ }
+ }
+
+ public synchronized void poll() throws IOException
+ {
+ assertNotNull(process);
+
+ // read messages from process
+ for (String line; (processOutput.ready() && ((line = processOutput.readLine()) != null));) {
+ logProcessLine(line);
+ }
+ }
+
+ public synchronized String execute(String scriptLine) throws IOException
+ {
+ // poll to read messages from process
+ poll();
+
+ // write script line to process
+ processInput.write(scriptLine);
+ processInput.newLine();
+ processInput.flush();
+
+ // read result or messages from process
+ String resultLine = null;
+ for (String line; ((line = processOutput.readLine()) != null);) {
+ if (! line.startsWith(AbstractJexlSpringTestServer.SCRIPT_RESULT_LINE_PREFIX)) {
+ logProcessLine(line);
+ } else {
+ resultLine = line;
+ break;
+ }
+ }
+ if ( resultLine == null) {
+ throw new IOException("Unexpected EOF from process output");
+ }
+ return resultLine;
+ }
+
+ public synchronized void shutdown(final long millis) throws IOException, InterruptedException {
+ assertNotNull(process);
+
+ // start thread to destroy process on timeout
+ Thread destroyThread = new Thread(new Runnable() {
+ public void run() {
+ try {
+ Thread.sleep(millis);
+ if ( process != null) {
+ log.warn( "Forcibly stopping "+name);
+ process.destroy();
+ }
+ } catch (Exception e) {
+ }
+ }
+ }, "DestroyThread");
+ destroyThread.setDaemon( true);
+ destroyThread.start();
+
+ // close process input to shutdown server and read messages
+ processInput.close();
+ for (String line; ((line = processOutput.readLine()) != null);) {
+ logProcessLine(line);
+ }
+
+ // join on process completion
+ process.waitFor();
+ processOutput.close();
+ process = null;
+
+ // join on destroy thread
+ destroyThread.interrupt();
+ destroyThread.join();
+ }
+
+ private void logProcessLine(String line)
+ {
+ if (line.contains("ERROR") || line.contains("Exception") || line.matches("\\s+at\\s.*")) {
+ log.error("{"+name+"} "+line);
+ } else {
+ log.info("{"+name+"} "+line);
+ }
+ }
+ }
+}
Added: portals/jetspeed-2/portal/trunk/components/jetspeed-cm/src/main/java/org/apache/jetspeed/components/test/AbstractJexlSpringTestServer.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-cm/src/main/java/org/apache/jetspeed/components/test/AbstractJexlSpringTestServer.java?rev=1641403&view=auto
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-cm/src/main/java/org/apache/jetspeed/components/test/AbstractJexlSpringTestServer.java (added)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-cm/src/main/java/org/apache/jetspeed/components/test/AbstractJexlSpringTestServer.java Mon Nov 24 15:01:25 2014
@@ -0,0 +1,224 @@
+/*
+ * 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 WARRANTIES OR 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.jetspeed.components.test;
+
+import org.apache.commons.jexl.JexlContext;
+import org.apache.commons.jexl.JexlHelper;
+import org.apache.commons.jexl.Script;
+import org.apache.commons.jexl.ScriptFactory;
+import org.apache.jetspeed.components.JetspeedBeanDefinitionFilter;
+import org.apache.jetspeed.components.SpringComponentManager;
+import org.apache.jetspeed.security.JSSubject;
+
+import javax.security.auth.Subject;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.security.PrivilegedAction;
+import java.util.Map;
+
+/**
+ * Abstract Jexl scriptable test server.
+ *
+ * @author <a href="mailto:[email protected]">Randy Watler</a>
+ * @version $Id:$
+ */
+public abstract class AbstractJexlSpringTestServer {
+
+ public static final String SCRIPT_RESULT_LINE_PREFIX = "> ";
+
+ protected String baseDir;
+ protected SpringComponentManager scm;
+ protected JexlContext jexlContext;
+ protected boolean exit;
+
+ /**
+ * Initialize page manager server instance and script context.
+ *
+ * @throws Exception
+ */
+ public void initialize() throws Exception {
+ // setup jetspeed test component manager
+ JetspeedBeanDefinitionFilter beanDefinitionFilter = new JetspeedBeanDefinitionFilter(getBeanDefinitionFilterCategories());
+ String [] bootConfigurations = getBootConfigurations();
+ String [] configurations = getConfigurations();
+ baseDir = System.getProperty("basedir");
+ if ((baseDir == null) || (baseDir.length() == 0)) {
+ baseDir = System.getProperty("user.dir");
+ }
+ String appRoot = baseDir+"/target/test-classes/webapp";
+ scm = new SpringComponentManager(beanDefinitionFilter, bootConfigurations, configurations, appRoot, false);
+ scm.start();
+
+ // create jexl context
+ jexlContext = JexlHelper.createContext();
+ jexlContext.getVars().putAll(getContextVars());
+ }
+
+ /**
+ * Get Jetspeed Spring filter categories list.
+ *
+ * @return filter categories CSV list
+ */
+ protected abstract String getBeanDefinitionFilterCategories();
+
+ /**
+ * Get array of Spring boot configurations to load.
+ *
+ * @return Spring boot configurations array
+ */
+ protected String[] getBootConfigurations() {
+ return null;
+ }
+
+ /**
+ * Get array of Spring configurations to load.
+ *
+ * @return Spring configurations array
+ */
+ protected abstract String[] getConfigurations();
+
+ /**
+ * Get list of top level objects to add to Jexl context vars.
+ *
+ * @return map of context variables
+ */
+ protected abstract Map<String,Object> getContextVars();
+
+ /**
+ * Terminate page manager server instance.
+ *
+ * @throws Exception
+ */
+ public void terminate() throws Exception {
+ // tear down jetspeed component manager
+ scm.stop();
+ }
+
+ /**
+ * Execute a single line script against page manager server context.
+ *
+ * @param scriptLine jexl script
+ * @return script result line
+ */
+ public String execute(String scriptLine) {
+ // execute script line and return result line
+ String resultLine = scriptLine;
+ try {
+ Script jexlScript = ScriptFactory.createScript(scriptLine);
+ Object result = jexlScript.execute(jexlContext);
+ if (result != null) {
+ resultLine += " -> "+result;
+ }
+ } catch (Exception e) {
+ resultLine += " -> "+e;
+ }
+ return resultLine;
+ }
+
+ /**
+ * Sets server exit flag.
+ */
+ public void exit() {
+ exit = true;
+ }
+
+ /**
+ * Get server exit flag.
+ *
+ * @return server exit flag
+ */
+ public boolean isExit() {
+ return exit;
+ }
+
+ /**
+ * Get or create and cache user subject.
+ *
+ * @return user subject
+ */
+ protected Subject getUserSubject() {
+ return null;
+ }
+
+ /**
+ * Server main entry point.
+ *
+ * @return runtime exception or null
+ */
+ public Throwable run() {
+ try {
+ // initialize server
+ initialize();
+
+ // simple server reads script lines from standard
+ // input and writes results on standard output
+ BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
+ PrintWriter out = new PrintWriter(System.out, true);
+ do {
+ // read single line scripts to execute
+ String scriptLine = in.readLine();
+ if (scriptLine != null) {
+ scriptLine = scriptLine.trim();
+ String resultLine = "";
+ if (scriptLine.length() > 0) {
+ // get user and execute script
+ Subject userSubject = getUserSubject();
+ if (userSubject != null) {
+ // execute script as user
+ final String executeScriptLine = scriptLine;
+ final String [] executeResultLine = new String[]{null};
+ Exception executeException = (Exception) JSSubject.doAsPrivileged(userSubject, new PrivilegedAction() {
+ public Object run() {
+ try {
+ executeResultLine[0] = execute(executeScriptLine);
+ return null;
+ } catch (Exception e) {
+ return e;
+ } finally {
+ JSSubject.clearSubject();
+ }
+ }
+ }, null);
+ if (executeException != null) {
+ throw executeException;
+ }
+ resultLine = executeResultLine[0];
+ } else {
+ // execute script anonymously
+ resultLine = execute(scriptLine);
+ }
+ }
+
+ // write prefixed single line results
+ out.println(SCRIPT_RESULT_LINE_PREFIX+resultLine);
+ } else {
+ // exit server on input EOF
+ exit();
+ }
+ }
+ while (!isExit());
+
+ // terminate server and return
+ terminate();
+ return null;
+ } catch (Throwable t) {
+ return t;
+ }
+ }
+}
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/test/java/org/apache/jetspeed/page/cache/DatabasePageManagerServer.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/test/java/org/apache/jetspeed/page/cache/DatabasePageManagerServer.java?rev=1641403&r1=1641402&r2=1641403&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/test/java/org/apache/jetspeed/page/cache/DatabasePageManagerServer.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/test/java/org/apache/jetspeed/page/cache/DatabasePageManagerServer.java Mon Nov 24 15:01:25 2014
@@ -16,26 +16,17 @@
*/
package org.apache.jetspeed.page.cache;
-import org.apache.commons.jexl.JexlContext;
-import org.apache.commons.jexl.JexlHelper;
-import org.apache.commons.jexl.Script;
-import org.apache.commons.jexl.ScriptFactory;
-import org.apache.jetspeed.components.JetspeedBeanDefinitionFilter;
-import org.apache.jetspeed.components.SpringComponentManager;
import org.apache.jetspeed.components.jndi.JetspeedTestJNDIComponent;
+import org.apache.jetspeed.components.test.AbstractJexlSpringTestServer;
import org.apache.jetspeed.page.PageManager;
import org.apache.jetspeed.page.PageManagerTestShared;
-import org.apache.jetspeed.security.JSSubject;
import org.apache.jetspeed.security.PrincipalsSet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.security.auth.Subject;
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
import java.security.Principal;
-import java.security.PrivilegedAction;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@@ -46,136 +37,98 @@ import java.util.Set;
* @author <a href="mailto:[email protected]">Randy Watler</a>
* @version $Id: $
*/
-public class DatabasePageManagerServer
-{
+public class DatabasePageManagerServer extends AbstractJexlSpringTestServer {
+
protected static Logger log = LoggerFactory.getLogger(DatabasePageManagerServer.class);
- // Constants
-
- public static final String SCRIPT_RESULT_LINE_PREFIX = "> ";
-
- // Members
-
private JetspeedTestJNDIComponent jndiDS;
- private String baseDir;
- private SpringComponentManager scm;
private PageManager pageManager;
- private JexlContext jexlContext;
- private boolean exit;
+
private String user;
private String groups;
private String roles;
private Subject userSubject;
- // Life cycle
-
- /**
- * Initialize page manager server instance and script context.
- *
- * @throws Exception
- */
- public void initialize() throws Exception
- {
- // setup jetspeed test datasource and component manager
+ @Override
+ public void initialize() throws Exception {
+ // setup jetspeed test datasource
jndiDS = new JetspeedTestJNDIComponent();
jndiDS.setup();
- final JetspeedBeanDefinitionFilter beanDefinitionFilter = new JetspeedBeanDefinitionFilter("default,jdbcDS");
- final String [] bootConfigurations = new String[]{"boot/datasource.xml"};
- final String [] configurations = new String[]{"database-page-manager.xml", "transaction.xml"};
- baseDir = System.getProperty("basedir");
- if ((baseDir == null) || (baseDir.length() == 0))
- {
- baseDir = System.getProperty("user.dir");
- }
- final String appRoot = baseDir+"/target/test-classes/webapp";
- scm = new SpringComponentManager(beanDefinitionFilter, bootConfigurations, configurations, appRoot, false);
- scm.start();
+
+ // initialize component manager and server
+ super.initialize();
// access page manager
pageManager = scm.lookupComponent("pageManager");
-
- // create jexl context
- jexlContext = JexlHelper.createContext();
- @SuppressWarnings("unchecked")
- Map<String,Object> jexlContextVars = jexlContext.getVars();
- jexlContextVars.put("pageManager", pageManager);
- jexlContextVars.put("pageManagerServer", this);
log.info( "DatabasePageManager server initialized");
}
-
- /**
- * Terminate page manager server instance.
- *
- * @throws Exception
- */
- public void terminate() throws Exception
- {
+
+ @Override
+ protected String getBeanDefinitionFilterCategories() {
+ return "default,jdbcDS";
+ }
+
+ @Override
+ protected String[] getBootConfigurations() {
+ return new String[]{"boot/datasource.xml"};
+ }
+
+ @Override
+ protected String[] getConfigurations() {
+ return new String[]{"database-page-manager.xml", "transaction.xml"};
+ }
+
+ @Override
+ protected Map<String,Object> getContextVars() {
+ Map<String,Object> contextVars = new HashMap<String,Object>();
+ contextVars.put("pageManager", scm.lookupComponent("pageManager"));
+ contextVars.put("pageManagerServer", this);
+ return contextVars;
+ }
+
+ @Override
+ public void terminate() throws Exception {
// shutdown page manager
pageManager.shutdown();
- // tear down jetspeed component manager and test datasource
- scm.stop();
+ // terminate component manager and server
+ super.terminate();
+
+ // tear down test datasource
jndiDS.tearDown();
log.info( "DatabasePageManager server terminated");
}
-
- // Implementation
-
- /**
- * Execute a single line script against page manager server context.
- *
- * @param scriptLine jexl script
- * @return script result line
- */
- public String execute(final String scriptLine)
- {
- // execute script line and return result line
- String resultLine = scriptLine;
- try
- {
- final Script jexlScript = ScriptFactory.createScript(scriptLine);
- final Object result = jexlScript.execute(jexlContext);
- if (result != null)
- {
- resultLine += " -> "+result;
+
+ @Override
+ public Subject getUserSubject() {
+ if ((userSubject == null) && (user != null)) {
+ Set<Principal> userPrincipals = new PrincipalsSet();
+ userPrincipals.add(new PageManagerTestShared.TestUser(user));
+ if (groups != null) {
+ String [] groupsArray = groups.split(",");
+ for (int i = 0; (i < groupsArray.length); i++) {
+ userPrincipals.add(new PageManagerTestShared.TestGroup(groupsArray[i].trim()));
+ }
}
+ if (roles != null) {
+ String [] rolesArray = roles.split(",");
+ for (int i = 0; (i < rolesArray.length); i++) {
+ userPrincipals.add(new PageManagerTestShared.TestRole(rolesArray[i].trim()));
+ }
+ }
+ userSubject = new Subject(true, userPrincipals, new HashSet<Principal>(), new HashSet<Principal>());
}
- catch (final Exception e)
- {
- resultLine += " -> "+e;
- }
- return resultLine;
+ return userSubject;
}
/**
- * Sets server exit flag.
- */
- public void exit()
- {
- exit = true;
- }
-
- // Data access
-
- /**
- * Get server exit flag.
- *
- * @return server exit flag
- */
- public boolean isExit()
- {
- return exit;
- }
-
- /**
* Get user principal name.
*
* @return user principal name
*/
- public String getUser()
- {
+ public String getUser() {
return user;
}
@@ -184,8 +137,7 @@ public class DatabasePageManagerServer
*
* @param user user principal name
*/
- public void setUser(String user)
- {
+ public void setUser(String user) {
this.user = user;
this.userSubject = null;
}
@@ -195,8 +147,7 @@ public class DatabasePageManagerServer
*
* @return CSV list of group principal names
*/
- public String getGroups()
- {
+ public String getGroups() {
return groups;
}
@@ -205,8 +156,7 @@ public class DatabasePageManagerServer
*
* @param groups CSV list of group principal names
*/
- public void setGroups(String groups)
- {
+ public void setGroups(String groups) {
this.groups = groups;
this.userSubject = null;
}
@@ -216,8 +166,7 @@ public class DatabasePageManagerServer
*
* @return CSV list of role principal names
*/
- public String getRoles()
- {
+ public String getRoles() {
return roles;
}
@@ -226,129 +175,20 @@ public class DatabasePageManagerServer
*
* @param roles CSV list of role principal names
*/
- public void setRoles(String roles)
- {
+ public void setRoles(String roles) {
this.roles = roles;
this.userSubject = null;
}
/**
- * Get or create and cache user subject.
- *
- * @return user subject
- */
- public Subject getUserSubject()
- {
- if ((userSubject == null) && (user != null))
- {
- Set<Principal> userPrincipals = new PrincipalsSet();
- userPrincipals.add(new PageManagerTestShared.TestUser(user));
- if (groups != null)
- {
- String [] groupsArray = groups.split(",");
- for (int i = 0; (i < groupsArray.length); i++)
- {
- userPrincipals.add(new PageManagerTestShared.TestGroup(groupsArray[i].trim()));
- }
- }
- if (roles != null)
- {
- String [] rolesArray = roles.split(",");
- for (int i = 0; (i < rolesArray.length); i++)
- {
- userPrincipals.add(new PageManagerTestShared.TestRole(rolesArray[i].trim()));
- }
- }
- userSubject = new Subject(true, userPrincipals, new HashSet<Principal>(), new HashSet<Principal>());
- }
- return userSubject;
- }
-
- // Application entry point
-
- /**
* Server main entry point.
*
* @param args not used
*/
- public static void main(final String [] args)
- {
- try
- {
- // create and initialize server
- final DatabasePageManagerServer server = new DatabasePageManagerServer();
- server.initialize();
-
- // simple server reads script lines from standard
- // input and writes results on standard output
- final BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
- final PrintWriter out = new PrintWriter(System.out, true);
- do
- {
- // read single line scripts to execute
- String scriptLine = in.readLine();
- if (scriptLine != null)
- {
- scriptLine = scriptLine.trim();
- String resultLine = "";
- if (scriptLine.length() > 0)
- {
- // get user and execute script
- Subject userSubject = server.getUserSubject();
- if (userSubject != null)
- {
- // execute script as user
- final String executeScriptLine = scriptLine;
- final String [] executeResultLine = new String[]{null};
- Exception executeException = (Exception)JSSubject.doAsPrivileged(userSubject, new PrivilegedAction()
- {
- public Object run()
- {
- try
- {
- executeResultLine[0] = server.execute(executeScriptLine);
- return null;
- }
- catch (Exception e)
- {
- return e;
- }
- finally
- {
- JSSubject.clearSubject();
- }
- }
- }, null);
- if (executeException != null)
- {
- throw executeException;
- }
- resultLine = executeResultLine[0];
- }
- else
- {
- // execute script anonymously
- resultLine = server.execute(scriptLine);
- }
- }
-
- // write prefixed single line results
- out.println(SCRIPT_RESULT_LINE_PREFIX+resultLine);
- }
- else
- {
- // exit server on input EOF
- server.exit();
- }
- }
- while (!server.isExit());
-
- // terminate server
- server.terminate();
- }
- catch (final Throwable t)
- {
- log.error( "Unexpected exception: "+t, t);
+ public static void main(String [] args) {
+ Throwable error = (new DatabasePageManagerServer()).run();
+ if (error != null) {
+ log.error( "Unexpected exception: "+error, error);
}
}
}
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/test/java/org/apache/jetspeed/page/cache/TestDatabasePageManagerCache.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/test/java/org/apache/jetspeed/page/cache/TestDatabasePageManagerCache.java?rev=1641403&r1=1641402&r2=1641403&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/test/java/org/apache/jetspeed/page/cache/TestDatabasePageManagerCache.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-page-manager/src/test/java/org/apache/jetspeed/page/cache/TestDatabasePageManagerCache.java Mon Nov 24 15:01:25 2014
@@ -16,68 +16,73 @@
*/
package org.apache.jetspeed.page.cache;
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.InputStreamReader;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.HashMap;
-
import junit.framework.Test;
-import junit.framework.TestCase;
import junit.framework.TestSuite;
-
import org.apache.jetspeed.cache.impl.EhCacheConfigResource;
+import org.apache.jetspeed.components.test.AbstractJexlSpringTestCase;
import org.apache.jetspeed.om.page.FragmentProperty;
import org.apache.jetspeed.page.PageManager;
-
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.util.Map;
+
/**
* TestDatabasePageManagerCache
*
* @author <a href="mailto:[email protected]">Randy Watler</a>
* @version $Id: $
*/
-public class TestDatabasePageManagerCache extends TestCase
-{
+public class TestDatabasePageManagerCache extends AbstractJexlSpringTestCase {
+
protected static Logger log = LoggerFactory.getLogger(TestDatabasePageManagerCache.class);
private static final long CACHE_NOTIFICATION_STARTUP_WAIT = 10000;
private static final long CACHE_NOTIFICATION_WAIT = 2000;
private static final long CACHE_NOTIFICATION_POLL = 250;
- private static final long CACHE_LOGGING_PUMP_WAIT = 50;
-
- // Members
-
- private String osExecutableExtension;
- private String fileSeparator;
- private File javaExecutablePath;
- private String classPathSeparator;
- private File projectDirectoryPath;
- private Map<String,String> systemProperties;
- private String classPath;
-
- // Test methods
-
+
+ /**
+ * Creates the test suite.
+ *
+ * @return a test suite that includes all methods starting with "test"
+ */
+ public static Test suite() {
+ return new TestSuite(TestDatabasePageManagerCache.class);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ // setup cache properties
+ EhCacheConfigResource.getInstance(EhCacheConfigResource.EHCACHE_CONFIG_RESOURCE_DISTRIBUTED_CACHE, true);
+
+ // continue setup
+ super.setUp();
+ }
+
+ @Override
+ protected String testProgramSystemPropertyValueFilter(String propertyName, int index, String propertyValue) {
+ if (propertyName.equals(EhCacheConfigResource.EHCACHE_PORT_PROP_NAME)) {
+ return Integer.toString(Integer.parseInt(propertyValue)+index);
+ }
+ return propertyValue;
+ }
+
+ @Override
+ protected Map<String,String> testProgramSystemProperties() {
+ Map<String,String> systemProperties = super.testProgramSystemProperties();
+ systemProperties.put("log4j.configuration", "log4j-stdout.properties");
+ return systemProperties;
+ }
+
/**
* Tests distributed cache operation for DatabasePageManager
*/
- public void testDatabasePageManagerCache()
- {
+ public void testDatabasePageManagerCache() {
String result;
// check for distributed database support
String databaseName = System.getProperty("org.apache.jetspeed.database.default.name");
- if ((databaseName != null) && databaseName.equals("derby"))
- {
+ if ((databaseName != null) && databaseName.equals("derby")) {
System.out.println("Database support not distributed: system limitation... test skipped");
log.warn("Database support not distributed: system limitation... test skipped");
return;
@@ -86,8 +91,7 @@ public class TestDatabasePageManagerCach
// create and start servers
final TestProgram server0 = new TestProgram("server-0", DatabasePageManagerServer.class, 0);
final TestProgram server1 = new TestProgram("server-1", DatabasePageManagerServer.class, 1);
- try
- {
+ try {
// start servers
server0.start();
server1.start();
@@ -100,31 +104,25 @@ public class TestDatabasePageManagerCach
boolean server0Distributed = false;
boolean server1Distributed = false;
final long distributedCheckStarted = System.currentTimeMillis();
- do
- {
+ do {
// check servers
- if (!server0Distributed)
- {
+ if (!server0Distributed) {
result = server0.execute("pageManager.isDistributed();");
assertTrue(!result.contains("Exception"));
server0Distributed = result.endsWith("true");
}
- if (!server1Distributed)
- {
+ if (!server1Distributed) {
result = server1.execute("pageManager.isDistributed();");
assertTrue(!result.contains("Exception"));
server1Distributed = result.endsWith("true");
}
// wait if servers not distributed
- if (!server0Distributed || !server1Distributed)
- {
+ if (!server0Distributed || !server1Distributed) {
sleep(server0, server1, CACHE_NOTIFICATION_POLL);
}
- }
- while ((!server0Distributed || !server1Distributed) && (System.currentTimeMillis()-distributedCheckStarted < CACHE_NOTIFICATION_STARTUP_WAIT));
- if (!server0Distributed && !server1Distributed)
- {
+ } while ((!server0Distributed || !server1Distributed) && (System.currentTimeMillis()-distributedCheckStarted < CACHE_NOTIFICATION_STARTUP_WAIT));
+ if (!server0Distributed && !server1Distributed) {
System.out.println("Server page managers not distributed: possible system limitation... test skipped");
log.warn("Server page managers not distributed: possible system limitation... test skipped");
return;
@@ -134,8 +132,7 @@ public class TestDatabasePageManagerCach
// clean and setup database page managers
result = server0.execute("removeRootFolder = pageManager.getFolder(\"/\");");
- if (!result.contains("FolderNotFoundException"))
- {
+ if (!result.contains("FolderNotFoundException")) {
result = server0.execute("pageManager.removeFolder(removeRootFolder);");
assertTrue(!result.contains("Exception"));
}
@@ -371,71 +368,58 @@ public class TestDatabasePageManagerCach
boolean deep1FolderRemoved = false;
boolean rootFolderFoldersCountOne = false;
long coherencyCheckStarted = System.currentTimeMillis();
- do
- {
+ do {
// reset request cache
result = server0.execute("pageManager.cleanupRequestCache();");
assertTrue(!result.contains("Exception"));
// check cache coherence
- if (!defaultPageUpdated)
- {
+ if (!defaultPageUpdated) {
result = server0.execute("pageManager.getPage(\"/default-page.psml\").getTitle();");
defaultPageUpdated = result.endsWith("Edited Default Page");
}
- if (!anotherPageStateUpdated)
- {
+ if (!anotherPageStateUpdated) {
result = server0.execute("pageManager.getPage(\"/another-page.psml\").getRootFragment().getState();");
anotherPageStateUpdated = result.endsWith("DEFAULT2");
}
- if (!anotherPagePropertyUpdated)
- {
+ if (!anotherPagePropertyUpdated) {
result = server0.execute("pageManager.getPage(\"/another-page.psml\").getRootFragment().getProperty(\"CUSTOM\");");
anotherPagePropertyUpdated = result.endsWith("CUSTOM2");
}
- if (!someOtherPageRemoved)
- {
+ if (!someOtherPageRemoved) {
result = server0.execute("pageManager.getPage(\"/some-other-page.psml\");");
someOtherPageRemoved = result.contains("PageNotFoundException");
}
- if (!rootFolderPagesCountTwo)
- {
+ if (!rootFolderPagesCountTwo) {
result = server0.execute("pageManager.getFolder(\"/\").getPages().size();");
rootFolderPagesCountTwo = result.endsWith("2");
}
- if (!defaultLinkUpdated)
- {
+ if (!defaultLinkUpdated) {
result = server0.execute("pageManager.getLink(\"/default.link\").getTitle();");
defaultLinkUpdated = result.endsWith("Edited Default Link");
}
- if (!deep0FolderUpdated)
- {
+ if (!deep0FolderUpdated) {
result = server0.execute("pageManager.getFolder(\"/deep-0\").getTitle();");
deep0FolderUpdated = result.endsWith("Edited Deep 0 Folder");
}
- if (!deepPage1Removed)
- {
+ if (!deepPage1Removed) {
result = server0.execute("pageManager.getPage(\"/deep-1/deep-page-1.psml\");");
deepPage1Removed = result.contains("PageNotFoundException");
}
- if (!deep1FolderRemoved)
- {
+ if (!deep1FolderRemoved) {
result = server0.execute("pageManager.getFolder(\"/deep-1\");");
deep1FolderRemoved = result.contains("FolderNotFoundException");
}
- if (!rootFolderFoldersCountOne)
- {
+ if (!rootFolderFoldersCountOne) {
result = server0.execute("pageManager.getFolder(\"/\").getFolders().size();");
rootFolderFoldersCountOne = result.endsWith("1");
}
// wait for cache coherence
- if (!defaultPageUpdated || !anotherPageStateUpdated || !anotherPagePropertyUpdated || !someOtherPageRemoved || !rootFolderPagesCountTwo || !defaultLinkUpdated || !deep0FolderUpdated || !deepPage1Removed || !deep1FolderRemoved || !rootFolderFoldersCountOne)
- {
+ if (!defaultPageUpdated || !anotherPageStateUpdated || !anotherPagePropertyUpdated || !someOtherPageRemoved || !rootFolderPagesCountTwo || !defaultLinkUpdated || !deep0FolderUpdated || !deepPage1Removed || !deep1FolderRemoved || !rootFolderFoldersCountOne) {
sleep(server0, server1, CACHE_NOTIFICATION_POLL);
}
- }
- while ((!defaultPageUpdated || !anotherPageStateUpdated || !anotherPagePropertyUpdated || !someOtherPageRemoved || !rootFolderPagesCountTwo || !defaultLinkUpdated || !deep0FolderUpdated || !deepPage1Removed || !deep1FolderRemoved || !rootFolderFoldersCountOne) && (System.currentTimeMillis()-coherencyCheckStarted < CACHE_NOTIFICATION_WAIT));
+ } while ((!defaultPageUpdated || !anotherPageStateUpdated || !anotherPagePropertyUpdated || !someOtherPageRemoved || !rootFolderPagesCountTwo || !defaultLinkUpdated || !deep0FolderUpdated || !deepPage1Removed || !deep1FolderRemoved || !rootFolderFoldersCountOne) && (System.currentTimeMillis()-coherencyCheckStarted < CACHE_NOTIFICATION_WAIT));
assertTrue(defaultPageUpdated);
assertTrue(anotherPageStateUpdated);
assertTrue(anotherPagePropertyUpdated);
@@ -499,46 +483,38 @@ public class TestDatabasePageManagerCach
boolean newPageCreated = false;
boolean deep2FolderCreated = false;
coherencyCheckStarted = System.currentTimeMillis();
- do
- {
+ do {
// reset request cache
result = server1.execute("pageManager.cleanupRequestCache();");
assertTrue(!result.contains("Exception"));
// check cache coherence
- if (!defaultPageUserStateUpdated)
- {
+ if (!defaultPageUserStateUpdated) {
result = server1.execute("pageManager.getPage(\"/default-page.psml\").getRootFragment().getState();");
defaultPageUserStateUpdated = result.endsWith("USER2");
}
- if (!rootFolderPagesCountThree)
- {
+ if (!rootFolderPagesCountThree) {
result = server1.execute("pageManager.getFolder(\"/\").getPages().size();");
rootFolderPagesCountThree = result.endsWith("3");
}
- if (!rootFolderFoldersCountTwo)
- {
+ if (!rootFolderFoldersCountTwo) {
result = server1.execute("pageManager.getFolder(\"/\").getFolders().size();");
rootFolderFoldersCountTwo = result.endsWith("2");
}
- if (!newPageCreated)
- {
+ if (!newPageCreated) {
result = server1.execute("pageManager.getPage(\"/new-page.psml\").getTitle();");
newPageCreated = result.endsWith("New Page");
}
- if (!deep2FolderCreated)
- {
+ if (!deep2FolderCreated) {
result = server1.execute("pageManager.getFolder(\"/deep-2\").getTitle();");
deep2FolderCreated = result.endsWith("Deep 2 Folder");
}
// wait for cache coherence
- if (!defaultPageUserStateUpdated || !rootFolderPagesCountThree || !rootFolderFoldersCountTwo || !newPageCreated || !deep2FolderCreated)
- {
+ if (!defaultPageUserStateUpdated || !rootFolderPagesCountThree || !rootFolderFoldersCountTwo || !newPageCreated || !deep2FolderCreated) {
sleep(server0, server1, CACHE_NOTIFICATION_POLL);
}
- }
- while ((!defaultPageUserStateUpdated || !rootFolderPagesCountThree || !rootFolderFoldersCountTwo || !newPageCreated || !deep2FolderCreated) && (System.currentTimeMillis()-coherencyCheckStarted < CACHE_NOTIFICATION_WAIT));
+ } while ((!defaultPageUserStateUpdated || !rootFolderPagesCountThree || !rootFolderFoldersCountTwo || !newPageCreated || !deep2FolderCreated) && (System.currentTimeMillis()-coherencyCheckStarted < CACHE_NOTIFICATION_WAIT));
assertTrue(defaultPageUserStateUpdated);
assertTrue(rootFolderPagesCountThree);
assertTrue(rootFolderFoldersCountTwo);
@@ -568,8 +544,7 @@ public class TestDatabasePageManagerCach
assertTrue(!result.contains("Exception"));
result = server1.execute("pageManager.updateFragmentProperties(fragment, null);");
assertTrue(!result.contains("Exception"));
- if (FragmentProperty.GROUP_AND_ROLE_PROPERTY_SCOPES_ENABLED)
- {
+ if (FragmentProperty.GROUP_AND_ROLE_PROPERTY_SCOPES_ENABLED) {
result = server1.execute("page = pageManager.getPage(\"/new-page.psml\");");
assertTrue(!result.contains("Exception"));
result = server1.execute("fragment = page.getRootFragment();");
@@ -592,8 +567,7 @@ public class TestDatabasePageManagerCach
assertTrue(result.endsWith("USER3"));
result = server1.execute("pageManager.getPage(\"/another-page.psml\").getRootFragment().getProperty(\"CUSTOM\");");
assertTrue(result.endsWith("CUSTOM3"));
- if (FragmentProperty.GROUP_AND_ROLE_PROPERTY_SCOPES_ENABLED)
- {
+ if (FragmentProperty.GROUP_AND_ROLE_PROPERTY_SCOPES_ENABLED) {
result = server1.execute("pageManager.getPage(\"/new-page.psml\").getRootFragment().getProperty(\"GROUP-CUSTOM\");");
assertTrue(result.endsWith("GROUP-CUSTOM"));
}
@@ -601,39 +575,32 @@ public class TestDatabasePageManagerCach
anotherPagePropertyUpdated = false;
boolean newPagePropertyUpdated = false;
coherencyCheckStarted = System.currentTimeMillis();
- do
- {
+ do {
// reset request cache
result = server0.execute("pageManager.cleanupRequestCache();");
assertTrue(!result.contains("Exception"));
// check cache coherence
- if (!defaultPageUserStateUpdated)
- {
+ if (!defaultPageUserStateUpdated) {
result = server0.execute("pageManager.getPage(\"/default-page.psml\").getRootFragment().getState();");
defaultPageUserStateUpdated = result.endsWith("USER3");
}
- if (!anotherPagePropertyUpdated)
- {
+ if (!anotherPagePropertyUpdated) {
result = server0.execute("pageManager.getPage(\"/another-page.psml\").getRootFragment().getProperty(\"CUSTOM\");");
anotherPagePropertyUpdated = result.endsWith("CUSTOM3");
}
- if (FragmentProperty.GROUP_AND_ROLE_PROPERTY_SCOPES_ENABLED)
- {
- if (!newPagePropertyUpdated)
- {
+ if (FragmentProperty.GROUP_AND_ROLE_PROPERTY_SCOPES_ENABLED) {
+ if (!newPagePropertyUpdated) {
result = server0.execute("pageManager.getPage(\"/new-page.psml\").getRootFragment().getProperty(\"GROUP-CUSTOM\");");
newPagePropertyUpdated = result.endsWith("GROUP-CUSTOM");
}
}
// wait for cache coherence
- if (!defaultPageUserStateUpdated || !anotherPagePropertyUpdated || (!newPagePropertyUpdated && FragmentProperty.GROUP_AND_ROLE_PROPERTY_SCOPES_ENABLED))
- {
+ if (!defaultPageUserStateUpdated || !anotherPagePropertyUpdated || (!newPagePropertyUpdated && FragmentProperty.GROUP_AND_ROLE_PROPERTY_SCOPES_ENABLED)) {
sleep(server0, server1, CACHE_NOTIFICATION_POLL);
}
- }
- while ((!defaultPageUserStateUpdated || !anotherPagePropertyUpdated || (!newPagePropertyUpdated && FragmentProperty.GROUP_AND_ROLE_PROPERTY_SCOPES_ENABLED)) && (System.currentTimeMillis()-coherencyCheckStarted < CACHE_NOTIFICATION_WAIT));
+ } while ((!defaultPageUserStateUpdated || !anotherPagePropertyUpdated || (!newPagePropertyUpdated && FragmentProperty.GROUP_AND_ROLE_PROPERTY_SCOPES_ENABLED)) && (System.currentTimeMillis()-coherencyCheckStarted < CACHE_NOTIFICATION_WAIT));
assertTrue(defaultPageUserStateUpdated);
assertTrue(anotherPagePropertyUpdated);
assertTrue(newPagePropertyUpdated || !FragmentProperty.GROUP_AND_ROLE_PROPERTY_SCOPES_ENABLED);
@@ -655,286 +622,30 @@ public class TestDatabasePageManagerCach
assertTrue(!result.contains("Exception"));
result = server1.execute("pageManager.reset();");
assertTrue(!result.contains("Exception"));
- }
- catch (final Exception e)
- {
+ } catch (final Exception e) {
log.error("Server test exception: "+e, e);
fail( "Server test exception: "+e);
- }
- finally
- {
+ } finally {
// silently shutdown servers
- try
- {
- server0.shutdown();
- }
- catch (final Exception e)
- {
+ try {
+ server0.shutdown(CACHE_NOTIFICATION_STARTUP_WAIT);
+ } catch (final Exception e) {
log.error( "Server shutdown exception: "+e, e);
}
- try
- {
- server1.shutdown();
- }
- catch (final Exception e)
- {
+ try {
+ server1.shutdown(CACHE_NOTIFICATION_STARTUP_WAIT);
+ } catch (final Exception e) {
log.error( "Server shutdown exception: "+e, e);
}
}
}
- private void sleep(TestProgram server0, TestProgram server1, long millis) throws IOException, InterruptedException
- {
- long slept = 0;
- while (slept < millis)
- {
- // poll servers for logging
- server0.poll();
- server1.poll();
- // sleep for interval
- long sleep = Math.min(millis-slept, CACHE_LOGGING_PUMP_WAIT);
- Thread.sleep(sleep);
- slept += sleep;
- }
- }
-
- // Implementation classes
-
- protected class TestProgram
- {
- private String name;
- private Class<?> mainClass;
- private int index;
-
- private Process process;
- private BufferedWriter processInput;
- private BufferedReader processOutput;
-
- public TestProgram(final String name, final Class<?> mainClass, final int index)
- {
- this.name = name;
- this.mainClass = mainClass;
- this.index = index;
- }
-
- public synchronized void start() throws IOException
- {
- assertNull(process);
-
- // configure launcher with paths, properties, and indexed properties
- final ProcessBuilder launcher = new ProcessBuilder();
- final List<String> commandAndArgs = new ArrayList<String>();
- commandAndArgs.add(javaExecutablePath.getCanonicalPath());
- for (Map.Entry<String,String> systemProperty : systemProperties.entrySet())
- {
- final String propertyName = systemProperty.getKey();
- String propertyValue = systemProperty.getValue();
- if (propertyName.equals(EhCacheConfigResource.EHCACHE_PORT_PROP_NAME))
- {
- propertyValue = Integer.toString(Integer.parseInt(propertyValue)+index);
- }
- commandAndArgs.add( "-D"+propertyName+"="+propertyValue);
- }
- commandAndArgs.add("-Dlog4j.configuration=log4j-stdout.properties");
- commandAndArgs.add("-classpath");
- commandAndArgs.add(classPath);
- commandAndArgs.add(mainClass.getName());
- log.info("Launcher command for "+name+": "+commandAndArgs);
- launcher.command(commandAndArgs);
- launcher.directory(projectDirectoryPath);
- launcher.redirectErrorStream(true);
-
- // launch test programs
- process = launcher.start();
-
- // setup I/O for process
- processInput = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
- processOutput = new BufferedReader(new InputStreamReader(process.getInputStream()));
-
- // read messages from process
- for (String line; (processOutput.ready() && ((line = processOutput.readLine()) != null));)
- {
- logProcessLine(line);
- }
- }
-
- public synchronized void poll() throws IOException
- {
- assertNotNull(process);
-
- // read messages from process
- for (String line; (processOutput.ready() && ((line = processOutput.readLine()) != null));)
- {
- logProcessLine(line);
- }
- }
-
- public synchronized String execute(final String scriptLine) throws IOException
- {
- // poll to read messages from process
- poll();
-
- // write script line to process
- processInput.write(scriptLine);
- processInput.newLine();
- processInput.flush();
-
- // read result or messages from process
- String resultLine = null;
- for (String line; ((line = processOutput.readLine()) != null);)
- {
- if (! line.startsWith(DatabasePageManagerServer.SCRIPT_RESULT_LINE_PREFIX))
- {
- logProcessLine(line);
- }
- else
- {
- resultLine = line;
- break;
- }
- }
- if ( resultLine == null)
- {
- throw new IOException("Unexpected EOF from process output");
- }
- return resultLine;
- }
-
- public synchronized void shutdown() throws IOException, InterruptedException
- {
- assertNotNull( process);
-
- // start thread to destroy process on timeout
- final Thread destroyThread = new Thread(new Runnable()
- {
- public void run()
- {
- try
- {
- Thread.sleep(CACHE_NOTIFICATION_STARTUP_WAIT);
- if ( process != null)
- {
- log.warn( "Forcibly stopping "+name);
- process.destroy();
- }
- }
- catch ( final Exception e)
- {
- }
- }
- }, "DestroyThread");
- destroyThread.setDaemon( true);
- destroyThread.start();
-
- // close process input to shutdown server and read messages
- processInput.close();
- for (String line; ((line = processOutput.readLine()) != null);)
- {
- logProcessLine(line);
- }
-
- // join on process completion
- process.waitFor();
- processOutput.close();
- process = null;
-
- // join on destroy thread
- destroyThread.interrupt();
- destroyThread.join();
- }
-
- private void logProcessLine(final String line)
- {
- if (line.contains("ERROR") || line.contains("Exception") || line.matches("\\s+at\\s.*"))
- {
- log.error("{"+name+"} "+line);
- }
- else
- {
- log.info("{"+name+"} "+line);
- }
- }
- }
-
- // TestCase implementation
-
- /* (non-Javadoc)
- * @see junit.framework.TestCase#setUp()
- */
- protected void setUp() throws Exception
- {
- // setup cache properties
- EhCacheConfigResource.getInstance(EhCacheConfigResource.EHCACHE_CONFIG_RESOURCE_DISTRIBUTED_CACHE, true);
-
- // environment setup
- osExecutableExtension = (System.getProperty("os.name").startsWith("Windows") ? ".exe" : "");
- fileSeparator = System.getProperty("file.separator");
- javaExecutablePath = new File(System.getProperty("java.home")+fileSeparator+"bin"+fileSeparator+"java"+osExecutableExtension);
- classPathSeparator = System.getProperty("path.separator");
- projectDirectoryPath = new File(System.getProperty("basedir"));
- systemProperties = new HashMap<String,String>();
- for (final Map.Entry<Object,Object> systemProperty : System.getProperties().entrySet())
- {
- final String propertyName = systemProperty.getKey().toString();
- final String propertyValue = systemProperty.getValue().toString();
- if (propertyName.startsWith("org.apache.jetspeed.") || propertyName.startsWith("java.net.") || propertyName.equals("basedir"))
- {
- systemProperties.put(propertyName, propertyValue);
- }
- }
-
- // construct launcher classpath from current class loader
- final StringBuilder classPathBuilder = new StringBuilder();
- final ClassLoader loader = this.getClass().getClassLoader();
- assertTrue(loader instanceof URLClassLoader);
- final URLClassLoader urlLoader = (URLClassLoader)loader;
- assertNotNull(urlLoader.getURLs());
- for (final URL pathURL : urlLoader.getURLs())
- {
- // convert path URL to file path
- final String path = new File(pathURL.toURI()).getCanonicalPath();
-
- // build class path
- if (classPathBuilder.length() > 0)
- {
- classPathBuilder.append(classPathSeparator);
- }
- classPathBuilder.append(path);
- }
- classPath = classPathBuilder.toString();
- assertTrue(classPath.length() > 0);
-
- // continue setup
- super.setUp();
- }
-
- /* (non-Javadoc)
- * @see junit.framework.TestCase#tearDown()
- */
- protected void tearDown() throws Exception
- {
- super.tearDown();
- }
-
- // Application entry point
-
/**
* Start the tests.
*
* @param args not used
*/
- public static void main(final String [] args)
- {
+ public static void main(final String [] args) {
junit.awtui.TestRunner.main(new String[]{TestDatabasePageManagerCache.class.getName()});
}
-
- /**
- * Creates the test suite.
- *
- * @return a test suite that includes all methods starting with "test"
- */
- public static Test suite()
- {
- return new TestSuite(TestDatabasePageManagerCache.class);
- }
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.