diff --git a/phosphor-regulators/test/meson.build b/phosphor-regulators/test/meson.build
index 547529c..5042cd3 100644
--- a/phosphor-regulators/test/meson.build
+++ b/phosphor-regulators/test/meson.build
@@ -13,6 +13,7 @@
     'rail_tests.cpp',
     'rule_tests.cpp',
     'sensor_monitoring_tests.cpp',
+    'validate-regulators-config_tests.cpp',
     'write_verification_error_tests.cpp',
 
     'actions/action_environment_tests.cpp',
@@ -54,5 +55,6 @@
                     libi2c_inc,
                     libi2c_dev_mock_inc
                 ]
-     )
+     ),
+     timeout : 90
 )
diff --git a/phosphor-regulators/test/validate-regulators-config_tests.cpp b/phosphor-regulators/test/validate-regulators-config_tests.cpp
index 4eeada7..7ba66e9 100644
--- a/phosphor-regulators/test/validate-regulators-config_tests.cpp
+++ b/phosphor-regulators/test/validate-regulators-config_tests.cpp
@@ -103,40 +103,53 @@
     }
 )"_json;
 
-std::string createTmpFile()
+class TmpFile
 {
-    // create temporary file using mkstemp under /tmp/. random name for XXXXXX
-    char fileName[] = "/tmp/temp-XXXXXX";
-    int fd = mkstemp(fileName);
-    if (fd == -1)
+  public:
+    TmpFile()
     {
-        perror("Can't create temporary file");
+        int fd = mkstemp(fileName);
+        if (fd == -1)
+        {
+            perror("Can't create temporary file");
+        }
+        close(fd);
     }
-    close(fd);
-    return fileName;
-}
+
+    std::string getName()
+    {
+        return fileName;
+    }
+
+    ~TmpFile()
+    {
+        unlink(fileName);
+    }
+
+  private:
+    char fileName[17] = "/tmp/temp-XXXXXX";
+};
 
 std::string getValidationToolCommand(const std::string& configFileName)
 {
-    std::string command = "../tools/validate-regulators-config.py -s \
-                           ../schema/config_schema.json -c ";
+    std::string command =
+        "../phosphor-regulators/tools/validate-regulators-config.py -s \
+         ../phosphor-regulators/schema/config_schema.json -c ";
     command += configFileName;
     return command;
 }
 
-int runToolForOutput(std::string& output, std::string command,
-                     bool isReadingStderr = false)
+int runToolForOutputWithCommand(std::string command,
+                                std::string& standardOutput,
+                                std::string& standardError)
 {
     // run the validation tool with the temporary file and return the output
     // of the validation tool.
-    // reading the stderr while isReadingStderr is true.
-    if (isReadingStderr == true)
-    {
-        command += " 2>&1 >/dev/null";
-    }
+    TmpFile tmpFile;
+    command += " 2> " + tmpFile.getName();
     // get the jsonschema print from validation tool.
     char buffer[256];
-    std::string result = "";
+    std::string result;
     // to get the stdout from the validation tool.
     FILE* pipe = popen(command.c_str(), "r");
     if (!pipe)
@@ -158,25 +171,34 @@
         throw std::runtime_error("pclose() failed!");
     }
     std::string firstLine = result.substr(0, result.find('\n'));
-    output = firstLine;
+    standardOutput = firstLine;
     // Get command exit status from return value
     int exitStatus = WEXITSTATUS(returnValue);
+
+    // Read the standardError from tmpFile.
+    std::ifstream input(tmpFile.getName().c_str());
+    std::string line;
+
+    if (std::getline(input, line))
+    {
+        standardError = line;
+    }
+
     return exitStatus;
 }
 
 int runToolForOutput(const std::string& configFileName, std::string& output,
-                     bool isReadingStderr = false)
+                     std::string& error)
 {
     std::string command = getValidationToolCommand(configFileName);
-    return runToolForOutput(output, command, isReadingStderr);
+    return runToolForOutputWithCommand(command, output, error);
 }
 
 void expectFileValid(const std::string& configFileName)
 {
     std::string errorMessage;
     std::string outputMessage;
-    EXPECT_EQ(runToolForOutput(configFileName, errorMessage, true), 0);
-    EXPECT_EQ(runToolForOutput(configFileName, outputMessage), 0);
+    EXPECT_EQ(runToolForOutput(configFileName, outputMessage, errorMessage), 0);
     EXPECT_EQ(errorMessage, "");
     EXPECT_EQ(outputMessage, "");
 }
@@ -187,31 +209,27 @@
 {
     std::string errorMessage;
     std::string outputMessage;
-    EXPECT_EQ(runToolForOutput(configFileName, errorMessage, true), 1);
-    EXPECT_EQ(runToolForOutput(configFileName, outputMessage), 1);
+    EXPECT_EQ(runToolForOutput(configFileName, outputMessage, errorMessage), 1);
     EXPECT_EQ(errorMessage, expectedErrorMessage);
     EXPECT_EQ(outputMessage, expectedOutputMessage);
 }
 
-std::string writeDataToTmpFile(const json configFileJson)
+void writeDataToFile(const json configFileJson, std::string fileName)
 {
-    std::string fileName;
-    fileName = createTmpFile();
     std::string jsonData = configFileJson.dump();
     std::ofstream out(fileName);
     out << jsonData;
     out.close();
-
-    return fileName;
 }
 
 void expectJsonValid(const json configFileJson)
 {
     std::string fileName;
-    fileName = writeDataToTmpFile(configFileJson);
+    TmpFile tmpFile;
+    fileName = tmpFile.getName();
+    writeDataToFile(configFileJson, fileName);
 
     EXPECT_FILE_VALID(fileName);
-    unlink(fileName.c_str());
 }
 
 void expectJsonInvalid(const json configFileJson,
@@ -219,10 +237,11 @@
                        const std::string& expectedOutputMessage)
 {
     std::string fileName;
-    fileName = writeDataToTmpFile(configFileJson);
+    TmpFile tmpFile;
+    fileName = tmpFile.getName();
+    writeDataToFile(configFileJson, fileName);
 
     EXPECT_FILE_INVALID(fileName, expectedErrorMessage, expectedOutputMessage);
-    unlink(fileName.c_str());
 }
 
 void expectCommandLineSyntax(const std::string& expectedErrorMessage,
@@ -231,8 +250,8 @@
 {
     std::string errorMessage;
     std::string outputMessage;
-    EXPECT_EQ(runToolForOutput(errorMessage, command, true), status);
-    EXPECT_EQ(runToolForOutput(outputMessage, command), status);
+    EXPECT_EQ(runToolForOutputWithCommand(command, outputMessage, errorMessage),
+              status);
     EXPECT_EQ(errorMessage, expectedErrorMessage);
     EXPECT_EQ(outputMessage, expectedOutputMessage);
 }
@@ -2529,9 +2548,11 @@
 }
 TEST(ValidateRegulatorsConfigTest, CommandLineSyntax)
 {
-    std::string validateTool = "../tools/validate-regulators-config.py ";
+    std::string validateTool =
+        " ../phosphor-regulators/tools/validate-regulators-config.py ";
     std::string schema = " -s ";
-    std::string schemaFile = " ../schema/config_schema.json ";
+    std::string schemaFile =
+        " ../phosphor-regulators/schema/config_schema.json ";
     std::string configuration = " -c ";
     std::string command;
     std::string errorMessage;
@@ -2541,7 +2562,9 @@
     int valid = 0;
 
     std::string fileName;
-    fileName = writeDataToTmpFile(validConfigFile);
+    TmpFile tmpFile;
+    fileName = tmpFile.getName();
+    writeDataToFile(validConfigFile, fileName);
     // Valid: -s specified
     {
         command = validateTool + "-s " + schemaFile + configuration + fileName;
@@ -2625,38 +2648,40 @@
     }
     // Invalid: File specified after -s is not right data format
     {
-        std::string wrongFormatFile;
-        wrongFormatFile = createTmpFile();
-        std::ofstream out(wrongFormatFile);
+        std::string wrongFormatFileName;
+        TmpFile wrongFormatFile;
+        wrongFormatFileName = wrongFormatFile.getName();
+        std::ofstream out(wrongFormatFileName);
         out << "foo";
         out.close();
-        command =
-            validateTool + schema + wrongFormatFile + configuration + fileName;
+        command = validateTool + schema + wrongFormatFileName + configuration +
+                  fileName;
         expectCommandLineSyntax(
             "Traceback (most recent call last):", outputMessage, command, 1);
-        unlink(wrongFormatFile.c_str());
     }
     // Invalid: File specified after -c is not readable
     {
-        std::string notReadableFile;
-        notReadableFile = writeDataToTmpFile(validConfigFile);
+        std::string notReadableFileName;
+        TmpFile notReadableFile;
+        notReadableFileName = notReadableFile.getName();
+        writeDataToFile(validConfigFile, notReadableFileName);
         command = validateTool + schema + schemaFile + configuration +
-                  notReadableFile;
-        chmod(notReadableFile.c_str(), 0222);
+                  notReadableFileName;
+        chmod(notReadableFileName.c_str(), 0222);
         expectCommandLineSyntax(
             "Traceback (most recent call last):", outputMessage, command, 1);
-        unlink(notReadableFile.c_str());
     }
     // Invalid: File specified after -s is not readable
     {
-        std::string notReadableFile;
-        notReadableFile = writeDataToTmpFile(validConfigFile);
-        command =
-            validateTool + schema + notReadableFile + configuration + fileName;
-        chmod(notReadableFile.c_str(), 0222);
+        std::string notReadableFileName;
+        TmpFile notReadableFile;
+        notReadableFileName = notReadableFile.getName();
+        writeDataToFile(validConfigFile, notReadableFileName);
+        command = validateTool + schema + notReadableFileName + configuration +
+                  fileName;
+        chmod(notReadableFileName.c_str(), 0222);
         expectCommandLineSyntax(
             "Traceback (most recent call last):", outputMessage, command, 1);
-        unlink(notReadableFile.c_str());
     }
     // Invalid: Unexpected parameter specified (like -g)
     {
@@ -2664,5 +2689,4 @@
                   fileName + " -g";
         expectCommandLineSyntax(outputMessageHelp, outputMessage, command, 2);
     }
-    unlink(fileName.c_str());
 }
