<!--

    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.

-->
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Pulsar CLI Integration Tests" verbose="2" annotations="JDK">
    <test name="pulsar-cli-test-suite" preserve-order="true" >
        <classes>
            <class name="org.apache.pulsar.tests.integration.cli.ClusterMetadataTearDownTest"/>
            <class name="org.apache.pulsar.tests.integration.cli.CLITest" />
            <class name="org.apache.pulsar.tests.integration.cli.HealthCheckTest" />
            <class name="org.apache.pulsar.tests.integration.compaction.TestCompaction" />
            <class name="org.apache.pulsar.tests.integration.cli.AdminMultiHostTest"/>
            <class name="org.apache.pulsar.tests.integration.cli.FunctionsCLITest"/>
        </classes>
    </test>
</suite>
