[Osgi-messages] SF.net SVN: osgi:[248] papoose-cmpn/trunk
Status: Beta
Brought to you by:
maguro
|
From: <osg...@li...> - 2010-02-21 20:17:34
|
Revision: 248
http://osgi.svn.sourceforge.net/osgi/?rev=248&view=rev
Author: maguro
Date: 2010-02-21 20:17:14 +0000 (Sun, 21 Feb 2010)
Log Message:
-----------
Some tests and fixes
Modified Paths:
--------------
papoose-cmpn/trunk/event/pom.xml
papoose-cmpn/trunk/event/src/main/java/org/papoose/event/EventAdminImpl.java
papoose-cmpn/trunk/event/src/main/java/org/papoose/event/util/LogServiceTracker.java
papoose-cmpn/trunk/log/pom.xml
papoose-cmpn/trunk/log/src/main/java/org/papoose/log/util/EventAdminTracker.java
papoose-cmpn/trunk/pom.xml
papoose-cmpn/trunk/tck/pom.xml
Added Paths:
-----------
papoose-cmpn/trunk/http/src/main/java/org/
papoose-cmpn/trunk/http/src/main/java/org/papoose/
papoose-cmpn/trunk/http/src/main/java/org/papoose/http/
papoose-cmpn/trunk/tck/tests/pom.xml
papoose-cmpn/trunk/tck/tests/src/
papoose-cmpn/trunk/tck/tests/src/main/
papoose-cmpn/trunk/tck/tests/src/main/java/
papoose-cmpn/trunk/tck/tests/src/test/
papoose-cmpn/trunk/tck/tests/src/test/java/
papoose-cmpn/trunk/tck/tests/src/test/java/org/
papoose-cmpn/trunk/tck/tests/src/test/java/org/papoose/
papoose-cmpn/trunk/tck/tests/src/test/java/org/papoose/tck/
papoose-cmpn/trunk/tck/tests/src/test/java/org/papoose/tck/event/
papoose-cmpn/trunk/tck/tests/src/test/java/org/papoose/tck/event/EventAdminImplTest.java
papoose-cmpn/trunk/tck/tests/src/test/java/org/papoose/tck/log/
papoose-cmpn/trunk/tck/tests/src/test/java/org/papoose/tck/log/LogServiceImplTest.java
Modified: papoose-cmpn/trunk/event/pom.xml
===================================================================
--- papoose-cmpn/trunk/event/pom.xml 2010-02-19 23:47:52 UTC (rev 247)
+++ papoose-cmpn/trunk/event/pom.xml 2010-02-21 20:17:14 UTC (rev 248)
@@ -23,7 +23,7 @@
<instructions>
<Bundle-SymbolicName>org.papoose.cmpn.event</Bundle-SymbolicName>
<Export-Package>org.papoose.event</Export-Package>
- <Import-Package>org.osgi.framework;version="[1.4,1.5]",org.osgi.service.event;version="[1.1,1.2]",org.osgi.service.log;version="[1.2,1.3]",org.osgi.util.tracker;version="[1.3,1.4]"</Import-Package>
+ <Import-Package>org.osgi.framework;version="[1.0,1.6)",org.osgi.service.event;version="[1.1,1.3)",org.osgi.service.log;version="[1.1,1.4)",org.osgi.util.tracker;version="[1.3,1.5)"</Import-Package>
<Private-Package>org.papoose.event.util</Private-Package>
</instructions>
</configuration>
Modified: papoose-cmpn/trunk/event/src/main/java/org/papoose/event/EventAdminImpl.java
===================================================================
--- papoose-cmpn/trunk/event/src/main/java/org/papoose/event/EventAdminImpl.java 2010-02-19 23:47:52 UTC (rev 247)
+++ papoose-cmpn/trunk/event/src/main/java/org/papoose/event/EventAdminImpl.java 2010-02-21 20:17:14 UTC (rev 248)
@@ -215,7 +215,6 @@
{
LOGGER.entering(CLASS_NAME, "removedService", new Object[]{ reference, service });
- context.ungetService(reference);
remove((EventListener) service);
LOGGER.exiting(CLASS_NAME, "removedService", null);
@@ -247,21 +246,24 @@
Set<EventListener> set = collectListeners(event);
- final CountDownLatch latch = new CountDownLatch(set.size());
- for (final EventListener listener : set)
+ if (!set.isEmpty())
{
- listener.executor.execute(new TimeoutRunnable(latch, listener, event));
- }
+ final CountDownLatch latch = new CountDownLatch(set.size());
+ for (final EventListener listener : set)
+ {
+ listener.executor.execute(new TimeoutRunnable(latch, listener, event));
+ }
- try
- {
- latch.await();
+ try
+ {
+ latch.await();
+ }
+ catch (InterruptedException ie)
+ {
+ LOGGER.log(Level.WARNING, "Wait interrupted", ie);
+ Thread.currentThread().interrupt();
+ }
}
- catch (InterruptedException ie)
- {
- LOGGER.log(Level.WARNING, "Wait interrupted", ie);
- Thread.currentThread().interrupt();
- }
LOGGER.exiting(CLASS_NAME, "sendEvent");
}
@@ -302,6 +304,8 @@
{
LOGGER.entering(CLASS_NAME, "remove", listener);
+ context.ungetService(listener.reference);
+
for (String[] tokens : listener.paths)
{
Listeners lPtr = listeners;
@@ -354,9 +358,13 @@
{
LOGGER.entering(CLASS_NAME, "addListeners", new Object[]{ to, from, event });
- for (EventListener eventListener : from)
+ if (from != null)
{
- if (event.matches(eventListener.filter)) to.add(eventListener);
+
+ for (EventListener eventListener : from)
+ {
+ if (event.matches(eventListener.filter)) to.add(eventListener);
+ }
}
LOGGER.exiting(CLASS_NAME, "addListeners");
Modified: papoose-cmpn/trunk/event/src/main/java/org/papoose/event/util/LogServiceTracker.java
===================================================================
--- papoose-cmpn/trunk/event/src/main/java/org/papoose/event/util/LogServiceTracker.java 2010-02-19 23:47:52 UTC (rev 247)
+++ papoose-cmpn/trunk/event/src/main/java/org/papoose/event/util/LogServiceTracker.java 2010-02-21 20:17:14 UTC (rev 248)
@@ -34,7 +34,7 @@
public void log(int level, String message)
{
- for (LogService service : (LogService[]) getServices())
+ for (LogService service : getLogServices())
{
service.log(level, message);
}
@@ -42,7 +42,7 @@
public void log(int level, String message, Throwable exception)
{
- for (LogService service : (LogService[]) getServices())
+ for (LogService service : getLogServices())
{
service.log(level, message, exception);
}
@@ -50,7 +50,7 @@
public void log(ServiceReference sr, int level, String message)
{
- for (LogService service : (LogService[]) getServices())
+ for (LogService service : getLogServices())
{
service.log(sr, level, message);
}
@@ -58,9 +58,20 @@
public void log(ServiceReference sr, int level, String message, Throwable exception)
{
- for (LogService service : (LogService[]) getServices())
+ for (LogService service : getLogServices())
{
service.log(sr, level, message, exception);
}
}
+
+ private final static LogService[] EMPTY = new LogService[0];
+
+ private LogService[] getLogServices()
+ {
+ LogService[] services = (LogService[]) getServices();
+
+ if (services == null) services = EMPTY;
+
+ return services;
+ }
}
Modified: papoose-cmpn/trunk/log/pom.xml
===================================================================
--- papoose-cmpn/trunk/log/pom.xml 2010-02-19 23:47:52 UTC (rev 247)
+++ papoose-cmpn/trunk/log/pom.xml 2010-02-21 20:17:14 UTC (rev 248)
@@ -23,8 +23,9 @@
<instructions>
<Bundle-SymbolicName>org.papoose.cmpn.log</Bundle-SymbolicName>
<Export-Package>org.papoose.log</Export-Package>
- <Import-Package>org.osgi.framework;version="[1.4,1.5]",org.osgi.service.event;version="[1.1,1.2]",org.osgi.service.log;version="[1.2,1.3]",org.osgi.util.tracker;version="[1.3,1.4]"</Import-Package>
+ <Import-Package>org.osgi.framework;version="[1.0,1.6)",org.osgi.service.event;version="[1.1,1.3)",org.osgi.service.log;version="[1.1,1.4)",org.osgi.util.tracker;version="[1.3,1.5)"</Import-Package>
<Private-Package>org.papoose.log.util</Private-Package>
+ <Private-Package>org.papoose.log.util</Private-Package>
</instructions>
</configuration>
</plugin>
Modified: papoose-cmpn/trunk/log/src/main/java/org/papoose/log/util/EventAdminTracker.java
===================================================================
--- papoose-cmpn/trunk/log/src/main/java/org/papoose/log/util/EventAdminTracker.java 2010-02-19 23:47:52 UTC (rev 247)
+++ papoose-cmpn/trunk/log/src/main/java/org/papoose/log/util/EventAdminTracker.java 2010-02-21 20:17:14 UTC (rev 248)
@@ -34,7 +34,7 @@
public void postEvent(Event event)
{
- for (EventAdmin service : (EventAdmin[]) getServices())
+ for (EventAdmin service : getEventAdminServices())
{
service.postEvent(event);
}
@@ -42,9 +42,20 @@
public void sendEvent(Event event)
{
- for (EventAdmin service : (EventAdmin[]) getServices())
+ for (EventAdmin service : getEventAdminServices())
{
service.sendEvent(event);
}
}
+
+ private final static EventAdmin[] EMPTY = new EventAdmin[0];
+
+ private EventAdmin[] getEventAdminServices()
+ {
+ EventAdmin[] services = (EventAdmin[]) getServices();
+
+ if (services == null) services = EMPTY;
+
+ return services;
+ }
}
Modified: papoose-cmpn/trunk/pom.xml
===================================================================
--- papoose-cmpn/trunk/pom.xml 2010-02-19 23:47:52 UTC (rev 247)
+++ papoose-cmpn/trunk/pom.xml 2010-02-21 20:17:14 UTC (rev 248)
@@ -26,6 +26,7 @@
<properties>
<jettyVersion>6.1.9</jettyVersion>
+ <paxExamVersion>1.2.0</paxExamVersion>
<papooseTestVersion>1.0-SNAPSHOT</papooseTestVersion>
</properties>
@@ -94,6 +95,27 @@
</dependency>
<dependency>
+ <groupId>org.ops4j.pax.exam</groupId>
+ <artifactId>pax-exam</artifactId>
+ <version>${paxExamVersion}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.ops4j.pax.exam</groupId>
+ <artifactId>pax-exam-junit</artifactId>
+ <version>${paxExamVersion}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.ops4j.pax.exam</groupId>
+ <artifactId>pax-exam-container-default</artifactId>
+ <version>${paxExamVersion}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.compendium</artifactId>
<version>4.2.0</version>
Modified: papoose-cmpn/trunk/tck/pom.xml
===================================================================
--- papoose-cmpn/trunk/tck/pom.xml 2010-02-19 23:47:52 UTC (rev 247)
+++ papoose-cmpn/trunk/tck/pom.xml 2010-02-21 20:17:14 UTC (rev 248)
@@ -3,7 +3,7 @@
<parent>
<groupId>org.papoose.cmpn</groupId>
<artifactId>papoose-cmpn</artifactId>
- <version>1.0.0.SNAPSHOT</version>
+ <version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -13,8 +13,6 @@
<name>Papoose :: OSGi Compatibility Tests</name>
<modules>
- <module>bundles</module>
- <module>test-support</module>
<module>tests</module>
</modules>
Added: papoose-cmpn/trunk/tck/tests/pom.xml
===================================================================
--- papoose-cmpn/trunk/tck/tests/pom.xml (rev 0)
+++ papoose-cmpn/trunk/tck/tests/pom.xml 2010-02-21 20:17:14 UTC (rev 248)
@@ -0,0 +1,83 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <parent>
+ <groupId>org.papoose.core.tck</groupId>
+ <artifactId>tck</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>papoose-cmpn-tests</artifactId>
+ <name>Papoose :: OSGi Compatibility Tests :: Tests</name>
+ <packaging>jar</packaging>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.servicemix.tooling</groupId>
+ <artifactId>depends-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>generate-depends-file</id>
+ <goals>
+ <goal>generate-depends-file</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.papoose.cmpn</groupId>
+ <artifactId>papoose-cmpn-event</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.papoose.cmpn</groupId>
+ <artifactId>papoose-cmpn-log</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.ops4j.pax.exam</groupId>
+ <artifactId>pax-exam</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.ops4j.pax.exam</groupId>
+ <artifactId>pax-exam-junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.ops4j.pax.exam</groupId>
+ <artifactId>pax-exam-container-default</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.compendium</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ </dependency>
+
+ </dependencies>
+
+</project>
Property changes on: papoose-cmpn/trunk/tck/tests/pom.xml
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: svn:eol-style
+ native
Added: papoose-cmpn/trunk/tck/tests/src/test/java/org/papoose/tck/event/EventAdminImplTest.java
===================================================================
--- papoose-cmpn/trunk/tck/tests/src/test/java/org/papoose/tck/event/EventAdminImplTest.java (rev 0)
+++ papoose-cmpn/trunk/tck/tests/src/test/java/org/papoose/tck/event/EventAdminImplTest.java 2010-02-21 20:17:14 UTC (rev 248)
@@ -0,0 +1,268 @@
+/**
+ *
+ * Copyright 2010 (C) The original author or authors
+ *
+ * Licensed 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.papoose.tck.event;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import static junit.framework.Assert.assertEquals;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import static org.ops4j.pax.exam.CoreOptions.equinox;
+import static org.ops4j.pax.exam.CoreOptions.felix;
+import static org.ops4j.pax.exam.CoreOptions.knopflerfish;
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.provision;
+import org.ops4j.pax.exam.Inject;
+import static org.ops4j.pax.exam.MavenUtils.asInProject;
+import org.ops4j.pax.exam.Option;
+import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.compendiumProfile;
+import org.ops4j.pax.exam.junit.Configuration;
+import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+
+import org.papoose.event.EventAdminImpl;
+
+
+/**
+ * @version $Revision: $ $Date: $
+ */
+@RunWith(JUnit4TestRunner.class)
+public class EventAdminImplTest
+{
+ @Inject
+ private BundleContext bundleContext = null;
+
+ @Configuration
+ public static Option[] configure()
+ {
+ return options(
+ equinox(),
+ felix(),
+ knopflerfish(),
+ // papoose(),
+ compendiumProfile(),
+ // vmOption("-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"),
+ // this is necessary to let junit runner not timout the remote process before attaching debugger
+ // setting timeout to 0 means wait as long as the remote service comes available.
+ // starting with version 0.5.0 of PAx Exam this is no longer required as by default the framework tests
+ // will not be triggered till the framework is not started
+ // waitForFrameworkStartup()
+ provision(
+ mavenBundle().groupId("org.papoose.cmpn").artifactId("papoose-cmpn-event").version(asInProject())
+ )
+ );
+ }
+
+ @Test
+ public void testSingleEvent() throws Exception
+ {
+ Assert.assertNotNull(bundleContext);
+ ExecutorService executor = new ThreadPoolExecutor(1, 5, 100, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
+ ScheduledExecutorService scheduledExecutor = new ScheduledThreadPoolExecutor(2);
+
+ EventAdminImpl eventAdmin = new EventAdminImpl(bundleContext, executor, scheduledExecutor);
+
+ eventAdmin.open();
+
+ Dictionary<String, Object> properties = new Hashtable<String, Object>();
+ properties.put(EventConstants.EVENT_TOPIC, "a/b/c/d");
+
+ final CountDownLatch latch = new CountDownLatch(1);
+ final AtomicInteger count = new AtomicInteger();
+ ServiceRegistration sr = bundleContext.registerService(EventHandler.class.getName(), new EventHandler()
+ {
+ public void handleEvent(Event event)
+ {
+ try
+ {
+ Thread.sleep(100);
+ }
+ catch (InterruptedException ie)
+ {
+ Thread.currentThread().interrupt();
+ }
+ finally
+ {
+ count.incrementAndGet();
+ latch.countDown();
+ }
+ }
+ }, properties);
+
+ try
+ {
+ eventAdmin.postEvent(new Event("a/b/c/d", (Dictionary) null));
+
+ latch.await();
+
+ assertEquals(1, count.get());
+
+ eventAdmin.sendEvent(new Event("a/b/c/d", (Dictionary) null));
+ eventAdmin.sendEvent(new Event("a/b/c/d/e", (Dictionary) null));
+ eventAdmin.sendEvent(new Event("z/b/c/d", (Dictionary) null));
+ eventAdmin.sendEvent(new Event("a/b/c", (Dictionary) null));
+
+ assertEquals(2, count.get());
+ }
+ finally
+ {
+ sr.unregister();
+
+ eventAdmin.close();
+
+ executor.shutdown();
+ scheduledExecutor.shutdown();
+ }
+ }
+
+ @Test
+ public void testWildcard() throws Exception
+ {
+ Assert.assertNotNull(bundleContext);
+ ExecutorService executor = new ThreadPoolExecutor(1, 5, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
+ ScheduledExecutorService scheduledExecutor = new ScheduledThreadPoolExecutor(2);
+
+ EventAdminImpl eventAdmin = new EventAdminImpl(bundleContext, executor, scheduledExecutor);
+
+ eventAdmin.open();
+
+ Dictionary<String, Object> properties = new Hashtable<String, Object>();
+ properties.put(EventConstants.EVENT_TOPIC, "a/b/c/*");
+
+ final CountDownLatch latch = new CountDownLatch(1);
+ final AtomicInteger count = new AtomicInteger();
+ ServiceRegistration sr = bundleContext.registerService(EventHandler.class.getName(), new EventHandler()
+ {
+ public void handleEvent(Event event)
+ {
+ try
+ {
+ Thread.sleep(100);
+ }
+ catch (InterruptedException ie)
+ {
+ Thread.currentThread().interrupt();
+ }
+ finally
+ {
+ count.incrementAndGet();
+ latch.countDown();
+ }
+ }
+ }, properties);
+
+ try
+ {
+ eventAdmin.postEvent(new Event("a/b/c/d", (Dictionary) null));
+
+ latch.await();
+
+ assertEquals(1, count.get());
+
+ eventAdmin.sendEvent(new Event("a/b/c", (Dictionary) null));
+ eventAdmin.sendEvent(new Event("a/b/c/d", (Dictionary) null));
+ eventAdmin.sendEvent(new Event("a/b/c/d/e", (Dictionary) null));
+
+ assertEquals(3, count.get());
+ }
+ finally
+ {
+ sr.unregister();
+
+ eventAdmin.close();
+
+ executor.shutdown();
+ scheduledExecutor.shutdown();
+ }
+ }
+
+ @Test
+ public void testRootWildcard() throws Exception
+ {
+ Assert.assertNotNull(bundleContext);
+ ExecutorService executor = new ThreadPoolExecutor(1, 5, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
+ ScheduledExecutorService scheduledExecutor = new ScheduledThreadPoolExecutor(2);
+
+ EventAdminImpl eventAdmin = new EventAdminImpl(bundleContext, executor, scheduledExecutor);
+
+ eventAdmin.open();
+
+ Dictionary<String, Object> properties = new Hashtable<String, Object>();
+ properties.put(EventConstants.EVENT_TOPIC, "a/*");
+
+ final CountDownLatch latch = new CountDownLatch(1);
+ final AtomicInteger count = new AtomicInteger();
+ ServiceRegistration sr = bundleContext.registerService(EventHandler.class.getName(), new EventHandler()
+ {
+ public void handleEvent(Event event)
+ {
+ try
+ {
+ Thread.sleep(100);
+ }
+ catch (InterruptedException ie)
+ {
+ Thread.currentThread().interrupt();
+ }
+ finally
+ {
+ count.incrementAndGet();
+ latch.countDown();
+ }
+ }
+ }, properties);
+
+ try
+ {
+ eventAdmin.postEvent(new Event("a/b/c/d", (Dictionary) null));
+
+ latch.await();
+
+ assertEquals(1, count.get());
+
+ eventAdmin.sendEvent(new Event("a/b/c", (Dictionary) null));
+ eventAdmin.sendEvent(new Event("a/b/c/d", (Dictionary) null));
+ eventAdmin.sendEvent(new Event("z/b/c/d", (Dictionary) null));
+
+ assertEquals(3, count.get());
+ }
+ finally
+ {
+ sr.unregister();
+
+ eventAdmin.close();
+
+ executor.shutdown();
+ scheduledExecutor.shutdown();
+ }
+ }
+}
Property changes on: papoose-cmpn/trunk/tck/tests/src/test/java/org/papoose/tck/event/EventAdminImplTest.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: svn:eol-style
+ native
Added: papoose-cmpn/trunk/tck/tests/src/test/java/org/papoose/tck/log/LogServiceImplTest.java
===================================================================
--- papoose-cmpn/trunk/tck/tests/src/test/java/org/papoose/tck/log/LogServiceImplTest.java (rev 0)
+++ papoose-cmpn/trunk/tck/tests/src/test/java/org/papoose/tck/log/LogServiceImplTest.java 2010-02-21 20:17:14 UTC (rev 248)
@@ -0,0 +1,171 @@
+/**
+ *
+ * Copyright 2010 (C) The original author or authors
+ *
+ * Licensed 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.papoose.tck.log;
+
+import java.util.Enumeration;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.junit.Assert;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import static org.ops4j.pax.exam.CoreOptions.equinox;
+import static org.ops4j.pax.exam.CoreOptions.felix;
+import static org.ops4j.pax.exam.CoreOptions.knopflerfish;
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.provision;
+import org.ops4j.pax.exam.Inject;
+import static org.ops4j.pax.exam.MavenUtils.asInProject;
+import org.ops4j.pax.exam.Option;
+import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.compendiumProfile;
+import org.ops4j.pax.exam.junit.Configuration;
+import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.log.LogEntry;
+import org.osgi.service.log.LogListener;
+import org.osgi.service.log.LogReaderService;
+import org.osgi.service.log.LogService;
+
+import org.papoose.log.LogServiceImpl;
+
+
+/**
+ * @version $Revision: $ $Date: $
+ */
+@RunWith(JUnit4TestRunner.class)
+public class LogServiceImplTest
+{
+ @Inject
+ private BundleContext bundleContext = null;
+
+ @Configuration
+ public static Option[] configure()
+ {
+ return options(
+ equinox(),
+ felix(),
+ knopflerfish(),
+ // papoose(),
+ compendiumProfile(),
+ // vmOption("-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"),
+ // this is necessary to let junit runner not timout the remote process before attaching debugger
+ // setting timeout to 0 means wait as long as the remote service comes available.
+ // starting with version 0.5.0 of PAx Exam this is no longer required as by default the framework tests
+ // will not be triggered till the framework is not started
+ // waitForFrameworkStartup()
+ provision(
+ mavenBundle().groupId("org.papoose.cmpn").artifactId("papoose-cmpn-log").version(asInProject())
+ )
+ );
+ }
+
+ @Test
+ public void test() throws Exception
+ {
+ Assert.assertNotNull(bundleContext);
+ ExecutorService executor = new ThreadPoolExecutor(1, 5, 100, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
+
+ LogServiceImpl logServiceImpl = new LogServiceImpl(bundleContext, executor);
+ logServiceImpl.setLimit(100);
+
+ logServiceImpl.start();
+
+ bundleContext.registerService(new String[]{ LogService.class.getName(), LogReaderService.class.getName() }, logServiceImpl, null);
+
+ try
+ {
+ ServiceReference sr = bundleContext.getServiceReference(LogService.class.getName());
+ LogService logService = (LogService) bundleContext.getService(sr);
+ sr = bundleContext.getServiceReference(LogReaderService.class.getName());
+ LogReaderService logReaderService = (LogReaderService) bundleContext.getService(sr);
+
+ final int NUM_LISTENERS = 100;
+ final int NUM_MESSAGES = 1000;
+ final AtomicReference<CountDownLatch> latch = new AtomicReference<CountDownLatch>();
+ final AtomicInteger count = new AtomicInteger();
+ final AtomicBoolean error = new AtomicBoolean(false);
+ LogListener listener;
+ logReaderService.addLogListener(listener = new LogListener()
+ {
+ int counter = 0;
+
+ public void logged(LogEntry entry)
+ {
+ error.set(error.get() || !("Test" + (counter++)).equals(entry.getMessage()));
+
+ count.incrementAndGet();
+ latch.get().countDown();
+ }
+ });
+
+ for (int i = 1; i < NUM_LISTENERS; i++)
+ {
+ logReaderService.addLogListener(new LogListener()
+ {
+ int counter = 0;
+
+ public void logged(LogEntry entry)
+ {
+ error.set(error.get() || !("Test" + (counter++)).equals(entry.getMessage()));
+ latch.get().countDown();
+ }
+ });
+ }
+
+ latch.set(new CountDownLatch(NUM_LISTENERS * NUM_MESSAGES));
+ for (int i = 0; i < NUM_MESSAGES; i++) logService.log(LogService.LOG_INFO, "Test" + i);
+
+ Enumeration enumeration = logReaderService.getLog();
+ for (int i = 0; i < 100; i++)
+ {
+ LogEntry logEntry = (LogEntry) enumeration.nextElement();
+ assertEquals("Test" + (999 - i), logEntry.getMessage());
+ }
+
+ assertFalse(enumeration.hasMoreElements());
+
+ latch.get().await();
+
+ assertEquals(NUM_MESSAGES, count.get());
+ assertFalse(error.get());
+
+ logReaderService.removeLogListener(listener);
+
+ latch.set(new CountDownLatch((NUM_LISTENERS - 1) * NUM_MESSAGES));
+ for (int i = 0; i < NUM_MESSAGES; i++) logService.log(LogService.LOG_INFO, "Test" + i);
+
+ latch.get().await();
+
+ assertEquals(NUM_MESSAGES, count.get());
+ }
+ finally
+ {
+ logServiceImpl.stop();
+ executor.shutdown();
+ }
+ }
+}
Property changes on: papoose-cmpn/trunk/tck/tests/src/test/java/org/papoose/tck/log/LogServiceImplTest.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: svn:eol-style
+ native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|