public bool Run(TDConnectionClass tdConn, TestSet RunSet, string configPath)
        {
            try
              {
              //Console.WriteLine("Test run from Interface of IRunTest!");
              Debug.Print("PAS: Test run from Interface of IRunTest!");
              TestConfigFile tConfig = new TestConfigFile();
              TestUtility.LoadConfigFile(ref tConfig, configPath);

              // invoke the test execution
              TSTestFactory TSTestFact = RunSet.TSTestFactory as TSTestFactory;
              List runList = new List();
              runList = TSTestFact.NewList("") as List;
              foreach (TSTest instance in runList)
              {
            //generate the run first
            RunFactory runFact = instance.RunFactory as RunFactory;
            DateTime now = DateTime.Now;
            Run instanceRun = runFact.AddItem("Run_" + now.ToShortDateString() +
                                        "_" + now.ToShortTimeString()) as Run;

            QCOperation.QCInformation info = new QCOperation.QCInformation();
            // string runID = instanceRun.ID as string;
            //Initial the start status
            info.SetTestRunStatus(tdConn, instanceRun.ID.ToString(), "Not Completed");
            //Add the run steps
            //info.SetTestRunStep(tdConn, runID, "Step 1", "Passed");
            //info.SetTestRunStep(tdConn, runID, "Step 2", "Failed");
            //Update the end status
            //info.SetTestRunStatus(tdConn, runID, "Failed");

            //Download test case attachments
            string caseID = instance.TestId as string;
            ArrayList attachments = new ArrayList();
            QCOperation.QCAttachment taa = new QCOperation.QCAttachment();
            foreach (string downfile in tConfig.RunParameter.DownloadFile)
            {
              attachments.Add(taa.DownloadAttachment(tdConn, "TEST", caseID, downfile, @"C:\CSAutoTest\Temp"));
            }

            //When finish the test, record the summary in instance of testset
            string instanceID = instance.ID as string;
            string scriptFilename = null;
            string dataFilename = null;
            for (int i = 0; i < attachments.Count; i++)
            {
              ArrayList downList = attachments[i] as ArrayList;
              if (downList.Count > 0)
              {
            foreach (Object fileObj in downList)
            {
              string tempFilePath = fileObj as string;
              if (tempFilePath != null && tempFilePath.EndsWith("cod"))
              {
                scriptFilename = tempFilePath;
              }
              if (tempFilePath != null && tempFilePath.EndsWith("iod"))
              {
                dataFilename = tempFilePath;
              }
            }
              }
            }
            if (scriptFilename != null)
            {
              PAS.AutoTest.ScriptRunner.ScriptRunner sr = new PAS.AutoTest.ScriptRunner.ScriptRunner();
              PAS.AutoTest.ScriptRunner.ExecuteResult er;
            Debug.Print("PAS: Script file name: {0}", scriptFilename);
            Debug.Print("PAS: Data file name: {0}", dataFilename);
              if (dataFilename != null)
            { er = sr.Run(scriptFilename, dataFilename, 1200); }
              else
            { er = sr.Run(scriptFilename, string.Empty, 1200); }
            switch (er.Result)
              {
              case PAS.AutoTest.TestData.TestResult.Done:
                info.SetTestRunStatus(tdConn, instanceRun.ID.ToString(), "Passed");
                break;
            case PAS.AutoTest.TestData.TestResult.Pass:
              info.SetTestRunStatus(tdConn, instanceRun.ID.ToString(), "Passed");
              break;
            case PAS.AutoTest.TestData.TestResult.Fail:
              info.SetTestRunStatus(tdConn, instanceRun.ID.ToString(), "Failed");
              break;
              case PAS.AutoTest.TestData.TestResult.Incomplete:
              info.SetTestRunStatus(tdConn, instanceRun.ID.ToString(), "Not Completed");
              break;
                //default:
              case PAS.AutoTest.TestData.TestResult.Warning:
                info.SetTestRunStatus(tdConn, instanceRun.ID.ToString(), "N/A");
                break;

              }
            if (er.Result != PAS.AutoTest.TestData.TestResult.Incomplete)
            {
              info.SetTestInstanceSummary(tdConn, instanceID, tConfig.RunParameter.NumOfPassed, er.Output.Summary.Passed.ToString());
              info.SetTestInstanceSummary(tdConn, instanceID, tConfig.RunParameter.NumOfTotal, er.Output.Summary.TotalRun.ToString());

              string fileLog = ".log";
              fileLog = "TEST_" + caseID + "_" + now.ToShortDateString() + "_" + now.ToShortTimeString() + ".log";
              fileLog = ConvertChar(fileLog);
              er.Output.ConvertToXml(".\\Temp\\" + fileLog);
              bool uploadSuccess = false;
              uploadSuccess = taa.UploadAttachment(tdConn, "RUN", instanceRun.ID.ToString(), fileLog, GetCurrentRunDir() + "\\Temp\\");
              if (uploadSuccess)
              {
            Debug.Print("PAS: Upload test log sucess!");
              }
              else
              {
            Debug.Print("PAS: Upload test log fail!");
              }
            }
              }
            }
              }
              catch
              {
            Debug.Print("PAS: Run test case error!");
              }

              return true;
        }
 //Common function to generate Class from XML
 public static bool LoadConfigFile(ref TestConfigFile tcFile, string XMLfile)
 {
     try
       {
     XmlSerializer xs = new XmlSerializer(typeof(TestConfigFile));
     FileStream stream = new FileStream(XMLfile, FileMode.Open, FileAccess.Read);
     TestConfigFile tmpConfig = (TestConfigFile)xs.Deserialize(stream);
     stream.Close();
     tcFile = tmpConfig;
     return true;
       }
       catch (Exception e)
       {
     Console.WriteLine("---Load Config File Error---");
     Console.WriteLine("{0}", e.Message);
       }
       return false;
 }