/*
 * 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.drivers.ovsdb;

import com.google.common.collect.ImmutableMap;
import org.junit.Before;
import org.junit.Test;
import org.onosproject.net.DeviceId;
import org.onosproject.net.behaviour.ControllerConfig;
import org.onosproject.net.device.DeviceServiceAdapter;
import org.onosproject.net.driver.DefaultDriver;
import org.onosproject.net.driver.DefaultDriverData;
import org.onosproject.net.driver.DefaultDriverHandler;
import org.onosproject.ovsdb.controller.driver.OvsdbClientServiceAdapter;
import org.onosproject.ovsdb.controller.driver.OvsdbControllerAdapter;

import java.util.ArrayList;

/**
 * Created by Andrea on 10/7/15.
 */
public class OvsdbControllerConfigTest {


    private static final DeviceId DEVICE_ID = DeviceId.deviceId("foo");

    private DefaultDriver ddc;
    private DefaultDriverData data;
    private DefaultDriverHandler handler;

    private TestDeviceService deviceService = new TestDeviceService();
    private TestOvsdbController controller = new TestOvsdbController();
    private TestOvsdbClient client = new TestOvsdbClient();

    private OvsdbControllerConfig controllerConfig;


    @Before
    public void setUp() {
        controllerConfig = new OvsdbControllerConfig();

        ddc = new DefaultDriver("foo.bar", new ArrayList<>(), "Circus", "lux", "1.2a",
                                ImmutableMap.of(ControllerConfig.class,
                                                OvsdbControllerConfig.class),
                                ImmutableMap.of("foo", "bar"));
        data = new DefaultDriverData(ddc, DEVICE_ID);
        handler = new DefaultDriverHandler(data);
        //handler.controllerConfig.setHandler(handler);
        //TODO setTestService directory on handler
        //TODO setup ovsdb fake controller with fake ovsdbclient
        //TODO setup fake device service
    }

    @Test
    public void testGetControllers() throws Exception {
//        DriverService driverService = new Driv
//        AbstractBehaviour ab = new AbstractBehaviour();
//        DriverHandler handler = handler();
//        List<ControllerInfo> controllersList =
//              controllerConfig.getControllers(DeviceId.deviceId("0000000000000018"));
//        log.info("controllers " + controllersList);

    }

    @Test
    public void testSetControllers() throws Exception {

    }


    private class TestDeviceService extends DeviceServiceAdapter {

    }

    private class TestOvsdbController extends OvsdbControllerAdapter {


    }

    private class TestOvsdbClient extends OvsdbClientServiceAdapter {

    }
}