[ONOS-3856] BGP flow specification component classes.

Change-Id: Ib798fe31c66813644fd7c2844682377fb5644aad
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsDestinationPortNum.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsDestinationPortNum.java
new file mode 100755
index 0000000..b9020c8
--- /dev/null
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsDestinationPortNum.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2016 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.bgpio.types;
+
+import java.util.Objects;
+import java.util.List;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.util.Constants;
+import com.google.common.base.MoreObjects;
+
+/**
+ * Provides implementation of BGP flow specification component.
+ */
+public class BgpFsDestinationPortNum implements BgpValueType {
+
+    public static final byte FLOW_SPEC_TYPE = Constants.BGP_FLOWSPEC_DST_PORT;
+    private List<BgpFsOperatorValue> operatorValue;
+
+    /**
+     * Constructor to initialize the value.
+     *
+     * @param operatorValue list of operator and value
+     */
+    public BgpFsDestinationPortNum(List<BgpFsOperatorValue> operatorValue) {
+        this.operatorValue = operatorValue;
+    }
+
+    @Override
+    public short getType() {
+        return this.FLOW_SPEC_TYPE;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(operatorValue);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof BgpFsDestinationPortNum) {
+            BgpFsDestinationPortNum other = (BgpFsDestinationPortNum) obj;
+            return this.operatorValue.equals(other.operatorValue);
+        }
+        return false;
+    }
+
+    @Override
+    public int write(ChannelBuffer cb) {
+        int iLenStartIndex = cb.writerIndex();
+        cb.writeByte(FLOW_SPEC_TYPE);
+
+        for (BgpFsOperatorValue fsOperVal : operatorValue) {
+            cb.writeByte(fsOperVal.option());
+            cb.writeBytes(fsOperVal.value());
+        }
+
+        return cb.writerIndex() - iLenStartIndex;
+    }
+
+    /**
+     * Reads the channel buffer and returns object.
+     *
+     * @param cb channelBuffer
+     * @param type address type
+     * @return object of flow spec destination port number
+     * @throws BgpParseException while parsing BgpFsDestinationPortNum
+     */
+    public static BgpFsDestinationPortNum read(ChannelBuffer cb, short type) throws BgpParseException {
+        return null;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("FLOW_SPEC_TYPE", FLOW_SPEC_TYPE)
+                .add("operatorValue", operatorValue).toString();
+    }
+
+    @Override
+    public int compareTo(Object o) {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+}
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsDestinationPrefix.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsDestinationPrefix.java
new file mode 100755
index 0000000..63a6898
--- /dev/null
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsDestinationPrefix.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2016 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.bgpio.types;
+
+import java.nio.ByteBuffer;
+import java.util.Objects;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onlab.packet.IpPrefix;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.util.Constants;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Preconditions;
+
+/**
+ * Provides implementation of IPv4AddressTlv.
+ */
+public class BgpFsDestinationPrefix implements BgpValueType {
+
+    public static final byte FLOW_SPEC_TYPE = Constants.BGP_FLOWSPEC_DST_PREFIX;
+    private byte length;
+    private IpPrefix ipPrefix;
+
+    /**
+     * Constructor to initialize parameters.
+     *
+     * @param length length of the prefix
+     * @param ipPrefix ip prefix
+     */
+    public BgpFsDestinationPrefix(byte length, IpPrefix ipPrefix) {
+        this.ipPrefix = Preconditions.checkNotNull(ipPrefix);
+        this.length = length;
+    }
+
+    /**
+     * Returns ip prefix.
+     *
+     * @return ipPrefix ip prefix
+     */
+    public IpPrefix ipPrefix() {
+        return ipPrefix;
+    }
+
+    @Override
+    public short getType() {
+        return FLOW_SPEC_TYPE;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(ipPrefix);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof BgpFsDestinationPrefix) {
+            BgpFsDestinationPrefix other = (BgpFsDestinationPrefix) obj;
+            return Objects.equals(this.ipPrefix, other.ipPrefix);
+        }
+        return false;
+    }
+
+    @Override
+    public int write(ChannelBuffer cb) {
+        int iLenStartIndex = cb.writerIndex();
+        cb.writeByte(FLOW_SPEC_TYPE);
+        cb.writeByte(length);
+        cb.writeInt(ipPrefix.getIp4Prefix().address().toInt());
+        return cb.writerIndex() - iLenStartIndex;
+    }
+
+    /**
+     * Reads the channel buffer and returns object of IPv4AddressTlv.
+     *
+     * @param cb channelBuffer
+     * @param type address type
+     * @return object of flow spec destination prefix
+     * @throws BgpParseException while parsing BgpFsDestinationPrefix
+     */
+    public static BgpFsDestinationPrefix read(ChannelBuffer cb, short type) throws BgpParseException {
+        return null;
+    }
+
+    /**
+     * Returns object of this class with specified values.
+     *
+     * @param ipPrefix ip prefix
+     * @param length length of ip prefix
+     * @return object of this class
+     */
+    public static BgpFsDestinationPrefix of(final IpPrefix ipPrefix, final byte length) {
+        return new BgpFsDestinationPrefix(length, ipPrefix);
+    }
+
+    @Override
+    public int compareTo(Object o) {
+        if (this.equals(o)) {
+            return 0;
+        }
+
+        if (o instanceof BgpFsDestinationPrefix) {
+            BgpFsDestinationPrefix that = (BgpFsDestinationPrefix) o;
+
+            if (this.ipPrefix().prefixLength() == that.ipPrefix().prefixLength()) {
+                ByteBuffer value1 = ByteBuffer.wrap(this.ipPrefix.address().toOctets());
+                ByteBuffer value2 = ByteBuffer.wrap(that.ipPrefix.address().toOctets());
+                return value1.compareTo(value2);
+            }
+
+            if (this.ipPrefix().prefixLength() > that.ipPrefix().prefixLength()) {
+                return 1;
+            } else if (this.ipPrefix().prefixLength() < that.ipPrefix().prefixLength()) {
+                return -1;
+            }
+        }
+        return 1;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("FLOW_SPEC_TYPE", FLOW_SPEC_TYPE)
+                .add("length", length)
+                .add("ipPrefix", ipPrefix).toString();
+    }
+}
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsDscpValue.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsDscpValue.java
new file mode 100755
index 0000000..e383399
--- /dev/null
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsDscpValue.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2016 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.bgpio.types;
+
+import java.util.Objects;
+import java.util.List;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.util.Constants;
+import com.google.common.base.MoreObjects;
+
+/**
+ * Provides implementation of BGP flow specification component.
+ */
+public class BgpFsDscpValue implements BgpValueType {
+
+    public static final byte FLOW_SPEC_TYPE = Constants.BGP_FLOWSPEC_DSCP;
+    private List<BgpFsOperatorValue> operatorValue;
+
+    /**
+     * Constructor to initialize the value.
+     *
+     * @param operatorValue list of operator and value
+     */
+    public BgpFsDscpValue(List<BgpFsOperatorValue> operatorValue) {
+        this.operatorValue = operatorValue;
+    }
+
+    @Override
+    public short getType() {
+        return this.FLOW_SPEC_TYPE;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(operatorValue);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof BgpFsDscpValue) {
+            BgpFsDscpValue other = (BgpFsDscpValue) obj;
+            return this.operatorValue.equals(other.operatorValue);
+        }
+        return false;
+    }
+
+    @Override
+    public int write(ChannelBuffer cb) {
+        int iLenStartIndex = cb.writerIndex();
+
+        cb.writeByte(FLOW_SPEC_TYPE);
+
+        for (BgpFsOperatorValue fsOperVal : operatorValue) {
+            cb.writeByte(fsOperVal.option());
+            cb.writeBytes(fsOperVal.value());
+        }
+
+        return cb.writerIndex() - iLenStartIndex;
+    }
+
+    /**
+     * Reads the channel buffer and returns object.
+     *
+     * @param cb channelBuffer
+     * @param type address type
+     * @return object of flow spec DSCP value
+     * @throws BgpParseException while parsing BgpFsDscpValue
+     */
+    public static BgpFsDscpValue read(ChannelBuffer cb, short type) throws BgpParseException {
+        return null;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("FLOW_SPEC_TYPE", FLOW_SPEC_TYPE)
+                .add("operatorValue", operatorValue).toString();
+    }
+
+    @Override
+    public int compareTo(Object o) {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+}
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsFragment.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsFragment.java
new file mode 100755
index 0000000..4c6bf79
--- /dev/null
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsFragment.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2016 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.bgpio.types;
+
+import java.util.Objects;
+import java.util.List;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.util.Constants;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * Provides implementation of BGP flow specification component.
+ */
+public class BgpFsFragment implements BgpValueType {
+    public static final byte FLOW_SPEC_TYPE = Constants.BGP_FLOWSPEC_FRAGMENT;
+    private List<BgpFsOperatorValue> operatorValue;
+
+    /**
+     * Constructor to initialize the value.
+     *
+     * @param operatorValue list of operator and value
+     */
+    public BgpFsFragment(List<BgpFsOperatorValue> operatorValue) {
+        this.operatorValue = operatorValue;
+    }
+
+    @Override
+    public short getType() {
+        return this.FLOW_SPEC_TYPE;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(operatorValue);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof BgpFsFragment) {
+            BgpFsFragment other = (BgpFsFragment) obj;
+            return this.operatorValue.equals(other.operatorValue);
+        }
+        return false;
+    }
+
+    @Override
+    public int write(ChannelBuffer cb) {
+        int iLenStartIndex = cb.writerIndex();
+
+        cb.writeByte(FLOW_SPEC_TYPE);
+
+        for (BgpFsOperatorValue fsOperVal : operatorValue) {
+            cb.writeByte(fsOperVal.option());
+            cb.writeBytes(fsOperVal.value());
+        }
+
+        return cb.writerIndex() - iLenStartIndex;
+    }
+
+    /**
+     * Reads the channel buffer and returns object.
+     *
+     * @param cb channelBuffer
+     * @param type address type
+     * @return object of flow spec fragment
+     * @throws BgpParseException while parsing BgpFsFragment
+     */
+    public static BgpFsFragment read(ChannelBuffer cb, short type) throws BgpParseException {
+        return null;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("FLOW_SPEC_TYPE", FLOW_SPEC_TYPE)
+                .add("operatorValue", operatorValue).toString();
+    }
+
+    @Override
+    public int compareTo(Object o) {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+}
diff --git a/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BgpFsDestinationPortNumTest.java b/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BgpFsDestinationPortNumTest.java
new file mode 100644
index 0000000..abd5351
--- /dev/null
+++ b/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BgpFsDestinationPortNumTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2016 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.bgpio.types;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.google.common.testing.EqualsTester;
+
+/**
+ * Test for destination port number flow specification component.
+ */
+public class BgpFsDestinationPortNumTest {
+    List<BgpFsOperatorValue> operatorValue1 = new ArrayList<>();
+    List<BgpFsOperatorValue> operatorValue2 = new ArrayList<>();
+
+    @Test
+    public void testEquality() {
+        operatorValue1.add(new BgpFsOperatorValue((byte) 1, new byte[100]));
+        operatorValue1.add(new BgpFsOperatorValue((byte) 1, new byte[100]));
+        operatorValue2.add(new BgpFsOperatorValue((byte) 2, new byte[100]));
+        operatorValue2.add(new BgpFsOperatorValue((byte) 1, new byte[100]));
+
+        BgpFsDestinationPortNum tlv1 = new BgpFsDestinationPortNum(operatorValue1);
+        BgpFsDestinationPortNum sameAsTlv1 = new BgpFsDestinationPortNum(operatorValue1);
+        BgpFsDestinationPortNum tlv2 = new BgpFsDestinationPortNum(operatorValue2);
+
+        new EqualsTester()
+        .addEqualityGroup(tlv1, sameAsTlv1)
+        .addEqualityGroup(tlv2)
+        .testEquals();
+    }
+}
diff --git a/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BgpFsDestinationPrefixTest.java b/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BgpFsDestinationPrefixTest.java
new file mode 100644
index 0000000..cf5f95f
--- /dev/null
+++ b/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BgpFsDestinationPrefixTest.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2016 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.bgpio.types;
+
+import org.junit.Test;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import com.google.common.testing.EqualsTester;
+
+/**
+ * Test for destination prefix flow specification component.
+ */
+public class BgpFsDestinationPrefixTest {
+    private final byte length = 4;
+
+    private final IpPrefix prefix = IpPrefix.valueOf(IpAddress.valueOf("10.0.1.1"), 32);
+
+    private final byte length2 = 4;
+    private final IpPrefix prefix2 = IpPrefix.valueOf(IpAddress.valueOf("10.0.1.2"), 32);
+
+    private final BgpFsDestinationPrefix tlv1 = new BgpFsDestinationPrefix(length,  prefix);
+    private final BgpFsDestinationPrefix sameAsTlv1 = new BgpFsDestinationPrefix(length, prefix);
+    private final BgpFsDestinationPrefix tlv2 = new BgpFsDestinationPrefix(length2,  prefix2);
+
+    @Test
+    public void testEquality() {
+        new EqualsTester()
+        .addEqualityGroup(tlv1, sameAsTlv1)
+        .addEqualityGroup(tlv2)
+        .testEquals();
+    }
+}
diff --git a/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BgpFsDscpValueTest.java b/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BgpFsDscpValueTest.java
new file mode 100644
index 0000000..03e0bfe
--- /dev/null
+++ b/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BgpFsDscpValueTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2016 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.bgpio.types;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.google.common.testing.EqualsTester;
+
+/**
+ * Test for DSCP value flow specification component.
+ */
+public class BgpFsDscpValueTest {
+    List<BgpFsOperatorValue> operatorValue1 = new ArrayList<>();
+    List<BgpFsOperatorValue> operatorValue2 = new ArrayList<>();
+
+    @Test
+    public void testEquality() {
+        operatorValue1.add(new BgpFsOperatorValue((byte) 1, new byte[100]));
+        operatorValue1.add(new BgpFsOperatorValue((byte) 1, new byte[100]));
+        operatorValue2.add(new BgpFsOperatorValue((byte) 2, new byte[100]));
+        operatorValue2.add(new BgpFsOperatorValue((byte) 1, new byte[100]));
+
+        BgpFsDscpValue tlv1 = new BgpFsDscpValue(operatorValue1);
+        BgpFsDscpValue sameAsTlv1 = new BgpFsDscpValue(operatorValue1);
+        BgpFsDscpValue tlv2 = new BgpFsDscpValue(operatorValue2);
+
+        new EqualsTester()
+        .addEqualityGroup(tlv1, sameAsTlv1)
+        .addEqualityGroup(tlv2)
+        .testEquals();
+    }
+}
diff --git a/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BgpFsFragmentTest.java b/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BgpFsFragmentTest.java
new file mode 100644
index 0000000..0cd04be
--- /dev/null
+++ b/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BgpFsFragmentTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2016 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.bgpio.types;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.google.common.testing.EqualsTester;
+
+/**
+ * Test for fragment flow specification component.
+ */
+public class BgpFsFragmentTest {
+    List<BgpFsOperatorValue> operatorValue1 = new ArrayList<>();
+    List<BgpFsOperatorValue> operatorValue2 = new ArrayList<>();
+
+    @Test
+    public void testEquality() {
+        operatorValue1.add(new BgpFsOperatorValue((byte) 1, new byte[100]));
+        operatorValue1.add(new BgpFsOperatorValue((byte) 1, new byte[100]));
+        operatorValue2.add(new BgpFsOperatorValue((byte) 2, new byte[100]));
+        operatorValue2.add(new BgpFsOperatorValue((byte) 1, new byte[100]));
+
+        BgpFsFragment tlv1 = new BgpFsFragment(operatorValue1);
+        BgpFsFragment sameAsTlv1 = new BgpFsFragment(operatorValue1);
+        BgpFsFragment tlv2 = new BgpFsFragment(operatorValue2);
+
+        new EqualsTester()
+        .addEqualityGroup(tlv1, sameAsTlv1)
+        .addEqualityGroup(tlv2)
+        .testEquals();
+    }
+}