diff --git a/src/test/java/org/onosproject/yangutils/parser/impl/YangUtilsParserManagerTest.java b/src/test/java/org/onosproject/yangutils/parser/impl/YangUtilsParserManagerTest.java
new file mode 100644
index 0000000..f8a6120
--- /dev/null
+++ b/src/test/java/org/onosproject/yangutils/parser/impl/YangUtilsParserManagerTest.java
@@ -0,0 +1,103 @@
+/*
+ * 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.yangutils.parser.impl;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.yangutils.datamodel.YangNode;
+import org.onosproject.yangutils.parser.exceptions.ParserException;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+/**
+ * Test case for testing YANG utils parser manager.
+ */
+public class YangUtilsParserManagerTest {
+
+    YangUtilsParserManager manager = new YangUtilsParserManager();
+    File file;
+    BufferedWriter out;
+
+    @Before
+    public void setUp() throws Exception {
+        file = new File("demo.yang");
+        out = new BufferedWriter(new FileWriter(file));
+    }
+    @After
+    public void tearDown() throws Exception {
+        file.delete();
+    }
+
+    /**
+     * This test case checks whether the null pointer exception is generated
+     * when the input YANG file is null.
+     */
+    @Test(expected = NullPointerException.class)
+    public void getDataModelNullFileTest() throws IOException, ParserException {
+        YangUtilsParserManager manager = new YangUtilsParserManager();
+        YangNode node = manager.getDataModel(null);
+    }
+
+    /**
+     * This test case checks whether the io exception is generated
+     * when the input YANG file is non existent.
+     */
+    @Test(expected = IOException.class)
+    public void getDataModelNonExistentFileTest() throws IOException, ParserException {
+
+        YangUtilsParserManager manager = new YangUtilsParserManager();
+        YangNode node = manager.getDataModel("nonexistent.yang");
+    }
+
+    /**
+     * This test case checks if the input YANG file is correct no exception
+     * should be generated.
+     */
+    @Test
+    public void getDataModelCorrectFileTest() throws IOException, ParserException {
+
+        out.write("module ONOS {\n");
+        out.write("yang-version 1;\n");
+        out.write("namespace urn:ietf:params:xml:ns:yang:ietf-ospf;\n");
+        out.write("prefix On;\n");
+        out.write("}\n");
+        out.close();
+
+        YangNode node = manager.getDataModel("demo.yang");
+    }
+
+    /**
+     * This test case checks if the input YANG file with wrong YANG constructs
+     * than parser exception should be generated.
+     */
+    @Test(expected = ParserException.class)
+    public void getDataModelIncorrectFileTest() throws IOException, ParserException {
+
+        out.write("module ONOS {\n");
+        out.write("yang-version 1\n");
+        out.write("namespace urn:ietf:params:xml:ns:yang:ietf-ospf;\n");
+        out.write("prefix On;\n");
+        out.write("}\n");
+        out.close();
+
+        YangNode node = manager.getDataModel("demo.yang");
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/org/onosproject/yangutils/parser/parseutils/ListenerValidationTest.java b/src/test/java/org/onosproject/yangutils/parser/parseutils/ListenerValidationTest.java
new file mode 100644
index 0000000..c047f2b
--- /dev/null
+++ b/src/test/java/org/onosproject/yangutils/parser/parseutils/ListenerValidationTest.java
@@ -0,0 +1,103 @@
+/*
+ * 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.yangutils.parser.parseutils;
+
+import org.junit.Test;
+import org.onosproject.yangutils.datamodel.YangRevision;
+import org.onosproject.yangutils.parser.impl.TreeWalkListener;
+import org.onosproject.yangutils.parser.impl.parserutils.ListenerError;
+import org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation;
+
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Test case for testing listener validation util.
+ */
+public class ListenerValidationTest {
+
+    /**
+     * This test case checks in case error pre-exists, listener validate
+     * function returns true.
+     */
+    @Test
+    public void listenerValidationErrorExists() {
+
+        // Create an test error.
+        ListenerError testError = new ListenerError();
+        testError.setErrorFlag(true);
+        testError.setErrorMsg("Test Error");
+
+        // Create test walker and assign test error to it.
+        TreeWalkListener testWalker = new TreeWalkListener();
+        testWalker.setErrorInformation(testError);
+
+        // Create a temporary node of parsable.
+        YangRevision tmpNode = new YangRevision();
+        testWalker.getParsedDataStack().push(tmpNode);
+
+        boolean errorFlag = ListenerValidation.preValidation(testWalker, "ErrorTest");
+
+        /**
+         * Check for the values set in syntax error function. If not set properly
+         * report an assert.
+         */
+        assertThat(errorFlag, is(true));
+    }
+
+    /**
+     * This test case checks in case parsable stack is empty, listener validate
+     * function returns true.
+     */
+    @Test
+    public void listenerValidationEmptyStack() {
+
+        // Create test walker and assign test error to it.
+        TreeWalkListener testWalker = new TreeWalkListener();
+
+        boolean errorFlag = ListenerValidation.preValidation(testWalker, "ErrorTest");
+
+        /**
+         * Check for the values set in syntax error function. If not set properly
+         * report an assert.
+         */
+        assertThat(errorFlag, is(true));
+    }
+
+    /**
+     * This test case checks in case of error doesn't pre-exists and stack is,
+     * non empty, listener validate function returns false.
+     */
+    @Test
+    public void listenerValidationNoErrorNotExists() {
+
+        // Create test walker and assign test error to it.
+        TreeWalkListener testWalker = new TreeWalkListener();
+
+        // Create a temporary node of parsable.
+        YangRevision tmpNode = new YangRevision();
+        testWalker.getParsedDataStack().push(tmpNode);
+
+        boolean errorFlag = ListenerValidation.preValidation(testWalker, "ErrorTest");
+
+        /**
+         * Check for the values set in syntax error function. If not set properly
+         * report an assert.
+         */
+        assertThat(errorFlag, is(false));
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/org/onosproject/yangutils/parser/parseutils/ParseTreeErrorListenerTest.java b/src/test/java/org/onosproject/yangutils/parser/parseutils/ParseTreeErrorListenerTest.java
new file mode 100644
index 0000000..f91797e
--- /dev/null
+++ b/src/test/java/org/onosproject/yangutils/parser/parseutils/ParseTreeErrorListenerTest.java
@@ -0,0 +1,100 @@
+/*
+ * 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.yangutils.parser.impl.parseutils;
+
+import org.antlr.v4.runtime.ANTLRFileStream;
+import org.antlr.v4.runtime.ANTLRInputStream;
+import org.antlr.v4.runtime.CommonTokenStream;
+import org.antlr.v4.runtime.tree.ParseTree;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangLexer;
+import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
+import org.onosproject.yangutils.parser.exceptions.ParserException;
+import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
+import org.onosproject.yangutils.parser.impl.parserutils.ParseTreeErrorListener;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Test case for testing parse tree error listener.
+ */
+public class ParseTreeErrorListenerTest {
+
+    YangUtilsParserManager manager = new YangUtilsParserManager();
+    File file;
+    BufferedWriter out;
+
+    @Before
+    public void setUp() throws Exception {
+        file = new File("demo.yang");
+        out = new BufferedWriter(new FileWriter(file));
+    }
+    @After
+    public void tearDown() throws Exception {
+        file.delete();
+    }
+
+    /**
+     * This test case checks whether the error received from parser is correctly
+     * handled.
+     */
+    @Test
+    public void syntaxErrorValidationTest() throws IOException {
+
+        out.write("module ONOS {\n");
+        out.write("yang-version 1\n");
+        out.write("namespace urn:ietf:params:xml:ns:yang:ietf-ospf;\n");
+        out.write("prefix On;\n");
+        out.write("}\n");
+        out.close();
+
+        ANTLRInputStream input = new ANTLRFileStream("demo.yang");
+
+        // Create a lexer that feeds off of input char stream.
+        GeneratedYangLexer lexer = new GeneratedYangLexer(input);
+        // Create a buffer of tokens pulled from the lexer.
+        CommonTokenStream tokens = new CommonTokenStream(lexer);
+        // Create a parser that feeds off the tokens buffer.
+        GeneratedYangParser parser = new GeneratedYangParser(tokens);
+        // Remove console error listener.
+        parser.removeErrorListeners();
+        // Create instance of customized error listener.
+        ParseTreeErrorListener parseTreeErrorListener = new ParseTreeErrorListener();
+        // Add customized error listener to catch errors during parsing.
+        parser.addErrorListener(parseTreeErrorListener);
+        // Begin parsing YANG file and generate parse tree.
+        ParseTree tree = parser.yangfile();
+        // Get the exception occurred during parsing.
+        ParserException parserException = parseTreeErrorListener.getParserException();
+
+        /**
+         * Check for the values set in syntax error function. If not set properly
+         * report an assert.
+         */
+        assertThat(parseTreeErrorListener.isExceptionFlag(), is(true));
+        assertThat(parserException.getLineNumber(), is(3));
+        assertThat(parserException.getCharPositionInLine(), is(0));
+    }
+}
\ No newline at end of file
