You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by pd...@apache.org on 2017/05/02 22:00:21 UTC
svn commit: r1793591 -
/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/api/FELIX5630_NullObjectTest.java
Author: pderop
Date: Tue May 2 22:00:21 2017
New Revision: 1793591
URL: http://svn.apache.org/viewvc?rev=1793591&view=rev
Log:
FELIX-5630: Added test case for this issue.
Added:
felix/trunk/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/api/FELIX5630_NullObjectTest.java
Added: felix/trunk/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/api/FELIX5630_NullObjectTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/api/FELIX5630_NullObjectTest.java?rev=1793591&view=auto
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/api/FELIX5630_NullObjectTest.java (added)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/api/FELIX5630_NullObjectTest.java Tue May 2 22:00:21 2017
@@ -0,0 +1,151 @@
+/*
+ * 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.felix.dm.itest.api;
+
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.dm.itest.util.Ensure;
+import org.apache.felix.dm.itest.util.TestBase;
+import org.junit.Assert;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class FELIX5630_NullObjectTest extends TestBase {
+
+ private final static String BSN = "org.apache.felix.metatype";
+
+ /**
+ * scenario:
+ *
+ * - A requires B,C.
+ * - A,B,C are started
+ * - B,A,C are stopped
+ * - A is restarted: at this point A has a bug: it is injected with a null object for B !
+ */
+ public void testRequiredServiceDependency() {
+ DependencyManager manager = getDM();
+
+ Component aComponent = manager.createComponent().setInterface(A.class.getName(), null).setImplementation(new A());
+ aComponent.add(manager.createServiceDependency().setService(B.class).setRequired(true));
+ aComponent.add(manager.createServiceDependency().setService(C.class).setRequired(true));
+
+ Component bComponent = manager.createComponent().setInterface(B.class.getName(), null).setImplementation(new B());
+ Component cComponent = manager.createComponent().setInterface(C.class.getName(), null).setImplementation(new C());
+
+ manager.add(bComponent);
+ manager.add(aComponent);
+ manager.add(cComponent);
+
+ manager.remove(aComponent);
+ manager.remove(bComponent);
+ manager.add(aComponent); //throws Could not create null object for
+
+ manager.clear();
+ }
+
+ /**
+ * - A requires bundle B, which is started
+ * - A started
+ * - A stopped
+ * - B stopped
+ * - A is restarted: at this point A has a bug: it is injected with a null object for the bundle dependency over B
+ */
+ public void testRequiredBundleDependency() {
+ DependencyManager m = getDM();
+
+ Ensure e = new Ensure();
+ BundleConsumer bundleConsumerImpl = new BundleConsumer(e);
+ Component bundleConsumer = m.createComponent()
+ .setImplementation(bundleConsumerImpl)
+ .add(m.createBundleDependency()
+ .setRequired(true)
+ .setFilter("(Bundle-SymbolicName=" + BSN + ")")
+ .setStateMask( Bundle.ACTIVE));
+ // add a bundle consumer with a filter
+ m.add(bundleConsumer);
+ e.waitForStep(1, 5000);
+ // remove bundle consumer
+ m.remove(bundleConsumer);
+ e.waitForStep(2, 5000);
+ // stop the metatype bundle
+ stopBundle(BSN);
+ // add the bundle consumer again, which must *not* be started
+ m.add(bundleConsumer);
+ Assert.assertFalse(bundleConsumerImpl.isStarted());
+ startBundle(BSN);
+ }
+
+
+ private class A {
+ public void init() {
+ System.out.println("init");
+ }
+
+ public void start() {
+ System.out.println("start");
+ }
+
+ public void stop() {
+ System.out.println("stop");
+ }
+
+ public void destroy() {
+ System.out.println("destroy");
+ }
+ }
+
+ private class B {
+
+ }
+
+ private class C {
+
+ }
+
+ static class BundleConsumer {
+ private final Ensure m_ensure;
+ volatile Bundle m_bundle;
+ private volatile boolean m_started;
+
+ public BundleConsumer(Ensure e) {
+ m_ensure = e;
+ }
+
+ public boolean isStarted() {
+ return m_started;
+ }
+
+ public void start() {
+ m_started = true;
+ if (m_bundle != null && m_bundle.getSymbolicName() != null && m_bundle.getSymbolicName().equals(BSN)) {
+ m_ensure.step();
+ }
+ }
+
+ public void stop() {
+ m_started = false;
+ if (m_bundle != null && m_bundle.getSymbolicName().equals(BSN)) {
+ m_ensure.step();
+ }
+ }
+ }
+
+}