diff --git a/utils/yangutils/src/test/java/org/onosproject/yangutils/utils/io/impl/YangFileScannerTest.java b/utils/yangutils/src/test/java/org/onosproject/yangutils/utils/io/impl/YangFileScannerTest.java
new file mode 100644
index 0000000..6ead5e3
--- /dev/null
+++ b/utils/yangutils/src/test/java/org/onosproject/yangutils/utils/io/impl/YangFileScannerTest.java
@@ -0,0 +1,222 @@
+/*
+ * 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.utils.io.impl;
+
+import java.io.IOException;
+
+import org.junit.Test;
+import java.io.File;
+import java.util.List;
+import org.slf4j.Logger;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Unit tests for searching yang files.
+ */
+public class YangFileScannerTest {
+
+    private final Logger log = getLogger(getClass());
+
+    private static final String BASEDIR = "target/UnitTestCase";
+
+    /**
+     * Checks an empty directory.
+     */
+    @Test
+    public void testWithSingleEmptyDirectoryInRoot() {
+        try {
+            File dir = new File(BASEDIR);
+            dir.mkdirs();
+            List<String> list = YangFileScanner.getYangFiles(BASEDIR.toString());
+        } catch (IOException e) {
+            log.info("IO Exception throwed");
+        }
+    }
+
+    /**
+     * Checks multiple empty directories in root directory.
+     */
+    @Test
+    public void testWithMultiEmptyDirectoriesInRoot() {
+        try {
+            String dir = "emptyDir";
+            String dir1 = "emptyDir1";
+            String dir2 = "emptyDir2";
+            String dir3 = "emptyDir3";
+            String dir4 = "emptyDir4";
+            File firstpath = createDirectory(dir);
+            File firstpath1 = createDirectory(dir1);
+            File firstpath2 = createDirectory(dir2);
+            File firstpath3 = createDirectory(dir3);
+            File firstpath4 = createDirectory(dir4);
+            List<String> list = YangFileScanner.getYangFiles(BASEDIR.toString());
+        } catch (IOException e) {
+            log.info("IO Exception throwed");
+        }
+    }
+
+    /**
+     * Checks one directory with one .yang file.
+     */
+    @Test
+    public void testWithSingleDirectorySingleFileInRoot() {
+        try {
+            String dir1 = "level1";
+            String firstFileName1 = "secondFile.yang";
+            File firstpath1 = createDirectory(dir1);
+            createFile(firstpath1, firstFileName1);
+            List<String> list = YangFileScanner.getYangFiles(BASEDIR.toString());
+        } catch (IOException e) {
+            log.info("IO Exception throwed");
+        }
+    }
+
+    /**
+     * Checks one directory with many .yang file.
+     */
+    @Test
+    public void testWithSingleDirectoryMultiFilesInRoot() {
+        try {
+            String dir2 = "level2";
+            String firstFileName2 = "thirdFile.yang";
+            String firstFileName3 = "fourthFile.yang";
+            String firstFileName4 = "fifthFile.yang";
+            String firstFileName5 = "sixthFile.yang";
+            File firstpath2 = createDirectory(dir2);
+            createFile(firstpath2, firstFileName2);
+            createFile(firstpath2, firstFileName3);
+            createFile(firstpath2, firstFileName4);
+            createFile(firstpath2, firstFileName5);
+            List<String> list = YangFileScanner.getYangFiles(BASEDIR.toString());
+        } catch (IOException e) {
+            log.info("IO Exception throwed");
+        }
+    }
+
+    /**
+     * Checks multi directories with many .yang file.
+     */
+    @Test
+    public void testWithMultiDirectoriesMultiFiles() {
+        try {
+            String dir2 = "newDir1/newDir2/newDir3/newDir4";
+            File dir3 = new File("target/UnitTestCase/newDir1");
+            File dir4 = new File("target/UnitTestCase/newDir1/newDir2");
+            File dir5 = new File("target/UnitTestCase/newDir1/newDir2/newDir3");
+            File dir6 = new File("target/UnitTestCase/newDir1/newDir2/newDir3/newDir4");
+            String firstFileName2 = "thirdFile.yang";
+            String firstFileName3 = "fourthFile.yang";
+            String firstFileName4 = "fifthFile.yang";
+            String firstFileName5 = "sixthFile.yang";
+            File firstpath2 = createDirectory(dir2);
+            createFile(firstpath2, firstFileName2);
+            createFile(firstpath2, firstFileName3);
+            createFile(firstpath2, firstFileName4);
+            createFile(dir3, firstFileName5);
+            createFile(dir3, firstFileName2);
+            createFile(dir3, firstFileName3);
+            createFile(dir3, firstFileName4);
+            createFile(dir3, firstFileName5);
+            createFile(dir4, firstFileName2);
+            createFile(dir4, firstFileName3);
+            createFile(dir4, firstFileName4);
+            createFile(dir4, firstFileName5);
+            createFile(dir5, firstFileName2);
+            createFile(dir5, firstFileName3);
+            createFile(dir5, firstFileName4);
+            createFile(dir5, firstFileName5);
+            createFile(dir6, firstFileName2);
+            createFile(dir6, firstFileName3);
+            createFile(dir6, firstFileName4);
+            createFile(dir6, firstFileName5);
+            List<String> list = YangFileScanner.getYangFiles(BASEDIR.toString());
+        } catch (IOException e) {
+            log.info("IO Exception throwed");
+        }
+    }
+
+    /**
+     * Checks multi directories with many .java file.
+     */
+    @Test
+    public void testWithMultiDirectoriesMultiJavaFiles() {
+        try {
+            String dir2 = "newDir1/newDir2/newDir3/newDir4";
+            File dir3 = new File("target/UnitTestCase/newDir1");
+            File dir4 = new File("target/UnitTestCase/newDir1/newDir2");
+            File dir5 = new File("target/UnitTestCase/newDir1/newDir2/newDir3");
+            File dir6 = new File("target/UnitTestCase/newDir1/newDir2/newDir3/newDir4");
+            String firstFileName2 = "thirdFile.java";
+            String firstFileName3 = "fourthFile.java";
+            String firstFileName4 = "fifthFile.java";
+            String firstFileName5 = "sixthFile.java";
+            File firstpath2 = createDirectory(dir2);
+            createFile(firstpath2, firstFileName2);
+            createFile(firstpath2, firstFileName3);
+            createFile(firstpath2, firstFileName4);
+            createFile(dir3, firstFileName5);
+            createFile(dir3, firstFileName2);
+            createFile(dir3, firstFileName3);
+            createFile(dir3, firstFileName4);
+            createFile(dir3, firstFileName5);
+            createFile(dir4, firstFileName2);
+            createFile(dir4, firstFileName3);
+            createFile(dir4, firstFileName4);
+            createFile(dir4, firstFileName5);
+            createFile(dir5, firstFileName2);
+            createFile(dir5, firstFileName3);
+            createFile(dir5, firstFileName4);
+            createFile(dir5, firstFileName5);
+            createFile(dir6, firstFileName2);
+            createFile(dir6, firstFileName3);
+            createFile(dir6, firstFileName4);
+            createFile(dir6, firstFileName5);
+            List<String> list = YangFileScanner.getJavaFiles(BASEDIR.toString());
+        } catch (IOException e) {
+            log.info("IO Exception throwed");
+        }
+    }
+
+    /**
+     * Method used for creating multiple directories inside the target file.
+     *
+     * @param path directory path
+     * @return directory path
+     */
+    public File createDirectory(String path) {
+        File myDir = new File(BASEDIR + File.separator + path);
+        myDir.mkdirs();
+        return myDir;
+    }
+
+    /**
+     * Method used for creating file inside the specified directory.
+     *
+     * @param myDir my current dirctory
+     * @param fileName file name
+     * @throws IOException io exception when fails to create a file.
+     */
+    public void createFile(File myDir, String fileName) throws IOException {
+        File file = null;
+        try {
+            file = new File(myDir + File.separator + fileName);
+            file.createNewFile();
+        } catch (final IOException e) {
+            throw new IOException("IOException occured");
+        }
+    }
+}
