diff --git a/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/lsa/tlvtypes/LinkTlvTest.java b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/lsa/tlvtypes/LinkTlvTest.java
new file mode 100644
index 0000000..2387890
--- /dev/null
+++ b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/lsa/tlvtypes/LinkTlvTest.java
@@ -0,0 +1,180 @@
+/*
+ * 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.ospf.protocol.lsa.tlvtypes;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.ospf.protocol.lsa.TlvHeader;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.*;
+
+/**
+ * Unit test class for LinkTlv.
+ */
+public class LinkTlvTest {
+
+    private final byte[] packet1 = {0, 9, 0, 4, 0, 0, 0, 1};
+    private final byte[] packet2 = {0, 1, 0, 4, 0, 0, 0, 1};
+    private final byte[] packet3 = {0, 2, 0, 4, 0, 0, 0, 1};
+    private final byte[] packet4 = {0, 3, 0, 4, 0, 0, 0, 1};
+    private final byte[] packet5 = {0, 4, 0, 4, 0, 0, 0, 1};
+    private final byte[] packet6 = {0, 6, 0, 4, 0, 0, 0, 1};
+    private final byte[] packet7 = {0, 7, 0, 4, 0, 0, 0, 1};
+    private final byte[] packet8 = {0, 8, 0, 4, 0, 0, 0, 1};
+    private final byte[] packet9 = {0, 9, 0, 4, 0, 0, 0, 1,
+            0, 9, 0, 4, 0, 0, 0, 1,
+            0, 1, 0, 4, 0, 0, 0, 1,
+            0, 2, 0, 4, 0, 0, 0, 1,
+            0, 3, 0, 4, 0, 0, 0, 1,
+            0, 4, 0, 4, 0, 0, 0, 1,
+            0, 6, 0, 4, 0, 0, 0, 1,
+            0, 7, 0, 4, 0, 0, 0, 1,
+            0, 8, 0, 4, 0, 0, 0, 1,
+    };
+    private LinkTlv linkTlv;
+    private TlvHeader header;
+    private ChannelBuffer channelBuffer;
+    private byte[] result;
+
+    @Before
+    public void setUp() throws Exception {
+        linkTlv = new LinkTlv(new TlvHeader());
+
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        linkTlv = null;
+        header = null;
+        channelBuffer = null;
+        result = null;
+    }
+
+    /**
+     * Tests to string method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(linkTlv.toString(), is(notNullValue()));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+
+        header = new TlvHeader();
+        header.setTlvLength(8);
+        header.setTlvType(9);
+        linkTlv = new LinkTlv(header);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet1);
+        linkTlv.readFrom(channelBuffer);
+        assertThat(linkTlv, is(notNullValue()));
+
+        header = new TlvHeader();
+        header.setTlvLength(8);
+        header.setTlvType(1);
+        linkTlv = new LinkTlv(header);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet2);
+        linkTlv.readFrom(channelBuffer);
+        assertThat(linkTlv, is(notNullValue()));
+
+        header = new TlvHeader();
+        header.setTlvLength(8);
+        header.setTlvType(2);
+        linkTlv = new LinkTlv(header);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet3);
+        linkTlv.readFrom(channelBuffer);
+        assertThat(linkTlv, is(notNullValue()));
+
+        header = new TlvHeader();
+        header.setTlvLength(8);
+        header.setTlvType(3);
+        linkTlv = new LinkTlv(header);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet4);
+        linkTlv.readFrom(channelBuffer);
+        assertThat(linkTlv, is(notNullValue()));
+
+        header = new TlvHeader();
+        header.setTlvLength(8);
+        header.setTlvType(4);
+        linkTlv = new LinkTlv(header);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet5);
+        linkTlv.readFrom(channelBuffer);
+        assertThat(linkTlv, is(notNullValue()));
+
+        header = new TlvHeader();
+        header.setTlvLength(8);
+        header.setTlvType(5);
+        linkTlv = new LinkTlv(header);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet1);
+        linkTlv.readFrom(channelBuffer);
+        assertThat(linkTlv, is(notNullValue()));
+
+        header = new TlvHeader();
+        header.setTlvLength(8);
+        header.setTlvType(6);
+        linkTlv = new LinkTlv(header);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet6);
+        linkTlv.readFrom(channelBuffer);
+        assertThat(linkTlv, is(notNullValue()));
+
+        header = new TlvHeader();
+        header.setTlvLength(8);
+        header.setTlvType(7);
+        linkTlv = new LinkTlv(header);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet7);
+        linkTlv.readFrom(channelBuffer);
+        assertThat(linkTlv, is(notNullValue()));
+
+        header = new TlvHeader();
+        header.setTlvLength(8);
+        header.setTlvType(8);
+        linkTlv = new LinkTlv(header);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet8);
+        linkTlv.readFrom(channelBuffer);
+        assertThat(linkTlv, is(notNullValue()));
+        assertThat(linkTlv, instanceOf(LinkTlv.class));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        result = linkTlv.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+
+    /**
+     * Tests getTlvBodyAsByteArray() method.
+     */
+    @Test
+    public void testGetTlvBodyAsByteArray() throws Exception {
+
+        channelBuffer = ChannelBuffers.copiedBuffer(packet9);
+        linkTlv.readFrom(channelBuffer);
+
+        result = linkTlv.getTlvBodyAsByteArray();
+        assertThat(result, is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/lsa/tlvtypes/RouterTlvTest.java b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/lsa/tlvtypes/RouterTlvTest.java
new file mode 100644
index 0000000..9a3d10e
--- /dev/null
+++ b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/lsa/tlvtypes/RouterTlvTest.java
@@ -0,0 +1,127 @@
+/*
+ * 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.ospf.protocol.lsa.tlvtypes;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.ospf.protocol.lsa.TlvHeader;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.*;
+
+/**
+ * Unit test class for RouterTlv.
+ */
+public class RouterTlvTest {
+
+    private final byte[] packet = {1, 1, 1, 1};
+    private final byte[] packet1 = {1, 1, 1};
+    private RouterTlv rtlv;
+    private TlvHeader header;
+    private ChannelBuffer channelBuffer;
+    private byte[] result;
+
+    @Before
+    public void setUp() throws Exception {
+        rtlv = new RouterTlv(new TlvHeader());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        rtlv = null;
+        header = null;
+        channelBuffer = null;
+        result = null;
+    }
+
+    /**
+     * Tests routerAddress() getter method.
+     */
+    @Test
+    public void testGetRouterAddress() throws Exception {
+        rtlv.setRouterAddress(Ip4Address.valueOf("1.1.1.1"));
+        assertThat(rtlv.routerAddress(), is(Ip4Address.valueOf("1.1.1.1")));
+    }
+
+    /**
+     * Tests routerAddress() setter method.
+     */
+    @Test
+    public void testSetRouterAddress() throws Exception {
+        rtlv.setRouterAddress(Ip4Address.valueOf("1.1.1.1"));
+        assertThat(rtlv.routerAddress(), is(Ip4Address.valueOf("1.1.1.1")));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        header = new TlvHeader();
+        header.setTlvType(1);
+        header.setTlvLength(4);
+        rtlv = new RouterTlv(header);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet);
+        rtlv.readFrom(channelBuffer);
+        assertThat(rtlv, is(notNullValue()));
+        assertThat(rtlv, instanceOf(RouterTlv.class));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test(expected = Exception.class)
+    public void testReadFrom1() throws Exception {
+        header = new TlvHeader();
+        header.setTlvType(1);
+        header.setTlvLength(4);
+        rtlv = new RouterTlv(header);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet1);
+        rtlv.readFrom(channelBuffer);
+        assertThat(rtlv, is(notNullValue()));
+        assertThat(rtlv, instanceOf(RouterTlv.class));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test(expected = Exception.class)
+    public void testAsBytes() throws Exception {
+        result = rtlv.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests getTlvBodyAsByteArray() method.
+     */
+    @Test(expected = Exception.class)
+    public void testGetTLVBodyAsByteArray() throws Exception {
+        result = rtlv.getTlvBodyAsByteArray();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests to string method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(rtlv.toString(), is(notNullValue()));
+    }
+}
