Return-Path: X-Original-To: apmail-cxf-commits-archive@www.apache.org Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 08B0B9CDF for ; Tue, 31 Jan 2012 21:29:13 +0000 (UTC) Received: (qmail 54500 invoked by uid 500); 31 Jan 2012 21:29:12 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 54423 invoked by uid 500); 31 Jan 2012 21:29:12 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 54416 invoked by uid 99); 31 Jan 2012 21:29:12 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 31 Jan 2012 21:29:12 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 31 Jan 2012 21:29:07 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id DF2B12388A66 for ; Tue, 31 Jan 2012 21:28:45 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1238819 - in /cxf/trunk/osgi/itests: ./ src/ src/test/ src/test/java/ src/test/java/org/ src/test/java/org/apache/ src/test/java/org/apache/cxf/ src/test/java/org/apache/cxf/osgi/ src/test/java/org/apache/cxf/osgi/itests/ Date: Tue, 31 Jan 2012 21:28:45 -0000 To: commits@cxf.apache.org From: dkulp@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20120131212845.DF2B12388A66@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: dkulp Date: Tue Jan 31 21:28:45 2012 New Revision: 1238819 URL: http://svn.apache.org/viewvc?rev=1238819&view=rev Log: Try to write an initial pax-exam test, but it's failing completely. Just committing it so Christian or JB can take a look and help me figure out what is going on. Added: cxf/trunk/osgi/itests/ cxf/trunk/osgi/itests/pom.xml (with props) cxf/trunk/osgi/itests/src/ cxf/trunk/osgi/itests/src/test/ cxf/trunk/osgi/itests/src/test/java/ cxf/trunk/osgi/itests/src/test/java/org/ cxf/trunk/osgi/itests/src/test/java/org/apache/ cxf/trunk/osgi/itests/src/test/java/org/apache/cxf/ cxf/trunk/osgi/itests/src/test/java/org/apache/cxf/osgi/ cxf/trunk/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/ cxf/trunk/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/BasicFeatureTest.java (with props) cxf/trunk/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/CXFOSGiTestSupport.java (with props) Added: cxf/trunk/osgi/itests/pom.xml URL: http://svn.apache.org/viewvc/cxf/trunk/osgi/itests/pom.xml?rev=1238819&view=auto ============================================================================== --- cxf/trunk/osgi/itests/pom.xml (added) +++ cxf/trunk/osgi/itests/pom.xml Tue Jan 31 21:28:45 2012 @@ -0,0 +1,129 @@ + + + + + + 4.0.0 + + + org.apache.cxf + cxf-parent + 2.6.0-SNAPSHOT + ../../parent/pom.xml + + + org.apache.cxf.osgi.itests + org.apache.cxf.osgi.itests + Apache CXF :: OSGi :: Integration Tests + jar + + + 2.3.0.M1 + 0.4.0 + 1.2.8 + once + + + + + org.ops4j.pax.url + pax-url-mvn + ${pax.url.version} + + + org.ops4j.pax.url + pax-url-aether + ${pax.url.version} + + + org.apache.karaf + apache-karaf + ${cxf.karaf.version} + tar.gz + + + org.openengsb.labs.paxexam.karaf + paxexam-karaf-container + ${pax.exam.karaf.version} + test + + + org.ops4j.pax.exam + pax-exam-junit4 + ${pax.exam.version} + test + + + junit + junit + test + + + + + org.apache.cxf + cxf-api + ${project.version} + + + + + + + + org.apache.servicemix.tooling + depends-maven-plugin + 1.2 + + + generate-depends-file + + generate-depends-file + + compile + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + unpack-unix + generate-resources + + unpack + + + + + org.apache.karaf + apache-karaf + tar.gz + target/karaf-base + + + + + + + + + + Propchange: cxf/trunk/osgi/itests/pom.xml ------------------------------------------------------------------------------ svn:eol-style = native Propchange: cxf/trunk/osgi/itests/pom.xml ------------------------------------------------------------------------------ svn:keywords = Rev Date Propchange: cxf/trunk/osgi/itests/pom.xml ------------------------------------------------------------------------------ svn:mime-type = text/xml Added: cxf/trunk/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/BasicFeatureTest.java URL: http://svn.apache.org/viewvc/cxf/trunk/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/BasicFeatureTest.java?rev=1238819&view=auto ============================================================================== --- cxf/trunk/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/BasicFeatureTest.java (added) +++ cxf/trunk/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/BasicFeatureTest.java Tue Jan 31 21:28:45 2012 @@ -0,0 +1,80 @@ +/** + * 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.cxf.osgi.itests; + +import java.io.File; + +import org.junit.After; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.openengsb.labs.paxexam.karaf.options.LogLevelOption; +import org.ops4j.pax.exam.Option; +import org.ops4j.pax.exam.junit.Configuration; +import org.ops4j.pax.exam.junit.ExamReactorStrategy; +import org.ops4j.pax.exam.junit.JUnit4TestRunner; +import org.ops4j.pax.exam.spi.reactors.AllConfinedStagedReactorFactory; + +import static org.openengsb.labs.paxexam.karaf.options.KarafDistributionOption.keepRuntimeFolder; +import static org.openengsb.labs.paxexam.karaf.options.KarafDistributionOption.logLevel; +import static org.openengsb.labs.paxexam.karaf.options.KarafDistributionOption.replaceConfigurationFile; + +@RunWith(JUnit4TestRunner.class) +@ExamReactorStrategy(AllConfinedStagedReactorFactory.class) +public class BasicFeatureTest extends CXFOSGiTestSupport { + //private static final String UNINSTALLED = "[uninstalled]"; + //private static final String INSTALLED = "[installed ]"; + + @Test + public void testCXFFeaturesModule() throws InterruptedException { + installCXF(); + Thread.sleep(DEFAULT_TIMEOUT); + + System.err.println(executeCommand("list")); + + + } + + @After + public void tearDown() { + try { + unInstallCXF(); + } catch (Exception ex) { + //Ignore + } + } + + @Configuration + public Option[] config() { + File file = new File("target/karaf-base/apache-karaf-2.2.5/etc/jre.properties.cxf") + .getAbsoluteFile(); + System.out.println(file); + System.out.println(); + System.out.println(); + System.out.println(); + System.out.println(); + System.out.println(); + System.out.println(); + return new Option[]{ + cxfDistributionConfiguration(), + keepRuntimeFolder(), + replaceConfigurationFile("etc/jre.properties", file), + logLevel(LogLevelOption.LogLevel.INFO)}; + } +} Propchange: cxf/trunk/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/BasicFeatureTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: cxf/trunk/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/BasicFeatureTest.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: cxf/trunk/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/CXFOSGiTestSupport.java URL: http://svn.apache.org/viewvc/cxf/trunk/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/CXFOSGiTestSupport.java?rev=1238819&view=auto ============================================================================== --- cxf/trunk/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/CXFOSGiTestSupport.java (added) +++ cxf/trunk/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/CXFOSGiTestSupport.java Tue Jan 31 21:28:45 2012 @@ -0,0 +1,336 @@ +/** + * 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.cxf.osgi.itests; + + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.PrintStream; +import java.net.DatagramSocket; +import java.net.ServerSocket; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Dictionary; +import java.util.Enumeration; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.FutureTask; +import java.util.concurrent.TimeUnit; +import javax.inject.Inject; + +import org.apache.felix.service.command.CommandProcessor; +import org.apache.felix.service.command.CommandSession; +import org.ops4j.pax.exam.MavenUtils; +import org.ops4j.pax.exam.Option; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; +import org.osgi.framework.Filter; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; +import org.osgi.util.tracker.ServiceTracker; + +import static org.openengsb.labs.paxexam.karaf.options.KarafDistributionOption.karafDistributionConfiguration; +import static org.ops4j.pax.exam.CoreOptions.maven; + +/** + * + */ +public class CXFOSGiTestSupport { + static final Long COMMAND_TIMEOUT = 10000L; + static final Long DEFAULT_TIMEOUT = 20000L; + static final Long SERVICE_TIMEOUT = 30000L; + static final String GROUP_ID = "org.apache.karaf"; + static final String ARTIFACT_ID = "apache-karaf"; + + static final String INSTANCE_STARTED = "Started"; + static final String INSTANCE_STARTING = "Starting"; + + static final String CXF_FEATURE_URL + = "mvn:org.apache.cxf.karaf/apache-cxf/" + //+ org.apache.cxf.version.Version.getCurrentVersion() + + "2.6.0-SNAPSHOT" + + "/xml/features"; + + static final String DEBUG_OPTS = " --java-opts \"-Xdebug -Xnoagent -Djava.compiler=NONE" + + " -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=%s\""; + + @Inject + protected BundleContext bundleContext; + + ExecutorService executor = Executors.newCachedThreadPool(); + + + /** + * Installs the CXF feature + */ + protected void installCXF() { + System.err.println(executeCommand("features:addurl " + CXF_FEATURE_URL)); + System.err.println(executeCommand("features:listurl")); + System.err.println(executeCommand("features:list")); + //executeCommand("features:install cxf"); + } + + protected void unInstallCXF() { + System.err.println(executeCommand("features:uninstall cxf")); + } + + /** + * Create an {@link org.ops4j.pax.exam.Option} for using a . + * + * @return + */ + protected Option cxfDistributionConfiguration() { + return karafDistributionConfiguration().frameworkUrl( + maven().groupId(GROUP_ID).artifactId(ARTIFACT_ID).versionAsInProject().type("tar.gz")) + .karafVersion(MavenUtils.getArtifactVersion(GROUP_ID, ARTIFACT_ID)) + .name("Apache Karaf") + .unpackDirectory(new File("target/paxexam/")); + } + + /** + * Executes a shell command and returns output as a String. + * Commands have a default timeout of 10 seconds. + * + * @param command + * @return + */ + protected String executeCommand(final String command) { + return executeCommand(command, COMMAND_TIMEOUT, false); + } + + /** + * Executes a shell command and returns output as a String. + * Commands have a default timeout of 10 seconds. + * + * @param command The command to execute. + * @param timeout The amount of time in millis to wait for the command to execute. + * @param silent Specifies if the command should be displayed in the screen. + * @return + */ + protected String executeCommand(final String command, final Long timeout, final Boolean silent) { + String response; + final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + final PrintStream printStream = new PrintStream(byteArrayOutputStream); + final CommandProcessor commandProcessor = getOsgiService(CommandProcessor.class); + final CommandSession commandSession + = commandProcessor.createSession(System.in, printStream, System.err); + FutureTask commandFuture = new FutureTask( + new Callable() { + public String call() { + try { + if (!silent) { + System.err.println(command); + } + commandSession.execute(command); + } catch (Exception e) { + e.printStackTrace(System.err); + } + printStream.flush(); + return byteArrayOutputStream.toString(); + } + }); + + try { + executor.submit(commandFuture); + response = commandFuture.get(timeout, TimeUnit.MILLISECONDS); + } catch (Exception e) { + e.printStackTrace(System.err); + response = "SHELL COMMAND TIMED OUT: "; + } + + return response; + } + + /** + * Executes multiple commands inside a Single Session. + * Commands have a default timeout of 10 seconds. + * + * @param commands + * @return + */ + protected String executeCommands(final String... commands) { + String response; + final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + final PrintStream printStream = new PrintStream(byteArrayOutputStream); + final CommandProcessor commandProcessor = getOsgiService(CommandProcessor.class); + final CommandSession commandSession + = commandProcessor.createSession(System.in, printStream, System.err); + FutureTask commandFuture = new FutureTask( + new Callable() { + public String call() { + try { + for (String command : commands) { + System.err.println(command); + commandSession.execute(command); + } + } catch (Exception e) { + e.printStackTrace(System.err); + } + return byteArrayOutputStream.toString(); + } + }); + + try { + executor.submit(commandFuture); + response = commandFuture.get(COMMAND_TIMEOUT, TimeUnit.MILLISECONDS); + } catch (Exception e) { + e.printStackTrace(System.err); + response = "SHELL COMMAND TIMED OUT: "; + } + + return response; + } + + protected Bundle getInstalledBundle(String symbolicName) { + for (Bundle b : bundleContext.getBundles()) { + if (b.getSymbolicName().equals(symbolicName)) { + return b; + } + } + for (Bundle b : bundleContext.getBundles()) { + System.err.println("Bundle: " + b.getSymbolicName()); + } + throw new RuntimeException("Bundle " + symbolicName + " does not exist"); + } + + /* + * Explode the dictionary into a ,-delimited list of key=value pairs + */ + private static String explode(Dictionary dictionary) { + Enumeration keys = dictionary.keys(); + StringBuffer result = new StringBuffer(); + while (keys.hasMoreElements()) { + Object key = keys.nextElement(); + result.append(String.format("%s=%s", key, dictionary.get(key))); + if (keys.hasMoreElements()) { + result.append(", "); + } + } + return result.toString(); + } + + protected T getOsgiService(Class type, long timeout) { + return getOsgiService(type, null, timeout); + } + + protected T getOsgiService(Class type) { + return getOsgiService(type, null, SERVICE_TIMEOUT); + } + + protected T getOsgiService(Class type, String filter, long timeout) { + ServiceTracker tracker = null; + try { + String flt; + if (filter != null) { + if (filter.startsWith("(")) { + flt = "(&(" + Constants.OBJECTCLASS + "=" + type.getName() + ")" + filter + ")"; + } else { + flt = "(&(" + Constants.OBJECTCLASS + "=" + type.getName() + ")(" + filter + "))"; + } + } else { + flt = "(" + Constants.OBJECTCLASS + "=" + type.getName() + ")"; + } + Filter osgiFilter = FrameworkUtil.createFilter(flt); + tracker = new ServiceTracker(bundleContext, osgiFilter, null); + tracker.open(true); + // Note that the tracker is not closed to keep the reference + // This is buggy, as the service reference may change i think + Object svc = type.cast(tracker.waitForService(timeout)); + if (svc == null) { + @SuppressWarnings("unchecked") + Dictionary dic = bundleContext.getBundle().getHeaders(); + System.err.println("Test bundle headers: " + explode(dic)); + + for (ServiceReference ref : asCollection(bundleContext.getAllServiceReferences(null, null))) { + System.err.println("ServiceReference: " + ref); + } + + for (ServiceReference ref : asCollection(bundleContext.getAllServiceReferences(null, flt))) { + System.err.println("Filtered ServiceReference: " + ref); + } + + throw new RuntimeException("Gave up waiting for service " + flt); + } + return type.cast(svc); + } catch (InvalidSyntaxException e) { + throw new IllegalArgumentException("Invalid filter", e); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + /** + * Finds a free port starting from the give port numner. + * + * @return + */ + protected int getFreePort(int port) { + while (!isPortAvailable(port)) { + port++; + } + return port; + } + + /** + * Returns true if port is available for use. + * + * @param port + * @return + */ + public static boolean isPortAvailable(int port) { + ServerSocket ss = null; + DatagramSocket ds = null; + try { + ss = new ServerSocket(port); + ss.setReuseAddress(true); + ds = new DatagramSocket(port); + ds.setReuseAddress(true); + return true; + } catch (IOException e) { + //ignore + } finally { + if (ds != null) { + ds.close(); + } + + if (ss != null) { + try { + ss.close(); + } catch (IOException e) { + /* should not be thrown */ + } + } + } + + return false; + } + + /** + * Provides an iterable collection of references, even if the original array is null + */ + private static Collection asCollection(ServiceReference[] references) { + return references != null ? Arrays.asList(references) : Collections.emptyList(); + } +} Propchange: cxf/trunk/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/CXFOSGiTestSupport.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: cxf/trunk/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/CXFOSGiTestSupport.java ------------------------------------------------------------------------------ svn:keywords = Rev Date