uttk 0.3.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +36 -0
- data/COPYING +18 -0
- data/ChangeLog +7673 -0
- data/GUIDELINES +86 -0
- data/LGPL +504 -0
- data/NEWS +158 -0
- data/NORM +137 -0
- data/README +180 -0
- data/Rakefile +8 -0
- data/SPEC.gemspec +15 -0
- data/SPEC.yml +60 -0
- data/TODO +23 -0
- data/TODO.old +31 -0
- data/VERSION +5 -0
- data/bin/getopts/uttk.rb +390 -0
- data/bin/uttk +188 -0
- data/bin/uttk-unit +125 -0
- data/lib/uttk.rb +288 -0
- data/lib/uttk/dumpers/Basic.rb +23 -0
- data/lib/uttk/dumpers/BasicColor.rb +35 -0
- data/lib/uttk/dumpers/Dumper.rb +77 -0
- data/lib/uttk/dumpers/Html.rb +271 -0
- data/lib/uttk/dumpers/Path.rb +24 -0
- data/lib/uttk/dumpers/Xml.rb +88 -0
- data/lib/uttk/dumpers/Yaml.rb +138 -0
- data/lib/uttk/filters.rb +128 -0
- data/lib/uttk/filters/Buffer.rb +119 -0
- data/lib/uttk/filters/Compact.rb +75 -0
- data/lib/uttk/filters/Default.rb +27 -0
- data/lib/uttk/filters/DefaultColor.rb +27 -0
- data/lib/uttk/filters/Filter.rb +53 -0
- data/lib/uttk/filters/Id.rb +30 -0
- data/lib/uttk/filters/JustStatus.rb +25 -0
- data/lib/uttk/filters/KeepSkipBased.rb +38 -0
- data/lib/uttk/filters/NodeCut.rb +97 -0
- data/lib/uttk/filters/RPathFilter.rb +134 -0
- data/lib/uttk/filters/Saver.rb +53 -0
- data/lib/uttk/filters/TextFilter.rb +69 -0
- data/lib/uttk/generators/dumper_generator.rb +28 -0
- data/lib/uttk/generators/filter_generator.rb +28 -0
- data/lib/uttk/generators/generator.rb +86 -0
- data/lib/uttk/generators/generator_generator.rb +26 -0
- data/lib/uttk/generators/loader_generator.rb +28 -0
- data/lib/uttk/generators/path_filter_generator.rb +28 -0
- data/lib/uttk/generators/strategy_generator.rb +28 -0
- data/lib/uttk/generators/templates/dumper.rb +50 -0
- data/lib/uttk/generators/templates/filter.rb +50 -0
- data/lib/uttk/generators/templates/generator.rb +28 -0
- data/lib/uttk/generators/templates/loader.rb +26 -0
- data/lib/uttk/generators/templates/path_filter.rb +28 -0
- data/lib/uttk/generators/templates/strategy.rb +59 -0
- data/lib/uttk/generators/templates/strategy.yml +28 -0
- data/lib/uttk/generators/templates/unit_test.rb +46 -0
- data/lib/uttk/loaders/Loader.rb +180 -0
- data/lib/uttk/loaders/Ruby.rb +28 -0
- data/lib/uttk/loaders/Yaml.rb +98 -0
- data/lib/uttk/logger.rb +306 -0
- data/lib/uttk/logger/backend.rb +170 -0
- data/lib/uttk/logger/path.rb +202 -0
- data/lib/uttk/logger/section_node.rb +214 -0
- data/lib/uttk/logger/severity.rb +63 -0
- data/lib/uttk/logger/to_uttk_log.rb +127 -0
- data/lib/uttk/logger/verbosity.rb +61 -0
- data/lib/uttk/logger_factory.rb +55 -0
- data/lib/uttk/path_filters/ColorStatus.rb +57 -0
- data/lib/uttk/path_filters/PathFilter.rb +27 -0
- data/lib/uttk/path_filters/RemoveTypes.rb +25 -0
- data/lib/uttk/status.rb +146 -0
- data/lib/uttk/strategies/Abort.rb +24 -0
- data/lib/uttk/strategies/Assert.rb +44 -0
- data/lib/uttk/strategies/Authors.rb +45 -0
- data/lib/uttk/strategies/Block.rb +113 -0
- data/lib/uttk/strategies/Bootstrap.rb +55 -0
- data/lib/uttk/strategies/Checkout.rb +64 -0
- data/lib/uttk/strategies/Clean.rb +29 -0
- data/lib/uttk/strategies/Cmd.rb +60 -0
- data/lib/uttk/strategies/CmdBase.rb +130 -0
- data/lib/uttk/strategies/Collection.rb +158 -0
- data/lib/uttk/strategies/Compile.rb +59 -0
- data/lib/uttk/strategies/Composite.rb +201 -0
- data/lib/uttk/strategies/Composite/contents_eval.rb +40 -0
- data/lib/uttk/strategies/Configure.rb +66 -0
- data/lib/uttk/strategies/Error.rb +23 -0
- data/lib/uttk/strategies/Fail.rb +26 -0
- data/lib/uttk/strategies/IOBased.rb +159 -0
- data/lib/uttk/strategies/Import.rb +60 -0
- data/lib/uttk/strategies/Iterate.rb +139 -0
- data/lib/uttk/strategies/JUnit.rb +205 -0
- data/lib/uttk/strategies/KillAll.rb +62 -0
- data/lib/uttk/strategies/Make.rb +94 -0
- data/lib/uttk/strategies/Package.rb +129 -0
- data/lib/uttk/strategies/PackageCollection.rb +78 -0
- data/lib/uttk/strategies/Pass.rb +24 -0
- data/lib/uttk/strategies/Pool.rb +104 -0
- data/lib/uttk/strategies/ProbabilityThreshold.rb +46 -0
- data/lib/uttk/strategies/Proxy.rb +42 -0
- data/lib/uttk/strategies/RMatch.rb +92 -0
- data/lib/uttk/strategies/RUnit.rb +132 -0
- data/lib/uttk/strategies/SignalCmd.rb +85 -0
- data/lib/uttk/strategies/Sleep.rb +36 -0
- data/lib/uttk/strategies/SqlQuery.rb +120 -0
- data/lib/uttk/strategies/Strategy.rb +683 -0
- data/lib/uttk/strategies/Stub.rb +37 -0
- data/lib/uttk/strategies/SubCmd.rb +77 -0
- data/lib/uttk/strategies/Suite.rb +71 -0
- data/lib/uttk/strategies/Test.rb +89 -0
- data/lib/uttk/streams.rb +69 -0
- data/lib/uttk/streams/Diff.rb +60 -0
- data/lib/uttk/streams/HexaDiff.rb +35 -0
- data/lib/uttk/streams/Stream.rb +76 -0
- data/lib/uttk/weights.rb +17 -0
- data/lib/uttk/weights/WExpr.rb +68 -0
- data/lib/uttk/weights/WFloat.rb +23 -0
- data/lib/uttk/weights/WMin.rb +22 -0
- data/lib/uttk/weights/Weight.rb +105 -0
- data/lib/www/javascripts/uttk.js +185 -0
- data/misc/expandtab.rb +29 -0
- data/misc/header.rb +44 -0
- data/misc/renaming +57 -0
- data/misc/textile_compiler +194 -0
- data/misc/uttk-grep.sh +8 -0
- data/misc/uttk-line-count.rb +143 -0
- data/test/examples-suite.yml +8 -0
- data/test/examples/README +68 -0
- data/test/examples/basic.rb +10 -0
- data/test/examples/basic.yml +9 -0
- data/test/examples/cache/cache_and_fatal.yml +5 -0
- data/test/examples/cache/simple.yml +30 -0
- data/test/examples/sql/basic.yml +24 -0
- data/test/examples/students-suite.yml +9 -0
- data/test/examples/students/ball.yml +11 -0
- data/test/examples/students/glob_stud.yml +20 -0
- data/test/examples/students/mini-lib.yml +61 -0
- data/test/examples/students/pool_stud.yml +31 -0
- data/test/examples/students/stud.yml +21 -0
- data/test/fixtures/ball/20040804-exam_a1-zapngo-tessar_m.tar.gz +0 -0
- data/test/fixtures/ball/Makefile +24 -0
- data/test/fixtures/ball/bar_p-mini-lib.tar.bz2 +0 -0
- data/test/fixtures/ball/bar_p-mini-lib/Makefile +20 -0
- data/test/fixtures/ball/bar_p-mini-lib/my_strlen.c +13 -0
- data/test/fixtures/ball/foo_s-mini-lib.tar.bz2 +0 -0
- data/test/fixtures/ball/foo_s-mini-lib/Makefile +20 -0
- data/test/fixtures/ball/foo_s-mini-lib/configure +2 -0
- data/test/fixtures/ball/foo_s-mini-lib/my_strlen.c +10 -0
- data/test/fixtures/ball/hello.tar.bz2 +0 -0
- data/test/fixtures/ball/hello.tar.gz +0 -0
- data/test/fixtures/ball/hello/Makefile +14 -0
- data/test/fixtures/ball/hello/hello.c +7 -0
- data/test/fixtures/ball/jack-exit.tar.bz2 +0 -0
- data/test/fixtures/ball/jack-exit/Makefile +14 -0
- data/test/fixtures/ball/jack-exit/exit.c +16 -0
- data/test/fixtures/ball/joe-exit.tar.bz2 +0 -0
- data/test/fixtures/ball/joe-exit/Makefile +14 -0
- data/test/fixtures/ball/joe-exit/exit.c +8 -0
- data/test/fixtures/ball/joe_i-mini-lib.tar.bz2 +0 -0
- data/test/fixtures/ball/joe_i-mini-lib/Makefile +20 -0
- data/test/fixtures/ball/joe_i-mini-lib/configure +2 -0
- data/test/fixtures/ball/joe_i-mini-lib/my_strlen.c +10 -0
- data/test/fixtures/ball/john-exit.tar.bz2 +0 -0
- data/test/fixtures/ball/john-exit/Makefile +14 -0
- data/test/fixtures/ball/john-exit/exit.c +6 -0
- data/test/fixtures/ball/qux_j-mini-lib.tar.bz2 +0 -0
- data/test/fixtures/ball/qux_j-mini-lib/Makefile +20 -0
- data/test/fixtures/ball/qux_j-mini-lib/my_strlen.c +12 -0
- data/test/fixtures/binaries/segv +0 -0
- data/test/fixtures/binaries/segv.c +10 -0
- data/test/fixtures/binaries/segv.rb +2 -0
- data/test/fixtures/demo/command-tutorial/steps/1/check.yml +5 -0
- data/test/fixtures/demo/command-tutorial/steps/1/pluralizer.rb +10 -0
- data/test/fixtures/demo/command-tutorial/steps/2/bad_check.yml +7 -0
- data/test/fixtures/demo/command-tutorial/steps/2/check.yml +7 -0
- data/test/fixtures/demo/command-tutorial/steps/2/pluralizer.rb +10 -0
- data/test/fixtures/demo/command-tutorial/steps/3.1/check.yml +12 -0
- data/test/fixtures/demo/command-tutorial/steps/3/check.yml +14 -0
- data/test/fixtures/demo/command-tutorial/steps/4.1/bird.txt +1 -0
- data/test/fixtures/demo/command-tutorial/steps/4.1/check.yml +12 -0
- data/test/fixtures/demo/command-tutorial/steps/4/check.yml +12 -0
- data/test/fixtures/demo/command-tutorial/steps/4/pluralizer.rb +12 -0
- data/test/fixtures/demo/command-tutorial/steps/5.1/bird.txt +1 -0
- data/test/fixtures/demo/command-tutorial/steps/5.1/check.yml +17 -0
- data/test/fixtures/demo/command-tutorial/steps/5.1/pluralizer.rb +17 -0
- data/test/fixtures/demo/command-tutorial/steps/5/bird.txt +1 -0
- data/test/fixtures/demo/command-tutorial/steps/5/check.yml +16 -0
- data/test/fixtures/demo/command-tutorial/steps/5/pluralizer.rb +16 -0
- data/test/fixtures/demo/command-tutorial/steps/6.1/bird.txt +1 -0
- data/test/fixtures/demo/command-tutorial/steps/6.1/check.yml +22 -0
- data/test/fixtures/demo/command-tutorial/steps/6.1/pluralizer.rb +17 -0
- data/test/fixtures/demo/command-tutorial/steps/6/bird.txt +1 -0
- data/test/fixtures/demo/command-tutorial/steps/6/check.yml +21 -0
- data/test/fixtures/demo/command-tutorial/steps/6/pluralizer.rb +17 -0
- data/test/fixtures/demo/command-tutorial/steps/7/bird.txt +1 -0
- data/test/fixtures/demo/command-tutorial/steps/7/check.yml +22 -0
- data/test/fixtures/demo/command-tutorial/steps/7/pluralizer.rb +17 -0
- data/test/fixtures/demo/filter-tutorial/check.yml +20 -0
- data/test/fixtures/demo/filter-tutorial/filters/CutSkip100.rb +19 -0
- data/test/fixtures/demo/filter-tutorial/pluralizer.rb +17 -0
- data/test/fixtures/java/unit/MultiRight/Foo/Foo.java +11 -0
- data/test/fixtures/java/unit/MultiRight/Foo/FooTest.java +15 -0
- data/test/fixtures/java/unit/MultiRight/MultiRight.java +13 -0
- data/test/fixtures/java/unit/MultiRight/MultiRightTest.java +12 -0
- data/test/fixtures/java/unit/MultiRight/bar/Bar.java +11 -0
- data/test/fixtures/java/unit/MultiRight/bar/BarTest.java +21 -0
- data/test/fixtures/java/unit/MultiRight/build.sh +7 -0
- data/test/fixtures/java/unit/SimpleException/SimpleExceptionTest.java +11 -0
- data/test/fixtures/java/unit/SimpleException/build.sh +4 -0
- data/test/fixtures/java/unit/build.sh +9 -0
- data/test/fixtures/java/unit/multibar.yml +6 -0
- data/test/fixtures/java/unit/multifoo.yml +6 -0
- data/test/fixtures/java/unit/multiright.yml +8 -0
- data/test/fixtures/java/unit/simple_exception.yml +6 -0
- data/test/fixtures/mini-lib/Makefile +9 -0
- data/test/fixtures/mini-lib/strlen.c +15 -0
- data/test/fixtures/package/pkg_foo.tar.gz +0 -0
- data/test/fixtures/package/pkg_foo/Makefile +20 -0
- data/test/fixtures/package/pkg_foo/bootstrap +3 -0
- data/test/fixtures/package/pkg_foo/configure +3 -0
- data/test/fixtures/package/pkg_foo/foo.sh +2 -0
- data/test/fixtures/text/1.txt +4 -0
- data/test/fixtures/unit/bad.rb +26 -0
- data/test/fixtures/unit/error.rb +6 -0
- data/test/fixtures/unit/good.rb +26 -0
- data/test/functional-suite.yml +10 -0
- data/test/functional/author.yml +11 -0
- data/test/functional/base.yml +119 -0
- data/test/functional/base_pool.yml +13 -0
- data/test/functional/block.yml +13 -0
- data/test/functional/cat.yml +16 -0
- data/test/functional/cmd.yml +17 -0
- data/test/functional/diff.yml +27 -0
- data/test/functional/env_cmd.yml +53 -0
- data/test/functional/exit.yml +15 -0
- data/test/functional/fatal.yml +23 -0
- data/test/functional/glob.yml +11 -0
- data/test/functional/hexa-diff.yml +25 -0
- data/test/functional/import.yml +41 -0
- data/test/functional/iterate.yml +99 -0
- data/test/functional/killall.yml +31 -0
- data/test/functional/pkg.yml +14 -0
- data/test/functional/probability_threshold.yml +35 -0
- data/test/functional/r_unit.yml +26 -0
- data/test/functional/rmatch.yml +122 -0
- data/test/functional/signal_cmd.yml +22 -0
- data/test/functional/sub.yml +15 -0
- data/test/functional/test.yml +25 -0
- data/test/functional/timeout.yml +20 -0
- data/test/functional/wc.yml +26 -0
- data/test/functional/weight.yml +152 -0
- data/test/pkg-suite.yml +8 -0
- data/test/pkg/cmdline.yml +80 -0
- data/test/pool-suite.yml +8 -0
- data/test/pool/base.yml +12 -0
- data/test/pool/pool.yml +25 -0
- data/test/ruby-suite.rb +10 -0
- data/test/ruby-suite.yml +5 -0
- data/test/ruby/base.rb +119 -0
- data/test/ruby/iterate.rb +21 -0
- data/test/ruby/wc.rb +43 -0
- data/test/unit-suite.yml +10 -0
- data/test/unit/dumpers/path_test.rb +46 -0
- data/test/unit/dumpers/xml_test.rb +65 -0
- data/test/unit/dumpers/yaml_test.rb +65 -0
- data/test/unit/filters/buffer_test.rb +168 -0
- data/test/unit/filters/keep_skip_based_test.rb +46 -0
- data/test/unit/filters/node_cut_test.rb +72 -0
- data/test/unit/filters/rpath_filter_test.rb +191 -0
- data/test/unit/filters/text_filter_test.rb +46 -0
- data/test/unit/filters_test.rb +119 -0
- data/test/unit/logger/section_node_test.rb +120 -0
- data/test/unit/logger/severity_test.rb +37 -0
- data/test/unit/logger/to_uttk_log_test.rb +113 -0
- data/test/unit/logger/verbosity_test.rb +44 -0
- data/test/unit/logger_test.rb +203 -0
- data/test/unit/strategies/suite_test.rb +151 -0
- data/test/uttk-check.yml +8 -0
- data/test/uttk-distcheck.yml +18 -0
- metadata +399 -0
data/bin/uttk
ADDED
@@ -0,0 +1,188 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Author:: The Uttk Team.
|
3
|
+
# Copyright:: Copyright (c) 2004, 2005 Uttk team. All rights reserved.
|
4
|
+
# License:: LGPL
|
5
|
+
# $Id: /w/fey/uttk/trunk/bin/uttk 22095 2006-02-21T17:17:56.386215Z pouillar $
|
6
|
+
|
7
|
+
begin
|
8
|
+
require 'pathname'
|
9
|
+
|
10
|
+
ME = Pathname.new($0).basename unless defined? ME
|
11
|
+
ME_DIR = Pathname.new(__FILE__).dirname unless defined? ME_DIR
|
12
|
+
|
13
|
+
$PROGRAME_NAME = ME
|
14
|
+
$PROGRAME_NAME.freeze
|
15
|
+
$VERBOSE = true # you can use 'export RUBYOPT="-w"' too
|
16
|
+
|
17
|
+
Uttk_BIN = true
|
18
|
+
|
19
|
+
require Pathname.new(__FILE__).dirname.parent + 'lib/uttk' unless defined? Uttk
|
20
|
+
|
21
|
+
module Uttk
|
22
|
+
SPEC_YML = ME_DIR.parent + 'SPEC.yml'
|
23
|
+
SPEC = YAML::load(SPEC_YML.read)
|
24
|
+
VERSION = SPEC['version']
|
25
|
+
VERSION_PATH = ME_DIR.parent + 'VERSION'
|
26
|
+
AUTHORS_PATH = ME_DIR.parent + 'AUTHORS'
|
27
|
+
require 'erb'
|
28
|
+
VERSION_TEXT = ERB.new(VERSION_PATH.read, nil, '<%>').result(binding)
|
29
|
+
end
|
30
|
+
|
31
|
+
require "#{ME_DIR}/getopts/uttk"
|
32
|
+
|
33
|
+
argv = ARGV.dup
|
34
|
+
opts = Uttk::Getopts::Uttk.parse(argv)
|
35
|
+
|
36
|
+
require 'profile' if opts[:profile]
|
37
|
+
|
38
|
+
if opts[:cache_dir] and opts[:cache_dir] != TempPath.tmpdir
|
39
|
+
TempPath.tmpdir.rmdir
|
40
|
+
opts[:cache_dir].mv(TempPath.tmpdir)
|
41
|
+
opts[:cache_dir] = TempPath.tmpdir
|
42
|
+
opts[:cache_mode] ||= true
|
43
|
+
end
|
44
|
+
|
45
|
+
symtbl = Uttk.default_symtbl(opts).new_child
|
46
|
+
log = symtbl[:log]
|
47
|
+
at_exit { log.close }
|
48
|
+
|
49
|
+
t = argv.uttk_testify(symtbl)
|
50
|
+
|
51
|
+
# Load the cache file if cache_dir is set.
|
52
|
+
if cache_dir = opts[:cache_dir]
|
53
|
+
cache = cache_dir + 'cache.yml'
|
54
|
+
t.symtbl[:use_cache] = YAML.parse(cache.read).symbol_safe_transform
|
55
|
+
end
|
56
|
+
|
57
|
+
# Disable the automatic cleaning of TempPath for the cache mode.
|
58
|
+
if opts[:cache_mode]
|
59
|
+
TempPath.auto_clean = false
|
60
|
+
end
|
61
|
+
|
62
|
+
# Run the root test.
|
63
|
+
status = t.run
|
64
|
+
|
65
|
+
|
66
|
+
# Generate the cache file.
|
67
|
+
if opts[:cache_mode]
|
68
|
+
cache_file = TempPath.tmpdir + 'cache.yml'
|
69
|
+
cache = t.symtbl[:cache]
|
70
|
+
t.symtbl.local.delete :cache
|
71
|
+
cache.each do |name, test|
|
72
|
+
todel = [:use_cache]
|
73
|
+
test[:symtbl].each do |k, v|
|
74
|
+
if [SynFlow, SynFlowFactory].any? { |klass| v.is_a? klass }
|
75
|
+
todel << k
|
76
|
+
end
|
77
|
+
end
|
78
|
+
todel.each { |k| test[:symtbl].delete(k) }
|
79
|
+
end
|
80
|
+
cache_file.open('w') { |f| f.puts cache.to_yaml }
|
81
|
+
end
|
82
|
+
|
83
|
+
relaunch = TempPath.tmpdir + 'relaunch'
|
84
|
+
|
85
|
+
if opts[:cache_mode]
|
86
|
+
|
87
|
+
# Update the argument for the cache mode
|
88
|
+
ARGV.delete '-C'
|
89
|
+
if ARGV.include? '--cache-dir'
|
90
|
+
ind = ARGV.index('--cache-dir') + 1
|
91
|
+
ARGV[ind] = TempPath.tmpdir.to_s
|
92
|
+
else
|
93
|
+
ARGV << '--cache-dir' << TempPath.tmpdir.to_s
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
if (opts[:cache_mode] or opts[:cache_dir]) and not status.pass?
|
99
|
+
raise 'HighLine is unavailable' unless defined? HighLine
|
100
|
+
h = HighLine.new
|
101
|
+
# Ask the user what to do.
|
102
|
+
if h.agree 'Would you relaunch the test suite now (use the cache) (y/n)', true
|
103
|
+
pid = Kernel.fork do
|
104
|
+
Kernel.exec Config::CONFIG['RUBY_INSTALL_PATH'], $0, *ARGV
|
105
|
+
end
|
106
|
+
Process.waitpid pid
|
107
|
+
exit
|
108
|
+
else
|
109
|
+
if h.agree 'Would you remove the temporary dir (y/n)', true
|
110
|
+
TempPath.auto_clean = true
|
111
|
+
else
|
112
|
+
TempPath.auto_clean = false
|
113
|
+
# Generate a little helper script to use the cache mode.
|
114
|
+
unless relaunch.exist?
|
115
|
+
relaunch.open('w') do |f|
|
116
|
+
f.puts '#!/usr/bin/env ruby'
|
117
|
+
f.puts "
|
118
|
+
|Kernel.exec #{Config::CONFIG['RUBY_INSTALL_PATH'].inspect},
|
119
|
+
| #{$0.inspect}, *#{ARGV.inspect}
|
120
|
+
|".head_cut!
|
121
|
+
end
|
122
|
+
relaunch.chmod(0500)
|
123
|
+
end
|
124
|
+
|
125
|
+
STDERR.puts "
|
126
|
+
|
|
127
|
+
|--- |
|
128
|
+
|
|
129
|
+
| /------------------------------------------------------------------.
|
130
|
+
| | Uttk was running in cache mode to re-run the same one just type: |
|
131
|
+
| | #{relaunch.to_s.ljust(63)}|
|
132
|
+
| `------------------------------------------------------------------/
|
133
|
+
|".head_cut!
|
134
|
+
end
|
135
|
+
end
|
136
|
+
else
|
137
|
+
TempPath.auto_clean = true
|
138
|
+
end
|
139
|
+
|
140
|
+
# Handle the --dump-status option.
|
141
|
+
STDOUT.puts status.to_yaml if opts[:dump_status]
|
142
|
+
|
143
|
+
unless status.pass?
|
144
|
+
|
145
|
+
if not opts[:dump_status] # FIXME and filter contains Default
|
146
|
+
STDERR.puts "
|
147
|
+
|
|
148
|
+
|--- |
|
149
|
+
| /-----------------------------------------------------------------------------.
|
150
|
+
| | *** Some tests failed *** |
|
151
|
+
| | The last status was not PASS but something like FAIL(42%) (just FAIL stands |
|
152
|
+
| | for FAIL(0%)). This means that 42% of tests *pass* but 100% was expected. |
|
153
|
+
| | To investigate results these different outputs are available: |
|
154
|
+
| | - the standard output is the shortest one (like a progression bar). |
|
155
|
+
| | - log.html contains an HTML/JavaScript page nice to display big outputs. |
|
156
|
+
| | - log.yml contains more information in the very readable YAML format. |
|
157
|
+
| | - log.xml contains the output as an XML document. |
|
158
|
+
| `-----------------------------------------------------------------------------/
|
159
|
+
|".head_cut!
|
160
|
+
end
|
161
|
+
exit(2)
|
162
|
+
end
|
163
|
+
|
164
|
+
rescue SystemExit
|
165
|
+
raise
|
166
|
+
rescue Exception => ex
|
167
|
+
|
168
|
+
TempPath.auto_clean = true if defined? TempPath
|
169
|
+
Thread.critical = true if defined? Thread
|
170
|
+
raise ex if ex.is_a? SystemExit
|
171
|
+
if defined? OptionParser and ex.is_a? OptionParser::ParseError
|
172
|
+
Uttk::Getopts::Uttk.usage
|
173
|
+
puts
|
174
|
+
if log.nil?
|
175
|
+
STDERR.puts "ERROR:\n #{ex.to_s} (OptionParser)"
|
176
|
+
else
|
177
|
+
log.error { ex }
|
178
|
+
end
|
179
|
+
elsif log.nil?
|
180
|
+
raise ex
|
181
|
+
else
|
182
|
+
log.error { ex }
|
183
|
+
end
|
184
|
+
exit(1)
|
185
|
+
|
186
|
+
end
|
187
|
+
|
188
|
+
exit(0)
|
data/bin/uttk-unit
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Copyright:: Copyright (c) 2005 Uttk Team. All rights reserved.
|
3
|
+
# Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
|
4
|
+
# License:: Gnu General Public License.
|
5
|
+
# Revision:: $Id$
|
6
|
+
|
7
|
+
|
8
|
+
# FIXME add a configuration file
|
9
|
+
# conf:
|
10
|
+
# load_path: ../lib # relative to the place of the configuration file
|
11
|
+
# requires:
|
12
|
+
class UttkUnit
|
13
|
+
|
14
|
+
def initialize ( argv )
|
15
|
+
@argv = argv
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
def parse_options
|
20
|
+
@options = OpenStruct.new(:load_path => [],
|
21
|
+
:actions => [],
|
22
|
+
:uttk => nil,
|
23
|
+
:verbose => true,
|
24
|
+
:mode => :require)
|
25
|
+
|
26
|
+
OptionParser.new do |o|
|
27
|
+
o.on('-I', '--include DIR', 'Add this directory to $LOAD_PATH') do |dir|
|
28
|
+
@options.load_path << dir
|
29
|
+
@options.actions << proc { dir.to_path.load_path! if defined? CoreEx }
|
30
|
+
end
|
31
|
+
o.on('-r', '--require FEATURE', 'Require this file') do |file|
|
32
|
+
@options.actions << proc { require file }
|
33
|
+
end
|
34
|
+
o.on('--import NAME', 'Import this constant') do |const|
|
35
|
+
@options.actions << proc { const.constantize.import! }
|
36
|
+
end
|
37
|
+
o.on('--mode import|require|nothing', [:import, :require, :nothing],
|
38
|
+
'Set the loading mode for unit tests [default: require]') do |mode|
|
39
|
+
@options.mode = mode
|
40
|
+
end
|
41
|
+
o.on('-w', '--[no-]verbose', 'Turn on/off the verbose mode [default: on]') do |b|
|
42
|
+
@options.verbose = b
|
43
|
+
end
|
44
|
+
o.on('--uttk FILE', 'Require this Uttk (`no\' to disable)') do |file|
|
45
|
+
@options.uttk = file
|
46
|
+
end
|
47
|
+
end.parse!(@argv)
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
def requires
|
52
|
+
require 'pathname'
|
53
|
+
require 'ostruct'
|
54
|
+
require 'optparse'
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
def run
|
59
|
+
raise 'Do not load CoreEx before uttk-unit' if defined? CoreEx
|
60
|
+
|
61
|
+
requires
|
62
|
+
|
63
|
+
parse_options
|
64
|
+
|
65
|
+
files = []
|
66
|
+
options = false
|
67
|
+
argv = ARGV.dup
|
68
|
+
ARGV.replace([])
|
69
|
+
argv.each do |arg|
|
70
|
+
if options
|
71
|
+
ARGV << arg
|
72
|
+
next
|
73
|
+
end
|
74
|
+
if arg == '--'
|
75
|
+
options = true
|
76
|
+
else
|
77
|
+
files << Pathname.new(arg).cleanpath
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
quoted_paths = files.map { |s| Regexp.quote(s) }
|
82
|
+
re_paths = Regexp.new("(#{quoted_paths.join '|'})")
|
83
|
+
|
84
|
+
Kernel.const_set(:EMBEDDED_TEST_MODE, re_paths)
|
85
|
+
|
86
|
+
@options.load_path.each { |dir| $LOAD_PATH << dir }
|
87
|
+
|
88
|
+
root = Pathname.new(__FILE__).dirname.parent
|
89
|
+
|
90
|
+
if @options.uttk.nil?
|
91
|
+
require((root + 'lib' + 'uttk').to_s)
|
92
|
+
elsif @options.uttk != 'no'
|
93
|
+
require @options.uttk
|
94
|
+
end
|
95
|
+
|
96
|
+
@options.actions.each { |block| block[] }
|
97
|
+
|
98
|
+
raise 'CoreEx not loaded' unless defined? CoreEx
|
99
|
+
|
100
|
+
Test::Unit::UI::Yaml::TestRunner.import!
|
101
|
+
|
102
|
+
$VERBOSE = @options.verbose
|
103
|
+
|
104
|
+
files.each do |arg|
|
105
|
+
path = Pathname.new(arg).ext.to_s
|
106
|
+
|
107
|
+
case @options.mode
|
108
|
+
when :import
|
109
|
+
path = path.camelize if path !~ /[A-Z]/ or path =~ /[.\/]/
|
110
|
+
path.constantize.import!
|
111
|
+
when :require
|
112
|
+
require path
|
113
|
+
when :nothing
|
114
|
+
else raise "Bad loading mode: #{@options.mode}"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
run_embedded_test_sections
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
end # class UttkUnit
|
123
|
+
|
124
|
+
|
125
|
+
UttkUnit.new(ARGV).run
|
data/lib/uttk.rb
ADDED
@@ -0,0 +1,288 @@
|
|
1
|
+
# Author:: The Uttk team
|
2
|
+
# Copyright:: Copyright (c) 2004, 2005 Uttk team. All rights reserved.
|
3
|
+
# License:: LGPL
|
4
|
+
# $Id: /w/fey/uttk/trunk/lib/uttk.rb 22081 2006-02-21T15:10:48.580983Z pouillar $
|
5
|
+
|
6
|
+
#
|
7
|
+
# = Description
|
8
|
+
#
|
9
|
+
# Interface module of the Uttk library. This file must be included by every
|
10
|
+
# Uttk's users.
|
11
|
+
#
|
12
|
+
|
13
|
+
#
|
14
|
+
# = Introduction
|
15
|
+
#
|
16
|
+
# This is the Uttk namespace. All Uttk is included into this namespace. This
|
17
|
+
# module provides some function to set up and run a Uttk pipeline.
|
18
|
+
#
|
19
|
+
# = How to use Uttk as a library
|
20
|
+
#
|
21
|
+
# FIXME: document me
|
22
|
+
module Uttk
|
23
|
+
|
24
|
+
require 'pathname'
|
25
|
+
|
26
|
+
lib = Pathname.new(__FILE__).dirname
|
27
|
+
vendor = lib.parent + 'vendor'
|
28
|
+
unless defined? RubyEx
|
29
|
+
$CORE_EX_VENDORS ||= []
|
30
|
+
$CORE_EX_VENDORS << vendor
|
31
|
+
file = vendor + 'ruby_ex' + 'lib' + 'ruby_ex.rb'
|
32
|
+
if file.exist?
|
33
|
+
require file.to_s
|
34
|
+
else
|
35
|
+
require 'rubygems'
|
36
|
+
require_gem 'ruby_ex'
|
37
|
+
require 'ruby_ex'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
$LOADED_FEATURES << 'uttk.rb'
|
41
|
+
lib.load_path!
|
42
|
+
RubyEx.import!
|
43
|
+
mattr_accessor :dir, :load_path
|
44
|
+
self.dir = lib + 'uttk'
|
45
|
+
self.load_path = [dir]
|
46
|
+
silence_warnings { core_ex_require 'action_view', 'actionpack' }
|
47
|
+
|
48
|
+
|
49
|
+
# Standard library requirements
|
50
|
+
require 'stringio'
|
51
|
+
require 'ostruct'
|
52
|
+
require 'tmpdir'
|
53
|
+
require 'thread'
|
54
|
+
require 'mutex_m'
|
55
|
+
require 'benchmark'
|
56
|
+
require 'rbconfig'
|
57
|
+
conf = Config::CONFIG
|
58
|
+
conf['RUBY_INSTALL_PATH'] = "#{conf['bindir']}/#{conf['RUBY_INSTALL_NAME']}"
|
59
|
+
|
60
|
+
# RubyEx requirements
|
61
|
+
SymTblGsub.import!
|
62
|
+
SynFlow.import!
|
63
|
+
Module::InstanceMethodVisibility.import!
|
64
|
+
AutoloadTree.import!
|
65
|
+
OrderedHash.import!
|
66
|
+
Abstract.import!
|
67
|
+
ConstRegexp.import!
|
68
|
+
HashEval.import!
|
69
|
+
RPath.import!
|
70
|
+
Commands.import!
|
71
|
+
Version.import!
|
72
|
+
URI::GenericEx.import!
|
73
|
+
|
74
|
+
# Mother exception of every exception thrown by Uttk.
|
75
|
+
class UttkException < Exception
|
76
|
+
end
|
77
|
+
|
78
|
+
# Uttk library requirements
|
79
|
+
require 'uttk/logger'
|
80
|
+
require 'uttk/logger_factory'
|
81
|
+
require 'uttk/streams'
|
82
|
+
|
83
|
+
# Autoload modules
|
84
|
+
def pathname_to_class(p)
|
85
|
+
const = p.basename.to_s.sub(/\.rb$/, '')
|
86
|
+
if const =~ ConstRegexp::RB_CONST
|
87
|
+
const
|
88
|
+
else
|
89
|
+
raise(ArgumentError,
|
90
|
+
"`#{p.to_s}' - your file doesn't follow our convention, " +
|
91
|
+
"the filename must be equal to the class name you declared into.")
|
92
|
+
nil
|
93
|
+
end
|
94
|
+
end
|
95
|
+
module_function :pathname_to_class
|
96
|
+
|
97
|
+
UTTK_MODULES = []
|
98
|
+
|
99
|
+
class ::Module
|
100
|
+
def uttk_module
|
101
|
+
module_eval do
|
102
|
+
UTTK_MODULES << self
|
103
|
+
|
104
|
+
def self.module_dirs
|
105
|
+
mod = name.demodulize.underscore
|
106
|
+
Uttk.load_path.map { |path| path/mod }
|
107
|
+
end
|
108
|
+
|
109
|
+
def self.setup_autoload
|
110
|
+
module_dirs.each do |module_dir|
|
111
|
+
if module_dir.directory? and module_dir.readable? and module_dir.executable?
|
112
|
+
autoload_tree(module_dir, false) do |p|
|
113
|
+
Uttk.pathname_to_class(p)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
setup_autoload
|
119
|
+
|
120
|
+
def self.define_module
|
121
|
+
module_dirs.each do |module_dir|
|
122
|
+
def_file = Pathname.new("#{module_dir}.rb")
|
123
|
+
if def_file.readable?
|
124
|
+
require def_file.to_s
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
define_module
|
129
|
+
|
130
|
+
def self.each_module_name ( &block )
|
131
|
+
Pathname.glob('{' + module_dirs.join(',') + '}/**/*.rb') do |path|
|
132
|
+
block[path.basename.ext.to_s.to_sym]
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def self.setup_autoload_all
|
141
|
+
UTTK_MODULES.each do |uttk_module|
|
142
|
+
uttk_module.setup_autoload
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
class ObserverError < ArgumentError
|
147
|
+
def initialize ( anObject )
|
148
|
+
@obs = anObject
|
149
|
+
end
|
150
|
+
def to_s
|
151
|
+
"observer needs to respond to `update' (#{@obs.inspect})"
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
module Weights
|
156
|
+
uttk_module
|
157
|
+
end
|
158
|
+
|
159
|
+
require 'uttk/status'
|
160
|
+
|
161
|
+
module Dumpers
|
162
|
+
uttk_module
|
163
|
+
end
|
164
|
+
|
165
|
+
module Loaders
|
166
|
+
uttk_module
|
167
|
+
end
|
168
|
+
|
169
|
+
module PathFilters
|
170
|
+
uttk_module
|
171
|
+
end
|
172
|
+
|
173
|
+
module Filters
|
174
|
+
uttk_module
|
175
|
+
end
|
176
|
+
|
177
|
+
module Strategies
|
178
|
+
uttk_module
|
179
|
+
end
|
180
|
+
|
181
|
+
# Modules shortcuts
|
182
|
+
S = Strategies
|
183
|
+
L = Loaders
|
184
|
+
D = Dumpers
|
185
|
+
F = Filters
|
186
|
+
W = Weights
|
187
|
+
|
188
|
+
# Set default options
|
189
|
+
DEFAULT_OPTIONS = {
|
190
|
+
:observers => [],
|
191
|
+
:backend => STDOUT.tty? ? 'DefaultColor' : 'Default',
|
192
|
+
:loader => Loaders::Yaml,
|
193
|
+
:wclass => Weights::Default,
|
194
|
+
:attributes => {}, #FIXME: freeze
|
195
|
+
:symbols => {}, #FIXME: freeze
|
196
|
+
:log_severity => Logger::Severity::INFO,
|
197
|
+
:log_verbosity => 0,
|
198
|
+
:log_section => [], #FIXME: freeze
|
199
|
+
:benchmark => false,
|
200
|
+
:profile => false,
|
201
|
+
:dump_status => false,
|
202
|
+
:cache_mode => false,
|
203
|
+
:cache_proc => DumpableProc.new('|test, status|
|
204
|
+
status.pass? or (status.is_a? Uttk::SkipStatus and status.weight.pass?)'
|
205
|
+
).freeze,
|
206
|
+
}.freeze
|
207
|
+
|
208
|
+
def self.default_options
|
209
|
+
DEFAULT_OPTIONS
|
210
|
+
end
|
211
|
+
|
212
|
+
# Return the default symbol table
|
213
|
+
def self.default_symtbl ( options=default_options,
|
214
|
+
log_factory=default_log_factory(options),
|
215
|
+
log=default_log(options, log_factory))
|
216
|
+
symtbl = SymTbl.new(options)
|
217
|
+
symtbl[:uttk] = Pathname.new($0).expand_path
|
218
|
+
symtbl[:ruby] = Config::CONFIG['RUBY_INSTALL_PATH']
|
219
|
+
symtbl[:'uttk-unit'] = symtbl[:uttk_unit] =
|
220
|
+
(Uttk.dir.parent.parent/'bin'/'uttk-unit').expand_path.cleanpath
|
221
|
+
symtbl[:core_ex] = CoreEx.dir
|
222
|
+
symtbl[:symtbl_class] = symtbl.class
|
223
|
+
symtbl[:pwd] = Pathname.pwd.expand_path
|
224
|
+
symtbl[:loader] = options[:loader].new
|
225
|
+
symtbl[:log_factory] = log_factory
|
226
|
+
symtbl[:log] = log
|
227
|
+
symtbl[:cache] = {}
|
228
|
+
symtbl[:cache_proc] = options[:cache_proc]
|
229
|
+
symtbl[:suite_name] = 'root'
|
230
|
+
symtbl
|
231
|
+
end
|
232
|
+
|
233
|
+
# Return the default logger factory
|
234
|
+
def self.default_log_factory ( options=default_options )
|
235
|
+
log_factory = LoggerFactory.new
|
236
|
+
if ENV.has_key?('UTTK_SEVERITY')
|
237
|
+
log_factory.severity_level = ENV['UTTK_SEVERITY']
|
238
|
+
else
|
239
|
+
log_factory.severity_level = options[:log_severity]
|
240
|
+
end
|
241
|
+
log_factory.verbosity_level = options[:log_verbosity]
|
242
|
+
log_factory.section_tree << Logger::SectionNode.new('basicObserver')
|
243
|
+
log_factory.active_section = options[:log_section]
|
244
|
+
log_factory
|
245
|
+
end
|
246
|
+
|
247
|
+
# Return the default logger factory
|
248
|
+
def self.default_log ( options=default_options,
|
249
|
+
log_factory=default_log_factory(options) )
|
250
|
+
log = log_factory.create
|
251
|
+
options[:observers] << options[:backend] if options[:observers].empty?
|
252
|
+
options[:observers].each do |backend|
|
253
|
+
Filters[backend].each do |obsv|
|
254
|
+
raise ObserverError, obsv unless obsv.respond_to? :update
|
255
|
+
log.add_observer(obsv)
|
256
|
+
end
|
257
|
+
end
|
258
|
+
log.info_basicObserver do
|
259
|
+
log.add_observer(Uttk::Dumpers::Basic.new(STDERR))
|
260
|
+
nil
|
261
|
+
end
|
262
|
+
log
|
263
|
+
end
|
264
|
+
|
265
|
+
# Evaluate code in the context of the Uttk module
|
266
|
+
def self.uttk_eval(string, symtbl, filename=__FILE__, lineno=1)
|
267
|
+
eval(string, binding, filename, lineno)
|
268
|
+
end
|
269
|
+
|
270
|
+
def self.bin
|
271
|
+
Config::CONFIG["RUBY_INSTALL_NAME"].to_cmd[dir.parent.parent + 'bin/uttk']
|
272
|
+
end
|
273
|
+
|
274
|
+
end # module Uttk
|
275
|
+
|
276
|
+
class Class
|
277
|
+
alias_method :old_to_yaml, :to_yaml
|
278
|
+
def to_yaml ( opts={} )
|
279
|
+
to_s.to_yaml(opts)
|
280
|
+
end
|
281
|
+
def is_complex_yaml?
|
282
|
+
false
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
if $0.to_path.basename.to_s == 'uttk' and not defined? Uttk_BIN
|
287
|
+
load Uttk::LIB_DIR.parent + 'bin/uttk'
|
288
|
+
end
|