[ONOS-8082] and [ONOS-8083] Route refresh changes

- Added Route Refresh message
- Changes in BgpFactory
- Add parsing for Route Refresh Capability TLV
- Add Unit Test case for Route Refresh message

Change-Id: I68efe55be50c545b06c99a099c4bc315b2d5f566
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpFactory.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpFactory.java
index 645100e..95bdec8 100644
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpFactory.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpFactory.java
@@ -52,6 +52,13 @@
     BgpUpdateMsg.Builder updateMessageBuilder();
 
     /**
+     * Gets the builder object for route refresh message.
+     *
+     * @return builder object for route refresh message
+     */
+    BgpRouteRefreshMsg.Builder routeRefreshMsgBuilder();
+
+    /**
      * Gets the BGP message reader.
      *
      * @return BGP message reader
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpRouteRefreshMsg.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpRouteRefreshMsg.java
new file mode 100644
index 0000000..d8d5370
--- /dev/null
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpRouteRefreshMsg.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2015-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.bgpio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.bgpio.types.BgpHeader;
+
+/**
+ * Abstraction of an entity providing BGP Route Refresh Message.
+ */
+public interface BgpRouteRefreshMsg extends BgpMessage {
+
+    @Override
+    BgpVersion getVersion();
+
+    @Override
+    BgpType getType();
+
+    @Override
+    void writeTo(ChannelBuffer channelBuffer);
+
+    @Override
+    BgpHeader getHeader();
+
+    /**
+     * Builder interface with get and set functions to build RouteRefresh message.
+     */
+    interface Builder extends BgpMessage.Builder {
+        @Override
+        BgpRouteRefreshMsg build();
+
+        @Override
+        Builder setHeader(BgpHeader bgpMsgHeader);
+
+        /**
+         * Adds the current AFI-SAFI pair and reserved bytes to be transmitted.
+         * BGP Route Refresh message contains one pair of AFI-SAFI values, but routers may transmit more than
+         * one AFI-SAFI pair
+         *
+         * @param afi AFI value to be added to AFI-SAFI pairs
+         * @param reserved reserved byte to be added. By default, this should be 0x00
+         * @param safi SAFI value to be added to AFI-SAFI pairs
+         * @return builder by setting hold time
+         */
+        Builder addAfiSafiValue(short afi, byte reserved, byte safi);
+    }
+}
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpType.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpType.java
index d65caff..e96c99f 100644
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpType.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpType.java
@@ -21,7 +21,7 @@
  */
 public enum BgpType {
 
-    NONE(0), OPEN(1), UPDATE(2), NOTIFICATION(3), KEEP_ALIVE(4);
+    NONE(0), OPEN(1), UPDATE(2), NOTIFICATION(3), KEEP_ALIVE(4), ROUTE_REFRESH(5);
 
     int value;
 
@@ -42,4 +42,4 @@
     public byte getType() {
         return (byte) value;
     }
-}
\ No newline at end of file
+}
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpFactoryVer4.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpFactoryVer4.java
index babade2..96806f1 100644
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpFactoryVer4.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpFactoryVer4.java
@@ -22,6 +22,7 @@
 import org.onosproject.bgpio.protocol.BgpMessageReader;
 import org.onosproject.bgpio.protocol.BgpNotificationMsg;
 import org.onosproject.bgpio.protocol.BgpOpenMsg;
+import org.onosproject.bgpio.protocol.BgpRouteRefreshMsg;
 import org.onosproject.bgpio.protocol.BgpUpdateMsg;
 import org.onosproject.bgpio.protocol.BgpVersion;
 
@@ -53,6 +54,11 @@
     }
 
     @Override
+    public BgpRouteRefreshMsg.Builder routeRefreshMsgBuilder() {
+        return new BgpRouteRefreshMsgVer4.Builder();
+    }
+
+    @Override
     public BgpMessageReader<BgpMessage> getReader() {
         return BgpMessageVer4.READER;
     }
@@ -61,4 +67,4 @@
     public BgpVersion getVersion() {
         return BgpVersion.BGP_4;
     }
-}
\ No newline at end of file
+}
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpMessageVer4.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpMessageVer4.java
index 278d817..fd4669d 100644
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpMessageVer4.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpMessageVer4.java
@@ -36,6 +36,7 @@
 
     static final byte OPEN_MSG_TYPE = 0x1;
     static final byte KEEPALIVE_MSG_TYPE = 0x4;
+    static final byte ROUTEREFRESH_MSG_TYPE = 0x5;
     static final byte UPDATE_MSG_TYPE = 0x2;
     static final byte NOTIFICATION_MSG_TYPE = 0x3;
     static final int MINIMUM_COMMON_HEADER_LENGTH = 19;
@@ -98,6 +99,9 @@
                 case NOTIFICATION_MSG_TYPE:
                     log.debug("NOTIFICATION MESSAGE is received");
                     return BgpNotificationMsgVer4.READER.readFrom(cb.readBytes(len), bgpHeader);
+                case ROUTEREFRESH_MSG_TYPE:
+                    log.debug("ROUTEREFRESH MESSAGE is received");
+                    return BgpRouteRefreshMsgVer4.READER.readFrom(cb.readBytes(len), bgpHeader);
                 default:
                     Validation.validateType(BgpErrorType.MESSAGE_HEADER_ERROR, BgpErrorType.BAD_MESSAGE_TYPE, type);
                     return null;
@@ -108,4 +112,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpOpenMsgVer4.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpOpenMsgVer4.java
index d7550ff..7c50998 100644
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpOpenMsgVer4.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpOpenMsgVer4.java
@@ -30,6 +30,7 @@
 import org.onosproject.bgpio.types.BgpValueType;
 import org.onosproject.bgpio.types.FourOctetAsNumCapabilityTlv;
 import org.onosproject.bgpio.types.MultiProtocolExtnCapabilityTlv;
+import org.onosproject.bgpio.types.RouteRefreshCapabilityTlv;
 import org.onosproject.bgpio.util.Validation;
 import org.onosproject.bgpio.util.Constants;
 import org.onosproject.bgpio.types.RpdCapabilityTlv;
@@ -298,6 +299,15 @@
                 tlv = new MultiProtocolExtnCapabilityTlv(afi, res, safi);
 
                 break;
+            case RouteRefreshCapabilityTlv.TYPE:
+                log.debug("RouteRefreshCapabilityTlv");
+
+                if (RouteRefreshCapabilityTlv.LENGTH != length) {
+                    throw new BgpParseException("Invalid length received for RouteRefreshCapabilityTlv.");
+                }
+
+                tlv = new RouteRefreshCapabilityTlv(true);
+                break;
             default:
                 log.debug("Warning: Unsupported TLV: " + type);
                 cb.skipBytes(length);
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpRouteRefreshMsgVer4.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpRouteRefreshMsgVer4.java
new file mode 100644
index 0000000..9239176
--- /dev/null
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpRouteRefreshMsgVer4.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright 2015-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.bgpio.protocol.ver4;
+
+import com.google.common.base.MoreObjects;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.protocol.BgpType;
+import org.onosproject.bgpio.types.BgpHeader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.onosproject.bgpio.protocol.BgpRouteRefreshMsg;
+import org.onosproject.bgpio.protocol.BgpMessageReader;
+import org.onosproject.bgpio.protocol.BgpMessageWriter;
+import org.onosproject.bgpio.protocol.BgpVersion;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Provides BGP Route Refresh message.
+ */
+public class BgpRouteRefreshMsgVer4 implements BgpRouteRefreshMsg {
+
+    /*
+    <Route Refresh Message>::=
+
+    0                   1                   2                   3
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+    |                                                               |
+    +                                                               +
+    |                                                               |
+    +                                                               +
+    |                           Marker                              |
+    +                                                               +
+    |                                                               |
+    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+    |          Length               |      Type     |
+    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+    |           AFI                 |    Reserved   |     SAFI      |
+    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+    REFERENCE : RFC 2918
+    */
+
+    private static final Logger log = LoggerFactory.getLogger(BgpRouteRefreshMsgVer4.class);
+
+    public static final byte PACKET_VERSION = 4;
+    public static final int PACKET_LENGTH = 0x17;
+    public static final int MARKER_LENGTH = 16;
+    public static final BgpType MSG_TYPE = BgpType.ROUTE_REFRESH;
+    private static final byte[] MARKER = new byte[]{(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+            (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+            (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+            (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff};
+
+    private static final BgpHeader DEFAULT_ROUTEREFRESH_HEADER = new BgpHeader(MARKER,
+            (short) PACKET_LENGTH, BgpType.ROUTE_REFRESH.getType());
+
+    private BgpHeader bgpMsgHeader;
+    private byte version;
+    private List<AfiSafiValue> afiSafiValues;
+
+    public static final BgpRouteRefreshMsgVer4.Reader READER = new Reader();
+
+    /**
+     * Reader class for reading BGP route refresh message from channel buffer.
+     */
+    static class Reader implements BgpMessageReader<BgpRouteRefreshMsg> {
+
+        @Override
+        public BgpRouteRefreshMsgVer4 readFrom(ChannelBuffer cb, BgpHeader bgpHeader)
+                throws BgpParseException {
+
+            Short afi = cb.readShort();
+            log.debug("AFI read from Route Refresh message = {}", afi);
+
+            byte reserved = cb.readByte();
+            log.debug("Reserved read from Route Refresh message = {}", reserved);
+
+            byte safi = cb.readByte();
+            log.debug("SAFI read from Route Refresh message = {}", safi);
+
+            List<AfiSafiValue> afiSafiList = new LinkedList<>();
+
+            AfiSafiValue afisafiValue = new AfiSafiValue(afi, reserved, safi);
+            afiSafiList.add(afisafiValue);
+
+            return new BgpRouteRefreshMsgVer4(DEFAULT_ROUTEREFRESH_HEADER, PACKET_VERSION, afiSafiList);
+        }
+    }
+
+    /**
+     * Default constructor.
+     */
+    public BgpRouteRefreshMsgVer4() {
+        this.bgpMsgHeader = null;
+        this.version = 0;
+        this.afiSafiValues = null;
+    }
+
+    public BgpRouteRefreshMsgVer4(BgpHeader msgHeader, byte version, List<AfiSafiValue> afiSafiValues) {
+        this.bgpMsgHeader = msgHeader;
+        this.version = version;
+        this.afiSafiValues = afiSafiValues;
+    }
+
+    /**
+     * Builder class for BGP route refresh message.
+     */
+    static class Builder implements BgpRouteRefreshMsg.Builder {
+        BgpHeader bgpHeader = null;
+        boolean isHeaderSet = false;
+        List<AfiSafiValue> afiSafiList = null;
+
+        @Override
+        public Builder setHeader(BgpHeader bgpMsgHeader) {
+            this.bgpHeader = bgpMsgHeader;
+            this.isHeaderSet = true;
+            return this;
+        }
+
+        @Override
+        public BgpRouteRefreshMsg.Builder addAfiSafiValue(short afi, byte reserved, byte safi) {
+            if (afiSafiList == null) {
+                afiSafiList = new LinkedList<>();
+            }
+            AfiSafiValue currentElement = new AfiSafiValue(afi, reserved, safi);
+            afiSafiList.add(currentElement);
+            return this;
+        }
+
+        @Override
+        public BgpRouteRefreshMsg build() {
+            BgpHeader header = isHeaderSet ? bgpHeader : DEFAULT_ROUTEREFRESH_HEADER;
+            return new BgpRouteRefreshMsgVer4(header, PACKET_VERSION, afiSafiList);
+        }
+    }
+
+    @Override
+    public void writeTo(ChannelBuffer cb) {
+        WRITER.write(cb, this);
+    }
+
+    static final Writer WRITER = new Writer();
+
+    /**
+     * Writer class for writing the BGP route refresh message to channel buffer.
+     */
+    static class Writer implements BgpMessageWriter<BgpRouteRefreshMsgVer4> {
+
+        @Override
+        public void write(ChannelBuffer cb, BgpRouteRefreshMsgVer4 message) {
+            //Iterate over the added AFI-SAFI pair and write a new packet for each of those
+
+            for (AfiSafiValue element : message.afiSafiValues) {
+                cb.writeBytes(MARKER, 0, MARKER_LENGTH);
+                cb.writeShort(PACKET_LENGTH);
+                cb.writeByte(MSG_TYPE.getType());
+
+                cb.writeShort(element.afi);
+                cb.writeByte(element.reserved);
+                cb.writeByte(element.safi);
+            }
+        }
+    }
+
+    @Override
+    public BgpVersion getVersion() {
+        return BgpVersion.BGP_4;
+    }
+
+    @Override
+    public BgpType getType() {
+        return MSG_TYPE;
+    }
+
+    @Override
+    public BgpHeader getHeader() {
+        return this.bgpMsgHeader;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass()).toString();
+    }
+}
+
+final class AfiSafiValue {
+    final short afi;
+    final byte reserved;
+    final byte safi;
+
+    public AfiSafiValue(short afi, byte reserved, byte safi) {
+        this.afi = afi;
+        this.reserved = reserved;
+        this.safi = safi;
+    }
+}
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/RouteRefreshCapabilityTlv.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/RouteRefreshCapabilityTlv.java
new file mode 100644
index 0000000..6d54a4e
--- /dev/null
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/RouteRefreshCapabilityTlv.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2015-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.bgpio.types;
+
+import com.google.common.base.MoreObjects;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Objects;
+
+/**
+ * Provides RouteRefreshCapabilityTlv.
+ */
+public class RouteRefreshCapabilityTlv implements BgpValueType {
+
+    /*
+       Capability Code = 2
+       Length = 0
+
+       REFERENCE : RFC 2918
+     */
+    private static final Logger log = LoggerFactory.getLogger(RouteRefreshCapabilityTlv.class);
+
+    public static final byte TYPE = 2;
+    public static final byte LENGTH = 0;
+
+    private boolean isSupported = false;
+
+    /**
+     * Constructor to initialize variables.
+     * @param isSupported Is Route Refresh supported
+     */
+    public RouteRefreshCapabilityTlv(boolean isSupported) {
+        this.isSupported = isSupported;
+    }
+
+    /**
+     * Returns object of RouteRefreshCapabilityTlv.
+     * @param isSupported Is Route Refresh supported
+     * @return object of RouteRefreshCapabilityTlv
+     */
+    public static RouteRefreshCapabilityTlv of(boolean isSupported) {
+        return new RouteRefreshCapabilityTlv(isSupported);
+    }
+
+    /**
+     * Returns isSupported value.
+     * @return isSupported value
+     */
+    public boolean isSupported() {
+        return isSupported;
+    }
+
+    @Override
+    public short getType() {
+        return TYPE;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(isSupported);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof RouteRefreshCapabilityTlv) {
+            RouteRefreshCapabilityTlv other = (RouteRefreshCapabilityTlv) obj;
+            return Objects.equals(this.isSupported, other.isSupported);
+        }
+        return false;
+    }
+
+    @Override
+    public int write(ChannelBuffer cb) {
+        int iLenStartIndex = cb.writerIndex();
+        cb.writeByte(TYPE);
+        cb.writeByte(LENGTH);
+
+        return cb.writerIndex() - iLenStartIndex;
+    }
+
+    /**
+     * Reads from channel buffer and returns object of RouteRefreshCapabilityTlv.
+     * @param cb of type channel buffer
+     * @return object of RouteRefreshCapabilityTlv
+     */
+    public static BgpValueType read(ChannelBuffer cb) {
+        //No need to read. If TLV is received, it means it is supported
+
+        return new RouteRefreshCapabilityTlv(true);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("Type", TYPE)
+                .add("Length", LENGTH).toString();
+    }
+
+    @Override
+    public int compareTo(Object o) {
+        return 0;
+    }
+}
diff --git a/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpOpenMsgTest.java b/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpOpenMsgTest.java
index a5d1b90..3fe02ee 100644
--- a/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpOpenMsgTest.java
+++ b/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpOpenMsgTest.java
@@ -297,7 +297,7 @@
         // OPEN Message with invalid message type.
         byte[] openMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
                                      (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
-                                     (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, 0x1d, 0x05, 0X04,
+                                     (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, 0x1d, 0x06, 0X04,
                                      (byte) 0xfe, 0x09, 0x00, (byte) 0xb4, (byte) 0xc0, (byte) 0xa8, 0x00, 0x0f, 0x00 };
 
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
diff --git a/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpRouteRefreshMsgTest.java b/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpRouteRefreshMsgTest.java
new file mode 100644
index 0000000..408ba0e
--- /dev/null
+++ b/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpRouteRefreshMsgTest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2015-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.bgpio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.Test;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.types.BgpHeader;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.core.Is.is;
+
+/**
+ * Test case for BGP Route Refresh Message.
+ */
+public class BgpRouteRefreshMsgTest {
+
+    /**
+     * This test case checks BGP Route Refresh message.
+     */
+    @Test
+    public void routeRefreshMessageTest1() throws BgpParseException {
+
+        // BGP RouteRefresh Message
+        byte[] rrMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                                          (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                                          (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                                          (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                                          0x00, 0x17, 0x05, 0x00, 0x02, 0x00, 0x01};
+
+        byte[] testRouteRefreshMsg;
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(rrMsg);
+
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message;
+        BgpHeader bgpHeader = new BgpHeader();
+
+        message = reader.readFrom(buffer, bgpHeader);
+
+        assertThat(message, instanceOf(BgpRouteRefreshMsg.class));
+
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testRouteRefreshMsg = new byte[readLen];
+        buf.readBytes(testRouteRefreshMsg, 0, readLen);
+
+        assertThat(testRouteRefreshMsg, is(rrMsg));
+    }
+}