/*
 * 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.lisp.msg.protocols;

import com.google.common.collect.ImmutableList;
import com.google.common.testing.EqualsTester;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import org.junit.Before;
import org.junit.Test;
import org.onlab.packet.DeserializationException;
import org.onlab.packet.IP;
import org.onlab.packet.IPv4;
import org.onlab.packet.IpAddress;
import org.onlab.packet.UDP;
import org.onosproject.lisp.msg.exceptions.LispParseError;
import org.onosproject.lisp.msg.exceptions.LispReaderException;
import org.onosproject.lisp.msg.exceptions.LispWriterException;
import org.onosproject.lisp.msg.protocols.DefaultLispEncapsulatedControl.DefaultEcmBuilder;
import org.onosproject.lisp.msg.protocols.DefaultLispEncapsulatedControl.EcmReader;
import org.onosproject.lisp.msg.protocols.DefaultLispEncapsulatedControl.EcmWriter;
import org.onosproject.lisp.msg.protocols.DefaultLispMapRegister.DefaultRegisterBuilder;
import org.onosproject.lisp.msg.protocols.LispEncapsulatedControl.EcmBuilder;
import org.onosproject.lisp.msg.protocols.LispMapRegister.RegisterBuilder;
import org.onosproject.lisp.msg.types.LispIpv4Address;
import org.onosproject.lisp.msg.protocols.LispMapRecord.MapRecordBuilder;
import org.onosproject.lisp.msg.protocols.DefaultLispMapRecord.DefaultMapRecordBuilder;

import java.util.List;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;


/**
 * Unit tests for DefaultLispEncapsulatedControl class.
 */
public final class DefaultLispEncapsulatedControlTest {

    private static final String ECM1_SRC_IP = "192.168.1.1";
    private static final String ECM1_DST_IP = "192.168.1.2";
    private static final String ECM2_SRC_IP = "192.168.2.1";
    private static final String ECM2_DST_IP = "192.168.2.2";
    private static final String RECORD_EID = "1.1.1.1";

    private static final String AUTH_KEY = "onos";

    private LispEncapsulatedControl ecm1;
    private LispEncapsulatedControl sameAsEcm1;
    private LispEncapsulatedControl ecm2;

    @Before
    public void setup() {

        //Creates ecm1
        EcmBuilder builder1 = new DefaultEcmBuilder();

        IP innerIp1 = new IPv4().setSourceAddress(ECM1_SRC_IP)
                .setDestinationAddress(ECM1_DST_IP)
                .setProtocol(IPv4.PROTOCOL_UDP).setVersion((byte) (4 & 0xf));
        UDP innerUdp1 = new UDP().setSourcePort(1)
                .setDestinationPort(2);

        RegisterBuilder msgBuilder = new DefaultRegisterBuilder();

        List<LispMapRecord> records1 = ImmutableList.of(getMapRecord(),
                                                        getMapRecord());

        LispMapRegister innerMsg1 = msgBuilder.withIsProxyMapReply(true)
                                    .withIsWantMapNotify(false)
                                    .withKeyId((short) 1)
                                    .withAuthKey(AUTH_KEY)
                                    .withNonce(1L)
                                    .withMapRecords(records1)
                                    .build();

        ecm1 = builder1.isSecurity(false)
                .innerIpHeader(innerIp1)
                .innerUdpHeader(innerUdp1)
                .innerLispMessage(innerMsg1)
                .build();

        //Creates sameAsEcm1
        EcmBuilder builder2 = new DefaultEcmBuilder();

        IP innerIp2 = new IPv4().setSourceAddress(ECM1_SRC_IP)
                .setDestinationAddress(ECM1_DST_IP)
                .setProtocol(IPv4.PROTOCOL_UDP);
        UDP innerUdp2 = new UDP().setSourcePort(1)
                .setDestinationPort(2);

        RegisterBuilder msgBuilder2 = new DefaultRegisterBuilder();

        List<LispMapRecord> records2 = ImmutableList.of(getMapRecord(),
                                                        getMapRecord());

        LispMapRegister innerMsg2 = msgBuilder2.withIsProxyMapReply(true)
                .withIsWantMapNotify(false)
                .withKeyId((short) 1)
                .withAuthKey(AUTH_KEY)
                .withNonce(1L)
                .withMapRecords(records2)
                .build();

        sameAsEcm1 = builder2.isSecurity(false)
                .innerIpHeader(innerIp2)
                .innerUdpHeader(innerUdp2)
                .innerLispMessage(innerMsg2)
                .build();

        //Creates ecm2
        EcmBuilder builder3 = new DefaultEcmBuilder();

        IP innerIp3 = new IPv4().setSourceAddress(ECM2_SRC_IP)
                .setDestinationAddress(ECM2_DST_IP)
                .setProtocol(IPv4.PROTOCOL_UDP);
        UDP innerUdp3 = new UDP().setSourcePort(10)
                .setDestinationPort(20);

        RegisterBuilder msgBuilder3 = new DefaultRegisterBuilder();

        List<LispMapRecord> records3 = ImmutableList.of(getMapRecord(),
                                                        getMapRecord());

        LispMapRegister innerMsg3 = msgBuilder3.withIsProxyMapReply(true)
                .withIsWantMapNotify(false)
                .withKeyId((short) 2)
                .withAuthKey(AUTH_KEY)
                .withNonce(1L)
                .withMapRecords(records3)
                .build();

        ecm2 = builder3.isSecurity(false)
                .innerIpHeader(innerIp3)
                .innerUdpHeader(innerUdp3)
                .innerLispMessage(innerMsg3)
                .build();
    }

    @Test
    public void testEquality() {
        new EqualsTester()
                .addEqualityGroup(ecm1, sameAsEcm1)
                .addEqualityGroup(ecm2).testEquals();
    }

    @Test
    public void testConstruction() {
        DefaultLispEncapsulatedControl ecm = (DefaultLispEncapsulatedControl) ecm1;

        assertThat("Inner Ip versions are not match",
                   ecm.innerIpHeader().getVersion(), is((byte) 4));
        assertThat("Inner Ip protocols are not match",
                   ((IPv4) ecm.innerIpHeader()).getProtocol(),
                   is(IPv4.PROTOCOL_UDP));
        assertThat("Inner IP source addresses are not match",
                   ((IPv4) ecm.innerIpHeader()).getSourceAddress(),
                   is(IPv4.toIPv4Address(ECM1_SRC_IP)));
        assertThat("Inner IP destination addresses are not match",
                   ((IPv4) ecm.innerIpHeader()).getDestinationAddress(),
                   is(IPv4.toIPv4Address(ECM1_DST_IP)));
        assertThat("Inner UDP source ports are not match",
                   ecm.innerUdp().getSourcePort(), is(1));
        assertThat("Inner UDP destination ports are not match",
                   ecm.innerUdp().getDestinationPort(), is(2));
        assertThat("Inner LISP control messages are not match",
                   ecm.getControlMessage().getType(),
                   is(LispType.LISP_MAP_REGISTER));
    }

    @Test
    public void testSerialization() throws LispReaderException,
            LispWriterException, LispParseError, DeserializationException {

        ByteBuf byteBuf = Unpooled.buffer();
        EcmWriter writer = new EcmWriter();
        writer.writeTo(byteBuf, ecm1);

        EcmReader reader = new EcmReader();

        LispEncapsulatedControl deserialized = reader.readFrom(byteBuf);

        new EqualsTester().addEqualityGroup(ecm1, deserialized).testEquals();
    }

    private LispMapRecord getMapRecord() {
        MapRecordBuilder builder1 = new DefaultMapRecordBuilder();

        LispIpv4Address ipv4Locator1 =
                new LispIpv4Address(IpAddress.valueOf(RECORD_EID));

        return builder1
                .withRecordTtl(100)
                .withIsAuthoritative(true)
                .withMapVersionNumber((short) 1)
                .withMaskLength((byte) 0x01)
                .withAction(LispMapReplyAction.NativelyForward)
                .withEidPrefixAfi(ipv4Locator1)
                .build();
    }
}
