# 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 project will develop a set of JarRunner adapters to perform the following
tasks via specific adapters:
  - provide a list of files within a jar file (artifact) which can be passed to a test
    framework such as JUnit for further execution (generic adapter)
  - request a list of tests from an artifact to be execute by an external
    framework (specific adapter)
  - get a list of tests within an artifact, supply them with certain arguments
    and run as POJO applications (concrete adapter: an extension of generic)

This project contains the experimental foundation of JarRunner and a
meta-service utilizing it to perform tests execution. These two components
might be joined together later.
