/*
 * Copyright 2017-present Open Networking 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.onosproject.pipelines.fabric.impl.behaviour.pipeliner;

import org.junit.Test;
import org.onlab.packet.IpPrefix;
import org.onlab.packet.MacAddress;
import org.onlab.packet.MplsLabel;
import org.onlab.packet.VlanId;
import org.onosproject.TestApplicationId;
import org.onosproject.core.ApplicationId;
import org.onosproject.net.DeviceId;
import org.onosproject.net.PortNumber;
import org.onosproject.net.flow.DefaultTrafficSelector;
import org.onosproject.net.flow.TrafficSelector;
import org.onosproject.pipelines.fabric.impl.behaviour.FabricCapabilities;

import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;

public class FabricPipelinerTest {
    static final ApplicationId APP_ID = TestApplicationId.create("FabricPipelinerTest");
    static final ApplicationId XCONNECT_APP_ID = TestApplicationId.create("FabricPipelinerTest.xconnect");
    static final DeviceId DEVICE_ID = DeviceId.deviceId("device:bmv2:11");
    static final int PRIORITY = 100;
    static final PortNumber PORT_1 = PortNumber.portNumber(1);
    static final PortNumber PORT_2 = PortNumber.portNumber(2);
    static final VlanId VLAN_100 = VlanId.vlanId("100");
    static final VlanId VLAN_200 = VlanId.vlanId("200");
    static final MacAddress HOST_MAC = MacAddress.valueOf("00:00:00:00:00:01");
    static final MacAddress ROUTER_MAC = MacAddress.valueOf("00:00:00:00:02:01");
    static final IpPrefix IPV4_UNICAST_ADDR = IpPrefix.valueOf("10.0.0.1/32");
    static final IpPrefix IPV4_MCAST_ADDR = IpPrefix.valueOf("224.0.0.1/32");
    static final IpPrefix IPV6_UNICAST_ADDR = IpPrefix.valueOf("2000::1/32");
    static final IpPrefix IPV6_MCAST_ADDR = IpPrefix.valueOf("ff00::1/32");
    static final MplsLabel MPLS_10 = MplsLabel.mplsLabel(10);
    static final Integer NEXT_ID_1 = 1;
    static final TrafficSelector VLAN_META = DefaultTrafficSelector.builder()
            .matchVlanId(VLAN_100)
            .build();

    FabricCapabilities capabilitiesHashed;
    FabricCapabilities capabilitiesSimple;

    void doSetup() {
        this.capabilitiesHashed = createNiceMock(FabricCapabilities.class);
        this.capabilitiesSimple = createNiceMock(FabricCapabilities.class);
        expect(capabilitiesHashed.hasHashedTable()).andReturn(true).anyTimes();
        expect(capabilitiesSimple.hasHashedTable()).andReturn(false).anyTimes();
        expect(capabilitiesSimple.supportDoubleVlanTerm()).andReturn(true).anyTimes();
        replay(capabilitiesHashed);
        replay(capabilitiesSimple);
    }

    @Test
    public void fakeTest() {
        // Needed otherwise Bazel complains about a test class without test cases.
        assert true;
    }
}
