vm = new SqliteVM($db, true); } public function __destruct() { unset($this->vm); } public function ValidateApiRequest($serviceType, $paramSet, $operation, $actualResult, $file) { //Default values for the outcome $exitStatus=0; $outcome="pass"; //If we have an exception we need to remove the stack trace because different line numbers will fail the test $resultData = ValidateUtils::RemoveStackTrace($actualResult->GetResultData()); //Get the mime type based on the content type in the result $mimeType = $actualResult->GetContentType(); //If we have exception message we need to remove any parts that may contain system dependent information //Ex. file paths $resultData = ValidateUtils::ProcessExceptionMessage($resultData); //Get the file extension that will be used for a dump $actualExtension = ValidateUtils::GetExtension($mimeType); $bAlwaysPass = false; $passReason = ""; //If we have an ALWAYSPASS parameter defined for the operation then skip the whole validation process //This parameter should only be used for clean up operations that are no related with the tests if ($this->vm->Execute("Select ParamValue from Params where ParamName=\"ALWAYSPASS\" and ParamSet=$paramSet")!=SQLITE_ROW) { //Form a file name that is going to be used to write results to a file $type=substr($serviceType, 0, strpos($serviceType, "_")); $filePath = Utils::GetPath("../../TestData/".$type."/DumpFiles/".$type."ApiTest"); $fileName = $filePath."_".$paramSet.".".$actualExtension; if ($_POST['testExecutionMode'] == "dump") { file_put_contents($fileName, $resultData); } else { //This section is special case handling for the operations that return different data after each call $resultData=ValidateUtils::SpecialDataHandling($operation, $resultData, $mimeType); if ($_POST['testExecutionMode'] == "generate" && array_key_exists($paramSet, $_POST)) { //Get the sample result that is stored in the database. If we are using file on disk for validation //then do not overwrite the filename in the database //To distinguish between sample data and filename all filenames should be prefixed with "@@" $status = $this->vm->Execute("Select Result from ApiTestResults where ParamSet=$paramSet;"); $sampleResult = $this->vm->GetString("Result"); if ("@@"!=substr($sampleResult, 0, 2)) { $responseBody=""; //Insert the sample data as a BLOB //Update the row for that param set or create a new row if we do not have it yet if ($status == SQLITE_ROW) { $this->vm->Prepare("update ApiTestResults set Result = :blob where ParamSet=$paramSet;"); } else { printf ("A new row has been created in ApiTestResults table to store the result for operation %s
", $paramSet); print ("Please, update the Description field for that row later

"); $this->vm->Prepare("INSERT INTO ApiTestResults(ParamSet, Result) VALUES($paramSet, :blob);"); } $this->vm->BindBlob(":blob", $resultData, mb_strlen($resultData, "latin1")); $this->vm->Execute(); //Update the mime type in the database if available if ($mimeType != null) { $this->vm->Execute("UPDATE ApiTestResults SET ContentType=\"$mimeType\" WHERE ParamSet=$paramSet;"); } //To ensure that the data generated in the database is correct, output the result in a file //Check the file contents to ensure that this is the data that you to be stored in the database file_put_contents($fileName, $resultData); } } elseif ($_POST['testExecutionMode'] == "validate" || $_POST['testExecutionMode'] == "show") { $expectedResult=""; $resultContent=""; //Get the sample result and the expected content type from the database $this->vm->Execute("Select Result, ContentType from ApiTestResults where ParamSet=$paramSet"); $byteReader = $this->vm->GetBlob("Result"); $expectedExtension = ValidateUtils::GetExtension($this->vm->GetString("ContentType")); while ($byteReader->Read($resultContent, 1024)>0) { $expectedResult.=$resultContent; } //If we are validating from a file then get the contents of that file //File names should be prefixed with "@@" to distinguish them from BLOB data if ("@@"==substr($expectedResult, 0, 2)) { //Remove "@@" from the filename. Get the path to the file and pump the contents in a variable $sampleDataFile=substr($expectedResult, 2); $sampleDataFile=Utils::GetPath($sampleDataFile); $expectedResult=file_get_contents($sampleDataFile); } if ($_POST['testExecutionMode'] == "validate") { //Normalize line endings so comparisons don't fall over due to incorrect line endings when expected results were entered in SQLite GUI $normResultData = str_replace("\r\n", "\n", $resultData); $normExpectedResult = str_replace("\r\n", "\n", $expectedResult); //If the results are different and special validation fails then the operation failed ->mark it red if (strncasecmp($normResultData, $normExpectedResult, strlen($normResultData . $normExpectedResult)) && !(ValidateUtils::SpecialValidation($operation, $resultData, $expectedResult))) { $outcome="fail"; $exitStatus=1; if (($expectedExtension!="xml") && ($expectedExtension!="html") && ($expectedExtension!="txt")) { $expectedResult= "Unable to display binary data"; } if (($actualExtension!="xml") && ($actualExtension!="html") && ($actualExtension!="txt")) { $resultData="Unable to display binary data"; } } } else { $type=substr($serviceType, 0, strpos($serviceType, "_")); $showPath = Utils::GetPath("../../TestData/".$type."/ShowFiles/".$type."ApiTest"); $showName = $showPath."_".$paramSet.".".$actualExtension; file_put_contents($showName, $expectedResult); } } } } else { $bAlwaysPass = true; $passReason = $this->vm->GetString("ParamValue"); } if ($_POST['output']=="html") { if ($outcome=="fail") { HtmlPrinter::AddResultRow($operation, $outcome, $paramSet, $resultData, $expectedResult); $str = sprintf("\n****ACTUAL RESULT****\n%s\n****EXPECTED RESULT****\n%s\n********\n\n\n", $resultData, $expectedResult); fwrite($file, $str); } else { HtmlPrinter::AddResultRow($operation, $outcome, $paramSet, $resultData, $expectedResult); //$str = sprintf("\n****ACTUAL RESULT****\n%s\n****EXPECTED RESULT****\n%s\n********\n\n\n", $resultData, $expectedResult); //fwrite($file, $str); } } else { if ($outcome=="fail") { printf("****".$serviceType." ".$paramSet." ".$operation." failed.\n"); $str = sprintf("\n****ACTUAL RESULT (%d)****\n%s\n****EXPECTED RESULT (%d)****\n%s\n********\n\n\n", strlen($resultData), $resultData, strlen($expectedResult), $expectedResult); echo $str; fwrite($file, $str); } else { /* if ($bAlwaysPass) { echo "Test (ParamSet: $paramSet) set to ALWAYSPASS: ".$passReason; if (php_sapi_name() == 'cli') echo "\n"; else echo "
"; } */ //$str = sprintf("\n****ACTUAL RESULT****\n%s\n****EXPECTED RESULT****\n%s\n********\n\n\n", $resultData, $expectedResult); //fwrite($file, $str); } } return $exitStatus; } public function ValidateHttpRequest($serviceType, $paramSet, $operation, $actualResult, $file) { //Default values for outcome $exitStatus=0; $outcome="pass"; //Get the content type of the result $contentType = $actualResult->GetContentType(); //We need to remove the stack trace if an exception is thrown because the different line numbers may fail the test $resultData = ValidateUtils::RemoveStackTrace($actualResult->GetResultData()); //If we have exception message we need to remove any parts that may contain system dependent information //Ex. file paths $resultData = ValidateUtils::ProcessExceptionMessage($resultData); //Get the extension for the dump file based on the content type of the result $actualExtension = ValidateUtils::GetExtension($contentType); $bAlwaysPass = false; $passReason = ""; //If ALWAYSPASS parameter is defined the the whole validation is skipped. //This parameter should only be used for clean up operations that are no related to the test if ($this->vm->Execute("Select ParamValue from Params where ParamName=\"ALWAYSPASS\" and ParamSet=$paramSet")!=SQLITE_ROW) { //Form a file name that is going to be used for the outputting results to a file $type=substr($serviceType, 0, strpos($serviceType, "_")); $dumpFilePath = Utils::GetPath("../../TestData/".$type."/DumpFiles/"); $filePath = Utils::GetPath("../../TestData/".$type."/DumpFiles/".$type."HttpTest"); $fileName = $filePath."_".$paramSet.".".$actualExtension; if ($_POST['testExecutionMode'] == "dump") { //if the folder "DumpFiles" is not exist, then user need to create the folder themself //or the "dump" operation fail, so add these code to create the folder automatically if(!file_exists($dumpFilePath)) { mkdir($dumpFilePath); } file_put_contents($fileName, "$resultData"); } else { //This section is special case handling for the operations that return different data after each call $resultData=ValidateUtils::SpecialDataHandling($operation, $resultData, $contentType); if ($_POST['testExecutionMode'] == "generate" && array_key_exists($paramSet,$_POST)) { //Get the sample result that is stored in the database. If we are using file on disk for validation //then do not overwrite the filename in the database //To distinguish between sample data and filename all filenames should be prefixed with "@@" $status = $this->vm->Execute("Select Result from HttpTestResults where ParamSet=$paramSet;"); //Get the sample data from the database $this->vm->Execute("Select Result from HttpTestResults where ParamSet = $paramSet"); //When use the GetString to get the result which is actually BlOB will cause exception //unfortunately, this expection can not be caught by the php engine, cause it is not legal php exception //maybe it is a problem of the sqlite in mapguide, so use GetBlob here, if the sqlite fix this problem //we can use try catch $byteReader = $this->vm->GetBlob("Result"); $sampleResult; while ($byteReader->Read($resultContent, 1024)>0) { $sampleResult.=$resultContent; } if ("@@"!=substr($sampleResult, 0, 2)) { $responseBody=""; //Store the result as a BLOB in the database //Update the row for that param set or create a new row if we do not have it yet if ($status == SQLITE_ROW) { $this->vm->Prepare("update HttpTestResults set Result = :blob where ParamSet=$paramSet;"); } else { printf ("A new row has been created in HttpTestResults table to store the result for operation %s
", $paramSet); print ("Please, update the Description field for that row later

"); $this->vm->Prepare("INSERT INTO HttpTestResults(ParamSet, Result) VALUES($paramSet, :blob);"); } $this->vm->BindBlob(":blob", $resultData, strlen($resultData)); $this->vm->Execute(); if ($contentType != null) { $this->vm->Execute("UPDATE HttpTestResults SET ContentType=\"$contentType\" WHERE ParamSet=$paramSet;"); } //Write the result to a file to ensure the correct data is populated in the database file_put_contents($fileName, $resultData); } } elseif ($_POST['testExecutionMode'] == "validate" || $_POST['testExecutionMode'] == "show") { $expectedResult=""; $resultContent=""; //Get the sample data from the database $this->vm->Execute("Select Result, ContentType from HttpTestResults where ParamSet=$paramSet"); $byteReader = $this->vm->GetBlob("Result"); $expectedExtension = ValidateUtils::GetExtension($this->vm->GetString("ContentType")); while ($byteReader->Read($resultContent, 1024)>0) { $expectedResult.=$resultContent; } //If we are validating from a file then get the contents of that file //File names should be prefixed with "@@" to distinguish them from BLOB data if ("@@"==substr($expectedResult, 0, 2)) { //Remove "@@" from the filename. Get the path to the file and pump the contents in a variable $sampleDataFile=substr($expectedResult, 2); $sampleDataFile=Utils::GetPath($expectedResult); $expectedResult=file_get_contents($sampleDataFile); } if ($_POST['testExecutionMode'] == "validate") { //Normalize line endings. Don't want stray CRLFs derailing verification $resultData = str_replace("\r\n", "\n", $resultData); $expectedResult = str_replace("\r\n", "\n", $expectedResult); //If the results are different and special validation fails then then the operation failed ->mark it red if ( strncasecmp($resultData, $expectedResult, strlen($resultData.$expectedResult)) && !(ValidateUtils::SpecialValidation($operation, $resultData, $expectedResult))) { $outcome="fail"; $exitStatus=1; if (($expectedExtension!="xml") && ($expectedExtension!="html") && ($expectedExtension!="txt")) { $expectedResult= "Unable to display binary data"; } if (($actualExtension!="xml") && ($actualExtension!="html") && ($actualExtension!="txt")) { $resultData="Unable to display binary data"; } } } else { $type=substr($serviceType, 0, strpos($serviceType, "_")); $showPath = Utils::GetPath("../../TestData/".$type."/ShowFiles/".$type."HttpTest"); $showName = $showPath."_".$paramSet.".".$actualExtension; file_put_contents($showName, $expectedResult); } } } } else { $bAlwaysPass = true; $passReason = $this->vm->GetString("ParamValue"); } if ($_POST['output']=="html") { if ($outcome=="fail") { HtmlPrinter::AddResultRow($operation, $outcome, $paramSet, $resultData, $expectedResult); $str = sprintf("\n****ACTUAL RESULT****\n%s\n****EXPECTED RESULT****\n%s\n********\n\n\n", $resultData, $expectedResult); fwrite($file, $str); } else { HtmlPrinter::AddResultRow($operation, $outcome, $paramSet); //$str = sprintf("\n****ACTUAL RESULT****\n%s\n****EXPECTED RESULT****\n%s\n********\n\n\n", $resultData, $expectedResult); //fwrite($file, $str); } } else { if ($outcome=="fail") { printf("****".$serviceType." ".$paramSet." ".$operation." failed.\n"); $str = sprintf("\n****ACTUAL RESULT (%d)****\n%s\n****EXPECTED RESULT (%d)****\n%s\n********\n\n\n", strlen($resultData), $resultData, strlen($expectedResult), $expectedResult); echo $str; fwrite($file, $str); } else { /* if ($bAlwaysPass) { echo "Test (ParamSet: $paramSet) set to ALWAYSPASS: ".$passReason; if (php_sapi_name() == 'cli') echo "\n"; else echo "
"; } */ //$str = sprintf("\n****ACTUAL RESULT****\n%s\n****EXPECTED RESULT****\n%s\n********\n\n\n", $resultData, $expectedResult); //fwrite($file, $str); } } return $exitStatus; } } ?>