Commit: 5f1f4ec8b08460a091468aba8f4358762ba1e01d
Author: Matt Ficken <[email protected]> Tue, 25
Oct 2011 18:47:41 -0700
Parents: cbefe7ccc0a817d1c3f4adcb9ffcf7e2da403cfd
Branches: master
Link:
http://git.php.net/?p=pftt2.git;a=commitdiff;h=5f1f4ec8b08460a091468aba8f4358762ba1e01d
Log:
various bug fixes
Former-commit-id: cbfac78b154bff3a9cad816b4aab441b13e7e32a
Changed paths:
M PFTT/_pftt.rb
M PFTT/lib/diff.rb
M PFTT/lib/host.rb
M PFTT/lib/middleware.rb
M PFTT/lib/middleware/cli.rb
M PFTT/lib/middleware/http.rb
M PFTT/lib/phpt_test_case.rb
M PFTT/lib/phpt_test_result.rb
M PFTT/lib/report/inspect/func.rb
M PFTT/lib/report/run/by_host/by_build/by_middleware/func.rb
M PFTT/lib/scenario.rb
M PFTT/lib/scenario/set.rb
M PFTT/lib/server/snapshot_getter.rb
M PFTT/lib/test_bench.rb
M PFTT/lib/test_bench/phpt.rb
A PFTT/pftt
M PFTT/pftt.cmd
A PFTT/pftt_server
M PFTT/pftt_server.cmd
M PFTT/scripts/SDK4Win/SetupPHPSDK.cmd
diff --git a/PFTT/_pftt.rb b/PFTT/_pftt.rb
index 6e81087..92eb7d4 100644
--- a/PFTT/_pftt.rb
+++ b/PFTT/_pftt.rb
@@ -220,10 +220,10 @@ class PfttOptions < OptionsHash
def help_list_actions
puts
- puts ' func_part - runs selected PHPT tests (ex: manual tool)'
puts ' func_full - deploys PHP and runs PHPT tests (ex: automatic
tool)'
puts ' func_list - write list of PHPT tests to file. useful with
func_part'
puts ' func_inspect - inspects options/configs used for func_part or
func_full'
+ puts ' func_part - runs selected PHPT tests (ex: manual tool)'
puts ' perf - run Performance test'
puts ' stress - run Stress test'
puts ' unit - run PHPUnit tests from PHP-AzureSDK, MediaWiki,
Symfony, etc'
@@ -600,9 +600,10 @@ class PfttOptions < OptionsHash
begin
list = []
- self[:phpt].each{|phpt|
+ self[:phpt].each do |phpt|
+ # TODO puts phpt.inspect
list.push(PhptTestCase::Array.new(phpt, self[:test_names]))
- }
+ end
return list
rescue PhptTestCase::Array::DuplicateTestError
puts "PFTT: error: same test occurs in multiple directories: #{file}"
@@ -619,15 +620,24 @@ CONFIG = PfttOptions.parse(ARGV)
# set up our basic test bench factors
$hosts =
(Host::Array.new.load(CONFIG[:host,:path].convert_path)).filter(CONFIG[:host,:filters])
-$hosts.push(Host::Remote::Ssh.new(:address=>'127.0.0.1',
:username=>'administrator', :password=>'password01!'))#Host::Local.new()) # TODO
+$hosts.push(#Host::Local.new(),#)# TODO
+ #OI1-PHP-FUNC-21-27
+ Host::Remote::Ssh.new(:address=>'10.200.50.72', :username=>'administrator',
:password=>'password01!'),
+# Host::Remote::Ssh.new(:address=>'10.200.50.39', :username=>'administrator',
:password=>'password01!'),
+# Host::Remote::Ssh.new(:address=>'10.200.50.33', :username=>'administrator',
:password=>'password01!'),
+# Host::Remote::Ssh.new(:address=>'10.200.50.37', :username=>'administrator',
:password=>'password01!'),
+# Host::Remote::Ssh.new(:address=>'10.200.50.36', :username=>'administrator',
:password=>'password01!'),
+# Host::Remote::Ssh.new(:address=>'10.200.50.77', :username=>'administrator',
:password=>'password01!'),
+# Host::Remote::Ssh.new(:address=>'10.200.50.34', :username=>'administrator',
:password=>'password01!'),
+ Host::Remote::Ssh.new(:address=>'127.0.0.1', :username=>'administrator',
:password=>'password01!'))#Host::Local.new()) # TODO
require 'typed-array'
$phps =
PhpBuild.get_set(CONFIG[:php,:dir].convert_path||'').filter(CONFIG[:php,:filters])
-$middlewares = [#Middleware::Cli]#,
- Middleware::Http::IIS::FastCgi::Base]#,
Middleware::Http::Apache::ModPhp::Base] # TODO Middleware::All#.filter([])#
TODO CONFIG[:middleware,:filters])
+$middlewares = [Middleware::Cli]#,
+ #Middleware::Http::IIS::FastCgi::Base]#,
Middleware::Http::Apache::ModPhp::Base] # TODO Middleware::All#.filter([])#
TODO CONFIG[:middleware,:filters])
# LATER? what about NFSv3 support (which ships with Windows 7<) (not NFSv4)
$scenarios = [
- Scenario::Set(
+ Scenario::Set.new(
'1',
Scenario::WorkingFileSystem::Local.new()#,
#Scenario::RemoteFileSystem::Http.new,
@@ -833,14 +843,15 @@ if __FILE__ == $0
unless CONFIG[:action] == 'perf'
$testcases = CONFIG.selected_tests()
+ # TODO puts $testcases.inspect
end
#
# add more threads to keep track of more hosts, but limit the size
- $thread_pool_size = $thread_pool_size * $hosts.length
- if $thread_pool_size > 60
- $thread_pool_size = 60
- end
+# TODO $thread_pool_size = $thread_pool_size * $hosts.length
+# if $thread_pool_size > 60
+# $thread_pool_size = 60
+# end
#
# stop Forefront Endpoint Protection and windows search service/indexer
@@ -860,11 +871,12 @@ if __FILE__ == $0
require 'time'
+ # lock hosts with PFTT Server (if available) so they aren't used by two
PFTT clients at same time
+ lock_all($hosts)
+
start_time = Time.now()
begin
- # lock hosts with PFTT Server (if available) so they aren't used by
two PFTT clients at same time
- lock_all($hosts)
-
+
# if func_full automatically do host configuration
if CONFIG[:action] == 'func_full'
host_config
@@ -880,14 +892,31 @@ if __FILE__ == $0
# iterate over all hosts, middlewares, etc..., running all tests for
each
test_ctx = test_bench.iterate( $phps, $hosts, $middlewares,
$scenarios, $testcases )
+ end_time = Time.now()
+ run_time = end_time - start_time
+
+ #
+ # reboot remote hosts to clean them up for next time
+ unless CONFIG[:action] == 'func_part'
+ $hosts.each do |host|
+ if host.instance_of?(Host::Remote::Base)
+ if host.windows?
+ host.exec!('shutdown /r /t 0')
+ else
+ host.exec!('shutdown -r -t 0')
+ end
+
+ sleep(5)
+ end
+ end
+ end
+ #
ensure
# ensure hosts are unlocked
release_all($hosts)
-
+ #
end
- end_time = Time.now()
- run_time = end_time - start_time
-
+ #
ensure
if CONFIG[:action] == 'func_full'
# restart wsearch on hosts where it was already running (also, restart
MsMpEng.exe)
@@ -937,7 +966,7 @@ if __FILE__ == $0
end
#
#
-
+
exit
elsif CONFIG[:action] == 'func_inspect'
# inspects what the configuration and arguments will have pftt do for the
func_full or func_part actions
diff --git a/PFTT/lib/diff.rb b/PFTT/lib/diff.rb
index 65ef6e0..8f65abe 100644
--- a/PFTT/lib/diff.rb
+++ b/PFTT/lib/diff.rb
@@ -1,5 +1,6 @@
require 'abstract_class'
+require 'iconv'
module Diff
class Base
@@ -12,6 +13,8 @@ module Diff
@middleware = middleware
@scn_set = scn_set
@php = php
+
+ @iconv = Iconv.new('US-ASCII//IGNORE', 'UTF-8')
end
def to_s
@@ -20,7 +23,8 @@ module Diff
when :insert then '+'
when :delete then '-'
else ''
- end + (String.not_nil(line[(line[0]==:delete)?3:1])).gsub(/\n\Z/,'')
+ # use iconv to fix character encoding problems
+ end +
(@iconv.conv(String.not_nil(line[(line[0]==:delete)?3:1])).gsub(/\n\Z/,''))
end.join("\n")
end
@@ -666,7 +670,7 @@ module Diff
# the order matters because %string% must be replaced before %s.
patterns(rex)
- return super( rex, result ) or super( rex, result.rstrip.chomp )
+ super( rex, result ) or super( rex, result.rstrip.chomp )
end
end
@@ -697,13 +701,13 @@ module Diff
class Php5 < Formatted
def patterns(rex)
- super(rex)
- rex.gsub!('%u\|b%', '')
- rex.gsub!('%b\|%u', '') #PHP6+: 'u'
- rex.gsub!('%binary_string_optional%', 'string') #PHP6+: 'binary_string'
rex.gsub!('%unicode_string_optional%', 'string') #PHP6+: 'Unicode
string'
+ rex.gsub!('%binary_string_optional%', 'string') #PHP6+: 'binary_string'
rex.gsub!('%unicode\|string%', 'string') #PHP6+: 'unicode'
rex.gsub!('%string\|unicode%', 'string') #PHP6+: 'unicode'
+ rex.gsub!('%u\|b%', '')
+ rex.gsub!('%b\|%u', '') #PHP6+: 'u'
+ super(rex)
end
def show_expect_info
@@ -718,13 +722,13 @@ module Diff
class Php6 < Formatted
def patterns(rex)
- super(rex)
- rex.gsub!('%u\|b%', 'u')
- rex.gsub!('%b\|%u', 'u') #PHP6+: 'u'
- rex.gsub!('%binary_string_optional%', 'binary_string') #PHP6+:
'binary_string'
rex.gsub!('%unicode_string_optional%', 'Unicode string') #PHP6+:
'Unicode string'
+ rex.gsub!('%binary_string_optional%', 'binary_string') #PHP6+:
'binary_string'
rex.gsub!('%unicode\|string%', 'unicode') #PHP6+: 'unicode'
rex.gsub!('%string\|unicode%', 'unicode') #PHP6+: 'unicode'
+ rex.gsub!('%u\|b%', 'u')
+ rex.gsub!('%b\|%u', 'u') #PHP6+: 'u'
+ super(rex)
end
def show_expect_info
diff --git a/PFTT/lib/host.rb b/PFTT/lib/host.rb
index 3dc8e1f..7e1a7d7 100644
--- a/PFTT/lib/host.rb
+++ b/PFTT/lib/host.rb
@@ -332,7 +332,7 @@ module Host
unless @_name
# find a name that other hosts on the network will use to reference
localhost
if windows?
- @_name = line!('echo %COMPUTERNAME%')
+ @_name = unquote_line!('echo %COMPUTERNAME%')
else
@_name = line!('echo $HOSTNAME')
end
diff --git a/PFTT/lib/middleware.rb b/PFTT/lib/middleware.rb
index d14695c..681698a 100644
--- a/PFTT/lib/middleware.rb
+++ b/PFTT/lib/middleware.rb
@@ -18,6 +18,14 @@ module Middleware
@host.close
end
+ def self.to_s
+ mw_name
+ end
+
+ def to_s
+ mw_name
+ end
+
def ==(o)
return self.class == o.class
end
@@ -48,7 +56,7 @@ module Middleware
# ask scenarios for the folder to deploy PHP to
deploy_to = nil
- @scenarios.map{|scn_type, scn| deploy_to||= scn.deployed_php(self) }
+ # TODO @scenarios.map{|scn_type, scn| deploy_to||=
scn.deployed_php(self) }
unless deploy_to
# fallback on storing php in a sub-folder in
%SYSTEMDRIVE%/php-sdk/PFTT-PHPs or ~/php-sdk/PFTT-PHPs
@@ -64,7 +72,7 @@ module Middleware
# if $force_deploy, make a new directory! otherwise, reuse existing
directory (for quick manual testing can't take the time
# to copy everything again)
- @deployed_php ||= @host.join(deploy_to, ( @php_build[:version] + (
$force_deploy ? '_'+String.random(4) : '' ) ) )
+ @deployed_php ||= @host.join(deploy_to, ( @php_build[:version] +
((@php_build[:threadsafe])?'-TS':'-NTS') + ( $force_deploy ?
'_'+String.random(4) : '' ) ) )
#
if $force_deploy or not File.exists?(php_binary()) or
File.mtime(@php_build.path) >= File.mtime(php_binary())
@@ -93,11 +101,11 @@ module Middleware
apply_ini(@current_ini)
# ask scenarios to add anything they need to this INI
- scn_set.ini(platform, @current_ini)
+ # TODO scn_set.ini(platform, @current_ini)
@current_ini
end
-
+
def uninstall r=nil
_undeploy_php_bin
unset_ini
diff --git a/PFTT/lib/middleware/cli.rb b/PFTT/lib/middleware/cli.rb
index 32b6617..bfa447b 100644
--- a/PFTT/lib/middleware/cli.rb
+++ b/PFTT/lib/middleware/cli.rb
@@ -12,6 +12,18 @@ module Middleware
'CLI'
end
+ def start!
+ # nothing to do
+ end
+
+ def stop!
+ # nothing to do
+ end
+
+ def running?
+ true
+ end
+
def clone
clone = Middleware::Cli.new(@host.clone, @php_build, @scenarios)
clone.deployed_php = @deployed_php
@@ -50,7 +62,7 @@ module Middleware
# tell scenarios that script is about to be started
# scenarios may modify env or current_ini
- scenarios.execute_script_start(env, test, script_type, deployed_script,
self.php_binary, @php_build, current_ini, @host )
+ # TODO scenarios.execute_script_start(env, test, script_type,
deployed_script, self.php_binary, @php_build, current_ini, @host )
# generate options for the command execution
exe_options = {
@@ -81,7 +93,7 @@ module Middleware
].flatten.compact.join(' ')
# save (in telemetry folder) the environment variables and the command
line string used to run this case case
- save_cmd(test_case, env, exe_options[:chdir], cmd_string)
+ # TODO save_cmd(test_case, env, exe_options[:chdir], cmd_string)
# feed in stdin string if present to PHP's standard input
if test_case.parts.has_key?(:stdin)
@@ -94,7 +106,7 @@ module Middleware
# tell scenarios that script has stopped
- scenarios.execute_script_stop(test, script_type, deployed_script,
self.php_binary, @php_build, @host)
+ # TODO scenarios.execute_script_stop(test, script_type, deployed_script,
self.php_binary, @php_build, @host)
# return success|failure and the output
[s==0, (o+e)]
@@ -104,7 +116,7 @@ module Middleware
# saves the command line and environment variables to run the test case
into a telemetry folder file
# (save as a shell script or batch script)
- def save_cmd(test_case, env, chdir, cmd_string)
+ def save_cmd(test_case, env, chdir, cmd_string)
file_name = telemetry_folder(@host, @php, @middleware, @scenarios) + '/'
+ test_case.relative_path+((@host.windows?)?'.cmd':'.sh')
File.open(file_name, 'wb') do |f|
if host.posix?
diff --git a/PFTT/lib/middleware/http.rb b/PFTT/lib/middleware/http.rb
index ca0e7f2..6c9ad13 100644
--- a/PFTT/lib/middleware/http.rb
+++ b/PFTT/lib/middleware/http.rb
@@ -19,7 +19,7 @@ module Middleware
@host.write( current_ini.to_a.join("\n"), ini_file )
true
else
- false
+ false
end
end
@@ -36,7 +36,7 @@ module Middleware
end
def execute_php_script deployed_script, test_case, script_type, scenarios
- scenarios.execute_script_start(env, test, script_type,
deployed_script, self.php_binary, @php_build, current_ini, @host )
+ # TODO scenarios.execute_script_start(env, test, script_type,
deployed_script, self.php_binary, @php_build, current_ini, @host )
# send HTTP GET request to web server (middleware) asking it to
execute the script
# then compare the returned document just as is done for locally
executed PHPT script (CLI middleware)
@@ -51,17 +51,19 @@ module Middleware
url = URI.parse(url)
+ http = Net::HTTP.new('127.0.0.1', 80) # TODO 80
+
if test_case.parts.has_key?(:post_raw)
- response = post(request, test_case, http,
test_case.parts[:post_raw], url, nil, false)
+ response = post(test_case, http, test_case.parts[:post_raw], url,
nil, false)
elsif test_case.parts.has_key?(:post)
- response = post(request, test_case, http,
test_case.parts[:post_raw], url, 'application/x-www-form-urlencoded', true)
+ response = post(test_case, http, test_case.parts[:post_raw], url,
'application/x-www-form-urlencoded', true)
elsif test_case.parts.has_key?(:gzip_post)
- response = post(request, test_case, http,
test_case.parts[:post_raw], url, 'gzip', true)
+ response = post(test_case, http, test_case.parts[:post_raw], url,
'gzip', true)
elsif test_case.parts.has_key?(:deflate_post)
- response = post(request, test_case, http,
test_case.parts[:post_raw], url, 'deflate', true)
+ response = post(test_case, http, test_case.parts[:post_raw], url,
'deflate', true)
else
# for --GET--
- response = get(request, test_case, http, url)
+ response = get(test_case, http, url)
end
#
@@ -99,22 +101,22 @@ module Middleware
protected
def cookie(request, test_case)
- if test_case.parts.has_key(:cookie)
+ if test_case.parts.has_key?(:cookie)
request['Set-Cookie'] = test_case.parts[:cookie]
end
end
def headers(request, test_case)
- if test_case.parts.has_key(:header)
- test_case.http_headers(Middleware::Cli.new(@host, @php, @scenarios))
do |name, value|
+ if test_case.parts.has_key?(:header)
+ test_case.http_headers(mw_cli) do |name, value|
request[name] = value
end
end
end
# do POST GZIP_POST DEFLATE_POST POST_RAW (add_content_type=false)
section
- def post(request, test_case, http, data, url, content_type,
add_content_type=true)
- request = Net::HTTP::Post.new(url)
+ def post(test_case, http, data, url, content_type, add_content_type=true)
+ request = Net::HTTP::Post.new(url.request_uri)
if add_content_type
request['Content-Type'] = content_type
end
@@ -127,19 +129,24 @@ module Middleware
end
# do GET section
- def get(request, test_case, http, url)
+ def get(test_case, http, url)
if test_case.parts.has_key?(:get)
# add the query part of the URL
url += '?' + test_case.parts[:get]
end
- request = Net::HTTP::Get.new(url)
+ request = Net::HTTP::Get.new(url.request_uri)
cookie(request, test_case)
headers(request, test_case)
http.request(request)
end
+
+ def mw_cli
+ # need CLI to execute some sections of some PHPTs
+ @cli ||= Middleware::Cli.new(@host, @php, @scenarios)
+ end
end
end
diff --git a/PFTT/lib/phpt_test_case.rb b/PFTT/lib/phpt_test_case.rb
index 561da3c..c4f76e2 100644
--- a/PFTT/lib/phpt_test_case.rb
+++ b/PFTT/lib/phpt_test_case.rb
@@ -316,20 +316,20 @@ class PhptTestCase
@bork_reasons << 'missing required section:'+group.to_s
end
end
- counte = (parts.has_key?(:expect)) ? 1 : 0
- counte += (parts.has_key?(:expectf)) ? 1 : 0
- counte += (parts.has_key?(:expectregex)) ? 1 : 0
- if counte > 0
- @bork_reasons << 'can only have one EXPECT or EXPECTF or EXPECTREGEX
section, not '+counte.to_s
- end
- counth = (parts.has_key?(:get)) ? 1 : 0
- counth = (parts.has_key?(:post)) ? 1 : 0
- counth = (parts.has_key?(:post_raw)) ? 1 : 0
- counth = (parts.has_key?(:gzip_post)) ? 1 : 0
- counth = (parts.has_key?(:deflate_post)) ? 1 : 0
- if counth > 0
- @bork_reasons << 'can only have one GET, POST, POST_RAW, GZIP_POST or
DEFLATE_POST section, not '+counth.to_s
- end
+# TODO counte = (parts.has_key?(:expect)) ? 1 : 0
+# counte += (parts.has_key?(:expectf)) ? 1 : 0
+# counte += (parts.has_key?(:expectregex)) ? 1 : 0
+# if counte > 0
+# @bork_reasons << 'can only have one EXPECT or EXPECTF or EXPECTREGEX
section, not '+counte.to_s
+# end
+# counth = (parts.has_key?(:get)) ? 1 : 0
+# counth = (parts.has_key?(:post)) ? 1 : 0
+# counth = (parts.has_key?(:post_raw)) ? 1 : 0
+# counth = (parts.has_key?(:gzip_post)) ? 1 : 0
+# counth = (parts.has_key?(:deflate_post)) ? 1 : 0
+# if counth > 0
+# @bork_reasons << 'can only have one GET, POST, POST_RAW, GZIP_POST or
DEFLATE_POST section, not '+counth.to_s
+# end
end
!@bork_reasons.length.zero?
end
@@ -395,15 +395,15 @@ class PhptTestCase
parts.inspect
end
- def raw(deploy_dir)
- @raw ||= IO.read(File.join(deploy_dir, full_name))
+ def raw()
+ @raw ||= IO.read(File.join('c:/php-sdk/svn/branches/php_5_4/', full_name))
# TODO phptdir
end
- def parse!(deploy_dir)
+ def parse!()
reset!
@result_tester = nil
section = :none
- raw(deploy_dir).lines do |line|
+ raw().lines do |line|
if line =~ /^--(?<section>[A-Z_]+)--/
section = Regexp.last_match[:section].downcase.to_sym
@parts[section]=''
@@ -424,7 +424,7 @@ class PhptTestCase
@parts[:file].gsub!(%Q{\r\n},%Q{\n}) unless @parts[:file].nil?
end
- protected
+ # TODO protected
def reset!
@parts = {}
@@ -432,7 +432,7 @@ class PhptTestCase
@options = nil
end
- private
+ # TODO private
def parse_line( line, context )
return line unless line =~ /^\#\!?include (?<script>.*)/
@@ -479,27 +479,31 @@ class PhptTestCase::Array < TypedArray(PhptTestCase)
end
}
end
-
+ #tests_names = ['math/abs'] # TODO
# search each directory for PHPT files
- paths.map{|path|
+ paths.map do |path|
Dir.glob( File.join( path, '**/*.phpt' ) ).each do |files|
if test_names != nil and test_names.length > 0
- test_names.each{|test_name|
+ test_names.each do |test_name|
+ # internally, ruby always uses / for filenames (check for / not \)
+ test_name.gsub!('\\', '/')
+# puts files.inspect
+# puts test_name.inspect
if files.is_a?(Array)
- files.each{|file|
+ files.each do |file|
if file.include?(test_name)
add_selected_file(path, file)
end
- }
+ end
elsif files.include?(test_name)
add_selected_file(path, files)
end
- }
+ end
else
add_selected_file(path, files)
end
end
- }
+ end
@selected = nil
self
end
@@ -507,9 +511,10 @@ class PhptTestCase::Array < TypedArray(PhptTestCase)
class DuplicateTestError < StandardError
end
- private
+ # TODO private
def add_selected_file(dir, file)
+ #puts file
file = File.absolute_path(file)
if file.starts_with?(dir)
file = file[dir.length+1...file.length]
diff --git a/PFTT/lib/phpt_test_result.rb b/PFTT/lib/phpt_test_result.rb
index 943cee0..cf1d388 100644
--- a/PFTT/lib/phpt_test_result.rb
+++ b/PFTT/lib/phpt_test_result.rb
@@ -1,15 +1,16 @@
module PhptTestResult
class Base
- def initialize( test_case, test_bench, deploydir )
+ def initialize( test_case, test_bench, deploydir, php )
@test_case = test_case
@test_bench = test_bench
- files['phpt'] = @test_case.raw(deploydir)
+ @php = php
+ files['phpt'] = @test_case.raw()# TODO deploydir)
self
end
attr_reader :test_case, :test_bench
- attr_accessor :status
+ attr_accessor :status
def to_s
%Q{[#{status.to_s.upcase}] #{@test_bench} #{@test_case.relative_path}}
@@ -109,13 +110,12 @@ module PhptTestResult
@filtered_expectation, @filtered_result =
[@test_case.expectation[:content], result_str].map do |str|
str.gsub("\r\n","\n").strip
end
- @diff = nil
@diff_spec = (case @test_case.expectation[:type]
when :expect then Diff::Exact
when :expectregex then Diff::RegExp
when :expectf
- case php.properties[:php_version_major]
+ case @php.properties[:php_version_major]
when 5 then Diff::Formatted::Php5
when 6 then Diff::Formatted::Php6
else Diff::Formatted
diff --git a/PFTT/lib/report/inspect/func.rb b/PFTT/lib/report/inspect/func.rb
index aaadcef..db8b130 100644
--- a/PFTT/lib/report/inspect/func.rb
+++ b/PFTT/lib/report/inspect/func.rb
@@ -1,7 +1,7 @@
module Report
module Inspect
- class Func
+ class Func < Base
def initialize(test_cases)
@test_cases = test_cases
end
@@ -9,17 +9,17 @@ module Report
str = "\r\n"
unless $brief_output
- str += 'PHPTs('+test_cases.length+'):'
+ str += 'PHPTs('+@test_cases.length.to_s+"):\r\n"
- test_cases.each do test_case
+ @test_cases.each do |test_case|
str += test_case.full_name + "\r\n"
end
str += "\r\n"
end
- str += "HOSTS#{$hosts.length}):\r\n"
- str += puts_or_empty($hosts)
+ str += "HOSTS(#{$hosts.length}):\r\n"
+ str += puts_or_empty($hosts)
if $phps.empty?
str += "PFTT: suggestion: run 'pftt get_php' to get a PHP binary
build to test\r\n"
@@ -32,21 +32,26 @@ module Report
str += "MIDDLEWARES(#{$middlewares.length}):\r\n"
str += puts_or_empty($middlewares)
- flat_scenarios = $scenarios.values.flatten
+ flat_scenarios = $scenarios#[0].values# TODO [0] .values.flatten
- str += "CONTEXTS(#{flat_scenarios.length}):\r\n"
+ str += "SCENARIO SETS(#{flat_scenarios.length}):\r\n"
str += puts_or_empty(flat_scenarios)
str += "\r\n"
+ str
end
protected
def puts_or_empty array
if array.empty?
- return '<None>'
+ return "<None>\r\n\r\n"
else
- return array.to_s
+ str = ""
+ array.each do |e|
+ str += e.to_s+"\r\n"
+ end
+ return str+"\r\n"
end
end
diff --git a/PFTT/lib/report/run/by_host/by_build/by_middleware/func.rb
b/PFTT/lib/report/run/by_host/by_build/by_middleware/func.rb
index 169c286..14243bc 100644
--- a/PFTT/lib/report/run/by_host/by_build/by_middleware/func.rb
+++ b/PFTT/lib/report/run/by_host/by_build/by_middleware/func.rb
@@ -21,7 +21,7 @@ module Report
#
str = "\r\n"
-
+
str += " === Test Run Completed === \r\n"
str += "\r\n"
diff --git a/PFTT/lib/scenario.rb b/PFTT/lib/scenario.rb
index 0ab0e99..276a868 100644
--- a/PFTT/lib/scenario.rb
+++ b/PFTT/lib/scenario.rb
@@ -30,6 +30,10 @@ module Scenario
return :unknown
end
+ def to_s
+ scn_name
+ end
+
def self.instantiable
All << self
end
diff --git a/PFTT/lib/scenario/set.rb b/PFTT/lib/scenario/set.rb
index a1021f1..3edc949 100644
--- a/PFTT/lib/scenario/set.rb
+++ b/PFTT/lib/scenario/set.rb
@@ -9,6 +9,7 @@ module Scenario
def initialize(id, working_filesystem_scenario, *optional_other_scenarios)
@id = id
+ @working_fs = working_filesystem_scenario
optional_other_scenarios.each do |scenario|
case scenario.scn_type
when :remote_file_system
@@ -65,6 +66,10 @@ module Scenario
end
end
+ def to_s
+ "[Set #{@id} #{values.inspect}]"
+ end
+
def == (o)
o.instance_of?(Scenario::Set) and o.id == @id
end
diff --git a/PFTT/lib/server/snapshot_getter.rb
b/PFTT/lib/server/snapshot_getter.rb
index 7060069..142eb27 100644
--- a/PFTT/lib/server/snapshot_getter.rb
+++ b/PFTT/lib/server/snapshot_getter.rb
@@ -130,7 +130,7 @@ module Server
end # def scrape_snapshot_urls
def download_file_to_local(remote_url)
- local_filename =
((@localhost.windows?)[email protected]+'/PFTT-PHPS/':'~/PFTT-PHPS')+File.basename(remote_url)
+ local_filename =
((@localhost.windows?)[email protected]+'/php-sdk/builds/':'~/php-sdk/builds/')+File.basename(remote_url)
local_dir = local_filename
# local dir should be same as local filename of ZIP without the .zip
diff --git a/PFTT/lib/test_bench.rb b/PFTT/lib/test_bench.rb
index ed83638..23beb77 100644
--- a/PFTT/lib/test_bench.rb
+++ b/PFTT/lib/test_bench.rb
@@ -59,42 +59,43 @@ module TestBench
# provide a hash to the iteration (ex scenarios[:file_system]
should have 1 scenario (not array) within the iteration)
# input: takes in a a structure like this
# {:working_file_system=>[#<Scenario::FileSystem::Smb:0x32ee198>],
:database=>[#<Scenario::Database::Mysql::Tcp:0x329b218>]}
- scenario_values = scenarios.values.flatten
+ scenario_values = scenarios# TODO ? .values.flatten
# except for :working_file_system, try each combination with no
scenarios of that type too (+scenarios.keys.length-1)
- cg =
CombinationGenerator.new(scenario_values.length+scenarios.keys.length-1,
scenarios.keys.length)
- scenarios = []
- while cg.hasMore do
- idicies = cg.getNext()
-
- scn_set = {}
- skip_set = false
- idicies.each do |idx|
- if idx >= scenario_values.length
- # if here, this is a combination that is meant to not include
any of a particular scenario type
- next
- end
- scn = scenario_values[idx]
-
- if scn_set.has_key? scn.scn_type
- skip_set = true
- break
- else
- scn_set[scn.scn_type] = scn
- end
- end
- unless skip_set
- scenarios.push(scn_set)
- end
- end
+# TODO cg =
CombinationGenerator.new(scenario_values.length+scenarios.keys.length-1,
scenarios.keys.length)
+# scenarios = []
+# while cg.hasMore do
+# idicies = cg.getNext()
+#
+# scn_set = {}
+# skip_set = false
+# idicies.each do |idx|
+# if idx >= scenario_values.length
+# # if here, this is a combination that is meant to not include
any of a particular scenario type
+# next
+# end
+# scn = scenario_values[idx]
+#
+# if scn_set.has_key? scn.scn_type
+# skip_set = true
+# break
+# else
+# scn_set[scn.scn_type] = scn
+# end
+# end
+# unless skip_set
+# scenarios.push(scn_set)
+# end
+# end
# output: produces a new structure like this
# [{:working_file_system=>#<Scenario::FileSystem::Smb:0x32ee198>,
:database=>#<Scenario::Database::Mysql::Tcp:0x329b218>},
# {:working_file_system=>#<Scenario::FileSystem::Smb:0x32ee198>,
:database=>#<Scenario::Database::Mysql::Ssl:0x3297408>},
{:file_system=>#<Context::FileSystem::Http:0x32e8150>,
#
#
+ scenarios = scenario_values # TODO
final_test_cases = []
- test_ctx = TestBenchRunContext.new(self, test_cases.flatten.length,
final_test_cases)
+ test_ctx = TestBenchRunContext.new(self, test_cases.flatten.length,
test_cases.flatten, final_test_cases)
hosts.each do |host|
@@ -109,6 +110,11 @@ module TestBench
#
test_ctx.show_label_legend
+
+ if test_cases.empty?
+ # no point in deploying, installing, uninstalling, and tearing down
+ return test_ctx
+ end
# iterate over all scenario sets (where there is one instance of each
scenario type (file system, database))
@@ -125,27 +131,36 @@ module TestBench
next
end
- @test_bench.install(scn_set[:working_file_system], middleware)
+ install(scn_set.working_fs, middleware)
+
+ # tell middleware to start (ex: start IIS)
+ middleware.start!
- test_ctx.create_entries(host, middleware, php, scn_set)
+ test_ctx.create_entries(host, middleware, php, scn_set,
test_cases)
- middlewares_uninstall.push([scn_set[:working_file_system],
middleware])
+ middlewares_uninstall.push([scn_set.working_fs, middleware])
end
end
end
end
# execute each, use a pool of worker threads to consume all test
case-scenario-host-build-middleware combinations
- run(final_test_cases, test_ctx)
+ unless final_test_cases.empty?
+ run(final_test_cases, test_ctx)
+ end
# do uninstall
middlewares_uninstall.each do |params|
+ # tell middleware to stop (ex: shutdown IIS)
+ params[1].stop!
+
uninstall(params[0], params[1])
end
# teardown scenarios on each host
hosts.each do |host|
scenarios.each do |scn_set|
+ # TODO where is deploy ??
scn_set.teardown(host)
end
end
@@ -302,8 +317,9 @@ module TestBench
class TestBenchRunContext < ResultsContext
attr_reader :tr, :test_case_len, :semaphore1, :semaphore2, :semaphore3,
:semaphore4, :semaphore5, :chunk_replacement
- def initialize(test_bench, test_case_len, final_test_cases)
+ def initialize(test_bench, test_case_len, test_cases, final_test_cases)
@final_test_cases = final_test_cases
+ @test_cases = test_cases
@tr = $auto_triage ? Diff::Base::TriageResults.new() : nil
@test_bench = test_bench
@@ -361,7 +377,7 @@ module TestBench
host_name_i = host_name.length - 1
while host_name_i >= 0
- name = ( scn_id[scn_id_i] + host_name[host_name_i] +
mw_name[mw_name_i] + version ).upcase
+ name = ( scn_id[scn_id_i] + mw_name[mw_name_i] + version +
host_name[host_name_i] ).upcase
unless @labels.has_key?(name)
set_label(host, middleware, host_name, php, mw_name, scn_set,
name)
@@ -398,7 +414,7 @@ module TestBench
@labels.keys.each do |label|
host_name, php, mw_name, scn_set = @labels[label]
- puts " #{label} - #{host_name} #{mw_name} #{php.to_s} Scenario
#[scn_set.id}"
+ puts " #{label} - Scenario #{scn_set.id} #{mw_name} #{php.to_s}
#{host_name} "
end
puts
@@ -439,9 +455,9 @@ module TestBench
results = @results[host][middleware][php][scn_set] =
PhptTestResult::Array.new()
end
- if results.length > @test_case_len
- raise 'TooManyResultsError' # shouldn't happen
- end
+# TODO if results.length > @test_case_len
+# raise 'TooManyResultsError' # shouldn't happen
+# end
results.push(result)
@@ -457,7 +473,7 @@ module TestBench
# user can follow telemetry in real-time
label = legend_label(host, php, middleware, scn_set)
- console_out(" [#{label}] #{tf}")
+ console_out(" [#{label}] Telemetry #{tf}")
end
@semaphore5.synchronize do
@@ -466,7 +482,7 @@ module TestBench
end
if do_finished_host_build_middleware_scenarios
- report = @test_bench.finished_host_build_middleware_scenarios(self,
tf, host, php, middleware, scenarios, results)
+ report = @test_bench.finished_host_build_middleware_scenarios(self,
tf, host, php, middleware, scn_set, results)
@semaphore4.synchronize do
# write list of scenarios tested
@@ -516,7 +532,7 @@ module TestBench
@labels2[host].keys.each do |mw_spec|
@labels2[host][mw_spec].keys.each do |php|
@labels2[host][mw_spec][php].keys.each do |scn_set|
- create_entries(host, mw_spec.new(host, php, scn_set), scn_set)
+ create_entries(host, mw_spec.new(host, php, scn_set), php,
scn_set, test_cases)
end
end
end
@@ -544,18 +560,18 @@ module TestBench
# 1. delete any remaining entries for this combo
delete_entries(host, middleware, scn_set, php)
# 2. recreate all of them
- create_entries(host, middleware, scn_set)
+ create_entries(host, middleware, php, scn_set, @test_cases)
end
def create_entries(host, middleware, php, scn_set, test_cases)
- test_cases.each do |test_case|
+ test_cases.flatten.each do |test_case| # TODO flatten
# make sure the test case is compatible too
- unless test_case.compatible(host, middleware, php, scn_set)
- next
- end
+# TODO unless test_case.compatible?(host, middleware, php, scn_set)
+# next
+# end
- @final_test_cases.push({:test_case=>test_case, :host=>host, :php=>php,
:middleware=>middleware, :scenarios=>scenarios})
+ @final_test_cases.push({:test_case=>test_case, :host=>host, :php=>php,
:middleware=>middleware, :scenarios=>scn_set})
end
end
diff --git a/PFTT/lib/test_bench/phpt.rb b/PFTT/lib/test_bench/phpt.rb
index fd5202b..dbe5b1c 100644
--- a/PFTT/lib/test_bench/phpt.rb
+++ b/PFTT/lib/test_bench/phpt.rb
@@ -38,21 +38,25 @@ module TestBench
single_thread_test_cases = []
#
- # TODO
- scenarios = test_case_sets[0][:scenarios][0]
+ # TODO
+ #puts test_case_sets.inspect
+ scn_set = test_case_sets[0][:scenarios]#.values
- fs_scn = scenarios[:working_file_system]
+ #fs_scn = test_case_sets[0][:scenarios].working_fs# TODO
[:working_file_system]
host = test_case_sets[0][:host]
middleware = test_case_sets[0][:middleware]
middleware.host = host
php = test_case_sets[0][:php]
test_cases = test_case_sets#[0]
+# if test_cases.is_a?(Array)
+# test_cases = test_cases.first # TODO
+# end
#
# create a temporary directory to deploy to. the working filesystem
scenario will
# decide where (either a local directory, remote SMB share, etc...)
- deploy_root = fs_scn.docroot(middleware)
+ deploy_root = scn_set.working_fs.docroot(middleware)
if $force_deploy
tmpdir = host.mktmpdir(deploy_root)
else
@@ -63,18 +67,19 @@ module TestBench
# run PHPTs in place unless $force_deploy (only true for the
'func_full' command or --force-deploy argument to 'func_part' command)
# parse all the phpt's and upload the files at the same time.
uploader = Thread.start{
- if $force_deploy or not host.exist?(tmpdir)
- puts 'uploading '+fs_scn.to_s;
- host.upload test_cases.path, tmpdir;
- puts 'uploaded.'
- end
+# TODO if $force_deploy or not host.exist?(tmpdir)
+# puts 'uploading '+scn_set.working_fs.to_s;
+# host.upload test_cases.path, tmpdir; #
+# puts 'uploaded.'
+# end
}
test_cases.each do |entry|
- entry[:test_case].parse!(tmpdir)
+ #puts entry.inspect
+ entry[:test_case].parse!()#tmpdir)
end
# note: each test_case is an instance of PhptTestCase
- puts %Q{selected #{test_cases.size} test cases}
+ puts %Q{selected #{test_ctx.test_case_len} test cases}
puts
# wait... does deployment and test case parsing at same time.
@@ -143,16 +148,16 @@ module TestBench
#
# see PhpTestResult::Array#generate_stats
- test_case.scn_list = scenarios
+ test_case.scn_list = scn_set#scenarios
# run the test case!
if $pftt_debug
- run_do_single_test_case(php, host, middleware, tmpdir,
deployed, skip_if_code_cache, skip_if_result_cache, test_ctx, test_cases,
test_case, fs_scn, scenarios)
+ run_do_single_test_case(php, host, middleware, tmpdir,
deployed, skip_if_code_cache, skip_if_result_cache, test_ctx, test_cases,
test_case, scn_set)
else
begin
- run_do_single_test_case(php, host, middleware, tmpdir,
deployed, skip_if_code_cache, skip_if_result_cache, test_ctx, test_cases,
test_case, fs_scn, scenarios)
+ run_do_single_test_case(php, host, middleware, tmpdir,
deployed, skip_if_code_cache, skip_if_result_cache, test_ctx, test_cases,
test_case, scn_set)
rescue
- test_ctx.add_exception(host, php, middleware, scenarios,
$!)
+ test_ctx.add_exception(host, php, middleware, scn_set,
$!)
end
end
@@ -204,8 +209,8 @@ module TestBench
#
end # end def run
- def run_do_single_test_case(php, host, middleware, tmpdir, deployed,
skip_if_code_cache, skip_if_result_cache, test_ctx, test_cases, test_case,
fs_scn, scenarios)
- do_single_test_case(php, host, middleware, tmpdir, deployed,
skip_if_code_cache, skip_if_result_cache, test_ctx, test_cases, test_case,
tmpdir, fs_scn, scenarios)
+ def run_do_single_test_case(php, host, middleware, tmpdir, deployed,
skip_if_code_cache, skip_if_result_cache, test_ctx, test_cases, test_case,
scn_set)
+ do_single_test_case(php, host, middleware, tmpdir, deployed,
skip_if_code_cache, skip_if_result_cache, test_ctx, test_cases, test_case,
tmpdir, scn_set)
end
def write_ext_file(telemetry_folder, ext_list, file_name)
@@ -223,14 +228,14 @@ module TestBench
f.close()
end
- def finished_host_build_middleware_scenarios(test_ctx, telemetry_folder,
host, php, middleware, scenarios, r)
+ def finished_host_build_middleware_scenarios(test_ctx, telemetry_folder,
host, php, middleware, scn_set, r)
r.telemetry_folder = telemetry_folder # ensure
report = Report::Run::PerHost::PerBuild::PerMiddleware::Func.new(host,
php, middleware, r)
# generate a combined INI for all scenarios for both platforms
- r.windows_ini = middleware.create_ini(scenarios, :windows)
- r.posix_ini = middleware.create_ini(scenarios, :posix)
+ r.windows_ini = middleware.create_ini(scn_set, :windows)
+ r.posix_ini = middleware.create_ini(scn_set, :posix)
ini_f = File.open(File.join(telemetry_folder, 'Posix.ini'), 'wb')
ini_f.puts(r.posix_ini.to_s)
@@ -248,7 +253,7 @@ module TestBench
return report
end
- def do_single_test_case(php, host, middleware, deploydir, deployed,
skip_if_code_cache, skip_if_result_cache, test_ctx, test_cases, test_case,
tmpdir, fs_scn, scenarios)
+ def do_single_test_case(php, host, middleware, deploydir, deployed,
skip_if_code_cache, skip_if_result_cache, test_ctx, test_cases, test_case,
tmpdir, scn_set)
tmiddleware = middleware.clone
#
@@ -256,7 +261,7 @@ module TestBench
# see http://qa.php.net/phpt_details.php#redirecttest_section
if test_case.parts.has_key?(:redirecttest)
# #mw_redirecttest requires a Middleware::Cli
- redirect_tests =
test_case.mw_redirecttest(tmiddleware.instance_of(Middleware::Cli)?tmiddleware:Middleware::Cli.new(host,
php, scenarios))
+ redirect_tests =
test_case.mw_redirecttest(tmiddleware.instance_of(Middleware::Cli)?tmiddleware:Middleware::Cli.new(host,
php, scn_set))
unless redirect_tests.empty?
test_ctx.add_tests(redirect_tests)
return # don't run the rest of this test case
@@ -302,7 +307,7 @@ module TestBench
begin
# run SKIPIF script
- skipif = tmiddleware.execute_php_script(deployed[:skipif],
test_case, :skipif, scenarios)[1]
+ skipif = tmiddleware.execute_php_script(deployed[:skipif],
test_case, :skipif, scn_set)[1]
# evaluate the result to see if we're supposed to skip this
test
check_skipif = skipif.downcase # preserve original skipif
result
@@ -355,13 +360,13 @@ module TestBench
out_err = ''
if $pftt_debug
- out_err = do_single_test_case_execute(deployed, test_case,
scenarios)
+ out_err = do_single_test_case_execute(deployed, test_case,
scn_set, tmiddleware)
else
begin
- out_err = do_single_test_case_execute(deployed, test_case,
scenarios)
+ out_err = do_single_test_case_execute(deployed, test_case,
scn_set, tmiddleware)
rescue
- test_ctx.add_exception(host, php, middleware, scenarios, $!)
+ test_ctx.add_exception(host, php, middleware, scn_set, $!)
end
end
@@ -389,41 +394,41 @@ module TestBench
#
# display, report and store result of this test case
if $pftt_debug
- do_single_test_case_result(test_ctx, host, php, middleware, test_case,
deploydir, result_spec)
+ do_single_test_case_result(test_ctx, host, php, middleware, scn_set,
test_case, deploydir, result_spec)
else
begin
- do_single_test_case_result(test_ctx, host, php, middleware,
test_case, deploydir, result_spec)
+ do_single_test_case_result(test_ctx, host, php, middleware, scn_set,
test_case, deploydir, result_spec)
rescue
end
end
#
end # def do_single_test_case
- def do_single_test_case_execute(deployed, test_case, scenarios)
- return tmiddleware.execute_php_script( deployed[:file], test_case,
:test, scenarios )[1]
+ def do_single_test_case_execute(deployed, test_case, scn_set, tmiddleware)
+ return tmiddleware.execute_php_script( deployed[:file], test_case,
:test, scn_set )[1]
end
- def do_single_test_case_result(test_ctx, host, php, middleware, test_case,
deploydir, result_spec)
+ def do_single_test_case_result(test_ctx, host, php, middleware, scn_set,
test_case, deploydir, result_spec)
result = nil
test_ctx.semaphore2.synchronize do
# don't modify result_spec, its cached/shared with other threads
a = result_spec[0]
# take the caught result and build the proper object out of it
- result = a.new( test_case, self, deploydir,
*result_spec[1...result_spec.length] )
+ result = a.new( test_case, self, deploydir, php,
*result_spec[1...result_spec.length] )
end
if result
# generate the diff here in the thread unlocked
if result.is_a?(PhptTestResult::Meaningful)
- result.generate_diff(test_ctx, host, middleware, php, scenarios,
test_ctx.tr)
+ result.generate_diff(test_ctx, host, middleware, php, scn_set,
test_ctx.tr)
end
# lookup Legend Label for this host/php/middleware combination
- label = test_ctx.legend_label(host, php, middleware, scenarios)
+ label = test_ctx.legend_label(host, php, middleware, scn_set)
test_ctx.console_out(" [#{label}] [#{result.status.to_s.upcase}]
#{@self} #{test_case.relative_path}")
- test_ctx.add_result(host, php, middleware, scenarios, result)
+ test_ctx.add_result(host, php, middleware, scn_set, result)
end
end
diff --git a/PFTT/pftt b/PFTT/pftt
new file mode 100644
index 0000000..71948af
--- /dev/null
+++ b/PFTT/pftt
@@ -0,0 +1,3 @@
+#!/bin/sh
+# TODO gem install bundler
+bundle exec ruby _pftt.rb $*
diff --git a/PFTT/pftt.cmd b/PFTT/pftt.cmd
index 664defb..f32c8aa 100644
--- a/PFTT/pftt.cmd
+++ b/PFTT/pftt.cmd
@@ -1,2 +1,3 @@
@echo off
+REM TODO gem install bundler
bundle exec ruby _pftt.rb %*
diff --git a/PFTT/pftt_server b/PFTT/pftt_server
new file mode 100644
index 0000000..b1bd3ec
--- /dev/null
+++ b/PFTT/pftt_server
@@ -0,0 +1,3 @@
+#!/bin/sh
+# TODO gem install bundler
+bundle exec ruby _pftt_server.rb $*
diff --git a/PFTT/pftt_server.cmd b/PFTT/pftt_server.cmd
index cc8c343..23783e9 100644
--- a/PFTT/pftt_server.cmd
+++ b/PFTT/pftt_server.cmd
@@ -1,2 +1,3 @@
@echo off
+REM TODO gem install bundler
bundle exec ruby _pftt_server.rb %*
diff --git a/PFTT/scripts/SDK4Win/SetupPHPSDK.cmd
b/PFTT/scripts/SDK4Win/SetupPHPSDK.cmd
index 2f859aa..6421aaa 100644
--- a/PFTT/scripts/SDK4Win/SetupPHPSDK.cmd
+++ b/PFTT/scripts/SDK4Win/SetupPHPSDK.cmd
@@ -35,7 +35,7 @@ IF NOT EXIST %PFTT_RESULTS% MKDIR %PFTT_RESULTS%
IF NOT EXIST %PFTT_SCRIPTS% MKDIR %PFTT_SCRIPTS%
IF NOT EXIST %PFTT_PHPS% MKDIR %PFTT_PHPS%
-set PATH=%PFTT_HOME%;%PFTT_HOME%\Scripts\SDK4Win\;%PATH%
+set
PATH=%PFTT_HOME%;%PFTT_HOME%\Scripts\SDK4Win\;%PATH%;%SYSTEMDRIVE%\Ruby192\bin
REM "%ProgramFiles%\Microsoft SDKs\Windows\v7.0\Bin\SetEnv.cmd" /xp /x86
/release