[ONOS-2613] Unit test the BGP Update message(LinkStateAttribute)

Change-Id: Id9545296612bed858459c8386368c66cb2159173
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpPathAttributes.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpPathAttributes.java
index 13e52ca..7189ef6 100644
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpPathAttributes.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpPathAttributes.java
@@ -24,6 +24,7 @@
 import org.onosproject.bgpio.types.AsPath;
 import org.onosproject.bgpio.types.BgpErrorType;
 import org.onosproject.bgpio.types.BgpValueType;
+import org.onosproject.bgpio.types.LinkStateAttributes;
 import org.onosproject.bgpio.types.LocalPref;
 import org.onosproject.bgpio.types.Med;
 import org.onosproject.bgpio.types.NextHop;
@@ -54,7 +55,7 @@
     */
     protected static final Logger log = LoggerFactory.getLogger(BgpPathAttributes.class);
 
-    public static final int LINK_STATE_ATTRIBUTE_TYPE = 50;
+    public static final int LINK_STATE_ATTRIBUTE_TYPE = 29;
     public static final int MPREACHNLRI_TYPE = 14;
     public static final int MPUNREACHNLRI_TYPE = 15;
 
@@ -139,7 +140,7 @@
                         .isMpUnReachNlriSet();
                 break;
             case LINK_STATE_ATTRIBUTE_TYPE:
-                //TODO: To be merged later
+                pathAttribute = LinkStateAttributes.read(cb);
                 break;
             default:
                 //skip bytes for unsupported attribute types
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/LinkStateAttributes.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/LinkStateAttributes.java
index cdf6ebe..fc69cfc 100644
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/LinkStateAttributes.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/LinkStateAttributes.java
@@ -89,7 +89,7 @@
     public static final short ATTR_PREFIX_OSPF_FWD_ADDR = 1156;
     public static final short ATTR_PREFIX_OPAQUE_ATTR = 1157;
 
-    public static final byte LINKSTATE_ATTRIB_TYPE = 50;
+    public static final byte LINKSTATE_ATTRIB_TYPE = 29;
     public static final byte TYPE_AND_LEN = 4;
     private boolean isLinkStateAttribute = false;
     private List<BgpValueType> linkStateAttribList;
@@ -139,14 +139,14 @@
     public static LinkStateAttributes read(ChannelBuffer cb)
             throws BgpParseException {
 
-        ChannelBuffer tempBuf = cb;
+        ChannelBuffer tempBuf = cb.copy();
         Validation parseFlags = Validation.parseAttributeHeader(cb);
         int len = parseFlags.isShort() ? parseFlags.getLength() + TYPE_AND_LEN
                                       : parseFlags.getLength() + 3;
 
         ChannelBuffer data = tempBuf.readBytes(len);
-        if (!parseFlags.getFirstBit() || parseFlags.getSecondBit()
-                || parseFlags.getThirdBit()) {
+        if (!parseFlags.getFirstBit() && parseFlags.getSecondBit()
+                && parseFlags.getThirdBit()) {
             throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR,
                                         BgpErrorType.ATTRIBUTE_FLAGS_ERROR,
                                         data);
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeFlagBitTlv.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeFlagBitTlv.java
old mode 100755
new mode 100644
index e0fef7c..7d4e22b
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeFlagBitTlv.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeFlagBitTlv.java
@@ -56,7 +56,7 @@
      * @param bExternalBit External bit
      * @param bAbrBit ABR Bit
      */
-    private BgpAttrNodeFlagBitTlv(boolean bOverloadBit, boolean bAttachedBit,
+    public BgpAttrNodeFlagBitTlv(boolean bOverloadBit, boolean bAttachedBit,
                                   boolean bExternalBit, boolean bAbrBit) {
         this.bOverloadBit = bOverloadBit;
         this.bAttachedBit = bAttachedBit;
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrProtectionType.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrProtectionType.java
index 59011d9..8882936 100644
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrProtectionType.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrProtectionType.java
@@ -21,9 +21,8 @@
 import org.onosproject.bgpio.exceptions.BgpParseException;
 import org.onosproject.bgpio.types.BgpErrorType;
 import org.onosproject.bgpio.types.BgpValueType;
+import org.onosproject.bgpio.util.Constants;
 import org.onosproject.bgpio.util.Validation;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.base.MoreObjects;
 
@@ -31,70 +30,55 @@
  * Implements BGP link protection type attribute.
  */
 public final class BgpLinkAttrProtectionType implements BgpValueType {
-
-    protected static final Logger log = LoggerFactory
-            .getLogger(BgpLinkAttrProtectionType.class);
-
     public static final int ATTRLINK_PROTECTIONTYPE = 1093;
     public static final int LINK_PROTECTION_LEN = 2;
 
-    public static final int EXTRA_TRAFFIC = 0x01;
-    public static final int UNPROTECTED = 0x02;
-    public static final int SHARED = 0x04;
-    public static final int DEDICATED_ONE_ISTO_ONE = 0x08;
-    public static final int DEDICATED_ONE_PLUS_ONE = 0x10;
-    public static final int ENHANCED = 0x20;
+    private byte linkProtectionType;
 
-    /* Link Protection type flags */
-    private final boolean bExtraTraffic;
-    private final boolean bUnprotected;
-    private final boolean bShared;
-    private final boolean bDedOneIstoOne;
-    private final boolean bDedOnePlusOne;
-    private final boolean bEnhanced;
+    /**
+     * Enum to provide Link protection types.
+     */
+    public enum ProtectionType {
+        EXTRA_TRAFFIC(1), UNPROTECTED(2), SHARED(4), DEDICATED_ONE_ISTO_ONE(8),
+        DEDICATED_ONE_PLUS_ONE(0x10), ENHANCED(0x20), RESERVED(0x40);
+        int value;
+
+        /**
+         * Assign val with the value as the link protection type.
+         *
+         * @param val link protection
+         */
+        ProtectionType(int val) {
+            value = val;
+        }
+
+        /**
+         * Returns value of link protection type.
+         *
+         * @return link protection type
+         */
+        public byte type() {
+            return (byte) value;
+        }
+    }
 
     /**
      * Constructor to initialize the value.
      *
-     * @param bExtraTraffic Extra Traffic
-     * @param bUnprotected Unprotected
-     * @param bShared Shared
-     * @param bDedOneIstoOne Dedicated 1:1
-     * @param bDedOnePlusOne Dedicated 1+1
-     * @param bEnhanced Enhanced
+     * @param linkProtectionType link protection type
      */
-    private BgpLinkAttrProtectionType(boolean bExtraTraffic,
-                                      boolean bUnprotected,
-                                      boolean bShared, boolean bDedOneIstoOne,
-                                      boolean bDedOnePlusOne, boolean bEnhanced) {
-        this.bExtraTraffic = bExtraTraffic;
-        this.bUnprotected = bUnprotected;
-        this.bShared = bShared;
-        this.bDedOneIstoOne = bDedOneIstoOne;
-        this.bDedOnePlusOne = bDedOnePlusOne;
-        this.bEnhanced = bEnhanced;
+    public BgpLinkAttrProtectionType(byte linkProtectionType) {
+        this.linkProtectionType = linkProtectionType;
     }
 
     /**
      * Returns object of this class with specified values.
      *
-     * @param bExtraTraffic Extra Traffic
-     * @param bUnprotected Unprotected
-     * @param bShared Shared
-     * @param bDedOneIstoOne Dedicated 1:1
-     * @param bDedOnePlusOne Dedicated 1+1
-     * @param bEnhanced Enhanced
+     * @param linkProtectionType link protection type
      * @return object of BgpLinkAttrProtectionType
      */
-    public static BgpLinkAttrProtectionType of(boolean bExtraTraffic,
-                                               boolean bUnprotected,
-                                               boolean bShared,
-                                               boolean bDedOneIstoOne,
-                                               boolean bDedOnePlusOne,
-                                               boolean bEnhanced) {
-        return new BgpLinkAttrProtectionType(bExtraTraffic, bUnprotected,
-                                             bShared, bDedOneIstoOne,
-                                             bDedOnePlusOne, bEnhanced);
+    public static BgpLinkAttrProtectionType of(byte linkProtectionType) {
+        return new BgpLinkAttrProtectionType(linkProtectionType);
     }
 
     /**
@@ -106,91 +90,43 @@
      */
     public static BgpLinkAttrProtectionType read(ChannelBuffer cb)
             throws BgpParseException {
-        short linkProtectionType;
-        byte higherByte;
         short lsAttrLength = cb.readShort();
 
-        boolean bExtraTraffic;
-        boolean bUnprotected;
-        boolean bShared;
-        boolean bDedOneIstoOne;
-        boolean bDedOnePlusOne;
-        boolean bEnhanced;
-
-        if ((lsAttrLength != LINK_PROTECTION_LEN)
-                || (cb.readableBytes() < lsAttrLength)) {
-            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
-                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
-                                   lsAttrLength);
+        if ((lsAttrLength != LINK_PROTECTION_LEN) || (cb.readableBytes() < lsAttrLength)) {
+            Validation
+                    .validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.ATTRIBUTE_LENGTH_ERROR, lsAttrLength);
         }
 
-        linkProtectionType = cb.readShort();
-        higherByte = (byte) (linkProtectionType >> 8);
+        byte linkProtectionType = cb.readByte();
+        byte reserved = cb.readByte();
 
-        bExtraTraffic = ((higherByte & (byte) EXTRA_TRAFFIC) == EXTRA_TRAFFIC);
-        bUnprotected = ((higherByte & (byte) UNPROTECTED) == UNPROTECTED);
-        bShared = ((higherByte & (byte) SHARED) == SHARED);
-        bDedOneIstoOne = ((higherByte & (byte) DEDICATED_ONE_ISTO_ONE) == DEDICATED_ONE_ISTO_ONE);
-        bDedOnePlusOne = ((higherByte & (byte) DEDICATED_ONE_PLUS_ONE) == DEDICATED_ONE_PLUS_ONE);
-        bEnhanced = ((higherByte & (byte) ENHANCED) == ENHANCED);
-
-        return BgpLinkAttrProtectionType.of(bExtraTraffic, bUnprotected,
-                                            bShared, bDedOneIstoOne,
-                                            bDedOnePlusOne, bEnhanced);
+        return BgpLinkAttrProtectionType.of(linkProtectionType);
     }
 
     /**
-     * Returns ExtraTraffic Bit.
+     * Returns Link Protection Type.
      *
-     * @return ExtraTraffic Bit
+     * @return Link Protection Type
      */
-    public boolean extraTraffic() {
-        return bExtraTraffic;
-    }
-
-    /**
-     * Returns Unprotected Bit.
-     *
-     * @return Unprotected Bit
-     */
-    public boolean unprotected() {
-        return bUnprotected;
-    }
-
-    /**
-     * Returns Shared Bit.
-     *
-     * @return Shared Bit
-     */
-    public boolean shared() {
-        return bShared;
-    }
-
-    /**
-     * Returns DedOneIstoOne Bit.
-     *
-     * @return DedOneIstoOne Bit
-     */
-    public boolean dedOneIstoOne() {
-        return bDedOneIstoOne;
-    }
-
-    /**
-     * Returns DedOnePlusOne Bit.
-     *
-     * @return DedOnePlusOne Bit
-     */
-    public boolean dedOnePlusOne() {
-        return bDedOnePlusOne;
-    }
-
-    /**
-     * Returns Enhanced Bit.
-     *
-     * @return Enhanced Bit
-     */
-    public boolean enhanced() {
-        return bEnhanced;
+    public ProtectionType protectionType() throws BgpParseException {
+        switch (linkProtectionType) {
+        case Constants.EXTRA_TRAFFIC:
+            return ProtectionType.EXTRA_TRAFFIC;
+        case Constants.UNPROTECTED:
+            return ProtectionType.UNPROTECTED;
+        case Constants.SHARED:
+            return ProtectionType.SHARED;
+        case Constants.DEDICATED_ONE_ISTO_ONE:
+            return ProtectionType.DEDICATED_ONE_ISTO_ONE;
+        case Constants.DEDICATED_ONE_PLUS_ONE:
+            return ProtectionType.DEDICATED_ONE_PLUS_ONE;
+        case Constants.ENHANCED:
+            return ProtectionType.ENHANCED;
+        case Constants.RESERVED:
+            return ProtectionType.RESERVED;
+        default:
+            throw new BgpParseException("Got another type " + linkProtectionType);
+        }
     }
 
     @Override
@@ -200,8 +136,7 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(bExtraTraffic, bUnprotected, bShared,
-                            bDedOneIstoOne, bDedOnePlusOne, bEnhanced);
+        return Objects.hash(linkProtectionType);
     }
 
     @Override
@@ -212,12 +147,7 @@
 
         if (obj instanceof BgpLinkAttrProtectionType) {
             BgpLinkAttrProtectionType other = (BgpLinkAttrProtectionType) obj;
-            return Objects.equals(bExtraTraffic, other.bExtraTraffic)
-                    && Objects.equals(bUnprotected, other.bUnprotected)
-                    && Objects.equals(bShared, other.bShared)
-                    && Objects.equals(bDedOneIstoOne, other.bDedOneIstoOne)
-                    && Objects.equals(bDedOnePlusOne, other.bDedOnePlusOne)
-                    && Objects.equals(bEnhanced, other.bEnhanced);
+            return Objects.equals(linkProtectionType, other.linkProtectionType);
         }
         return false;
     }
@@ -231,11 +161,8 @@
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(getClass())
-                .add("bExtraTraffic", bExtraTraffic)
-                .add("bUnprotected", bUnprotected).add("bShared", bShared)
-                .add("bDedOneIstoOne", bDedOneIstoOne)
-                .add("bDedOnePlusOne", bDedOnePlusOne)
-                .add("bEnhanced", bEnhanced).toString();
+                .add("linkProtectionType", linkProtectionType)
+                .toString();
     }
 
     @Override
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrSrlg.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrSrlg.java
index 4a6f23f..e1be002 100644
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrSrlg.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrSrlg.java
@@ -33,6 +33,7 @@
 public class BgpLinkAttrSrlg implements BgpValueType {
 
     public static final short ATTRNODE_SRLG = 1097;
+    public static final short SIZE = 4;
 
     /* Shared Risk Link Group */
     private List<Integer> sRlg = new ArrayList<Integer>();
@@ -69,7 +70,7 @@
         ArrayList<Integer> sRlg = new ArrayList<Integer>();
 
         short lsAttrLength = cb.readShort();
-        int len = lsAttrLength / Integer.SIZE; // each element is of 4 octets
+        int len = lsAttrLength / SIZE; // each element is of 4 octets
 
         if (cb.readableBytes() < lsAttrLength) {
             Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrIgpFlags.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrIgpFlags.java
index 4e84191..7f6f63f 100644
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrIgpFlags.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrIgpFlags.java
@@ -57,7 +57,7 @@
      * @param bOspfLclAddrBit OSPF local address Bit
      * @param bOspfNSSABit OSPF propagate NSSA Bit
      */
-    BgpPrefixAttrIgpFlags(boolean bisisUpDownBit,
+    public BgpPrefixAttrIgpFlags(boolean bisisUpDownBit,
                           boolean bOspfNoUnicastBit,
                           boolean bOspfLclAddrBit, boolean bOspfNSSABit) {
         this.bisisUpDownBit = bisisUpDownBit;
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrRouteTag.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrRouteTag.java
index 3894c00..ecfcb9e 100644
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrRouteTag.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrRouteTag.java
@@ -38,6 +38,7 @@
             .getLogger(BgpPrefixAttrRouteTag.class);
 
     public static final short ATTR_PREFIX_ROUTETAG = 1153;
+    public static final short SIZE = 4;
 
     /* Prefix Route Tag */
     private List<Integer> pfxRouteTag = new ArrayList<Integer>();
@@ -74,7 +75,7 @@
         ArrayList<Integer> pfxRouteTag = new ArrayList<Integer>();
 
         short lsAttrLength = cb.readShort();
-        int len = lsAttrLength / Integer.SIZE;
+        int len = lsAttrLength / SIZE;
 
         if (cb.readableBytes() < lsAttrLength) {
             Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/util/Constants.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/util/Constants.java
index 9649bf1..ff660a7 100644
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/util/Constants.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/util/Constants.java
@@ -34,4 +34,11 @@
     public static final short AFI_VALUE = 16388;
     public static final byte VPN_SAFI_VALUE = (byte) 0x80;
     public static final byte SAFI_VALUE = 71;
+    public static final int EXTRA_TRAFFIC = 0x01;
+    public static final int UNPROTECTED = 0x02;
+    public static final int SHARED = 0x04;
+    public static final int DEDICATED_ONE_ISTO_ONE = 0x08;
+    public static final int DEDICATED_ONE_PLUS_ONE = 0x10;
+    public static final int ENHANCED = 0x20;
+    public static final int RESERVED = 0x40;
 }
\ No newline at end of file