/*
 * 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.p4runtime.ctl;

import com.google.common.testing.EqualsTester;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.onlab.util.ImmutableByteSequence;
import org.onosproject.net.DeviceId;
import org.onosproject.net.pi.model.PiControlMetadataId;
import org.onosproject.net.pi.runtime.PiControlMetadata;
import org.onosproject.net.pi.runtime.PiPacketOperation;

import static org.onlab.util.ImmutableByteSequence.copyFrom;
import static org.onosproject.net.pi.model.PiPacketOperationType.PACKET_IN;
import static org.onosproject.net.pi.model.PiPacketOperationType.PACKET_OUT;

/**
 * Test for DefaultPacketIn class.
 */
public class PacketInEventTest {

    private static final int DEFAULT_ORIGINAL_VALUE = 255;
    private static final int DEFAULT_BIT_WIDTH = 9;

    private final DeviceId deviceId = DeviceId.deviceId("dummy:1");
    private final DeviceId sameDeviceId = DeviceId.deviceId("dummy:1");
    private final DeviceId deviceId2 = DeviceId.deviceId("dummy:2");
    private final DeviceId nullDeviceId = null;

    private PiPacketOperation packetOperation;
    private PiPacketOperation packetOperation2;
    private PiPacketOperation nullPacketOperation = null;

    private PacketInEvent packetIn;
    private PacketInEvent sameAsPacketIn;
    private PacketInEvent packetIn2;
    private PacketInEvent packetIn3;

    /**
     * Setup method for packetOperation and packetOperation2.
     * @throws ImmutableByteSequence.ByteSequenceTrimException if byte sequence cannot be trimmed
     */
    @Before
    public void setup() throws ImmutableByteSequence.ByteSequenceTrimException {

        packetOperation = PiPacketOperation.builder()
                .forDevice(deviceId)
                .withData(ImmutableByteSequence.ofOnes(512))
                .withType(PACKET_OUT)
                .withMetadata(PiControlMetadata.builder()
                                      .withId(PiControlMetadataId.of("egress_port"))
                                      .withValue(copyFrom(DEFAULT_ORIGINAL_VALUE).fit(DEFAULT_BIT_WIDTH))
                                      .build())
                .build();

        packetOperation2 = PiPacketOperation.builder()
                .forDevice(deviceId2)
                .withData(ImmutableByteSequence.ofOnes(512))
                .withType(PACKET_IN)
                .withMetadata(PiControlMetadata.builder()
                                      .withId(PiControlMetadataId.of("ingress_port"))
                                      .withValue(copyFrom(DEFAULT_ORIGINAL_VALUE).fit(DEFAULT_BIT_WIDTH))
                                      .build())
                .build();

        packetIn = new PacketInEvent(deviceId, packetOperation);
        sameAsPacketIn = new PacketInEvent(sameDeviceId, packetOperation);
        packetIn2 = new PacketInEvent(deviceId2, packetOperation);
        packetIn3 = new PacketInEvent(deviceId, packetOperation2);
    }

    /**
     * tearDown method for packetOperation and packetOperation2.
     */
    @After
    public void tearDown() {
        packetOperation = null;
        packetOperation2 = null;

        packetIn = null;
        sameAsPacketIn = null;
        packetIn2 = null;
        packetIn3 = null;
    }


    /**
     * Tests constructor with null object as a DeviceId parameter.
     */
    @Test(expected = NullPointerException.class)
    public void testConstructorWithNullDeviceId() {

        new PacketInEvent(nullDeviceId, packetOperation);
    }

    /**
     * Tests constructor with null object as PacketOperation parameter.
     */
    @Test(expected = NullPointerException.class)
    public void testConstructorWithNullPacketOperation() {

        new PacketInEvent(deviceId, nullPacketOperation);
    }

    /**
     * Test for deviceId method.
     */
    @Test
    public void deviceId() {
        new EqualsTester()
                .addEqualityGroup(deviceId, packetIn.deviceId(), sameAsPacketIn.deviceId())
                .addEqualityGroup(packetIn2)
                .testEquals();
    }

    /**
     * Test for packetOperation method.
     */
    @Test
    public void packetOperation() {
        new EqualsTester()
                .addEqualityGroup(packetOperation, packetIn.packetOperation())
                .addEqualityGroup(packetIn3.packetOperation())
                .testEquals();
    }

    /**
     * Checks the operation of equals(), hashCode() and toString() methods.
     */
    @Test
    public void testEquals() {
        new EqualsTester()
                .addEqualityGroup(packetIn, sameAsPacketIn)
                .addEqualityGroup(packetIn2)
                .addEqualityGroup(packetIn3)
                .testEquals();
    }
}
