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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.