buildr 1.2.10 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +566 -268
- data/DISCLAIMER +7 -1
- data/KEYS +151 -0
- data/NOTICE +23 -8
- data/README +122 -22
- data/Rakefile +49 -229
- data/{lib → addon}/buildr/antlr.rb +23 -10
- data/addon/buildr/cobertura.rb +232 -0
- data/{lib → addon}/buildr/hibernate.rb +20 -4
- data/{lib → addon}/buildr/javacc.rb +27 -12
- data/addon/buildr/jdepend.rb +60 -0
- data/{lib → addon}/buildr/jetty.rb +34 -18
- data/addon/buildr/nailgun.rb +892 -0
- data/{lib → addon}/buildr/openjpa.rb +23 -6
- data/addon/buildr/org/apache/buildr/JettyWrapper$1.class +0 -0
- data/addon/buildr/org/apache/buildr/JettyWrapper$BuildrHandler.class +0 -0
- data/addon/buildr/org/apache/buildr/JettyWrapper.class +0 -0
- data/{lib/buildr/jetty → addon/buildr/org/apache/buildr}/JettyWrapper.java +19 -0
- data/{lib → addon}/buildr/xmlbeans.rb +39 -14
- data/bin/buildr +21 -7
- data/buildr.gemspec +50 -0
- data/doc/css/default.css +225 -0
- data/doc/css/print.css +95 -0
- data/doc/css/syntax.css +43 -0
- data/doc/images/apache-incubator-logo.png +0 -0
- data/doc/images/buildr-hires.png +0 -0
- data/doc/images/buildr.png +0 -0
- data/doc/images/note.png +0 -0
- data/doc/images/tip.png +0 -0
- data/doc/images/zbuildr.tif +0 -0
- data/doc/pages/artifacts.textile +317 -0
- data/doc/pages/building.textile +501 -0
- data/doc/pages/contributing.textile +178 -0
- data/doc/pages/download.textile +25 -0
- data/doc/pages/extending.textile +229 -0
- data/doc/pages/getting_started.textile +337 -0
- data/doc/pages/index.textile +63 -0
- data/doc/pages/mailing_lists.textile +17 -0
- data/doc/pages/more_stuff.textile +367 -0
- data/doc/pages/packaging.textile +592 -0
- data/doc/pages/projects.textile +449 -0
- data/doc/pages/recipes.textile +127 -0
- data/doc/pages/settings_profiles.textile +339 -0
- data/doc/pages/testing.textile +475 -0
- data/doc/pages/troubleshooting.textile +121 -0
- data/doc/pages/whats_new.textile +389 -0
- data/doc/print.haml +52 -0
- data/doc/print.toc.yaml +28 -0
- data/doc/scripts/buildr-git.rb +411 -0
- data/doc/scripts/install-jruby.sh +44 -0
- data/doc/scripts/install-linux.sh +64 -0
- data/doc/scripts/install-osx.sh +52 -0
- data/doc/site.haml +55 -0
- data/doc/site.toc.yaml +44 -0
- data/lib/buildr.rb +28 -45
- data/lib/buildr/core.rb +27 -0
- data/lib/buildr/core/application.rb +373 -0
- data/lib/buildr/core/application_cli.rb +134 -0
- data/lib/{core → buildr/core}/build.rb +91 -77
- data/lib/{core → buildr/core}/checks.rb +116 -95
- data/lib/buildr/core/common.rb +155 -0
- data/lib/buildr/core/compile.rb +594 -0
- data/lib/buildr/core/environment.rb +120 -0
- data/lib/buildr/core/filter.rb +258 -0
- data/lib/{core → buildr/core}/generate.rb +22 -5
- data/lib/buildr/core/help.rb +118 -0
- data/lib/buildr/core/progressbar.rb +156 -0
- data/lib/{core → buildr/core}/project.rb +468 -213
- data/lib/buildr/core/test.rb +690 -0
- data/lib/{core → buildr/core}/transports.rb +107 -127
- data/lib/buildr/core/util.rb +235 -0
- data/lib/buildr/ide.rb +19 -0
- data/lib/{java → buildr/ide}/eclipse.rb +86 -60
- data/lib/{java → buildr/ide}/idea.ipr.template +16 -0
- data/lib/buildr/ide/idea.rb +194 -0
- data/lib/buildr/ide/idea7x.ipr.template +290 -0
- data/lib/buildr/ide/idea7x.rb +210 -0
- data/lib/buildr/java.rb +26 -0
- data/lib/buildr/java/ant.rb +71 -0
- data/lib/buildr/java/bdd_frameworks.rb +267 -0
- data/lib/buildr/java/commands.rb +210 -0
- data/lib/buildr/java/compilers.rb +432 -0
- data/lib/buildr/java/deprecated.rb +141 -0
- data/lib/buildr/java/groovyc.rb +137 -0
- data/lib/buildr/java/jruby.rb +99 -0
- data/lib/buildr/java/org/apache/buildr/BuildrNail$Main.class +0 -0
- data/lib/buildr/java/org/apache/buildr/BuildrNail.class +0 -0
- data/lib/buildr/java/org/apache/buildr/BuildrNail.java +41 -0
- data/lib/buildr/java/org/apache/buildr/JavaTestFilter.class +0 -0
- data/lib/buildr/java/org/apache/buildr/JavaTestFilter.java +116 -0
- data/lib/buildr/java/packaging.rb +706 -0
- data/lib/{java → buildr/java}/pom.rb +20 -4
- data/lib/buildr/java/rjb.rb +142 -0
- data/lib/buildr/java/test_frameworks.rb +290 -0
- data/lib/buildr/java/version_requirement.rb +172 -0
- data/lib/buildr/packaging.rb +21 -0
- data/lib/{java → buildr/packaging}/artifact.rb +170 -179
- data/lib/buildr/packaging/artifact_namespace.rb +957 -0
- data/lib/buildr/packaging/artifact_search.rb +140 -0
- data/lib/buildr/packaging/gems.rb +102 -0
- data/lib/buildr/packaging/package.rb +233 -0
- data/lib/{tasks → buildr/packaging}/tar.rb +18 -1
- data/lib/{tasks → buildr/packaging}/zip.rb +153 -105
- data/rakelib/apache.rake +126 -0
- data/rakelib/changelog.rake +56 -0
- data/rakelib/doc.rake +103 -0
- data/rakelib/package.rake +44 -0
- data/rakelib/release.rake +53 -0
- data/rakelib/rspec.rake +81 -0
- data/rakelib/rubyforge.rake +45 -0
- data/rakelib/scm.rake +49 -0
- data/rakelib/setup.rake +59 -0
- data/rakelib/stage.rake +45 -0
- data/spec/application_spec.rb +316 -0
- data/spec/archive_spec.rb +494 -0
- data/spec/artifact_namespace_spec.rb +635 -0
- data/spec/artifact_spec.rb +738 -0
- data/spec/build_spec.rb +193 -0
- data/spec/checks_spec.rb +537 -0
- data/spec/common_spec.rb +579 -0
- data/spec/compile_spec.rb +561 -0
- data/spec/groovy_compilers_spec.rb +239 -0
- data/spec/java_bdd_frameworks_spec.rb +238 -0
- data/spec/java_compilers_spec.rb +446 -0
- data/spec/java_packaging_spec.rb +1042 -0
- data/spec/java_test_frameworks_spec.rb +414 -0
- data/spec/packaging_helper.rb +63 -0
- data/spec/packaging_spec.rb +589 -0
- data/spec/project_spec.rb +739 -0
- data/spec/sandbox.rb +116 -0
- data/spec/scala_compilers_spec.rb +239 -0
- data/spec/spec.opts +6 -0
- data/spec/spec_helpers.rb +283 -0
- data/spec/test_spec.rb +871 -0
- data/spec/transport_spec.rb +300 -0
- data/spec/version_requirement_spec.rb +115 -0
- metadata +188 -77
- data/lib/buildr/cobertura.rb +0 -89
- data/lib/buildr/jdepend.rb +0 -40
- data/lib/buildr/jetty/JettyWrapper$1.class +0 -0
- data/lib/buildr/jetty/JettyWrapper$BuildrHandler.class +0 -0
- data/lib/buildr/jetty/JettyWrapper.class +0 -0
- data/lib/buildr/scala.rb +0 -368
- data/lib/core/application.rb +0 -188
- data/lib/core/common.rb +0 -562
- data/lib/core/help.rb +0 -72
- data/lib/core/rake_ext.rb +0 -81
- data/lib/java/ant.rb +0 -71
- data/lib/java/compile.rb +0 -589
- data/lib/java/idea.rb +0 -159
- data/lib/java/java.rb +0 -432
- data/lib/java/packaging.rb +0 -581
- data/lib/java/test.rb +0 -795
- data/lib/tasks/concat.rb +0 -35
data/lib/java/test.rb
DELETED
@@ -1,795 +0,0 @@
|
|
1
|
-
require "core/build"
|
2
|
-
require "java/compile"
|
3
|
-
require "java/ant"
|
4
|
-
require "core/help"
|
5
|
-
|
6
|
-
|
7
|
-
module Buildr
|
8
|
-
module Java
|
9
|
-
|
10
|
-
# *Deprecated:* Use the test task directly instead of calling test.junit.
|
11
|
-
class JUnitTask < Rake::Task #:nodoc:
|
12
|
-
|
13
|
-
# The classpath used for running the tests. Includes the compile classpath,
|
14
|
-
# compiled classes (target). For everything else, add by calling #with.
|
15
|
-
attr_accessor :classpath
|
16
|
-
|
17
|
-
def initialize(*args) #:nodoc:
|
18
|
-
super
|
19
|
-
@parent = Rake::Task["#{name.split(":")[0...-1].join(":")}"]
|
20
|
-
end
|
21
|
-
|
22
|
-
# :call-seq:
|
23
|
-
# include(*classes) => self
|
24
|
-
#
|
25
|
-
# Include only the specified test cases. Unless specified, the default is to include
|
26
|
-
# all test cases. This method accepts multiple arguments and returns self.
|
27
|
-
#
|
28
|
-
# Test cases are specified using the fully qualified class name. You can also use file-like
|
29
|
-
# patterns (glob) to specify collection of classes. For example:
|
30
|
-
# test.include "com.example.FirstTest"
|
31
|
-
# test.include "com.example.*"
|
32
|
-
# test.include "com.example.Module*"
|
33
|
-
# test.include "*.{First,Second}Test"
|
34
|
-
#
|
35
|
-
# By default, all classes that have a name ending with Test or Suite are included.
|
36
|
-
# Use these suffixes for your test and test suite classes respectively, to distinguish them
|
37
|
-
# from stubs, helper classes, etc.
|
38
|
-
def include(*classes)
|
39
|
-
@parent.include *classes
|
40
|
-
self
|
41
|
-
end
|
42
|
-
|
43
|
-
# :call-seq:
|
44
|
-
# exclude(*classes) => self
|
45
|
-
#
|
46
|
-
# Exclude the specified test cases. This method accepts multiple arguments and returns self.
|
47
|
-
# See #include for the type of arguments you can use.
|
48
|
-
def exclude(*classes)
|
49
|
-
@parent.exclude *classes
|
50
|
-
self
|
51
|
-
end
|
52
|
-
|
53
|
-
# :call-seq:
|
54
|
-
# from(*paths) => self
|
55
|
-
#
|
56
|
-
# Specify one or more directories that include test cases.
|
57
|
-
def from(*files)
|
58
|
-
self
|
59
|
-
end
|
60
|
-
|
61
|
-
# :call-seq:
|
62
|
-
# with(*specs) => self
|
63
|
-
#
|
64
|
-
# Specify artifacts (specs, tasks, files, etc) to include in the classpath when running
|
65
|
-
# the test cases.
|
66
|
-
def with(*files)
|
67
|
-
(@parent.options[:classpath] ||= []).concat files.flatten
|
68
|
-
self
|
69
|
-
end
|
70
|
-
|
71
|
-
# Returns the JUnit options.
|
72
|
-
def options()
|
73
|
-
@parent.options
|
74
|
-
end
|
75
|
-
|
76
|
-
# :call-seq:
|
77
|
-
# using(options) => self
|
78
|
-
#
|
79
|
-
# Sets the JUnit options from a hash and returns self. Right now supports passing :properties to JUnit,
|
80
|
-
# and :java_args to the JVM.
|
81
|
-
#
|
82
|
-
# For example:
|
83
|
-
# test.junit.using :properties=>{ "root"=>base_dir }
|
84
|
-
def using(options)
|
85
|
-
@parent.using options
|
86
|
-
self
|
87
|
-
end
|
88
|
-
|
89
|
-
end
|
90
|
-
|
91
|
-
|
92
|
-
# The test task controls the entire test lifecycle.
|
93
|
-
#
|
94
|
-
# You can use the test task in three ways. You can access and configure specific test tasks,
|
95
|
-
# e.g. enhance the #compile task, or run code during #setup/#teardown.
|
96
|
-
#
|
97
|
-
# You can use convenient methods that handle the most common settings. For example, add classpath
|
98
|
-
# dependencies using #with, or include only specific test cases using #include.
|
99
|
-
#
|
100
|
-
# You can also enhance this task directly. This task will first execute the #compile task, followed
|
101
|
-
# by the #setup task, run the unit tests, any other enhancements, and end by executing #teardown.
|
102
|
-
#
|
103
|
-
# Unit tests are fun from classed compiled by the test.compile class that match the TEST_FILE_PATTERN
|
104
|
-
# (i.e. MyClassTest, MyClassTestSuite, etc). The test framework is determined by setting one of the
|
105
|
-
# test framework options to true, for example:
|
106
|
-
# test.unsing :testng
|
107
|
-
class TestTask < Rake::Task
|
108
|
-
|
109
|
-
class << self
|
110
|
-
|
111
|
-
# Used by the local test and integration tasks to
|
112
|
-
# a) Find the local project(s),
|
113
|
-
# b) Find all its sub-projects and narrow down to those that have either unit or integration tests,
|
114
|
-
# c) Run all the (either unit or integration) tests, and
|
115
|
-
# d) Ignore failure if necessary.
|
116
|
-
def run_local_tests(integration) #:nodoc:
|
117
|
-
Project.local_projects do |project|
|
118
|
-
# !(foo ^ bar) tests for equality and accepts nil as false (and select is less obfuscated than reject on ^).
|
119
|
-
projects = ([project] + project.projects).select { |project| !(project.test.options[:integration] ^ integration) }
|
120
|
-
projects.each do |project|
|
121
|
-
puts "Testing #{project.name}" if verbose
|
122
|
-
begin
|
123
|
-
project.test.invoke
|
124
|
-
rescue
|
125
|
-
raise unless Buildr.options.test == :all
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
# Used by the test/integration rule to only run tests that match the specified names.
|
132
|
-
def only_run(tests) #:nodoc:
|
133
|
-
tests = tests.map { |name| name =~ /\*/ ? name : "*#{name}*" }
|
134
|
-
# Since the test case may reside in a sub-project, we need to set the include/exclude pattern on
|
135
|
-
# all sub-projects, but only invoke test on the local project.
|
136
|
-
Project.projects.each { |project| project.test.instance_eval { @include = tests ; @exclude.clear } }
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
# List of supported test framework, first one being a default. Test frameworks are added by
|
141
|
-
# including them in TestTask (e.g. JUnit, TestNG).
|
142
|
-
TEST_FRAMEWORKS = []
|
143
|
-
|
144
|
-
# Default options already set on each test task.
|
145
|
-
DEFAULT_OPTIONS = { :fail_on_failure=>true, :fork=>:once, :properties=>{}, :environment=>{} }
|
146
|
-
|
147
|
-
# JMock version..
|
148
|
-
JMOCK_VERSION = "1.2.0"
|
149
|
-
# JMock specification.
|
150
|
-
JMOCK_REQUIRES = "jmock:jmock:jar:#{JMOCK_VERSION}"
|
151
|
-
|
152
|
-
# The classpath used for running the tests. Includes the compiled classes (compile.target) and
|
153
|
-
# their classpath dependencies. Will also include anything you pass to #with, shared between the
|
154
|
-
# testing compile and run classpath dependencies.
|
155
|
-
attr_reader :classpath
|
156
|
-
|
157
|
-
def initialize(*args) #:nodoc:
|
158
|
-
super
|
159
|
-
@classpath = []
|
160
|
-
@include = []
|
161
|
-
@exclude = []
|
162
|
-
parent = Project.task_in_parent_project(name)
|
163
|
-
@options = parent && parent.respond_to?(:options) ? parent.options.clone : DEFAULT_OPTIONS.clone
|
164
|
-
enhance { run_tests }
|
165
|
-
end
|
166
|
-
|
167
|
-
def execute() #:nodoc:
|
168
|
-
setup.invoke
|
169
|
-
begin
|
170
|
-
super
|
171
|
-
@project.task("test:junit").invoke # In case someone enhanced it
|
172
|
-
rescue RuntimeError
|
173
|
-
raise if options[:fail_on_failure]
|
174
|
-
ensure
|
175
|
-
teardown.invoke
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
|
-
# *Deprecated* Add a prerequisite to the compile task instead.
|
180
|
-
def prepare(*prereqs, &block)
|
181
|
-
warn_deprecated "Add a prerequisite to the compile task instead of using the prepare task."
|
182
|
-
@project.task("test:prepare").enhance prereqs, &block
|
183
|
-
end
|
184
|
-
|
185
|
-
# :call-seq:
|
186
|
-
# compile(*sources) => CompileTask
|
187
|
-
# compile(*sources) { |task| .. } => CompileTask
|
188
|
-
#
|
189
|
-
# The compile task is similar to the Project's compile task. However, it compiles all
|
190
|
-
# files found in the src/java/test directory into the target/test-classes directory.
|
191
|
-
# This task is executed by the test task before running any test cases.
|
192
|
-
#
|
193
|
-
# Once the project definition is complete, all classpath dependencies from the regular
|
194
|
-
# compile task are copied over, so you only need to specify classpath dependencies
|
195
|
-
# specific to your test cases. You can do so by calling #with on the test task.
|
196
|
-
# The classpath dependencies used here are also copied over to the junit task.
|
197
|
-
def compile(*sources, &block)
|
198
|
-
@project.task("test:compile").from(sources).enhance &block
|
199
|
-
end
|
200
|
-
|
201
|
-
# :call-seq:
|
202
|
-
# resources(*prereqs) => ResourcesTask
|
203
|
-
# resources(*prereqs) { |task| .. } => ResourcesTask
|
204
|
-
#
|
205
|
-
# Executes by the #compile task to copy resource files over. See Project#resources.
|
206
|
-
def resources(*prereqs, &block)
|
207
|
-
@project.task("test:resources").enhance prereqs, &block
|
208
|
-
end
|
209
|
-
|
210
|
-
# *Deprecated* Use the test task directly instead of calling test.junit.
|
211
|
-
def junit()
|
212
|
-
warn_deprecated "Use the test task directly instead of calling test.junit."
|
213
|
-
@project.task("test:junit")
|
214
|
-
end
|
215
|
-
|
216
|
-
# :call-seq:
|
217
|
-
# setup(*prereqs) => task
|
218
|
-
# setup(*prereqs) { |task| .. } => task
|
219
|
-
#
|
220
|
-
# Returns the setup task. The setup task is executed at the beginning of the test task,
|
221
|
-
# after compiling the test files.
|
222
|
-
def setup(*prereqs, &block)
|
223
|
-
@project.task("test:setup").enhance prereqs, &block
|
224
|
-
end
|
225
|
-
|
226
|
-
# :call-seq:
|
227
|
-
# teardown(*prereqs) => task
|
228
|
-
# teardown(*prereqs) { |task| .. } => task
|
229
|
-
#
|
230
|
-
# Returns the teardown task. The teardown task is executed at the end of the test task.
|
231
|
-
def teardown(*prereqs, &block)
|
232
|
-
@project.task("test:teardown").enhance prereqs, &block
|
233
|
-
end
|
234
|
-
|
235
|
-
# :call-seq:
|
236
|
-
# with(*specs) => self
|
237
|
-
#
|
238
|
-
# Specify artifacts (specs, tasks, files, etc) to include in the classpath when compiling
|
239
|
-
# and running test cases.
|
240
|
-
def with(*artifacts)
|
241
|
-
@classpath |= Buildr.artifacts(artifacts.flatten).uniq
|
242
|
-
compile.with artifacts
|
243
|
-
self
|
244
|
-
end
|
245
|
-
|
246
|
-
# Returns various test options.
|
247
|
-
attr_reader :options
|
248
|
-
|
249
|
-
# :call-seq:
|
250
|
-
# using(options) => self
|
251
|
-
#
|
252
|
-
# Sets various test options and returns self. Accepts a hash of options, or symbols (a symbol sets that
|
253
|
-
# option to true). For example:
|
254
|
-
# test.using :testng, :fork=>:each, :properties=>{ "url"=>"http://localhost:8080" }
|
255
|
-
#
|
256
|
-
# Currently supports the following options:
|
257
|
-
# * :fail_on_failure -- True to fail on test failure (default is true).
|
258
|
-
# * :fork -- Fork test cases (JUnit only).
|
259
|
-
# * :java_args -- Java arguments when forking a new JVM.
|
260
|
-
# * :properties -- System properties.
|
261
|
-
# * :environment -- Environment variables.
|
262
|
-
#
|
263
|
-
# The :fork option takes the following values:
|
264
|
-
# * :once -- Fork one JVM for each project (default).
|
265
|
-
# * :each -- Fork one JVM for each test case.
|
266
|
-
# * false -- Do not fork, running all test cases in the same JVM.
|
267
|
-
def using(*args)
|
268
|
-
args.pop.each { |key, value| options[key.to_sym] = value } if Hash === args.last
|
269
|
-
args.each { |key| options[key.to_sym] = true }
|
270
|
-
self
|
271
|
-
end
|
272
|
-
|
273
|
-
# :call-seq:
|
274
|
-
# include(*classes) => self
|
275
|
-
#
|
276
|
-
# Include only the specified test cases. Unless specified, the default is to include
|
277
|
-
# all test cases. This method accepts multiple arguments and returns self.
|
278
|
-
#
|
279
|
-
# Test cases are specified using the fully qualified class name. You can also use file-like
|
280
|
-
# patterns (glob) to specify collection of classes. For example:
|
281
|
-
# test.include "com.example.FirstTest"
|
282
|
-
# test.include "com.example.*"
|
283
|
-
# test.include "com.example.Module*"
|
284
|
-
# test.include "*.{First,Second}Test"
|
285
|
-
#
|
286
|
-
# By default, all classes that have a name ending with Test or Suite are included.
|
287
|
-
# Use these suffixes for your test and test suite classes respectively, to distinguish them
|
288
|
-
# from stubs, helper classes, etc.
|
289
|
-
def include(*classes)
|
290
|
-
@include += classes
|
291
|
-
self
|
292
|
-
end
|
293
|
-
|
294
|
-
# :call-seq:
|
295
|
-
# exclude(*classes) => self
|
296
|
-
#
|
297
|
-
# Exclude the specified test cases. This method accepts multiple arguments and returns self.
|
298
|
-
# See #include for the type of arguments you can use.
|
299
|
-
def exclude(*classes)
|
300
|
-
@exclude += classes
|
301
|
-
self
|
302
|
-
end
|
303
|
-
|
304
|
-
# :call-seq:
|
305
|
-
# classes() => strings
|
306
|
-
#
|
307
|
-
# List of test classes to run. Determined by finding all the test classes in the target directory,
|
308
|
-
# and reducing based on the include/exclude patterns.
|
309
|
-
def classes()
|
310
|
-
base = Pathname.new(compile.target.to_s)
|
311
|
-
patterns = self.class.const_get("#{framework.to_s.upcase}_TESTS_PATTERN").to_a
|
312
|
-
FileList[patterns.map { |pattern| "#{base}/**/#{pattern}.class" }].
|
313
|
-
map { |file| Pathname.new(file).relative_path_from(base).to_s.ext("").gsub(File::SEPARATOR, ".") }.
|
314
|
-
select { |name| include?(name) }.reject { |name| name =~ /\$/ }.sort
|
315
|
-
end
|
316
|
-
|
317
|
-
# List of failed test classes. Set after running the tests.
|
318
|
-
attr_reader :failed_tests
|
319
|
-
|
320
|
-
# :call-seq:
|
321
|
-
# include?(name) => boolean
|
322
|
-
#
|
323
|
-
# Returns true if the specified class name matches the inclusion/exclusion pattern. Used to determine
|
324
|
-
# which tests to execute.
|
325
|
-
def include?(name)
|
326
|
-
(@include.empty? || @include.any? { |pattern| File.fnmatch(pattern, name) }) &&
|
327
|
-
!@exclude.any? { |pattern| File.fnmatch(pattern, name) }
|
328
|
-
end
|
329
|
-
|
330
|
-
# :call-seq:
|
331
|
-
# requires() => classpath
|
332
|
-
#
|
333
|
-
# Returns the classpath for the selected test frameworks. Necessary for compiling and running test cases.
|
334
|
-
def requires()
|
335
|
-
self.class.const_get("#{framework.to_s.upcase}_REQUIRES").to_a + [JMOCK_REQUIRES]
|
336
|
-
end
|
337
|
-
|
338
|
-
# :call-seq:
|
339
|
-
# framework() => symbol
|
340
|
-
#
|
341
|
-
# Returns the test framework, e.g. :junit, :testng.
|
342
|
-
def framework()
|
343
|
-
@framework ||= TEST_FRAMEWORKS.detect { |name| options[name] } || TEST_FRAMEWORKS.first
|
344
|
-
end
|
345
|
-
|
346
|
-
# :call-seq:
|
347
|
-
# report_to() => file
|
348
|
-
#
|
349
|
-
# Test frameworks that can produce reports, will write them to this directory.
|
350
|
-
#
|
351
|
-
# This is framework dependent, so unless you use the default test framework, call this method
|
352
|
-
# after setting the test framework.
|
353
|
-
def report_to()
|
354
|
-
@report_to ||= file(@project.path_to(:reports, "#{framework}")=>self)
|
355
|
-
end
|
356
|
-
|
357
|
-
protected
|
358
|
-
|
359
|
-
# :call-seq:
|
360
|
-
# run_tests()
|
361
|
-
#
|
362
|
-
# Runs the test cases using the selected test framework. Executes as part of the task.
|
363
|
-
def run_tests()
|
364
|
-
classes = self.classes
|
365
|
-
if classes.empty?
|
366
|
-
@failed_tests = []
|
367
|
-
else
|
368
|
-
puts "Running tests in #{@project.name}" if verbose
|
369
|
-
@failed_tests = send("#{framework}_run",
|
370
|
-
:classes => classes,
|
371
|
-
:classpath => @classpath + [compile.target],
|
372
|
-
:properties => { 'baseDir' => compile.target.to_s }.merge(options[:properties] || {}),
|
373
|
-
:environment=> options[:environment] || {},
|
374
|
-
:java_args => options[:java_args] || Buildr.options.java_args)
|
375
|
-
unless @failed_tests.empty?
|
376
|
-
warn "The following tests failed:\n#{@failed_tests.join("\n")}" if verbose
|
377
|
-
fail "Tests failed!"
|
378
|
-
end
|
379
|
-
end
|
380
|
-
end
|
381
|
-
|
382
|
-
end
|
383
|
-
|
384
|
-
|
385
|
-
# The JUnit test framework. This is the default test framework, but you can force it by
|
386
|
-
# adding the following to your project:
|
387
|
-
# test.using :testng
|
388
|
-
#
|
389
|
-
# You can use the report method to control the junit:report task.
|
390
|
-
module JUnit
|
391
|
-
|
392
|
-
# Used by the junit:report task. Access through JUnit#report if you want to set various
|
393
|
-
# options for that task, for example:
|
394
|
-
# JUnit.report.frames = false
|
395
|
-
class Report
|
396
|
-
|
397
|
-
# Ant-Trax required for running the JUnitReport task.
|
398
|
-
Java.wrapper.setup { |jw| jw.classpath << "org.apache.ant:ant-trax:jar:#{Ant::VERSION}" }
|
399
|
-
|
400
|
-
# Parameters passed to the Ant JUnitReport task.
|
401
|
-
attr_reader :params
|
402
|
-
# True (default) to produce a report using frames, false to produce a single-page report.
|
403
|
-
attr_accessor :frames
|
404
|
-
# Directory for the report style (defaults to using the internal style).
|
405
|
-
attr_accessor :style_dir
|
406
|
-
# Target directory for generated report.
|
407
|
-
attr_accessor :target
|
408
|
-
|
409
|
-
def initialize()
|
410
|
-
@params = {}
|
411
|
-
@frames = true
|
412
|
-
@target = "reports/junit"
|
413
|
-
end
|
414
|
-
|
415
|
-
# :call-seq:
|
416
|
-
# generate(projects, target?)
|
417
|
-
#
|
418
|
-
# Generates a JUnit report for these projects (must run JUnit tests first) into the
|
419
|
-
# target directory. You can specify a target, or let it pick the default one from the
|
420
|
-
# target attribute.
|
421
|
-
def generate(projects, target = @target.to_s)
|
422
|
-
html_in = File.join(target, "html")
|
423
|
-
rm_rf html_in ; mkpath html_in
|
424
|
-
|
425
|
-
Buildr.ant("junit-report") do |ant|
|
426
|
-
ant.junitreport :todir=>target do
|
427
|
-
projects.select { |project| project.test.framework == :junit }.
|
428
|
-
map { |project| project.test.report_to.to_s }.select { |path| File.exist?(path) }.
|
429
|
-
each { |path| ant.fileset(:dir=>path) { ant.include :name=>"TEST-*.xml" } }
|
430
|
-
options = { :format=>frames ? "frames" : "noframes" }
|
431
|
-
options[:styledir] = style_dir if style_dir
|
432
|
-
ant.report options.merge(:todir=>html_in) do
|
433
|
-
params.each { |key, value| ant.param :name=>key, :expression=>value }
|
434
|
-
end
|
435
|
-
end
|
436
|
-
end
|
437
|
-
end
|
438
|
-
|
439
|
-
end
|
440
|
-
|
441
|
-
# JUnit version number.
|
442
|
-
JUNIT_VERSION = "4.3.1"
|
443
|
-
# JUnit specification.
|
444
|
-
JUNIT_REQUIRES = "junit:junit:jar:#{JUNIT_VERSION}"
|
445
|
-
# Pattern for selecting JUnit test classes. Regardless of include/exclude patterns, only classes
|
446
|
-
# that match this pattern are used.
|
447
|
-
JUNIT_TESTS_PATTERN = [ "Test*", "*Test" ]
|
448
|
-
|
449
|
-
# Ant-JUnit requires for JUnit and JUnit reports tasks.
|
450
|
-
Java.wrapper.setup { |jw| jw.classpath << "org.apache.ant:ant-junit:jar:#{Ant::VERSION}" }
|
451
|
-
|
452
|
-
class << self
|
453
|
-
|
454
|
-
# :call-seq:
|
455
|
-
# report()
|
456
|
-
#
|
457
|
-
# Returns the Report object used by the junit:report task. You can use this object to set
|
458
|
-
# various options that affect your report, for example:
|
459
|
-
# JUnit.report.frames = false
|
460
|
-
# JUnit.report.params["title"] = "My App"
|
461
|
-
def report()
|
462
|
-
@report ||= Report.new
|
463
|
-
end
|
464
|
-
|
465
|
-
def included(mod)
|
466
|
-
mod::TEST_FRAMEWORKS << :junit
|
467
|
-
end
|
468
|
-
private :included
|
469
|
-
|
470
|
-
end
|
471
|
-
|
472
|
-
private
|
473
|
-
|
474
|
-
def junit_run(args)
|
475
|
-
rm_rf report_to.to_s ; mkpath report_to.to_s
|
476
|
-
# Use Ant to execute the Junit tasks, gives us performance and reporting.
|
477
|
-
Buildr.ant("junit") do |ant|
|
478
|
-
case options[:fork]
|
479
|
-
when false
|
480
|
-
forking = {}
|
481
|
-
when :each
|
482
|
-
forking = { :fork=>true, :forkmode=>"perTest" }
|
483
|
-
when true, :once
|
484
|
-
forking = { :fork=>true, :forkmode=>"once" }
|
485
|
-
else
|
486
|
-
fail "Option fork must be :once, :each or false."
|
487
|
-
end
|
488
|
-
ant.junit forking.merge(:clonevm=>options[:clonevm] || false, :dir=>@project.path_to) do
|
489
|
-
ant.classpath :path=>args[:classpath].map(&:to_s).each { |path| file(path).invoke }.join(File::PATH_SEPARATOR)
|
490
|
-
args[:properties].each { |key, value| ant.sysproperty :key=>key, :value=>value }
|
491
|
-
args[:environment].each { |key, value| ant.env :key=>key, :value=>value }
|
492
|
-
java_args = args[:java_args]
|
493
|
-
java_args = java_args.split(" ") if String === java_args
|
494
|
-
java_args.each { |value| ant.jvmarg :value=>value } if java_args
|
495
|
-
ant.formatter :type=>"plain"
|
496
|
-
ant.formatter :type=>"xml"
|
497
|
-
ant.formatter :type=>"plain", :usefile=>false # log test
|
498
|
-
ant.formatter :type=>"xml"
|
499
|
-
ant.batchtest :todir=>report_to.to_s, :failureproperty=>"failed" do
|
500
|
-
ant.fileset :dir=>compile.target.to_s do
|
501
|
-
args[:classes].each { |cls| ant.include :name=>cls.gsub(".", "/").ext("class") }
|
502
|
-
end
|
503
|
-
end
|
504
|
-
end
|
505
|
-
return [] unless ant.project.getProperty("failed")
|
506
|
-
end
|
507
|
-
# But Ant doesn't tell us what went kaput, so we'll have to parse the test files.
|
508
|
-
args[:classes].inject([]) do |failed, name|
|
509
|
-
if report = File.read(File.join(report_to.to_s, "TEST-#{name}.txt")) rescue nil
|
510
|
-
# The second line (if exists) is the status line and we scan it for its values.
|
511
|
-
status = (report.split("\n")[1] || "").scan(/(run|failures|errors):\s*(\d+)/i).
|
512
|
-
inject(Hash.new(0)) { |hash, pair| hash[pair[0].downcase.to_sym] = pair[1].to_i ; hash }
|
513
|
-
failed << name if status[:failures] > 0 || status[:errors] > 0
|
514
|
-
end
|
515
|
-
failed
|
516
|
-
end
|
517
|
-
end
|
518
|
-
|
519
|
-
namespace "junit" do
|
520
|
-
desc "Generate JUnit tests report in #{report.target}"
|
521
|
-
task("report") do |task|
|
522
|
-
report.generate Project.projects
|
523
|
-
puts "Generated JUnit tests report in #{report.target}"
|
524
|
-
end
|
525
|
-
end
|
526
|
-
|
527
|
-
task("clean") { rm_rf report.target.to_s }
|
528
|
-
|
529
|
-
end
|
530
|
-
|
531
|
-
|
532
|
-
# The TestNG test framework. Use by adding the following to your project:
|
533
|
-
# test.using :testng
|
534
|
-
module TestNG
|
535
|
-
|
536
|
-
# TestNG version number.
|
537
|
-
TESTNG_VERSION = "5.5"
|
538
|
-
# TestNG specification.
|
539
|
-
TESTNG_REQUIRES = "org.testng:testng:jar:jdk15:#{TESTNG_VERSION}"
|
540
|
-
# Pattern for selecting TestNG test classes. Regardless of include/exclude patterns, only classes
|
541
|
-
# that match this pattern are used.
|
542
|
-
TESTNG_TESTS_PATTERN = [ "Test*", "*Test", "*TestCase" ]
|
543
|
-
|
544
|
-
class << self
|
545
|
-
|
546
|
-
def included(mod)
|
547
|
-
mod::TEST_FRAMEWORKS << :testng
|
548
|
-
end
|
549
|
-
private :included
|
550
|
-
|
551
|
-
end
|
552
|
-
|
553
|
-
private
|
554
|
-
|
555
|
-
def testng_run(args)
|
556
|
-
cmd_args = [ "org.testng.TestNG", "-sourcedir", compile.sources.join(";"), "-suitename", @project.name ]
|
557
|
-
cmd_args << "-d" << report_to.to_s
|
558
|
-
cmd_options = args.only(:classpath, :properties, :java_args)
|
559
|
-
args[:classes].inject([]) do |failed, test|
|
560
|
-
begin
|
561
|
-
Buildr.java cmd_args, "-testclass", test, cmd_options.merge(:name=>test)
|
562
|
-
failed
|
563
|
-
rescue
|
564
|
-
failed << test
|
565
|
-
end
|
566
|
-
end
|
567
|
-
end
|
568
|
-
|
569
|
-
end
|
570
|
-
|
571
|
-
class TestTask ; include JUnit ; include TestNG ; end
|
572
|
-
|
573
|
-
end
|
574
|
-
|
575
|
-
|
576
|
-
class Project
|
577
|
-
|
578
|
-
# :call-seq:
|
579
|
-
# test(*prereqs) => TestTask
|
580
|
-
# test(*prereqs) { |task| .. } => TestTask
|
581
|
-
#
|
582
|
-
# Returns the test task. The test task controls the entire test lifecycle.
|
583
|
-
#
|
584
|
-
# You can use the test task in three ways. You can access and configure specific
|
585
|
-
# test tasks, e.g. enhance the compile task by calling test.compile, setup for
|
586
|
-
# the test cases by enhancing test.setup and so forth.
|
587
|
-
#
|
588
|
-
# You can use convenient methods that handle the most common settings. For example,
|
589
|
-
# add classpath dependencies using test.with, or include only specific test cases
|
590
|
-
# using test.include.
|
591
|
-
#
|
592
|
-
# You can also enhance this task directly. This method accepts a list of arguments
|
593
|
-
# that are used as prerequisites and an optional block that will be executed by the
|
594
|
-
# test task.
|
595
|
-
#
|
596
|
-
# This task compiles the project and the test cases (in that order) before running any tests.
|
597
|
-
# It execute the setup task, runs all the test cases, any enhancements, and ends with the
|
598
|
-
# teardown tasks.
|
599
|
-
def test(*prereqs, &block)
|
600
|
-
task("test").enhance prereqs, &block
|
601
|
-
end
|
602
|
-
|
603
|
-
end
|
604
|
-
|
605
|
-
|
606
|
-
Project.on_define do |project|
|
607
|
-
# Define a recursive test task, and pass it a reference to the project so it can discover all other tasks.
|
608
|
-
Java::TestTask.define_task("test")
|
609
|
-
project.test.instance_eval { instance_variable_set :@project, project }
|
610
|
-
#project.recursive_task("test")
|
611
|
-
# Similar to the regular resources task but using different paths.
|
612
|
-
resources = Java::ResourcesTask.define_task("test:resources")
|
613
|
-
project.path_to("src/test/resources").tap { |dir| resources.from dir if File.exist?(dir) }
|
614
|
-
# Similar to the regular compile task but using different paths.
|
615
|
-
compile = Java::CompileTask.define_task("test:compile"=>[project.compile, task("test:prepare"), project.test.resources])
|
616
|
-
project.path_to("src/test/java").tap { |dir| compile.from dir if File.exist?(dir) }
|
617
|
-
compile.into project.path_to(:target, "test-classes")
|
618
|
-
resources.filter.into compile.target
|
619
|
-
project.test.enhance [compile]
|
620
|
-
# Define the JUnit task here, otherwise we get a normal task.
|
621
|
-
Java::JUnitTask.define_task("test:junit")
|
622
|
-
# Define these tasks once, otherwise we may get a namespace error.
|
623
|
-
project.test.setup ; project.test.teardown
|
624
|
-
|
625
|
-
project.enhance do |project|
|
626
|
-
# Copy the regular compile classpath over, and also include the generated classes, both of which
|
627
|
-
# can be used in the test cases. And don't forget the classpath required by the test framework (e.g. JUnit).
|
628
|
-
project.test.with project.compile.classpath, project.compile.target, project.test.requires
|
629
|
-
project.clean do
|
630
|
-
verbose(false) do
|
631
|
-
rm_rf project.test.compile.target.to_s
|
632
|
-
rm_rf project.test.report_to.to_s
|
633
|
-
end
|
634
|
-
end
|
635
|
-
end
|
636
|
-
end
|
637
|
-
|
638
|
-
|
639
|
-
class Options
|
640
|
-
|
641
|
-
# Runs test cases after the build when true (default). This forces test cases to execute
|
642
|
-
# after the build, including when running build related tasks like install, deploy and release.
|
643
|
-
#
|
644
|
-
# Set to false to not run any test cases. Set to :all to run all test cases, ignoring failures.
|
645
|
-
#
|
646
|
-
# This option is set from the environment variable "test", so you can also do:
|
647
|
-
|
648
|
-
# Returns the test option (environment variable TEST). Possible values are:
|
649
|
-
# * :false -- Do not run any test cases (also accepts "no" and "skip").
|
650
|
-
# * :true -- Run all test cases, stop on failure (default if not set).
|
651
|
-
# * :all -- Run all test cases, ignore failures.
|
652
|
-
def test()
|
653
|
-
case value = ENV["TEST"] || ENV["test"]
|
654
|
-
when /^(no|off|false|skip)$/i
|
655
|
-
false
|
656
|
-
when /^all$/i
|
657
|
-
:all
|
658
|
-
when /^(yes|on|true)$/i, nil
|
659
|
-
true
|
660
|
-
else
|
661
|
-
warn "Expecting the environment variable test to be 'no' or 'all', not sure what to do with #{value}, so I'm just going to run all the test cases and stop at failure."
|
662
|
-
true
|
663
|
-
end
|
664
|
-
end
|
665
|
-
|
666
|
-
# Sets the test option (environment variable TEST). Possible values are true, false or :all.
|
667
|
-
#
|
668
|
-
# You can also set this from the environment variable, e.g.:
|
669
|
-
#
|
670
|
-
# buildr # With tests
|
671
|
-
# buildr test=no # Without tests
|
672
|
-
# buildr test=all # Ignore failures
|
673
|
-
# set TEST=no
|
674
|
-
# buildr # Without tests
|
675
|
-
def test=(flag)
|
676
|
-
ENV["test"] = nil
|
677
|
-
ENV["TEST"] = flag.to_s
|
678
|
-
end
|
679
|
-
|
680
|
-
end
|
681
|
-
|
682
|
-
|
683
|
-
desc "Run all test cases"
|
684
|
-
task("test") { TestTask.run_local_tests false }
|
685
|
-
|
686
|
-
# This rule takes a suffix and runs that test case in the current project. For example;
|
687
|
-
# buildr test:MyTest
|
688
|
-
# will run the test case class com.example.MyTest, if found in the current project.
|
689
|
-
#
|
690
|
-
# If you want to run multiple test cases, separate tham with a comma. You can also use glob
|
691
|
-
# (* and ?) patterns to match multiple tests, e.g. com.example.* to run all test cases in
|
692
|
-
# a given package. If you don't specify a glob pattern, asterisks are added for you.
|
693
|
-
rule /^test:.*$/ do |task|
|
694
|
-
TestTask.only_run task.name.scan(/test:(.*)/)[0][0].split(",")
|
695
|
-
task("test").invoke
|
696
|
-
end
|
697
|
-
|
698
|
-
task "build" do |task|
|
699
|
-
# Make sure this happens as the last action on the build, so all other enhancements
|
700
|
-
# are made to run before starting the test cases.
|
701
|
-
task.enhance do
|
702
|
-
task("test").invoke unless Buildr.options.test == false
|
703
|
-
end
|
704
|
-
end
|
705
|
-
|
706
|
-
|
707
|
-
# The integration tests task. Buildr has one such task (see Buildr#integration) that runs
|
708
|
-
# all tests marked with :integration=>true, and has a setup/teardown tasks separate from
|
709
|
-
# the unit tests.
|
710
|
-
class IntegrationTestsTask < Rake::Task
|
711
|
-
|
712
|
-
def initialize(*args) #:nodoc:
|
713
|
-
super
|
714
|
-
task "#{name}-setup"
|
715
|
-
task "#{name}-teardown"
|
716
|
-
enhance { puts "Running integration tests..." if verbose }
|
717
|
-
end
|
718
|
-
|
719
|
-
def execute() #:nodoc:
|
720
|
-
setup.invoke
|
721
|
-
begin
|
722
|
-
super
|
723
|
-
ensure
|
724
|
-
teardown.invoke
|
725
|
-
end
|
726
|
-
end
|
727
|
-
|
728
|
-
# :call-seq:
|
729
|
-
# setup(*prereqs) => task
|
730
|
-
# setup(*prereqs) { |task| .. } => task
|
731
|
-
#
|
732
|
-
# Returns the setup task. The setup task is executed before running the integration tests.
|
733
|
-
def setup(*prereqs, &block)
|
734
|
-
Rake::Task["rake:integration-setup"].enhance prereqs, &block
|
735
|
-
end
|
736
|
-
|
737
|
-
# :call-seq:
|
738
|
-
# teardown(*prereqs) => task
|
739
|
-
# teardown(*prereqs) { |task| .. } => task
|
740
|
-
#
|
741
|
-
# Returns the teardown task. The teardown task is executed after running the integration tests.
|
742
|
-
def teardown(*prereqs, &block)
|
743
|
-
Rake::Task["rake:integration-teardown"].enhance prereqs, &block
|
744
|
-
end
|
745
|
-
|
746
|
-
end
|
747
|
-
|
748
|
-
# :call-seq:
|
749
|
-
# integration() { |task| .... }
|
750
|
-
# integration() => IntegrationTestTask
|
751
|
-
#
|
752
|
-
# Use this method to return the integration tests task, or enhance it with a block to execute.
|
753
|
-
#
|
754
|
-
# There is one integration tests task you can execute directly, or as a result of running the package
|
755
|
-
# task (or tasks that depend on it, like install and deploy). It contains all the tests marked with
|
756
|
-
# :integration=>true, all other tests are considered unit tests and run by the test task before packaging.
|
757
|
-
# So essentially: build=>test=>packaging=>integration=>install/deploy.
|
758
|
-
#
|
759
|
-
# You add new test cases from projects that define integration tests using the regular test task,
|
760
|
-
# but with the following addition:
|
761
|
-
# test.using :integration
|
762
|
-
#
|
763
|
-
# Use this method to enhance the setup and teardown tasks that are executed before (and after) all
|
764
|
-
# integration tests are run, for example, to start a Web server or create a database.
|
765
|
-
def integration(*deps, &block)
|
766
|
-
Rake::Task["rake:integration"].enhance deps, &block
|
767
|
-
end
|
768
|
-
|
769
|
-
IntegrationTestsTask.define_task("integration") { TestTask.run_local_tests true }
|
770
|
-
|
771
|
-
# Similar to test:[pattern] but for integration tests.
|
772
|
-
rule /^integration:.*$/ do |task|
|
773
|
-
TestTask.only_run task.name.scan(/integration:(.*)/)[0][0].split(",")
|
774
|
-
task("integration").invoke
|
775
|
-
end
|
776
|
-
|
777
|
-
# Anything that comes after local packaging (install, deploy) executes the integration tests,
|
778
|
-
# which do not conflict with integration invoking the project's own packaging (package=>
|
779
|
-
# integration=>foo:package is not circular, just confusing to debug.)
|
780
|
-
task "package" do |task|
|
781
|
-
integration.invoke if Buildr.options.test && Rake.application.original_dir == Dir.pwd
|
782
|
-
end
|
783
|
-
|
784
|
-
|
785
|
-
task("help") do
|
786
|
-
puts
|
787
|
-
puts "To run a full build without running any test cases:"
|
788
|
-
puts " buildr test=no"
|
789
|
-
puts "To run specific test case:"
|
790
|
-
puts " buildr test:MyTest"
|
791
|
-
puts "To run integration tests:"
|
792
|
-
puts " buildr integration"
|
793
|
-
end
|
794
|
-
|
795
|
-
end
|