#
#   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.
#
echo 'Test Home...'
./build.sh -buildfile mtDemo.xml mt-demo0 >mttest.out 2>mttest.err &
echo 'Load & Test Client123...'
./build.sh -buildfile mtDemo.xml mt-demo1 >>mttest.out 2>>mttest.err &
echo 'Load & Test Client456...'
./build.sh -buildfile mtDemo.xml mt-demo2 >>mttest.out 2>>mttest.err &
echo 'Load & Test Client789...'
./build.sh -buildfile mtDemo.xml mt-demo3 >>mttest.out 2>>mttest.err &
tail -f -n10000 mttest.out
