
#    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.
#-standalone: target/index.xml

-runtrace = true

-target = \
    org.osgi.test.cases.remoteserviceadmin

-runproperties = \
    report="true", \
    osgi.resolverMode="strict"
    rsa.ct.timeout="300000", \
    rsa.ct.timeout.factor="3"
#    org.osgi.test.cases.remoteserviceadmin.system.packages.extra="junit.framework;version=3.8", \
#    org.osgi.test.cases.remoteserviceadmin.bundles="jar/osgi.cmpn-5.0.0.jar,jar/org.osgi.impl.service.log-1.3.2.jar,jar/org.apache.cxf.dosgi.singlebundle-1.3.1.jar,jar/org.apache.cxf.dosgi.discovery.server.config-1.2.0.jar", \
#    org.osgi.test.cases.remoteserviceadmin.serverconfig="service.exported.configs,org.apache.cxf.ws.port", \
#    service.exported.configs="org.apache.cxf.ws", \
#    org.apache.cxf.ws.port="@@FREE_PORT@@"

-runvm = \
    -Xmx512m, -XX:MaxPermSize=350m

-runsystempackages=javax.xml.stream; version=1.0, javax.xml.stream.events; version=1.0, javax.xml.stream.util; version=1.0
-runfw: org.eclipse.osgi;version='[3.8.0.v20120529-1548,3.8.0.v20120529-1548]'
-runee: JavaSE-1.8
-runrequires: \
	osgi.identity;filter:='(osgi.identity=org.osgi.test.cases.remoteserviceadmin)',\
	osgi.identity;filter:='(osgi.identity=org.apache.aries.rsa.topology-manager)',\
	osgi.identity;filter:='(osgi.identity=org.ops4j.pax.logging.pax-logging-service)'
	
-runblacklist: \
	osgi.identity;filter:='(osgi.identity=osgi.cmpn)',\
	osgi.identity;filter:='(osgi.identity=slf4j.api)'
-runbundles: \
	org.apache.aries.rsa.core;version='[1.10.0,1.10.1)',\
	org.apache.aries.rsa.discovery.config;version='[1.10.0,1.10.1)',\
	org.apache.aries.rsa.provider.tcp;version='[1.10.0,1.10.1)',\
	org.apache.aries.rsa.spi;version='[1.10.0,1.10.1)',\
	org.apache.aries.rsa.topology-manager;version='[1.10.0,1.10.1)',\
	org.apache.felix.configadmin;version='[1.8.0,1.8.1)',\
	org.apache.felix.eventadmin;version='[1.4.2,1.4.3)',\
	org.apache.servicemix.bundles.junit;version='[3.8.2,3.8.3)',\
	org.osgi.test.cases.remoteserviceadmin;version='[5.0.0,5.0.1)',\
	org.ops4j.pax.logging.pax-logging-api;version='[1.8.5,1.8.6)',\
	org.ops4j.pax.logging.pax-logging-service;version='[1.8.5,1.8.6)'
