/*
* 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.karaf.bundle.command;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import java.util.Collections;
import java.util.Dictionary;
import java.util.Hashtable;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.startlevel.BundleStartLevel;
public class TestBundleFactory {
ServiceReference<?> createServiceRef(Object ... keyProp) {
ServiceReference<?> serviceRef = createMock(ServiceReference.class);
if (keyProp.length % 2 != 0) {
throw new IllegalArgumentException("");
}
Hashtable<String, Object> keyPropMap = new Hashtable<String, Object>();
int c = 0;
while (c < keyProp.length) {
String key = (String)keyProp[c++];
Object value = (Object)keyProp[c++];
keyPropMap.put(key, value);
expect(serviceRef.getProperty(key)).andReturn(value).anyTimes();
}
expect(serviceRef.getPropertyKeys()).andReturn(Collections.list(keyPropMap.keys()).toArray(new String[]{})).anyTimes();
return serviceRef;
}
Bundle createBundle(long id, String name) {
Bundle bundle = createMock(Bundle.class);
expect(bundle.getBundleId()).andReturn(id).anyTimes();
Dictionary<String, String> headers = new Hashtable<String, String>();
headers.put(Constants.BUNDLE_NAME, name);
expect(bundle.getHeaders()).andReturn(headers).anyTimes();
return bundle;
}
private Bundle[] createBundles() {
Bundle bundle1 = createBundle(1, "Bundle A");
Bundle bundle2 = createBundle(2, "Bundle B");
Bundle bundle3 = createBundle(3, "Bundle C");
BundleStartLevel bsl = createMock(BundleStartLevel.class);
ServiceReference<?> ref1 = createServiceRef(Constants.OBJECTCLASS, new String[]{"org.example.MyService"},
"key1", "value1");
ServiceReference<?> ref2 = createServiceRef(Constants.OBJECTCLASS, new String[]{"org.example.OtherService"}, "key2", 1);
addRegisteredServices(bundle1, ref1, ref2);
addRegisteredServices(bundle2, ref2);
expect(bundle3.getRegisteredServices()).andReturn(null).anyTimes();
expect(bundle1.getServicesInUse()).andReturn(null).anyTimes();
addUsedServices(bundle2, ref1);
addUsedServices(bundle3, ref1, ref2);
expect(ref1.getUsingBundles()).andReturn(new Bundle[]{bundle2, bundle3}).anyTimes();
expect(ref2.getUsingBundles()).andReturn(new Bundle[]{bundle3}).anyTimes();
expect(bundle1.adapt(BundleStartLevel.class)).andReturn(bsl).anyTimes();
expect(bundle2.adapt(BundleStartLevel.class)).andReturn(bsl).anyTimes();
expect(bundle3.adapt(BundleStartLevel.class)).andReturn(bsl).anyTimes();
expect(bsl.getStartLevel()).andReturn(80).anyTimes();
replay(bundle1, bundle2, bundle3, ref1, ref2, bsl);
return new Bundle[] { bundle1, bundle2, bundle3 };
}
private void addUsedServices(Bundle bundle, ServiceReference<?> ... refs) {
expect(bundle.getServicesInUse()).andReturn(refs).anyTimes();
}
private void addRegisteredServices(Bundle bundle, ServiceReference<?> ... refs) {
expect(bundle.getRegisteredServices()).andReturn(refs).anyTimes();
for (ServiceReference<?> ref : refs) {
expect(ref.getBundle()).andReturn(bundle);
}
}
public BundleContext createBundleContext() {
BundleContext bundleContext = createMock(BundleContext.class);
Bundle[] bundles = createBundles();
expect(bundleContext.getProperty("karaf.systemBundlesStartLevel")).andReturn(Integer.toString(50)).anyTimes();
expect(bundleContext.getBundles()).andReturn(bundles).anyTimes();
expect(bundleContext.getBundle(0)).andReturn(null).anyTimes();
expect(bundleContext.getBundle(1)).andReturn(bundles[0]).anyTimes();
expect(bundleContext.getBundle(2)).andReturn(bundles[1]).anyTimes();
replay(bundleContext);
return bundleContext;
}
}