package net.onrc.onos.api.rest;

import net.floodlightcontroller.core.module.FloodlightModuleContext;
import net.floodlightcontroller.core.module.FloodlightModuleException;
import net.onrc.onos.core.intent.runtime.IntentTestMocks;
import net.onrc.onos.core.intent.runtime.PathCalcRuntimeModule;
import net.onrc.onos.core.topology.ITopologyService;
import net.onrc.onos.core.topology.web.TopologyWebRoutable;
import org.junit.After;

/**
 * Test harness for Topology based REST API tests.  This class maintains the
 * web server and mocks required for testing topology APIs.  REST API tests
 * for topology should inherit from this class.
 */
public class TestRestTopology extends TestRest {

    private IntentTestMocks mocks;

    /**
     * Fetch the Intent mocking object.
     *
     * @return intent mocking object
     */
    IntentTestMocks getMocks() {
        return mocks;
    }

    /**
     * Create the web server and mocks required for the topology tests.
     */
    @Override
    public void setUp() {
        mocks = new IntentTestMocks();
        mocks.setUpIntentMocks();

        addRestlet(new TopologyWebRoutable());
        super.setUp();

        final PathCalcRuntimeModule runtime = new PathCalcRuntimeModule();
        final FloodlightModuleContext moduleContext = getMocks().getModuleContext();
        try {
            runtime.init(moduleContext);
        } catch (FloodlightModuleException floodlightEx) {
            throw new IllegalArgumentException(floodlightEx);
        }
        runtime.startUp(moduleContext);

        getRestApiServer().addAttribute(ITopologyService.class.getCanonicalName(),
                                        mocks.getTopologyService());
    }

    /**
     * Remove anything that will interfere with the next test running correctly.
     * Shuts down the test REST web server and removes the mocks.
     */
    @After
    public void tearDownMocks() {
        getMocks().tearDownIntentMocks();
    }

    /**
     * Fetch the base URL for Topology REST APIs.
     *
     * @return base URL
     */
    String getBaseRestTopologyUrl() {
        return getBaseRestUrl() + "/topology";
    }

}
