diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/PsnpTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/PsnpTest.java
new file mode 100644
index 0000000..6c760cf
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/PsnpTest.java
@@ -0,0 +1,203 @@
+/*
+ * 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.pdu;
+
+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 org.onosproject.isis.controller.IsisPduType;
+import org.onosproject.isis.io.isispacket.IsisHeader;
+import org.onosproject.isis.io.isispacket.tlv.AdjacencyStateTlv;
+import org.onosproject.isis.io.isispacket.tlv.IsisTlv;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+
+import java.util.List;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+/**
+ * Unit test class for Psnp.
+ */
+public class PsnpTest {
+    private final String srcId = "1111.1111.1111";
+    private final byte[] psnpPkt = {
+            0, 35, 41, 41, 41, 41, 41, 41, 0, 9, 16, 4, -81, 18, 52, 18,
+            52, 0, 18, 0, 0, 0, 0, 0, 42, -94, -29
+    };
+    private Psnp psnp;
+    private IsisHeader isisHeader;
+    private ChannelBuffer channelBuffer;
+    private IsisTlv isisTlv;
+    private TlvHeader tlvHeader;
+    private List<IsisTlv> resultList;
+    private String resultStr;
+    private int resultInt;
+    private byte[] result;
+
+    @Before
+    public void setUp() throws Exception {
+        isisHeader = new IsisHeader();
+        isisHeader.setIsisPduType(IsisPduType.L1PSNP.value());
+        psnp = new Psnp(isisHeader);
+        tlvHeader = new TlvHeader();
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+        isisTlv = new AdjacencyStateTlv(tlvHeader);
+
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        isisHeader = null;
+        psnp = null;
+        channelBuffer = null;
+        tlvHeader = null;
+        isisTlv = null;
+        tlvHeader = null;
+    }
+
+    /**
+     * Tests addTlv() method.
+     */
+    @Test
+    public void testAddTlv() throws Exception {
+        psnp.addTlv(isisTlv);
+        resultList = psnp.getAllTlv();
+        assertThat(resultList.size(), is(1));
+
+    }
+
+    /**
+     * Tests getAllTlv() method.
+     */
+    @Test
+    public void testGetAllTlv() throws Exception {
+        psnp.addTlv(isisTlv);
+        resultList = psnp.getAllTlv();
+        assertThat(resultList.size(), is(1));
+
+    }
+
+    /**
+     * Tests sourceId() getter method.
+     */
+    @Test
+    public void testSourceId() throws Exception {
+        psnp.setSourceId(srcId);
+        resultStr = psnp.sourceId();
+        assertThat(resultStr, is(srcId));
+    }
+
+    /**
+     * Tests sourceId() setter method.
+     */
+    @Test
+    public void testSetSourceId() throws Exception {
+        psnp.setSourceId(srcId);
+        resultStr = psnp.sourceId();
+        assertThat(resultStr, is(srcId));
+    }
+
+    /**
+     * Tests pduLength() getter method.
+     */
+    @Test
+    public void testPduLength() throws Exception {
+        psnp.setPduLength(10);
+        resultInt = psnp.pduLength();
+        assertThat(resultInt, is(10));
+    }
+
+    /**
+     * Tests pduLength() setter method.
+     */
+    @Test
+    public void testSetPduLength() throws Exception {
+        psnp.setPduLength(10);
+        resultInt = psnp.pduLength();
+        assertThat(resultInt, is(10));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(psnpPkt);
+        psnp.readFrom(channelBuffer);
+        assertThat(psnp, is(notNullValue()));
+    }
+
+    /**
+     * Tests lasBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(psnpPkt);
+        psnp.readFrom(channelBuffer);
+        result = psnp.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests isisPduHeader() method.
+     */
+    @Test
+    public void testIsisPduHeader() throws Exception {
+        result = psnp.isisPduHeader();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests partialSequenceNumberPduBody() method.
+     */
+    @Test
+    public void testPartialSequenceNumberPduBody() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(psnpPkt);
+        psnp.readFrom(channelBuffer);
+        result = psnp.partialSequenceNumberPduBody();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests toString() method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat((psnp.toString()), is(notNullValue()));
+    }
+
+    /**
+     * Tests equals() method.
+     */
+    @Test
+    public void testEquals() throws Exception {
+        assertThat(psnp.equals(new Psnp(new IsisHeader())), is(true));
+    }
+
+    /**
+     * Tests hashCode() method.
+     */
+    @Test
+    public void testHashCode() throws Exception {
+        int hashCode = psnp.hashCode();
+        assertThat(hashCode, is(notNullValue()));
+    }
+}
