/*
 *
 * 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.
 *
 */
{
  "_tests":[
  {
    "_name": "ManyParticipants",
    "_queues":[
      {
        "_name": "testQueue1"
      },
      {
        "_name": "testQueue2"
      }
    ],
    "_clients":[
      {
        "_name": "producingClient1",
        "_connections":[
          {
            "_name": "producingConnection1",
            "_factory": "connectionfactory",
            "_sessions": [
              {
                "_sessionName": "producingSession1",
                "_producers": [
                  {
                    "_name": "participantProducer1",
                    "_destinationName": "testQueue1",
                    "_numberOfMessages": 10
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "_name": "producingClient2",
        "_connections":[
          {
            "_name": "producingConnection2",
            "_factory": "connectionfactory",
            "_sessions": [
              {
                "_sessionName": "producingSession1",
                "_producers": [
                  {
                    "_name": "participantProducer2",
                    "_destinationName": "testQueue2",
                    "_numberOfMessages": 10
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "_name": "consumingClient",
        "_connections":[
          {
            "_name": "consumingConnection1",
            "_factory": "connectionfactory",
            "_sessions": [
              {
                "_sessionName": "consumingSession1",
                "_consumers": [
                  {
                    "_name": "participantConsumer1",
                    "_destinationName": "testQueue1",
                    "_numberOfMessages": 10
                  }
                ]
              }
            ]
          },
          {
            "_name": "consumingConnection2",
            "_factory": "connectionfactory",
            "_sessions": [
              {
                "_sessionName": "consumingSession2",
                "_consumers": [
                  {
                    "_name": "participantConsumer2",
                    "_destinationName": "testQueue2",
                    "_numberOfMessages": 10
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }]
}

