com pftt2: remove AbtractPhptTestCaseRunner2 and minor change on SKIPIF as XFAIL: src/com/mostc/pftt/runner/AbstractPhptTestCaseRunner.java src/com/mostc/pftt/runner/AbstractPhptTestCaseRunner2.java
[email protected] (Christoph Michael Becker)
| Newsgroups | php.qa |
|---|---|
| Message-ID | <[email protected]> |
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_255bcd1fed82b185e308ff8538ddb6e92c7f31dd.txt
(text/plain, 28.2 KB)
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