Commit: 255bcd1fed82b185e308ff8538ddb6e92c7f31dd
Author: Holly Li (WIPRO LIMITED) <[email protected]> Tue, 6 Aug
2019 00:46:51 -0700
Committer: Christoph M. Becker <[email protected]> Tue, 6 Aug 2019
10:24:49 +0200
Parents: 848cc83c9bd1aef3fba651961d049afa16c28964
Branches: master
Link:
http://git.php.net/?p=pftt2.git;a=commitdiff;h=255bcd1fed82b185e308ff8538ddb6e92c7f31dd
Log:
remove AbtractPhptTestCaseRunner2 and minor change on SKIPIF as XFAIL
Changed paths:
M src/com/mostc/pftt/runner/AbstractPhptTestCaseRunner.java
D src/com/mostc/pftt/runner/AbstractPhptTestCaseRunner2.java
diff --git a/src/com/mostc/pftt/runner/AbstractPhptTestCaseRunner.java
b/src/com/mostc/pftt/runner/AbstractPhptTestCaseRunner.java
index 7917690..660becd 100644
--- a/src/com/mostc/pftt/runner/AbstractPhptTestCaseRunner.java
+++ b/src/com/mostc/pftt/runner/AbstractPhptTestCaseRunner.java
@@ -234,6 +234,14 @@ public abstract class AbstractPhptTestCaseRunner extends
AbstractTestCaseRunner<
*/
protected boolean evalSkipIf(String output) throws IOException {
String lc_output = output.toLowerCase();
+
+ // Support xfail in SKIPIF sections
+ if(lc_output.contains("xfail"))
+ {
+ prep.test_case.skipifAsXfail = true;
+ return false;
+ }
+
//
// find 'skip ' or 'skip...' or 'skip.. ' or 'skip' but ignore
'404 error, file not found abc.skip.php'
// (don't need to check for multiple occurences of 'skip',
just one... finding abc.skip.php would be a TEST_EXCEPTION or FAIL anyway)
@@ -259,12 +267,6 @@ public abstract class AbstractPhptTestCaseRunner extends
AbstractTestCaseRunner<
// skip this test
return true;
}
-
- // Support xfail in SKIPIF sections
- if(lc_output.contains("xfail"))
- {
- prep.test_case.skipifAsXfail = true;
- }
// execute this test, don't skip it
return false;
diff --git a/src/com/mostc/pftt/runner/AbstractPhptTestCaseRunner2.java
b/src/com/mostc/pftt/runner/AbstractPhptTestCaseRunner2.java
deleted file mode 100644
index 03dbef6..0000000
--- a/src/com/mostc/pftt/runner/AbstractPhptTestCaseRunner2.java
+++ /dev/null
@@ -1,664 +0,0 @@
-package com.mostc.pftt.runner;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.nio.charset.Charset;
-import java.util.Map;
-import java.util.regex.Pattern;
-import java.util.zip.Deflater;
-import java.util.zip.DeflaterOutputStream;
-
-import javax.annotation.Nonnull;
-
-import org.incava.util.diff.Diff;
-
-import com.github.mattficken.io.StringUtil;
-import com.mostc.pftt.host.AHost;
-import com.mostc.pftt.model.core.EPhptSection;
-import com.mostc.pftt.model.core.EPhptTestStatus;
-import com.mostc.pftt.model.core.PhpBuild;
-import com.mostc.pftt.model.core.PhpIni;
-import com.mostc.pftt.model.core.PhptActiveTestPack;
-import com.mostc.pftt.model.core.PhptOverrideManager;
-import com.mostc.pftt.model.core.PhptSourceTestPack;
-import com.mostc.pftt.model.core.PhptTestCase;
-import com.mostc.pftt.results.ConsoleManager;
-import com.mostc.pftt.results.ITestResultReceiver;
-import com.mostc.pftt.results.PhptTestResult;
-import com.mostc.pftt.results.TestCaseCodeCoverage;
-import com.mostc.pftt.runner.LocalPhptTestPackRunner.PhptThread;
-import com.mostc.pftt.runner.PhptTestPreparer.PreparedPhptTestCase;
-import com.mostc.pftt.scenario.SAPIScenario;
-import com.mostc.pftt.scenario.ScenarioSetSetup;
-import com.mostc.pftt.util.ErrorUtil;
-import com.mostc.pftt.util.GZIPOutputStreamLevel;
-import com.mostc.pftt.util.StringUtil2.LengthLimitStringWriter;
-
-public abstract class AbstractPhptTestCaseRunner2 extends
AbstractPhptTestCaseRunner {
- protected final ConsoleManager cm;
- protected final ITestResultReceiver twriter;
- protected final AHost host;
- protected final PhpBuild build;
- protected final PhptSourceTestPack src_test_pack;
- protected final PreparedPhptTestCase prep;
- protected final ScenarioSetSetup scenario_set;
- protected final PhptThread thread;
- protected final SAPIScenario sapi_scenario;
- protected final PhptActiveTestPack active_test_pack;
- protected final boolean xdebug;
- protected TestCaseCodeCoverage code_coverage;
- protected Map<String, String> env;
- protected byte[] stdin_post;
- protected String base_file_name, content_type;
- protected PhpIni ini;
- protected boolean not_crashed = true; // @see HttpTestCaseRunner
- // if is_timeout, test output is still processed the same, only marked
as TIMEOUT if it would have normally been marked FAIL
- // (so its possible a test could timeout but still be marked PASS)
- protected boolean is_timeout = false;
-
- public abstract String getIniActual() throws Exception;
-
- /** runs the test case and reports the results to the
PhptTelemetryManager
- *
- * @see #willSkip - called by PhptTestPackRunner before #runTest is
called
- *
- */
- @Override
- public void runTest(ConsoleManager cm,
LocalPhptTestPackRunner.PhptThread t, LocalPhptTestPackRunner r) throws
IOException, Exception, Throwable {
- if (!prepare())
- // test is SKIP BORK EXCEPTION etc...
- return;
-
- if (prep.skipif_file!=null) {
- current_section = EPhptSection.SKIPIF; // @see
#getSAPIOutput
- if ( evalSkipIf(executeSkipIf()) ) {
- return;
- }
- }
-
-
- current_section = EPhptSection.TEST; // @see #getSAPIOutput
- // no SKIPIF section or executed SKIPIF says to execute the
TEST section
- prepareTest();
- //
- String test_output = executeTest();
-
- //
- if (xdebug) {
- // read and filter code coverage data from the output
- // @see PhpUnitTemplate#renderXDebugPhptTemplate
- StringBuilder sb = new StringBuilder(4096);
- code_coverage = new TestCaseCodeCoverage(host,
prep.test_file);
- String filename = prep.test_file; // can assume it
starts here
- for ( String line : StringUtil.splitLines(test_output))
{
- if (line.startsWith("exe=")) {
- code_coverage.addExecutedLine(filename,
Integer.parseInt(line.substring("exe=".length())));
- } else if (line.startsWith("didnt_exe=")) {
-
code_coverage.addNotExecutedLine(filename,
Integer.parseInt(line.substring("didnt_exe=".length())));
- } else if (line.startsWith("no_exe=")) {
-
code_coverage.addNonExecutableLine(filename,
Integer.parseInt(line.substring("no_exe=".length())));
- } else if (line.startsWith("file=")) {
- filename =
line.substring("file=".length());
- } else {
- sb.append(line);
- sb.append('\n');
- }
- }
- test_output = sb.toString();
- }
- //
- if (not_crashed) {
- //
- PhptTestResult result = evalTest(test_output,
prep.test_case.getCommonCharset());
- if (result!=null)
- twriter.addResult(host, scenario_set,
src_test_pack, result);
-
- // some tests create files/dirs which, which will cause
the test to fail again
- // if its run in-place from the same test-pack
- if
(!cm.isPhptNotInPlace()&&prep.test_clean!=null&&!host.isBusy()) {
- current_section = EPhptSection.CLEAN; // @see
#getSAPIOutput
- executeClean(); // #executeClean !=
#doRunTestClean
- }
- }
-
- if (!host.isBusy())
- doRunTestClean(cm);
- }
-
- protected void redoCrashedTest() throws Exception {
- }
-
- protected void doRunTestClean(ConsoleManager cm) throws
IllegalStateException, IOException {
-
- }
-
- public AbstractPhptTestCaseRunner2(boolean xdebug, SAPIScenario
sapi_scenario, PhpIni ini, PhptThread thread, PreparedPhptTestCase prep,
ConsoleManager cm, ITestResultReceiver twriter, AHost host, ScenarioSetSetup
scenario_set, PhpBuild build, PhptSourceTestPack src_test_pack,
PhptActiveTestPack active_test_pack) {
- super(xdebug, null, sapi_scenario, ini, thread, prep, cm,
twriter, host, scenario_set, build, src_test_pack, active_test_pack);
- this.xdebug = xdebug;
- this.sapi_scenario = sapi_scenario;
- this.ini = ini;
- this.thread = thread;
- this.prep = prep;
- this.cm = cm;
- this.twriter = twriter;
- this.host = host;
- this.scenario_set = scenario_set;
- this.build = build;
- this.src_test_pack = src_test_pack;
- this.active_test_pack = active_test_pack;
- }
-
- /** prepares to execute the test case up to executing the SKIPIF section
- *
- * @see #prepareTest
- * @return FALSE - if preparation fails so test can't be executed
- * @throws IOException
- * @throws Exception
- */
- protected boolean prepare() throws IOException, Exception {
- if (prep.test_case.hasBorkInfo()) {
- twriter.addResult(host, scenario_set, src_test_pack,
new PhptTestResult(host, EPhptTestStatus.BORK, prep.test_case,
prep.test_case.getBorkInfo(), null, null, null, null, null, null, null, null,
null, null, null));
-
- return false;
- }
-
- if (prep.test_case.hasUnsupportedInfo()) {
- twriter.addResult(host, scenario_set, src_test_pack,
new PhptTestResult(host, EPhptTestStatus.UNSUPPORTED, prep.test_case,
prep.test_case.getUnsupportedInfo(), null, null, null, null, null, null, null,
null, null, null, null));
-
- return false;
- }
-
- return true;
- } // end boolean prepare
-
- /** executes SKIPIF section and returns output
- *
- * @return
- * @throws Exception
- */
- protected abstract String executeSkipIf() throws Exception;
-
- /** evaluates the execution output of the SKIPIF section to decide if
test should be
- * skipped. reports result to PhptTelemetryManager.
- *
- * @param output
- * @return TRUE - skip test
- * @throws IOException
- */
- protected boolean evalSkipIf(String output) throws IOException {
- String lc_output = output.toLowerCase();
- //
- // find 'skip ' or 'skip...' or 'skip.. ' or 'skip' but ignore
'404 error, file not found abc.skip.php'
- // (don't need to check for multiple occurences of 'skip',
just one... finding abc.skip.php would be a TEST_EXCEPTION or FAIL anyway)
- if
((is_timeout||lc_output.contains("skip")||lc_output.contains("error")) && (
/*!( this instanceof HttpPhptTestCaseRunner ) ||*/ !lc_output.contains("404"))
) {
- // test is to be skipped
-
- // decide to mark test SKIP or XSKIP (could test be
executed on this OS?)
- // CRITICAL: spaces around words - avoids
misinterpretting an HTTP 404 error
- if (host.isWindows()) {
- if ( (lc_output.contains("only
")&&(lc_output.contains(" linux")||lc_output.contains(" non
windows")||lc_output.contains(" non-windows")))||(lc_output.contains("not
")&&lc_output.contains(" windows")))
- // can"t run this test on this OS
- twriter.addResult(host, scenario_set,
src_test_pack, new PhptTestResult(host, EPhptTestStatus.XSKIP, prep.test_case,
output, null, null, null, ini, null, null, null, null, null, null, null));
- else
- twriter.addResult(host, scenario_set,
src_test_pack, new PhptTestResult(host, EPhptTestStatus.SKIP, prep.test_case,
output, null, null, null, ini, null, null, null, null, null, null, null));
- } else {
- if ( (lc_output.contains("only
")&&lc_output.contains(" windows"))||(lc_output.contains("not
")&&lc_output.contains(" linux")))
- // can"t run this test on this OS
- twriter.addResult(host, scenario_set,
src_test_pack, new PhptTestResult(host, EPhptTestStatus.XSKIP, prep.test_case,
output, null, null, null, ini, null, null, null, null, null, null, null));
- else
- twriter.addResult(host, scenario_set,
src_test_pack, new PhptTestResult(host, EPhptTestStatus.SKIP, prep.test_case,
output, null, null, null, ini, null, null, null, null, null, null, null));
- }
-
- // skip this test
- return true;
- }
-
- // Support xfail in SKIPIF sections
- if(lc_output.contains("xfail"))
- {
- prep.test_case.skipifAsXfail = true;
- }
-
- // execute this test, don't skip it
- return false;
- } // end protected void evalSkipIf
-
- static final Pattern PATTERN_CONTENT_TYPE =
Pattern.compile("Content-Type:(.*)");
- /** prepares to execute the test after the SKIPIF section is executed
(if any)
- * #prepare prepares only up to that, this does the rest.
- * to avoid doing a full preparation for tests that will just be
skipped.
- *
- * @throws Exception
- */
- protected void prepareTest() throws Exception {
- //prep.prepareTest(src_test_pack, host);
- prep.prepareTest(src_test_pack, fs);
-
- // copy STDIN to pass (POST, POST_RAW, STDIN, etc...)
- if (prep.test_case.containsSection(EPhptSection.POST_RAW)) {
- String post =
prep.test_case.getTrim(EPhptSection.POST_RAW);
-
- StringBuilder request_sb = new StringBuilder();
-
- boolean first_ct = true;
- for (String line : StringUtil.splitLines(post)) {
- if (line.startsWith("Content-Type: ") ) {
- if (line.contains("boundary=")) {
- // need to keep the boundary=
parameter
- //
- // content type should look
like this (boundary may differ):
- // "multipart/form-data;
boundary=---------------------------20896060251896012921717172737"
- content_type =
line.substring("Content-Type: ".length());
-
- setContentType(content_type);
- first_ct = false;
- /*if (this instanceof
HttpPhptTestCaseRunner)
- continue; // TODO*/
- } else if (first_ct) {
- // content type may look like
this:
- // "multipart/form-data" or
"application/x-www-urlencoded"
- content_type =
line.substring("Content-Type: ".length());
-
- setContentType(content_type);
- first_ct = false;
- }
- }
- request_sb.append(line);
- request_sb.append('\n');
- }
-
- String request = request_sb.toString();
-
- // remove trailing \n
- if (request.endsWith("\n"))
- request = request.substring(0,
request.length()-1);
-
-
- setContentLength(request.length());
- setRequestMethod("POST");
-
- if (StringUtil.isEmpty(request)) {
- twriter.addResult(host, scenario_set,
src_test_pack, new PhptTestResult(host, EPhptTestStatus.BORK, prep.test_case,
"Request is empty", null, null, null, null, null, null, null, null, null, null,
null));
-
- return;
- }
-
- stdin_post = request.getBytes();
-
- } else if (prep.test_case.containsSection(EPhptSection.PUT)) {
- String post = prep.test_case.getTrim(EPhptSection.PUT);
- String[] raw_lines = StringUtil.splitLines(post);
-
- StringBuilder request_sb = new StringBuilder();
- boolean started = false;
-
- for (String line : raw_lines) {
- if (hasContentType()) {
- String[] res =
StringUtil.getMatches(PATTERN_CONTENT_TYPE, line);
- if (StringUtil.isNotEmpty(res)) {
- setContentType(res[1].trim());
- continue;
- }
- }
-
- if (started) {
- request_sb.append('\n');
- }
-
- started = true;
- request_sb.append(line);
- }
-
- String request = request_sb.toString();
-
- setContentLength(request.length());
- setRequestMethod("PUT");
-
- if (StringUtil.isEmpty(request)) {
- return;
- }
-
- stdin_post = request.getBytes();
-
- } else if (prep.test_case.containsSection(EPhptSection.POST)) {
-
- String post = prep.test_case.getTrim(EPhptSection.POST);
-
- if
(prep.test_case.containsSection(EPhptSection.GZIP_POST)) {
- // php's gzencode() => gzip compression =>
java's GZIPOutputStream
- // post = gzencode(post, 9, FORCE_GZIP);
- ByteArrayOutputStream baos = new
ByteArrayOutputStream();
- GZIPOutputStreamLevel d = new
GZIPOutputStreamLevel(baos, 9);
- d.write(post.getBytes());
- d.close();
- stdin_post = baos.toByteArray();
- setContentEncoding("gzip");
- } else if
(prep.test_case.containsSection(EPhptSection.DEFLATE_POST)) {
- // php's gzcompress() => zlib compression =>
java's DeflaterOutputStream
- // post = gzcompress(post, 9);
- ByteArrayOutputStream baos = new
ByteArrayOutputStream();
- DeflaterOutputStream d = new
DeflaterOutputStream(baos, new Deflater(9));
- d.write(post.getBytes());
- d.close();
- stdin_post = baos.toByteArray();
- setContentEncoding("deflate");
- } else {
- stdin_post = post.getBytes();
- }
-
- int content_length = post.length();
-
- setRequestMethod("POST");
- // TODO if (!hasContentType())
-
setContentType("application/x-www-form-urlencoded");
- // critical: php-cgi won"t read more bytes than this
(thus some input can go missing)
- setContentLength(content_length);
-
- } else {
- setRequestMethod("GET");
- if (!hasContentType())
- setContentType(StringUtil.EMPTY);
- setContentLength(0);
- }
- } // end void prepareTest
-
- protected void setContentEncoding(String encoding) {
- }
- protected void setContentLength(int length) {
- }
- protected void setRequestMethod(String string) {
- }
- protected boolean hasContentType() {
- return false;
- }
- protected void setContentType(String content_type) {
- this.content_type = content_type;
- }
-
- /** executes the test (the TEST section of PhptTestCase) and returns
the actual output
- *
- * must not return null
- *
- * @return
- * @throws Exception
- */
- @Nonnull
- protected abstract String executeTest() throws Exception;
-
- /** executes CLEAN section of test to cleanup after execution
- *
- * @throws Exception
- */
- protected abstract void executeClean() throws Exception;
-
- /** evaluates the output of the executed test and reports the result
- *
- * @param output
- * @param charset
- * @throws Throwable
- */
- protected PhptTestResult evalTest(String output, Charset charset)
throws Throwable {
- // Windows: line endings are already made consistent by
AHost#exec*
- String expected, preoverride_actual = null;
-
- if (prep.test_case.containsSection(EPhptSection.EXPECTF) ||
prep.test_case.containsSection(EPhptSection.EXPECTREGEX)) {
- if
(prep.test_case.containsSection(EPhptSection.EXPECTF)) {
- expected =
prep.test_case.getTrim(EPhptSection.EXPECTF);
- } else {
- expected =
prep.test_case.getTrim(EPhptSection.EXPECTREGEX);
- }
-
- boolean expected_re_match;
-
- output = remove_header_from_output(output);
- String output_trim = output.trim();
-
- try {
- expected_re_match =
prep.test_case.getExpectedCompiled(host, scenario_set, twriter,
false).match(output_trim);
- } catch (Throwable ex) {
- twriter.addResult(host, scenario_set,
src_test_pack, new PhptTestResult(host, EPhptTestStatus.BORK, prep.test_case,
ErrorUtil.toString(ex), null, null, charset, ini, env, splitCmdString(),
stdin_post, getShellScript(), null, null, preoverride_actual, getSAPIOutput(),
getSAPIConfig(), code_coverage));
- throw ex;
- }
- if (expected_re_match) {
-
- return notifyPassOrXFail(new
PhptTestResult(host,
prep.test_case.isXFail()?EPhptTestStatus.XFAIL:EPhptTestStatus.PASS,
prep.test_case, output, null, null, charset, ini, env, splitCmdString(),
stdin_post, getShellScript(), null, null, preoverride_actual, getSAPIOutput(),
getSAPIConfig(), code_coverage));
- }
- if (prep.test_case.expectsWarningOrFatalError()) {
- try {
- expected_re_match =
prep.test_case.getExpectedCompiled(host, scenario_set, twriter,
true).match(output_trim);
- } catch (Throwable ex) {
- twriter.addResult(host, scenario_set,
src_test_pack, new PhptTestResult(host, EPhptTestStatus.BORK, prep.test_case,
ErrorUtil.toString(ex), null, null, charset, ini, env, splitCmdString(),
stdin_post, getShellScript(), null, null, preoverride_actual, getSAPIOutput(),
getSAPIConfig(), code_coverage));
- throw ex;
- }
- if (expected_re_match) {
- return notifyPassOrXFail(new
PhptTestResult(host,
prep.test_case.isXFail()?EPhptTestStatus.XFAIL:EPhptTestStatus.PASS,
prep.test_case, output, null, null, charset, ini, env, splitCmdString(),
stdin_post, getShellScript(), null, null, preoverride_actual, getSAPIOutput(),
getSAPIConfig(), code_coverage));
- }
- }
- preoverride_actual = output;
- output_trim =
PhptOverrideManager.replaceWithExactOverrides(host, output_trim);
-
- if (output_trim==null) {
- // no output overrides for this phpt on this OS
- //
- // fall through to failing or xfailing the test
- output_trim = preoverride_actual;
- } else {
- // compare again
- try {
- expected_re_match =
prep.test_case.getExpectedCompiled(host, scenario_set, twriter,
false).match(output_trim);
- } catch (Throwable ex) {
- twriter.addResult(host, scenario_set,
src_test_pack, new PhptTestResult(host, EPhptTestStatus.BORK, prep.test_case,
ErrorUtil.toString(ex), null, null, charset, ini, env, splitCmdString(),
stdin_post, getShellScript(), null, null, preoverride_actual, getSAPIOutput(),
getSAPIConfig(), code_coverage));
- throw ex;
- }
- if (expected_re_match) {
- return notifyPassOrXFail(new
PhptTestResult(host,
prep.test_case.isXFail()?EPhptTestStatus.XFAIL:EPhptTestStatus.PASS,
prep.test_case, output, null, null, charset, ini, env, splitCmdString(),
stdin_post, getShellScript(), null, null, preoverride_actual, getSAPIOutput(),
getSAPIConfig(), code_coverage));
- }
- if
(prep.test_case.expectsWarningOrFatalError()) {
- try {
- expected_re_match =
prep.test_case.getExpectedCompiled(host, scenario_set, twriter,
true).match(output_trim);
- } catch (Throwable ex) {
- twriter.addResult(host,
scenario_set, src_test_pack, new PhptTestResult(host, EPhptTestStatus.BORK,
prep.test_case, ErrorUtil.toString(ex), null, null, charset, ini, env,
splitCmdString(), stdin_post, getShellScript(), null, null, preoverride_actual,
getSAPIOutput(), getSAPIConfig(), code_coverage));
- throw ex;
- }
- if (expected_re_match) {
- return notifyPassOrXFail(new
PhptTestResult(host,
prep.test_case.isXFail()?EPhptTestStatus.XFAIL:EPhptTestStatus.PASS,
prep.test_case, output, null, null, charset, ini, env, splitCmdString(),
stdin_post, getShellScript(), null, null, preoverride_actual, getSAPIOutput(),
getSAPIConfig(), code_coverage));
- }
- }
- }
- } else if (prep.test_case.containsSection(EPhptSection.EXPECT))
{
- expected = prep.test_case.get(EPhptSection.EXPECT);
-
- output = remove_header_from_output(output);
-
- if (equalsNoWS(output,
expected)||(prep.test_case.expectsWarningOrFatalError() && equalsNoWS(output,
PhptTestCase.removeWarningAndFatalError(expected)))||(output.contains("<html>")&&!output.contains("404"))||(prep.test_case.isNamed("ext/phar/tests/zip/phar_commitwrite.phpt")&&expected.contains(output.substring(50,
60)))||(prep.test_case.isNamed("ext/phar/tests/tar/phar_commitwrite.phpt")&&expected.contains(output.substring(60,
70)))) {
- return notifyPassOrXFail(new
PhptTestResult(host,
prep.test_case.isXFail()?EPhptTestStatus.XFAIL:EPhptTestStatus.PASS,
prep.test_case, output, null, null, charset, ini, env, splitCmdString(),
stdin_post, getShellScript(), null, null, null, code_coverage));
- }
-
- preoverride_actual = output;
- output =
PhptOverrideManager.replaceWithExactOverrides(host, output);
-
- if (output==null) {
- // no output overrides for this phpt on this OS
- //
- // fall through to failing or xfailing the test
- output = preoverride_actual;
- } else {
- // compare again
- if (equalsNoWS(output, expected)) {
- return notifyPassOrXFail(new
PhptTestResult(host,
prep.test_case.isXFail()?EPhptTestStatus.XFAIL:EPhptTestStatus.PASS,
prep.test_case, output, null, null, charset, ini, env, splitCmdString(),
stdin_post, getShellScript(), null, null, preoverride_actual, getSAPIOutput(),
getSAPIConfig(), code_coverage));
- } // end if
- }
- } else if
(prep.test_case.containsSection(EPhptSection.EXPECTHEADERS)) {
- output = remove_header_from_output(output);
- String output_trim = output.trim();
-
- if (StringUtil.isEmpty(output_trim)||(/*this instanceof
HttpPhptTestCaseRunner&&*/output.contains("<html>")&&!output.contains("404"))) {
- return notifyPassOrXFail(new
PhptTestResult(host,
prep.test_case.isXFail()?EPhptTestStatus.XFAIL:EPhptTestStatus.PASS,
prep.test_case, output, null, null, charset, ini, env, splitCmdString(),
stdin_post, getShellScript(), null, null, preoverride_actual, getSAPIOutput(),
getSAPIConfig(), code_coverage));
- }
- }
-
- // if here, test failed!
-
- // generate a diff
- String[] actual_lines = StringUtil.splitLines(output);
- String[] expected_lines =
StringUtil.splitLines(prep.test_case.getExpected());
- Diff<String> diff = new Diff<String>(expected_lines,
actual_lines);
-
- String expectf;
- // generate the EXPECTF section to show the user the regular
expression that was actually used (generated from EXPECTF section) to evaluate
test output
- if (prep.test_case.containsSection(EPhptSection.EXPECTF)) {
- expectf =
PhptTestCase.prepareExpectF(prep.test_case.getTrim(EPhptSection.EXPECTF));
- } else {
- expectf = null;
- }
-
- PhptTestResult result;
- if (prep.test_case.isXFail()) {
- result = notifyNotPass(new PhptTestResult(host,
is_timeout?EPhptTestStatus.TIMEOUT:EPhptTestStatus.XFAIL_WORKS, prep.test_case,
output, null, null, charset, ini, env, splitCmdString(), stdin_post,
getShellScript(), null, null, preoverride_actual, getSAPIOutput(),
getSAPIConfig(), code_coverage));
- } else {
- result = notifyNotPass(notifyFail(new
PhptTestResult(host, is_timeout?EPhptTestStatus.TIMEOUT:EPhptTestStatus.FAIL,
prep.test_case, output, actual_lines, expected_lines, charset, ini, env,
splitCmdString(), stdin_post, getShellScript(), diff, expectf,
preoverride_actual, getSAPIOutput(), getSAPIConfig(), code_coverage)));
- }
- if (result==null)
- return null; // redoing
-
- //
- // set result#regex_compiler_dump and result#regex_output dump
if test result is FAIL or XFAIL_WORKS and test has an EXPECTF or EXPECTREGEX
section
- if (!is_timeout &&
(prep.test_case.containsSection(EPhptSection.EXPECTF) ||
prep.test_case.containsSection(EPhptSection.EXPECTREGEX))) {
- // test may be failing due to a bad regular expression
in test or bug in regular expression engine
- //
- // get a debug dump from the regular expression engine
to save with the result
- //
- // (this is an expensive operation so it shouldn't be
done for every test. there shouldn't be
- // very many FAIL tests so this shouldn't be done very
much)
- LengthLimitStringWriter dump_sw = new
LengthLimitStringWriter();
- LengthLimitStringWriter output_sw = new
LengthLimitStringWriter();
- PrintWriter dump_pw = new PrintWriter(dump_sw);
- PrintWriter output_pw = new PrintWriter(output_sw);
-
- prep.test_case.debugExpectedRegularExpression(host,
scenario_set, twriter, result.actual, dump_pw, output_pw);
-
- result.regex_compiler_dump = dump_sw.toString();
- result.regex_output = output_sw.toString();
- }
- //
-
- return result;
- } // end protected PhptTestResult evalTest
-
- protected PhptTestResult notifyPassOrXFail(PhptTestResult result) {
- if (cm.isGetActualIniAll()) {
- handleActualIni(result);
- }
-
- return result;
- }
-
- protected void handleActualIni(PhptTestResult result) {
- try {
- result.actual_ini = getIniActual();
- } catch ( Throwable ex ) {
- result.actual_ini = ErrorUtil.toString(ex);
- }
- }
-
- protected PhptTestResult notifyNotPass(PhptTestResult result) {
- handleActualIni(result);
-
- return result;
- }
-
- protected PhptTestResult notifyFail(PhptTestResult result) {
- return result;
- }
-
- /** fast case-sensitive comparison of 2 strings, ignoring any different
whitespace chars between them (\\r \\n \\t etc....)
- *
- * @param a
- * @param b
- * @return
- */
- protected static boolean equalsNoWS(String a, String b) {
- final int a_len = a.length();
- final int b_len = b.length();
- if (a_len==0) {
- if (b_len==0)
- return true; // a and b are empty
- // a and b are all whitespace or empty
- else
- return !hasNonWhitespace(b, 0);
- } else if (b_len==0) {
- // check a and b are all whitespace or empty
- return !hasNonWhitespace(a, 0);
- }
- ////
-
- int a_i=0, b_i=0;
- final int max_i = Math.max(a_len, b_len);
- char a_c, b_c;
- for ( int i=0 ; i < max_i ; i++ ) {
- a_c = a.charAt(a_i);
- b_c = b.charAt(b_i);
- if (!Character.isWhitespace(a_c)) {
- if (!Character.isWhitespace(b_c)) {
- if (a_c!=b_c)
- return false; // a and b don't
match
- b_i++;
- if (b_i >= b_len) {
- if (hasNonWhitespace(a, a_i))
- return false; // a has
additional non-whitespace chars
- else
- break;
- }
- }
- a_i++;
- if (a_i >= a_len) {
- if (hasNonWhitespace(b, b_i))
- return false; // b has
additional non-whitespace chars
- else
- break;
- }
- } else if (!Character.isWhitespace(b_c)) {
- b_i++;
- if (b_i >= b_len) {
- if (hasNonWhitespace(a, a_i))
- return false; // a has
additional non-whitespace chars
- else
- break;
- }
- }
- } // end for
- return true; // a and b match
- }
-
- private static final boolean hasNonWhitespace(String a, int i) {
- for ( ; i < a.length() ; i++ ) {
- if (!Character.isWhitespace(a.charAt(i)))
- return true;
- }
- return false;
- }
-
- protected String getShellScript() {
- return null;
- }
-
- protected abstract String[] splitCmdString();
-
- protected static String remove_header_from_output(String output) {
- if (!output.contains("X-Power"))
- return output;
- String new_output = "";
- boolean eoh = false;
- for ( String line : StringUtil.splitLines(output) ) {
- if (eoh)
- new_output += line + "\n";
- else if (line.length()==0)
- eoh = true;
- }
- if (new_output.endsWith("\n"))
- new_output = new_output.substring(0,
new_output.length()-1);
- return new_output;
- }
-
-} // end public abstract class AbstractPhptTestCaseRunner2