/*
* Copyright 2004-2006 The Apache Software Foundation.
*
* Licensed 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();
            }
        };
    }
}
