/*
 * Copyright 2015 Open Networking Laboratory
 *
 * 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.onosproject.rest.resources;

import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;

import java.io.IOException;
import java.net.ServerSocket;

/**
 * Base class for REST API tests.  Performs common configuration operations.
 */
public class ResourceTest extends JerseyTest {
    private static final int DEFAULT_PORT = 9998;

    /**
     * Creates a new web-resource test.
     */
    public ResourceTest() {
        super(ResourceConfig.forApplicationClass(CoreWebApplication.class));
        this.set("jersey.config.test.container.port", getRandomPort(DEFAULT_PORT));
    }

    /**
     * Creates a new web-resource test.
     */
    public ResourceTest(ResourceConfig config) {
        super(config);
        this.set("jersey.config.test.container.port", getRandomPort(DEFAULT_PORT));
    }

    /**
     * Returns an unused port number to make sure that each unit test runs in
     * different port number.
     *
     * @param defaultPort default port number
     * @return a randomized unique port number
     */
    private int getRandomPort(int defaultPort) {
        try {
            ServerSocket socket = new ServerSocket(0);
            socket.setReuseAddress(true);
            int port = socket.getLocalPort();
            socket.close();
            return port;
        } catch (IOException ioe) {
            return defaultPort;
        }
    }
}
