Commit: 36873b54238ccf9aed2246724d8044835ce0c7ba
Author: Matt Ficken <[email protected]> Thu, 14 Feb 2013
00:00:14 -0800
Parents: 0d9f16578763e405db74efdb784e08873f93f07d
Branches: master
Link:
http://git.php.net/?p=pftt2.git;a=commitdiff;h=36873b54238ccf9aed2246724d8044835ce0c7ba
Log:
adding ZendOptimizerPlus scenario
Former-commit-id: 9b3bb24569955394efeb0f797690490a6da981dd
Changed paths:
M conf/app/joomla.groovy
M src/com/mostc/pftt/host/RemotePhptTestPackRunner.java
M src/com/mostc/pftt/main/Config.java
M src/com/mostc/pftt/main/PfttMain.java
M src/com/mostc/pftt/model/app/PhpUnitSourceTestPack.java
M src/com/mostc/pftt/model/app/PhpUnitTemplate.groovy
M src/com/mostc/pftt/model/app/PhpUnitTestCase.java
M src/com/mostc/pftt/results/ITestResultReceiver.java
M src/com/mostc/pftt/results/PhpResultPackWriter.java
M src/com/mostc/pftt/results/PhpUnitResultWriter.java
M src/com/mostc/pftt/results/PhptResultWriter.java
M src/com/mostc/pftt/runner/AbstractLocalTestPackRunner.java
M src/com/mostc/pftt/runner/AbstractPhpUnitTestCaseRunner.java
M src/com/mostc/pftt/runner/CliPhpUnitTestCaseRunner.java
M src/com/mostc/pftt/runner/HttpPhpUnitTestCaseRunner.java
M src/com/mostc/pftt/runner/LocalPhpUnitTestPackRunner.java
M src/com/mostc/pftt/scenario/AbstractSAPIScenario.java
M src/com/mostc/pftt/scenario/AbstractWebServerScenario.java
M src/com/mostc/pftt/scenario/CLIScenario.java
M src/com/mostc/pftt/scenario/ZendOptimizerPlusScenario.java
diff --git a/conf/app/joomla.groovy b/conf/app/joomla.groovy
index 3edbef5..d2a277b 100644
--- a/conf/app/joomla.groovy
+++ b/conf/app/joomla.groovy
@@ -1,5 +1,3 @@
-import com.mostc.pftt.model.app.Symfony;
-
def scenarios() {
// install Joomla CMS
diff --git a/src/com/mostc/pftt/host/RemotePhptTestPackRunner.java
b/src/com/mostc/pftt/host/RemotePhptTestPackRunner.java
index 2d9189d..4f579b8 100644
--- a/src/com/mostc/pftt/host/RemotePhptTestPackRunner.java
+++ b/src/com/mostc/pftt/host/RemotePhptTestPackRunner.java
@@ -62,7 +62,7 @@ public class RemotePhptTestPackRunner extends
AbstractRemoteTestPackRunner<PhptA
PhptSourceTestPack test_pack = new
PhptSourceTestPack("C:\\php-sdk\\php-test-pack-5.5-nts-windows-vc9-x86-re6bde1f");
test_pack.open(cm, host);
- PhpResultPackWriter tmgr = new PhpResultPackWriter(host, cm,
new File(host.getPhpSdkDir()), build, test_pack, scenario_set);
+ PhpResultPackWriter tmgr = new PhpResultPackWriter(host, cm,
new File(host.getPhpSdkDir()), build, scenario_set);
RemotePhptTestPackRunner runner = new
RemotePhptTestPackRunner(tmgr, scenario_set, build, host, host);
if (args.length>0) {
diff --git a/src/com/mostc/pftt/main/Config.java
b/src/com/mostc/pftt/main/Config.java
index b0df86c..f79b10c 100644
--- a/src/com/mostc/pftt/main/Config.java
+++ b/src/com/mostc/pftt/main/Config.java
@@ -25,6 +25,7 @@ import com.mostc.pftt.scenario.ScenarioSet;
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
+import groovy.lang.MetaMethod;
/** Handles loading a configuration (hosts, scenarios, credentials, etc...)
from a groovy script.
*
@@ -140,11 +141,10 @@ public final class Config {
* @return
*/
public PhpUnitSourceTestPack getPhpUnitSourceTestPack(ConsoleManager
cm) {
- //this.get_php_unit_source_test_pack_method
if (get_php_unit_source_test_pack_method==null)
return null;
try {
- return (PhpUnitSourceTestPack)
get_php_unit_source_test_pack_method.invokeMethod(CONFIGURE_FTP_CLIENT_METHOD,
null);
+ return (PhpUnitSourceTestPack)
get_php_unit_source_test_pack_method.invokeMethod(GET_PHP_UNIT_SOURCE_TEST_PACK_METHOD,
null);
} catch ( Exception ex ) {
if (cm==null)
ex.printStackTrace(System.err);
@@ -327,7 +327,7 @@ public final class Config {
}
}
try {
- if (go.getProperty(CONFIGURE_SMTP_METHOD)!=null) {
+ if (hasMethod(go, CONFIGURE_SMTP_METHOD)) {
if (config.configure_smtp_method!=null)
cm.println(EPrintType.OPERATION_FAILED_CONTINUING, "Config",
CONFIGURE_SMTP_METHOD+"("+config.configure_smtp_file+") overriden by :
"+file_name);
config.configure_smtp_method = go;
@@ -344,7 +344,7 @@ public final class Config {
}
}
try {
- if (go.getProperty(CONFIGURE_FTP_CLIENT_METHOD)!=null) {
+ if (hasMethod(go, CONFIGURE_FTP_CLIENT_METHOD)) {
if (config.configure_ftp_client_method!=null)
cm.println(EPrintType.OPERATION_FAILED_CONTINUING, "Config",
CONFIGURE_FTP_CLIENT_METHOD+"("+config.configure_ftp_client_file+") overriden
by : "+file_name);
config.configure_ftp_client_method = go;
@@ -361,7 +361,7 @@ public final class Config {
}
}
try {
- if
(go.getProperty(GET_PHP_UNIT_SOURCE_TEST_PACK_METHOD)!=null) {
+ if (hasMethod(go,
GET_PHP_UNIT_SOURCE_TEST_PACK_METHOD)) {
if
(config.get_php_unit_source_test_pack_method!=null)
cm.println(EPrintType.OPERATION_FAILED_CONTINUING, "Config",
GET_PHP_UNIT_SOURCE_TEST_PACK_METHOD+"("+config.get_php_unit_source_test_pack_file+")
overriden by : "+file_name);
config.get_php_unit_source_test_pack_method =
go;
@@ -379,4 +379,12 @@ public final class Config {
}
} // end protected static void loadObjectToConfig
+ protected static boolean hasMethod(GroovyObject go, String method_name)
{
+ for ( MetaMethod mm : go.getMetaClass().getMethods() ) {
+ if ( mm.getName().equals(method_name) )
+ return true;
+ }
+ return false;
+ }
+
} // end public final class ConfigUtil
diff --git a/src/com/mostc/pftt/main/PfttMain.java
b/src/com/mostc/pftt/main/PfttMain.java
index d732f42..49af013 100644
--- a/src/com/mostc/pftt/main/PfttMain.java
+++ b/src/com/mostc/pftt/main/PfttMain.java
@@ -149,7 +149,7 @@ public class PfttMain {
}
//
- PhpResultPackWriter tmgr = new
PhpResultPackWriter(host, cm, telem_dir(), build, test_pack, scenario_set);
+ PhpResultPackWriter tmgr = new
PhpResultPackWriter(host, cm, telem_dir(), build, scenario_set);
LocalPhptTestPackRunner test_pack_runner = new
LocalPhptTestPackRunner(tmgr.getConsoleManager(), tmgr, scenario_set, build,
storage_host, host);
cm.showGUI(test_pack_runner);
@@ -219,7 +219,7 @@ public class PfttMain {
LinkedList<PhptTestCase> test_cases = new
LinkedList<PhptTestCase>();
- PhpResultPackWriter tmgr = new
PhpResultPackWriter(host, cm, telem_dir(), build, test_pack, scenario_set);
+ PhpResultPackWriter tmgr = new
PhpResultPackWriter(host, cm, telem_dir(), build, scenario_set);
test_pack.cleanup(cm);
cm.println(EPrintType.IN_PROGRESS,
"PhptSourceTestPack", "enumerating test cases from test-pack...");
test_pack.read(test_cases, names,
tmgr.getConsoleManager(), tmgr, build, true); // TODO true?
@@ -646,7 +646,7 @@ public class PfttMain {
// 2. search current dir / assume
filename is absolute path
// 3. search $PFTT_DIR/conf
// 4. search $PFTT_DIR/conf/internal
- // 5. search $PFTT_DIR/conf/apps
+ // 5. search $PFTT_DIR/conf/app
File config_file = new File(part);
if (config_file.exists()) {
if
(!config_files.contains(config_file))
@@ -677,12 +677,12 @@ public class PfttMain {
if (!config_files.contains(config_file))
config_files.add(config_file);
} else {
-
config_file = new File(LocalHost.getLocalPfttDir()+"/conf/apps/"+part);
+
config_file = new File(LocalHost.getLocalPfttDir()+"/conf/app/"+part);
if (config_file.exists()) {
if (!config_files.contains(config_file))
config_files.add(config_file);
} else {
-
config_file = new
File(LocalHost.getLocalPfttDir()+"/conf/apps/"+part+".groovy");
+
config_file = new
File(LocalHost.getLocalPfttDir()+"/conf/app/"+part+".groovy");
if (config_file.exists()) {
if (!config_files.contains(config_file))
config_files.add(config_file);
@@ -782,43 +782,32 @@ public class PfttMain {
LocalConsoleManager cm = new LocalConsoleManager(source_pack,
debug_pack, force, debug, results_only, show_gui, disable_debug_prompt,
dont_cleanup_test_pack, phpt_not_in_place, pftt_debug,
no_result_file_for_pass_xskip_skip, randomize_order, run_test_times_all,
thread_safety, run_test_times_list_times,
run_group_times_all, run_group_times_list_times, debug_list,
run_test_times_list, run_group_times_list, skip_list);
- //
- /*
- SSHHost remote_host = new SSHHost("192.168.1.117",
"administrator", "password01!");
- System.out.println(remote_host.isWindows());
- SMBDeduplicationScenario d = new
SMBDeduplicationScenario(remote_host, "F:");
- //SMBDFSScenario d = new SMBDFSScenario(remote_host);
- SMBStorageDir dir = d.createStorageDir(cm, rt.host);
- System.out.println(dir.getLocalPath(rt.host));
- System.out.println(dir.notifyTestPackInstalled(cm, rt.host));
- */
+ if (config_files.size()>0) {
+ config = Config.loadConfigFromFiles(cm,
(File[])config_files.toArray(new File[config_files.size()]));
+ System.out.println("PFTT: Config: loaded
"+config_files);
+ } else {
+ File default_config_file = new
File(rt.host.getPfttDir()+"/conf/default.groovy");
+ config = Config.loadConfigFromFiles(cm,
default_config_file);
+ System.out.println("PFTT: Config: no config files
loaded... using defaults only ("+default_config_file+")");
+ }
- /*{
- ScenarioSet scenario_set =
ScenarioSet.getDefaultScenarioSets().get(0);
+ // TODO
+ {
+ ScenarioSet scenario_set =
config.getScenarioSets().get(0);
PhpBuild build = new
PhpBuild("c:/php-sdk/php-5.5-ts-windows-vc9-x86-re6bde1f");
build.open(cm, rt.host);
- PhpUnitSourceTestPack test_pack = new
PhpUnitSourceTestPack();
-
- //new Symfony().setup(test_pack);
- new JoomlaPlatform().setup(test_pack);
+ PhpUnitSourceTestPack test_pack =
config.getPhpUnitSourceTestPack(cm);
+ test_pack.open(cm, rt.host); // CRITICAL
- LocalPhpUnitTestPackRunner r = new
LocalPhpUnitTestPackRunner(cm, null, scenario_set, build, rt.host);
+ PhpResultPackWriter tmgr = new
PhpResultPackWriter(rt.host, cm, new File(rt.host.getPhpSdkDir()), build,
scenario_set);
+ LocalPhpUnitTestPackRunner r = new
LocalPhpUnitTestPackRunner(cm, tmgr, scenario_set, build, rt.host, rt.host);
r.runAllTests(test_pack);
+
+ tmgr.close();
} //
System.exit(0);
- */
- //
-
- if (config_files.size()>0) {
- config = Config.loadConfigFromFiles(cm,
(File[])config_files.toArray(new File[config_files.size()]));
- System.out.println("PFTT: Config: loaded
"+config_files);
- } else {
- File default_config_file = new
File(rt.host.getPfttDir()+"/conf/default.groovy");
- config = Config.loadConfigFromFiles(cm,
default_config_file);
- System.out.println("PFTT: Config: no config files
loaded... using defaults only ("+default_config_file+")");
- }
//
// help user find/install WinDebug properly
diff --git a/src/com/mostc/pftt/model/app/PhpUnitSourceTestPack.java
b/src/com/mostc/pftt/model/app/PhpUnitSourceTestPack.java
index d20c1b6..c433246 100644
--- a/src/com/mostc/pftt/model/app/PhpUnitSourceTestPack.java
+++ b/src/com/mostc/pftt/model/app/PhpUnitSourceTestPack.java
@@ -197,7 +197,7 @@ public abstract class PhpUnitSourceTestPack implements
SourceTestPack<PhpUnitAct
} else if (file.getName().endsWith("Test.php")) {
String file_name =
Host.pathFrom(php_unit_dist.path.getAbsolutePath(), file.getAbsolutePath());
- String test_name =
PhpUnitTestCase.normalizeName(file_name);
+ String test_name =
PhpUnitTestCase.normalizeFileName(file_name);
if (blacklist_test_names.contains(test_name))
continue;
diff --git a/src/com/mostc/pftt/model/app/PhpUnitTemplate.groovy
b/src/com/mostc/pftt/model/app/PhpUnitTemplate.groovy
index b61da62..c2abe37 100644
--- a/src/com/mostc/pftt/model/app/PhpUnitTemplate.groovy
+++ b/src/com/mostc/pftt/model/app/PhpUnitTemplate.groovy
@@ -30,11 +30,11 @@ public class PhpUnitTemplate {
* @param env - environment variables
* @return
*/
- public static String renderTemplate(AHost host, PhpUnitTestCase
test_case, String preamble_code, String bootstrap_file, String cwd, String
include_path, String[] included_files, Map<String, String> globals, Map<String,
String> constants, HashMap<String, String> env) {
- return renderTemplate(host, test_case, preamble_code,
bootstrap_file, cwd, include_path, included_files, globals, constants, env,
false);
+ public static String renderTemplate(AHost host, PhpUnitTestCase
test_case, String preamble_code, String bootstrap_file, String cwd, String
include_path, String[] included_files, Map<String, String> globals, Map<String,
String> constants, HashMap<String, String> env, String my_temp_dir) {
+ return renderTemplate(host, test_case, preamble_code,
bootstrap_file, cwd, include_path, included_files, globals, constants, env,
my_temp_dir, false);
}
- public static String renderTemplate(AHost host, PhpUnitTestCase
test_case, String preamble_code, String bootstrap_file, String cwd, String
include_path, String[] included_files, Map<String, String> globals, Map<String,
String> constants, HashMap<String, String> env, boolean strict) {
+ public static String renderTemplate(AHost host, PhpUnitTestCase
test_case, String preamble_code, String bootstrap_file, String cwd, String
include_path, String[] included_files, Map<String, String> globals, Map<String,
String> constants, HashMap<String, String> env, String my_temp_dir, boolean
strict) {
// XXX will need to get these values from PHP code
// data source: PhpUnit_Framework_TestCase constructor (default
value)
String data = "a:0:{}";
@@ -46,15 +46,25 @@ public class PhpUnitTemplate {
StringWriter sw = new StringWriter(16384);
PrintWriter pw = new PrintWriter(sw);
+ my_temp_dir = StringUtil.cslashes(host.fixPath(my_temp_dir));
+
// PFTT mod: need to set date.timezone=UTC... for some reason,
// ini file doesn't work, date_default_timezone_set()
and ini_set() must both
// be used to suppress related errors symfony phpunit
tests
+ //
+ // also set ENV vars in PHP for the temproary dir...
for CLI or Apache, sometimes setting the
+ // temporary dir ENV vars passed to AHost#exec
doesn't always work
+ // @see PHP sys_get_temp_dir() - many Symfony
filesystem tests use this
pw.print(
"""<?php
set_include_path('$include_path');
date_default_timezone_set('UTC');
ini_set('date.timezone', 'UTC');
require 'PHPUnit/Autoload.php';
+putenv('TMP=$my_temp_dir');
+putenv('TEMP=$my_temp_dir');
+putenv('TMPDIR=$my_temp_dir');
+
""")
if (StringUtil.isNotEmpty(bootstrap_file)) {
pw.print("""require_once '$bootstrap_file';
diff --git a/src/com/mostc/pftt/model/app/PhpUnitTestCase.java
b/src/com/mostc/pftt/model/app/PhpUnitTestCase.java
index eaf57e8..0419102 100644
--- a/src/com/mostc/pftt/model/app/PhpUnitTestCase.java
+++ b/src/com/mostc/pftt/model/app/PhpUnitTestCase.java
@@ -21,7 +21,11 @@ public class PhpUnitTestCase extends TestCase {
protected PhpUnitTestCase(PhpUnitDist php_unit_dist, String filename,
String className, String methodName) {
this.php_unit_dist = php_unit_dist;
+ // don't need to call #normalizeFilename here usually. it's
called in PhpUnitSourcetestPack#readDir...
+ // calling it (again )here would be a performance hit
this.filename = filename;
+ // don't need to normalize classname:
+ // if it has \ thats ok b/c its legal PHP (namespaces) whereas
it won't be / b/c that's illegal in PHP
this.className = className;
this.methodName = methodName;
}
@@ -36,7 +40,7 @@ public class PhpUnitTestCase extends TestCase {
return getName();
}
- public static String normalizeName(String test_name) {
+ public static String normalizeFileName(String test_name) {
return Host.toUnixPath(test_name).toLowerCase();
}
diff --git a/src/com/mostc/pftt/results/ITestResultReceiver.java
b/src/com/mostc/pftt/results/ITestResultReceiver.java
index 4319fb8..58637c7 100644
--- a/src/com/mostc/pftt/results/ITestResultReceiver.java
+++ b/src/com/mostc/pftt/results/ITestResultReceiver.java
@@ -6,11 +6,9 @@ import com.mostc.pftt.scenario.ScenarioSet;
public interface ITestResultReceiver {
public void addResult(AHost this_host, ScenarioSet this_scenario_set,
PhptTestResult result);
+ public void addResult(AHost host, ScenarioSet scenario_set,
PhpUnitTestResult result);
public void addTestException(AHost this_host, ScenarioSet
this_scenario_set, TestCase test_file, Throwable ex, Object a);
public void addTestException(AHost this_host, ScenarioSet
this_scenario_set, TestCase test_case, Throwable ex, Object a, Object b);
- public void setTotalCount(int size);
-
- public void addResult(AHost host, ScenarioSet scenario_set,
- PhpUnitTestResult phpUnitTestResult);
+ public void setTotalCount(int size);
}
diff --git a/src/com/mostc/pftt/results/PhpResultPackWriter.java
b/src/com/mostc/pftt/results/PhpResultPackWriter.java
index 0630370..2f1a671 100644
--- a/src/com/mostc/pftt/results/PhpResultPackWriter.java
+++ b/src/com/mostc/pftt/results/PhpResultPackWriter.java
@@ -17,7 +17,6 @@ import com.mostc.pftt.model.core.ECPUArch;
import com.mostc.pftt.model.core.ECompiler;
import com.mostc.pftt.model.core.EPhptTestStatus;
import com.mostc.pftt.model.core.PhpBuild;
-import com.mostc.pftt.model.core.PhptSourceTestPack;
import com.mostc.pftt.model.core.PhptTestCase;
import com.mostc.pftt.scenario.ScenarioSet;
import com.mostc.pftt.util.ErrorUtil;
@@ -41,7 +40,6 @@ public class PhpResultPackWriter extends PhpResultPack
implements ITestResultRec
protected PrintWriter global_exception_writer;
protected LocalConsoleManager cm;
protected PhpBuild build;
- protected PhptSourceTestPack test_pack;
protected LinkedBlockingQueue<ResultQueueEntry> results;
protected boolean run = true;
@@ -77,7 +75,7 @@ public class PhpResultPackWriter extends PhpResultPack
implements ITestResultRec
return new File(base.getAbsolutePath() + sb);
}
- public PhpResultPackWriter(LocalHost local_host, LocalConsoleManager
cm, File telem_base_dir, PhpBuild build, PhptSourceTestPack test_pack,
ScenarioSet scenario_set) throws Exception {
+ public PhpResultPackWriter(LocalHost local_host, LocalConsoleManager
cm, File telem_base_dir, PhpBuild build, ScenarioSet scenario_set) throws
Exception {
super(local_host);
phpt_writer_map = new
HashMap<AHost,HashMap<ScenarioSet,PhptResultWriter>>(16);
@@ -93,7 +91,6 @@ public class PhpResultPackWriter extends PhpResultPack
implements ITestResultRec
this.local_host = local_host;
this.cm = cm;
this.build = build;
- this.test_pack = test_pack;
this.telem_dir = new File(host.uniqueNameFromBase(makeName(cm,
host, telem_base_dir, build, scenario_set).getAbsolutePath()));
this.telem_dir.mkdirs();
@@ -160,6 +157,7 @@ public class PhpResultPackWriter extends PhpResultPack
implements ITestResultRec
w.handleResult(cm, this_host, this_scenario_set,
this_result);
// show on console
+ // TODO
System.out.println(this_result.status+"
"+this_result.test_case);
if (cm!=null) {
@@ -196,6 +194,10 @@ public class PhpResultPackWriter extends PhpResultPack
implements ITestResultRec
}
w.writeResult(this_result);
+
+ // show on console
+ // TODO
+ System.out.println(this_result.status+"
"+this_result.test_case);
}
} // end protected class PhpUnitResultQueueEntry
diff --git a/src/com/mostc/pftt/results/PhpUnitResultWriter.java
b/src/com/mostc/pftt/results/PhpUnitResultWriter.java
index 619a909..e3736ba 100644
--- a/src/com/mostc/pftt/results/PhpUnitResultWriter.java
+++ b/src/com/mostc/pftt/results/PhpUnitResultWriter.java
@@ -4,13 +4,19 @@ import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
+import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
import javax.annotation.concurrent.NotThreadSafe;
import org.kxml2.io.KXmlSerializer;
+import com.mostc.pftt.model.app.EPhpUnitTestStatus;
import com.mostc.pftt.util.PFTTVersionUtil;
/** Writes PhpUnitTestResults from a single test run with a single scenario
set on a single host with a single build.
@@ -31,12 +37,15 @@ import com.mostc.pftt.util.PFTTVersionUtil;
@NotThreadSafe
public class PhpUnitResultWriter {
protected final KXmlSerializer serial;
+ protected final File dir;
protected final OutputStream out;
+ protected final HashMap<EPhpUnitTestStatus,StatusListEntry>
status_list_map;
private boolean is_first_result = true;
private String last_test_suite_name;
private int test_count, percent_total, pass, failure, error, warning,
notice, skip, deprecated, not_implemented, unsupported, test_exception, crash,
bork, xskip;
public PhpUnitResultWriter(File dir) throws FileNotFoundException,
IOException {
+ this.dir = dir;
dir.mkdirs();
// TODO include hosts or scenario-set in file name because that
will make it easier to view a bunch of them in Notepad++ or other MDIs
@@ -49,15 +58,61 @@ public class PhpUnitResultWriter {
// setup serializer to indent XML (pretty print) so its easy
for people to read
serial.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output",
true);
+
+ status_list_map = new
HashMap<EPhpUnitTestStatus,StatusListEntry>();
+ for ( EPhpUnitTestStatus status : EPhpUnitTestStatus.values() )
{
+ status_list_map.put(status, new
StatusListEntry(status));
+ }
}
+
+ protected class StatusListEntry {
+ protected final EPhpUnitTestStatus status;
+ protected final File journal_file;
+ protected final PrintWriter journal_writer;
+ protected final LinkedList<String> test_names;
+
+ public StatusListEntry(EPhpUnitTestStatus status) throws
IOException {
+ this.status = status;
+
+ journal_file = new File(dir+"/"+status+".journal.txt");
+ journal_writer = new PrintWriter(new
FileWriter(journal_file));
+ test_names = new LinkedList<String>();
+ }
+
+ public void write(PhpUnitTestResult result) {
+ final String test_name = result.test_case.getName();
+
+ journal_writer.println(test_name);
+
+ test_names.add(test_name);
+ }
+ public void close() throws IOException {
+ journal_writer.close();
+
+ // sort alphabetically
+ Collections.sort(test_names);
+
+ PrintWriter pw = new PrintWriter(new FileWriter(new
File(dir+"/"+status+".txt")));
+ for ( String test_name : test_names )
+ pw.println(test_name);
+ pw.close();
+
+ // if here, collecting the results and writing them in
sorted-order has worked ...
+ // don't need journal anymore (pftt didn't crash,
fail, etc...)
+ journal_file.delete();
+ }
+ } // end protected class StatusListEntry
// @see PHPUnit/Util/Log/JUnit.php#startTestSuite
public void writeResult(PhpUnitTestResult result) throws
IllegalArgumentException, IllegalStateException, IOException {
+ status_list_map.get(result.status).write(result);
+
+
// write file header
String test_suite_name = null; // TODO
result.test_case.php_unit_dist.getName();
if (is_first_result) {
serial.startDocument("utf-8", null);
- serial.setPrefix("pftt",
PFTTVersionUtil.PFTT_PROJECT_URL);
+ serial.setPrefix("pftt", "pftt");
serial.startTag(null, "testsuites");
if (test_suite_name==null)
writeTestSuiteStart(test_suite_name);
@@ -124,7 +179,7 @@ public class PhpUnitResultWriter {
private void writeTestSuiteStart(String test_suite_name) throws
IllegalArgumentException, IllegalStateException, IOException {
serial.startTag(null, "testsuite");
- serial.attribute(null, "name", test_suite_name);
+ // TODO serial.attribute(null, "name", test_suite_name);
}
private void writeTestSuiteEnd() throws IllegalArgumentException,
IllegalStateException, IOException {
@@ -139,6 +194,10 @@ public class PhpUnitResultWriter {
serial.flush();
out.close();
+
+ // do this after finishing phpunit.xml since that's more
important than alphabetizing text file lists
+ for ( StatusListEntry e : status_list_map.values() )
+ e.close();
}
private void writeTally() throws IllegalArgumentException,
IllegalStateException, IOException {
@@ -147,13 +206,13 @@ public class PhpUnitResultWriter {
serial.attribute(null, "test_count",
Integer.toString(test_count));
serial.attribute(null, "percent_total",
Integer.toString(percent_total));
serial.attribute(null, "pass", Integer.toString(pass));
- serial.attribute(null, "pass_percent",
Float.toString(pass/percent_total));
+ serial.attribute(null, "pass_percent", Float.toString( 100.0f *
(((float)pass)/((float)percent_total))));
serial.attribute(null, "failure", Integer.toString(failure));
- serial.attribute(null, "failure_percent",
Float.toString(failure/percent_total));
+ serial.attribute(null, "failure_percent", Float.toString(
100.0f * (((float)failure)/((float)percent_total))));
serial.attribute(null, "error", Integer.toString(error));
- serial.attribute(null, "error_percent",
Float.toString(error/percent_total));
+ serial.attribute(null, "error_percent", Float.toString( 100.0f
* (((float)error)/((float)percent_total))));
serial.attribute(null, "crash", Integer.toString(crash));
- serial.attribute(null, "crash_percent",
Float.toString(crash/percent_total));
+ serial.attribute(null, "crash_percent", Float.toString( 100.0f
* (((float)crash)/((float)percent_total))));
serial.attribute(null, "skip", Integer.toString(skip));
serial.attribute(null, "xskip", Integer.toString(xskip));
serial.attribute(null, "warning", Integer.toString(warning));
diff --git a/src/com/mostc/pftt/results/PhptResultWriter.java
b/src/com/mostc/pftt/results/PhptResultWriter.java
index 539a4c8..2ee6828 100644
--- a/src/com/mostc/pftt/results/PhptResultWriter.java
+++ b/src/com/mostc/pftt/results/PhptResultWriter.java
@@ -7,7 +7,9 @@ import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
+import java.util.Collections;
import java.util.HashMap;
+import java.util.LinkedList;
import org.kxml2.io.KXmlSerializer;
@@ -19,24 +21,52 @@ import com.mostc.pftt.results.ConsoleManager.EPrintType;
import com.mostc.pftt.scenario.ScenarioSet;
public class PhptResultWriter {
- final File dir;
- final HashMap<EPhptTestStatus,PrintWriter> status_list_map;
- final KXmlSerializer serial;
+ protected final File dir;
+ protected final HashMap<EPhptTestStatus,StatusListEntry>
status_list_map;
+ protected final KXmlSerializer serial;
- PhptResultWriter(File dir) throws IOException {
+ public PhptResultWriter(File dir) throws IOException {
this.dir = dir;
dir.mkdirs();
- status_list_map = new HashMap<EPhptTestStatus,PrintWriter>();
+ status_list_map = new
HashMap<EPhptTestStatus,StatusListEntry>();
serial = new KXmlSerializer();
// setup serializer to indent XML (pretty print) so its easy
for people to read
serial.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output",
true);
- for(EPhptTestStatus status:EPhptTestStatus.values()) {
- File file = new File(dir+"/"+status+".txt");
- PrintWriter pw = new PrintWriter(new FileWriter(file));
+ for(EPhptTestStatus status:EPhptTestStatus.values())
+ status_list_map.put(status, new
StatusListEntry(status));
+ }
+
+ protected class StatusListEntry {
+ protected final EPhptTestStatus status;
+ protected final File journal_file;
+ protected final PrintWriter journal_writer;
+ protected final LinkedList<String> test_names;
+
+ public StatusListEntry(EPhptTestStatus status) throws
IOException {
+ this.status = status;
+
+ journal_file = new File(dir+"/"+status+".journal.txt");
+ journal_writer = new PrintWriter(new
FileWriter(journal_file));
+ test_names = new LinkedList<String>();
+ }
+
+ public void write(PhptTestResult result) {
+ final String test_name = result.test_case.getName();
+
+ journal_writer.println(test_name);
+
+ test_names.add(test_name);
+ }
+ public void close() throws IOException {
+ journal_writer.close();
+
+ // sort alphabetically
+ Collections.sort(test_names);
+ PrintWriter pw = new PrintWriter(new FileWriter(new
File(dir+"/"+status+".txt")));
switch(status) {
case XSKIP:
case UNSUPPORTED:
@@ -49,16 +79,17 @@ public class PhptResultWriter {
default:
break;
} // end switch
+ for ( String test_name : test_names )
+ pw.println(test_name);
+ pw.close();
- status_list_map.put(status, pw);
+ // if here, collecting the results and writing them in
sorted-order has worked ...
+ // don't need journal anymore (pftt didn't crash,
fail, etc...)
+ journal_file.delete();
}
- }
+ } // end protected class StatusListEntry
- public void close() {
- for ( PrintWriter pw : status_list_map.values() ) {
- pw.close();
- }
-
+ public void close() throws IOException {
// write tally file with
try {
/*PhptTallyFile tally = new PhptTallyFile();
@@ -85,16 +116,13 @@ public class PhptResultWriter {
} catch ( Exception ex ) {
ex.printStackTrace();
}
+
+ for ( StatusListEntry e : status_list_map.values() )
+ e.close();
} // end public void close
protected void handleResult(ConsoleManager cm, AHost host, ScenarioSet
scenario_set, PhptTestResult result) {
-
- try {
- PrintWriter pw = status_list_map.get(result.status);
- pw.println(result.test_case.getName());
- } catch (Exception ex) {
- ex.printStackTrace();
- }
+ status_list_map.get(result.status).write(result);
final String test_case_base_name =
result.test_case.getBaseName();
diff --git a/src/com/mostc/pftt/runner/AbstractLocalTestPackRunner.java
b/src/com/mostc/pftt/runner/AbstractLocalTestPackRunner.java
index a87f260..42410ac 100644
--- a/src/com/mostc/pftt/runner/AbstractLocalTestPackRunner.java
+++ b/src/com/mostc/pftt/runner/AbstractLocalTestPackRunner.java
@@ -191,7 +191,9 @@ public abstract class AbstractLocalTestPackRunner<A extends
ActiveTestPack, S ex
System.out.println((run_time/1000)+" seconds"); // TODO
console manager
// if not -dont-cleanup-test-pack and if successful,
delete test-pack (otherwise leave it behind for user to analyze the internal
exception(s))
- if (!cm.isDontCleanupTestPack() &&
+ if (!cm.isDontCleanupTestPack() &&
+ this.active_test_pack != null && //
TODO phpunit?
+
this.active_test_pack.getStorageDirectory() != null && // TODO does phpunit
need this?
!this.active_test_pack.getStorageDirectory().equals(
src_test_pack.getSourceDirectory())) {
cm.println(EPrintType.IN_PROGRESS, getClass(),
"deleting/cleaning-up active test-pack: "+this.active_test_pack);
@@ -497,7 +499,10 @@ public abstract class AbstractLocalTestPackRunner<A
extends ActiveTestPack, S ex
sa =
((SharedSAPIInstanceTestCaseGroupKey)group_key).getSAPIInstance();
if
(sa==null||sa.isCrashed()||(debugger_attached &&
!((WebServerInstance)sa).isDebuggerAttached())) {
//((SharedSAPIInstanceTestCaseGroupKey)group_key).setSAPIInstance(
- sa =
((AbstractWebServerScenario)sapi_scenario).smgr.getWebServerInstance(cm,
runner_host, build, group_key.getPhpIni(), group_key.getEnv(),
active_test_pack.getStorageDirectory(), (WebServerInstance) sa,
debugger_attached, completed_tests);
+ sa =
((AbstractWebServerScenario)sapi_scenario).smgr.getWebServerInstance(cm,
runner_host, build, group_key.getPhpIni(), group_key.getEnv(),
+
active_test_pack==null?null: // TODO phpunit
+
+
active_test_pack.getStorageDirectory(), (WebServerInstance) sa,
debugger_attached, completed_tests);
//);
// TODO don't
store sa on group_key! (don't share sa between threads)
diff --git a/src/com/mostc/pftt/runner/AbstractPhpUnitTestCaseRunner.java
b/src/com/mostc/pftt/runner/AbstractPhpUnitTestCaseRunner.java
index 2e37efd..3966671 100644
--- a/src/com/mostc/pftt/runner/AbstractPhpUnitTestCaseRunner.java
+++ b/src/com/mostc/pftt/runner/AbstractPhpUnitTestCaseRunner.java
@@ -14,6 +14,8 @@ import com.mostc.pftt.model.app.PhpUnitTemplate;
import com.mostc.pftt.model.app.PhpUnitTestCase;
import com.mostc.pftt.model.core.PhpBuild;
import com.mostc.pftt.results.ConsoleManager;
+import com.mostc.pftt.results.ITestResultReceiver;
+import com.mostc.pftt.results.PhpUnitTestResult;
import com.mostc.pftt.scenario.ScenarioSet;
/** runs a single PhpUnitTestCase
@@ -22,11 +24,22 @@ import com.mostc.pftt.scenario.ScenarioSet;
*
*/
+// having PFTT directly run PhpUnit test cases itself, instead of just
wrapping `phpunit` allows for:
+// -faster execution (threads)
+// -Web Server support ('cut closer to actual server')
+// -more accurate results
+// -usually only a slight or no difference
+// -but if you care about accurate, quality or thorough testing
+// -or if care about how well your software actually works
+// -counting additional statuses (ex: xskip)
+// -accurate crash detection
+//
public abstract class AbstractPhpUnitTestCaseRunner extends
AbstractTestCaseRunner {
public static final String DB_DSN = "DB_DSN";
public static final String DB_USER = "DB_USER";
public static final String DB_PASSWD = "DB_PASSWD";
public static final String DB_DBNAME = "DB_DBNAME";
+ protected final ITestResultReceiver tmgr;
protected final Map<String, String> globals;
protected final Map<String, String> env;
protected final Map<String,String> constants;
@@ -40,7 +53,8 @@ public abstract class AbstractPhpUnitTestCaseRunner extends
AbstractTestCaseRunn
protected final String my_temp_dir;
protected boolean is_crashed;
- public AbstractPhpUnitTestCaseRunner(Map<String, String> globals,
Map<String, String> env, ConsoleManager cm, AHost host, ScenarioSet
scenario_set, PhpBuild build, PhpUnitTestCase test_case, String my_temp_dir,
Map<String,String> constants, String include_path, String[] include_files) {
+ public AbstractPhpUnitTestCaseRunner(ITestResultReceiver tmgr,
Map<String, String> globals, Map<String, String> env, ConsoleManager cm, AHost
host, ScenarioSet scenario_set, PhpBuild build, PhpUnitTestCase test_case,
String my_temp_dir, Map<String,String> constants, String include_path, String[]
include_files) {
+ this.tmgr = tmgr;
this.globals = globals;
this.env = env;
this.cm = cm;
@@ -66,9 +80,13 @@ public abstract class AbstractPhpUnitTestCaseRunner extends
AbstractTestCaseRunn
// BN: some phpunit tests (symfony) seem to not cleanup files
or directories they create, sometimes
// have a temporary directory used to run each test and
forcibly clean it between each test run to avoid this problem
- // set both TMP and TEMP!!!!
+ // set both TMP and TEMP and TMPDIR!!!!
env.put("TEMP", my_temp_dir);
env.put("TMP", my_temp_dir);
+ env.put("TMPDIR", my_temp_dir);
+ // these ENV vars are also set again in PHP code @see
phpUnitTemplate to make sure that they're used
+ // @see PHP sys_get_temp_dir() - many Symfony filesystem tests
use this
+
//////// prepared, generate PHP code
@@ -83,7 +101,8 @@ public abstract class AbstractPhpUnitTestCaseRunner extends
AbstractTestCaseRunn
include_files,
globals,
constants,
- env
+ env,
+ my_temp_dir
);
}
@@ -110,11 +129,11 @@ public abstract class AbstractPhpUnitTestCaseRunner
extends AbstractTestCaseRunn
if (PAT_CLASS_NOT_FOUND.matcher(output).find()) {
status = EPhpUnitTestStatus.UNSUPPORTED;
- System.out.println(status+" "+test_case);
+ tmgr.addResult(host, scenario_set, new
PhpUnitTestResult(test_case, status, scenario_set, host, output));
} else if (PAT_FATAL_ERROR.matcher(output).find()) {
status = EPhpUnitTestStatus.ERROR;
- System.out.println(status+" "+test_case);
+ tmgr.addResult(host, scenario_set, new
PhpUnitTestResult(test_case, status, scenario_set, host, output));
} else {
// CRASH may really be a syntax error (BORK),
check to make sure
final ExecOutput syntax_eo =
host.execOut(build.getPhpExe()+" -l "+template_file, Host.ONE_MINUTE,
test_case.php_unit_dist.path.getAbsolutePath());
@@ -122,13 +141,11 @@ public abstract class AbstractPhpUnitTestCaseRunner
extends AbstractTestCaseRunn
// its a syntax error - BORK, as test
case can't run
status = EPhpUnitTestStatus.BORK;
- //tmgr.addResult(host, scenario_set,
new PhpUnitTestResult(test_case, status, scenario_set, host, syntax_eo.output));
- System.out.println(status+"
"+test_case);
+ tmgr.addResult(host, scenario_set, new
PhpUnitTestResult(test_case, status, scenario_set, host, syntax_eo.output));
} else {
status = EPhpUnitTestStatus.CRASH;
- //tmgr.addResult(host, scenario_set,
new PhpUnitTestResult(test_case, status, scenario_set, host, eo.output));
- System.out.println(status+"
"+test_case);
+ tmgr.addResult(host, scenario_set, new
PhpUnitTestResult(test_case, status, scenario_set, host, output));
}
}
} else {
@@ -166,11 +183,9 @@ public abstract class AbstractPhpUnitTestCaseRunner
extends AbstractTestCaseRunn
if (status.isNotPass()) {
final String output_str =
StringUtil.join(lines, 1, "\n");
- //tmgr.addResult(host, scenario_set, new
PhpUnitTestResult(test_case, status, scenario_set, host, output_str));
- System.out.println(status+" "+test_case);
+ tmgr.addResult(host, scenario_set, new
PhpUnitTestResult(test_case, status, scenario_set, host, output_str));
} else {
- //tmgr.addResult(host, scenario_set, new
PhpUnitTestResult(test_case, status, scenario_set, host, null));
- System.out.println(status+" "+test_case);
+ tmgr.addResult(host, scenario_set, new
PhpUnitTestResult(test_case, status, scenario_set, host, null));
}
}
diff --git a/src/com/mostc/pftt/runner/CliPhpUnitTestCaseRunner.java
b/src/com/mostc/pftt/runner/CliPhpUnitTestCaseRunner.java
index 8b6f2c6..b92d29c 100644
--- a/src/com/mostc/pftt/runner/CliPhpUnitTestCaseRunner.java
+++ b/src/com/mostc/pftt/runner/CliPhpUnitTestCaseRunner.java
@@ -9,13 +9,14 @@ import com.mostc.pftt.host.Host;
import com.mostc.pftt.model.app.PhpUnitTestCase;
import com.mostc.pftt.model.core.PhpBuild;
import com.mostc.pftt.results.ConsoleManager;
+import com.mostc.pftt.results.ITestResultReceiver;
import com.mostc.pftt.scenario.ScenarioSet;
public class CliPhpUnitTestCaseRunner extends AbstractPhpUnitTestCaseRunner {
protected ExecOutput eo;
- public CliPhpUnitTestCaseRunner(Map<String, String> globals,
Map<String, String> env, ConsoleManager cm, AHost host, ScenarioSet
scenario_set, PhpBuild build, PhpUnitTestCase test_case, String my_temp_dir,
Map<String, String> constants, String include_path, String[] include_files) {
- super(globals, env, cm, host, scenario_set, build, test_case,
my_temp_dir, constants, include_path, include_files);
+ public CliPhpUnitTestCaseRunner(ITestResultReceiver tmgr, Map<String,
String> globals, Map<String, String> env, ConsoleManager cm, AHost host,
ScenarioSet scenario_set, PhpBuild build, PhpUnitTestCase test_case, String
my_temp_dir, Map<String, String> constants, String include_path, String[]
include_files) {
+ super(tmgr, globals, env, cm, host, scenario_set, build,
test_case, my_temp_dir, constants, include_path, include_files);
}
@Override
diff --git a/src/com/mostc/pftt/runner/HttpPhpUnitTestCaseRunner.java
b/src/com/mostc/pftt/runner/HttpPhpUnitTestCaseRunner.java
index 2a1c897..6e1c0e8 100644
--- a/src/com/mostc/pftt/runner/HttpPhpUnitTestCaseRunner.java
+++ b/src/com/mostc/pftt/runner/HttpPhpUnitTestCaseRunner.java
@@ -25,6 +25,7 @@ import com.mostc.pftt.model.sapi.WebServerInstance;
import com.mostc.pftt.model.sapi.WebServerManager;
import com.mostc.pftt.model.smoke.RequiredExtensionsSmokeTest;
import com.mostc.pftt.results.ConsoleManager;
+import com.mostc.pftt.results.ITestResultReceiver;
import com.mostc.pftt.scenario.ScenarioSet;
import com.mostc.pftt.util.ErrorUtil;
@@ -40,11 +41,11 @@ public class HttpPhpUnitTestCaseRunner extends
AbstractPhpUnitTestCaseRunner {
protected final HttpRequestExecutor httpexecutor;
protected final PhpIni ini;
- public HttpPhpUnitTestCaseRunner(
+ public HttpPhpUnitTestCaseRunner(ITestResultReceiver tmgr,
HttpParams params, HttpProcessor httpproc,
HttpRequestExecutor httpexecutor, WebServerManager smgr, WebServerInstance web,
Map<String, String> globals, Map<String, String> env,
ConsoleManager cm, AHost host, ScenarioSet scenario_set, PhpBuild build,
PhpUnitTestCase test_case, String my_temp_dir,
Map<String, String> constants, String include_path, String[] include_files) {
- super(globals, env, cm, host, scenario_set, build, test_case,
my_temp_dir, constants, include_path, include_files);
+ super(tmgr, globals, env, cm, host, scenario_set, build,
test_case, my_temp_dir, constants, include_path, include_files);
this.params = params;
this.httpproc = httpproc;
this.httpexecutor = httpexecutor;
diff --git a/src/com/mostc/pftt/runner/LocalPhpUnitTestPackRunner.java
b/src/com/mostc/pftt/runner/LocalPhpUnitTestPackRunner.java
index 1fb82ec..c8d59b2 100644
--- a/src/com/mostc/pftt/runner/LocalPhpUnitTestPackRunner.java
+++ b/src/com/mostc/pftt/runner/LocalPhpUnitTestPackRunner.java
@@ -25,6 +25,7 @@ import com.mostc.pftt.model.app.PhpUnitSourceTestPack;
import com.mostc.pftt.model.app.PhpUnitTestCase;
import com.mostc.pftt.model.core.PhpBuild;
import com.mostc.pftt.model.sapi.ApacheManager;
+import com.mostc.pftt.model.sapi.SharedSAPIInstanceTestCaseGroupKey;
import com.mostc.pftt.model.sapi.TestCaseGroupKey;
import com.mostc.pftt.results.ConsoleManager;
import com.mostc.pftt.results.ITestResultReceiver;
@@ -73,12 +74,12 @@ public class LocalPhpUnitTestPackRunner extends
AbstractLocalTestPackRunner<PhpU
@Override
protected void setupStorageAndTestPack(ITestPackStorageDir storage_dir,
List<PhpUnitTestCase> test_cases) {
-
+ // TODO
}
@Override
protected TestCaseGroupKey createGroupKey(PhpUnitTestCase test_case,
TestCaseGroupKey group_key) throws Exception {
- return new TestCaseGroupKey(null, null);
+ return group_key == null ? new
SharedSAPIInstanceTestCaseGroupKey(null, null) : group_key;
}
@Override
@@ -101,8 +102,7 @@ public class LocalPhpUnitTestPackRunner extends
AbstractLocalTestPackRunner<PhpU
@Override
protected void runTest(TestCaseGroupKey group_key,
PhpUnitTestCase test_case) throws IOException, Exception, Throwable {
- HttpPhpUnitTestCaseRunner r = new
HttpPhpUnitTestCaseRunner(params, httpproc, httpexecutor, smgr, null, globals,
env, cm, runner_host, scenario_set, build, test_case, my_temp_dir, constants,
test_case.php_unit_dist.getIncludePath(),
test_case.php_unit_dist.getIncludeFiles());
- //CliPhpUnitTestCaseRunner r = new
CliPhpUnitTestCaseRunner(globals, env, cm, rt.host, scenario_set, build,
test_case, temp_dir, constants, test_case.php_unit_dist.getIncludePath(),
test_case.php_unit_dist.getIncludeFiles());
+ AbstractPhpUnitTestCaseRunner r =
sapi_scenario.createPhpUnitTestCaseRunner(cm, twriter, globals, env,
runner_host, scenario_set, build, test_case, my_temp_dir, constants,
test_case.php_unit_dist.getIncludePath(),
test_case.php_unit_dist.getIncludeFiles());
r.runTest();
}
diff --git a/src/com/mostc/pftt/scenario/AbstractSAPIScenario.java
b/src/com/mostc/pftt/scenario/AbstractSAPIScenario.java
index 82a9a4a..b6e040a 100644
--- a/src/com/mostc/pftt/scenario/AbstractSAPIScenario.java
+++ b/src/com/mostc/pftt/scenario/AbstractSAPIScenario.java
@@ -1,6 +1,9 @@
package com.mostc.pftt.scenario;
+import java.util.Map;
+
import com.mostc.pftt.host.AHost;
+import com.mostc.pftt.model.app.PhpUnitTestCase;
import com.mostc.pftt.model.core.ESAPIType;
import com.mostc.pftt.model.core.PhpBuild;
import com.mostc.pftt.model.core.PhpIni;
@@ -10,6 +13,7 @@ import com.mostc.pftt.model.core.PhptTestCase;
import com.mostc.pftt.model.sapi.TestCaseGroupKey;
import com.mostc.pftt.results.ConsoleManager;
import com.mostc.pftt.results.ITestResultReceiver;
+import com.mostc.pftt.runner.AbstractPhpUnitTestCaseRunner;
import com.mostc.pftt.runner.AbstractPhptTestCaseRunner;
import com.mostc.pftt.runner.LocalPhptTestPackRunner.PhptThread;
@@ -86,5 +90,7 @@ public abstract class AbstractSAPIScenario extends
AbstractSerialScenario {
public abstract TestCaseGroupKey createTestGroupKey(ConsoleManager cm,
AHost host, PhpBuild build, ScenarioSet scenario_set, PhptActiveTestPack
active_test_pack, PhptTestCase test_case, TestCaseGroupKey group_key) throws
Exception;
public abstract PhpIni createIniForTest(ConsoleManager cm, AHost host,
PhpBuild build, PhptActiveTestPack active_test_pack, ScenarioSet scenario_set);
+
+ public abstract AbstractPhpUnitTestCaseRunner
createPhpUnitTestCaseRunner(ConsoleManager cm, ITestResultReceiver twriter,
Map<String,String> globals, Map<String,String> env, AHost runner_host,
ScenarioSet scenario_set, PhpBuild build, PhpUnitTestCase test_case, String
my_temp_dir, Map<String,String> constants, String include_path, String[]
include_files);
} // end public abstract class AbstractSAPIScenario
diff --git a/src/com/mostc/pftt/scenario/AbstractWebServerScenario.java
b/src/com/mostc/pftt/scenario/AbstractWebServerScenario.java
index ad99aa4..ca2f51e 100644
--- a/src/com/mostc/pftt/scenario/AbstractWebServerScenario.java
+++ b/src/com/mostc/pftt/scenario/AbstractWebServerScenario.java
@@ -19,6 +19,7 @@ import org.apache.http.protocol.RequestUserAgent;
import com.mostc.pftt.host.AHost;
import com.mostc.pftt.host.Host;
import com.mostc.pftt.host.HostGroup;
+import com.mostc.pftt.model.app.PhpUnitTestCase;
import com.mostc.pftt.model.core.EPhptSection;
import com.mostc.pftt.model.core.ESAPIType;
import com.mostc.pftt.model.core.PhpBuild;
@@ -33,7 +34,9 @@ import com.mostc.pftt.model.sapi.WebServerManager;
import com.mostc.pftt.model.smoke.RequiredExtensionsSmokeTest;
import com.mostc.pftt.results.ConsoleManager;
import com.mostc.pftt.results.ITestResultReceiver;
+import com.mostc.pftt.runner.AbstractPhpUnitTestCaseRunner;
import com.mostc.pftt.runner.AbstractPhptTestCaseRunner;
+import com.mostc.pftt.runner.HttpPhpUnitTestCaseRunner;
import com.mostc.pftt.runner.HttpPhptTestCaseRunner;
import com.mostc.pftt.runner.LocalPhptTestPackRunner.PhptThread;
@@ -169,4 +172,8 @@ public abstract class AbstractWebServerScenario extends
AbstractSAPIScenario {
return HttpPhptTestCaseRunner.willSkip(cm, twriter, host,
scenario_set, type, build, test_case);
}
+ public AbstractPhpUnitTestCaseRunner
createPhpUnitTestCaseRunner(ConsoleManager cm, ITestResultReceiver twriter,
Map<String,String> globals, Map<String,String> env, AHost runner_host,
ScenarioSet scenario_set, PhpBuild build, PhpUnitTestCase test_case, String
my_temp_dir, Map<String,String> constants, String include_path, String[]
include_files) {
+ return new HttpPhpUnitTestCaseRunner(twriter, params, httpproc,
httpexecutor, smgr, null, globals, env, cm, runner_host, scenario_set, build,
test_case, my_temp_dir, constants, include_path, include_files);
+ }
+
} // end public abstract class AbstractWebServerScenario
diff --git a/src/com/mostc/pftt/scenario/CLIScenario.java
b/src/com/mostc/pftt/scenario/CLIScenario.java
index f964dd2..c9926c9 100644
--- a/src/com/mostc/pftt/scenario/CLIScenario.java
+++ b/src/com/mostc/pftt/scenario/CLIScenario.java
@@ -1,6 +1,9 @@
package com.mostc.pftt.scenario;
+import java.util.Map;
+
import com.mostc.pftt.host.AHost;
+import com.mostc.pftt.model.app.PhpUnitTestCase;
import com.mostc.pftt.model.core.EPhptSection;
import com.mostc.pftt.model.core.ESAPIType;
import com.mostc.pftt.model.core.PhpBuild;
@@ -11,8 +14,11 @@ import com.mostc.pftt.model.core.PhptTestCase;
import com.mostc.pftt.model.sapi.TestCaseGroupKey;
import com.mostc.pftt.results.ConsoleManager;
import com.mostc.pftt.results.ITestResultReceiver;
+import com.mostc.pftt.runner.AbstractPhpUnitTestCaseRunner;
import com.mostc.pftt.runner.AbstractPhptTestCaseRunner;
+import com.mostc.pftt.runner.CliPhpUnitTestCaseRunner;
import com.mostc.pftt.runner.CliPhptTestCaseRunner;
+import com.mostc.pftt.runner.HttpPhpUnitTestCaseRunner;
import com.mostc.pftt.runner.LocalPhptTestPackRunner.PhptThread;
/** Tests the Command Line Interface(CLI) for running PHP.
@@ -84,5 +90,10 @@ public class CliScenario extends AbstractSAPIScenario {
public boolean willSkip(ConsoleManager cm, ITestResultReceiver twriter,
AHost host, ScenarioSet scenario_set, ESAPIType type, PhpBuild build,
PhptTestCase test_case) throws Exception {
return CliPhptTestCaseRunner.willSkip(cm, twriter, host,
scenario_set, type, build, test_case);
}
+
+ @Override
+ public AbstractPhpUnitTestCaseRunner
createPhpUnitTestCaseRunner(ConsoleManager cm, ITestResultReceiver twriter,
Map<String, String> globals, Map<String, String> env, AHost runner_host,
ScenarioSet scenario_set, PhpBuild build, PhpUnitTestCase test_case, String
my_temp_dir, Map<String, String> constants, String include_path, String[]
include_files) {
+ return new CliPhpUnitTestCaseRunner(twriter, globals, env, cm,
runner_host, scenario_set, build, test_case, my_temp_dir, constants,
test_case.php_unit_dist.getIncludePath(),
test_case.php_unit_dist.getIncludeFiles());
+ }
} // end public class CliScenario
diff --git a/src/com/mostc/pftt/scenario/ZendOptimizerPlusScenario.java
b/src/com/mostc/pftt/scenario/ZendOptimizerPlusScenario.java
index fd8f986..8838790 100644
--- a/src/com/mostc/pftt/scenario/ZendOptimizerPlusScenario.java
+++ b/src/com/mostc/pftt/scenario/ZendOptimizerPlusScenario.java
@@ -6,6 +6,16 @@ import com.mostc.pftt.model.core.PhpBuild;
import com.mostc.pftt.model.core.PhpIni;
import com.mostc.pftt.results.ConsoleManager;
+/** The Zend Optimizer+ provides faster PHP execution through opcode caching
and optimization.
+ * It improves PHP performance by storing precompiled script bytecode in the
shared memory. This
+ * eliminates the stages of reading code from the disk and compiling it on
future access. In
+ * addition, it applies a few bytecode optimization patterns that make code
execution faster.
+ *
+ * @see https://github.com/zend-dev/ZendOptimizerPlus
+ * @see https://github.com/OSTC/ZendOptimizerPlus - fork for Windows/PHP on
Windows
+ *
+ */
+
public class ZendOptimizerPlusScenario extends AbstractCodeCacheScenario {
@Override
@@ -20,18 +30,37 @@ public class ZendOptimizerPlusScenario extends
AbstractCodeCacheScenario {
@Override
public boolean setup(ConsoleManager cm, Host host, PhpBuild build,
PhpIni ini) {
- // TODO Auto-generated method stub
- return false;
+ // assume SO is in same directory as PHP extensions
+ String dll_path = ini.getExtensionDir() + "/ZendOptimizerPlus."
+ (host.isWindows() ? "dll" : "so" );
+
+ // must be absolute path to ZendOptimizerPlus.so
+ ini.putMulti("zend_extension", dll_path);
+
+ // CRITICAL: for CliScenario
+ ini.putSingle("zend_optimizerplus.enable_cli", 1);
+
+ // recommended settings, @see
https://github.com/zend-dev/ZendOptimizerPlus
+ // (recommended settings differ from some of the documented
default settings)
+ ini.putSingle("zend_optimizerplus.memory_consumption", 128);
+ ini.putSingle("zend_optimizerplus.interned_strings_buffer", 8);
+ ini.putSingle("zend_optimizerplus.max_accelerated_files", 4000);
+ ini.putSingle("zend_optimizerplus.revalidate_freq", 60);
+ ini.putSingle("zend_optimizerplus.save_comments", 0);
+ ini.putSingle("zend_optimizerplus.fast_shutdown", 1);
+ ini.putSingle("zend_optimizerplus.enable_file_override", 1);
+
+ return true;
}
@Override
public String getName() {
- return "ZendOptimizer+";
+ // use 'plus' instead of + symbol which may cause problems (ex:
on certain filesystems)
+ return "ZendOptimizerPlus";
}
@Override
public boolean isImplemented() {
- return false;
+ return true;
}
-}
+} // end public class ZendOptimizerPlusScenario