diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/IpInternalReachabilityTlvTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/IpInternalReachabilityTlvTest.java
new file mode 100644
index 0000000..c1b2117
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/tlv/IpInternalReachabilityTlvTest.java
@@ -0,0 +1,92 @@
+/*
+ * 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.isis.io.isispacket.tlv;
+
+import org.easymock.EasyMock;
+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 static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for IP InternalReachabilityTlv.
+ */
+public class IpInternalReachabilityTlvTest {
+    private final byte[] tlv = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+    private TlvHeader tlvHeader;
+    private IpInternalReachabilityTlv ipInternalReachabilityTlv;
+    private MetricOfInternalReachability metricOfInternalReachability;
+    private byte[] result;
+    private ChannelBuffer channelBuffer;
+
+    @Before
+    public void setUp() throws Exception {
+        tlvHeader = new TlvHeader();
+        ipInternalReachabilityTlv = new IpInternalReachabilityTlv(tlvHeader);
+        metricOfInternalReachability = new MetricOfInternalReachability();
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        tlvHeader = null;
+        ipInternalReachabilityTlv = null;
+    }
+
+    /**
+     * Tests addInternalReachabilityMetric() method.
+     */
+    @Test
+    public void testAddInternalReachabilityMetric() throws Exception {
+        ipInternalReachabilityTlv.addInternalReachabilityMetric(metricOfInternalReachability);
+        assertThat(ipInternalReachabilityTlv, is(notNullValue()));
+
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        ipInternalReachabilityTlv.readFrom(channelBuffer);
+        assertThat(ipInternalReachabilityTlv, is(notNullValue()));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv);
+        ipInternalReachabilityTlv.readFrom(channelBuffer);
+        result = ipInternalReachabilityTlv.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests toString() method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(ipInternalReachabilityTlv.toString(), is(notNullValue()));
+    }
+}
\ No newline at end of file
