/*
 * 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.
 */

package org.apache.axis2.integration;

import junit.extensions.TestSetup;
import junit.framework.Test;
import junit.framework.TestCase;

public class UtilServerBasedTestCase extends TestCase {

    public UtilServerBasedTestCase() {
        super(UtilServerBasedTestCase.class.getName());
    }

    public UtilServerBasedTestCase(java.lang.String string) {
        super(string);
    }

    protected static Test getTestSetup(Test test) {
        return new TestSetup(test) {
            public void setUp() throws Exception {
                UtilServer.start();
            }

            public void tearDown() throws Exception {
                UtilServer.stop();
            }
        };
    }

    protected static Test getTestSetup2(Test test, final String param) {
        return new TestSetup(test) {
            public void setUp() throws Exception {
                UtilServer.start(param);
            }

            public void tearDown() throws Exception {
                UtilServer.stop();
            }
        };
    }

    protected static Test getTestSetup3(Test test, final String param1, final String param2) {
        return new TestSetup(test) {
            public void setUp() throws Exception {
                UtilServer.start(param1, param2);
            }

            public void tearDown() throws Exception {
                UtilServer.stop();
            }
        };
    }
}
