#
#  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.
#
# This is a feature description
#
# A feature consists of variables and run mode dependent artifacts.
#

# Test our Sling extension commands, that add a bundle via the Sling installer
# (which requires commons.json and jcr-wrapper)
[feature name=crankstart.tests]

[artifacts]
  org.apache.sling/org.apache.sling.crankstart3.test.services/1.0.3-SNAPSHOT
  org.apache.sling/org.apache.sling.junit.core/1.0.10
  org.apache.sling/org.apache.sling.commons.mime/2.1.8
  org.apache.sling/org.apache.sling.settings/1.3.6

[configurations]
  org.apache.sling.crankstart.testservices.SingleConfigServlet
  # TODO should use a variable to verify that they work in configs
    path="/single"
    message="doesn't matter"

  org.apache.sling.crankstart.testservices.ConfigFactoryServlet-foo
    path="/foo"
    message="Not used"
  
  org.apache.sling.crankstart.testservices.ConfigFactoryServlet-bar.test
    path="/bar/test"
    message="Not used"
  
  felix.format.test
    mongouri="mongodb://localhost:27017"
    service.ranking.launcher.test=I"54321"
    array=["foo","bar.from.launcher.test"]
  
  empty.config.should.work