/*
 * Copyright 2016-present 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 {

    }
}