buildr 1.3.5-x86-mswin32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +998 -0
- data/LICENSE +176 -0
- data/NOTICE +26 -0
- data/README.rdoc +134 -0
- data/Rakefile +45 -0
- data/_buildr +29 -0
- data/_jbuildr +29 -0
- data/addon/buildr/antlr.rb +65 -0
- data/addon/buildr/cobertura.rb +22 -0
- data/addon/buildr/drb.rb +281 -0
- data/addon/buildr/emma.rb +22 -0
- data/addon/buildr/hibernate.rb +142 -0
- data/addon/buildr/javacc.rb +85 -0
- data/addon/buildr/jdepend.rb +60 -0
- data/addon/buildr/jetty.rb +248 -0
- data/addon/buildr/jibx.rb +86 -0
- data/addon/buildr/nailgun.rb +221 -0
- data/addon/buildr/openjpa.rb +90 -0
- data/addon/buildr/org/apache/buildr/BuildrNail$Main.class +0 -0
- data/addon/buildr/org/apache/buildr/BuildrNail.class +0 -0
- data/addon/buildr/org/apache/buildr/BuildrNail.java +41 -0
- 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/addon/buildr/org/apache/buildr/JettyWrapper.java +144 -0
- data/addon/buildr/xmlbeans.rb +93 -0
- data/bin/buildr +19 -0
- data/buildr.buildfile +58 -0
- data/buildr.gemspec +65 -0
- data/doc/_config.yml +1 -0
- data/doc/_layouts/default.html +88 -0
- data/doc/_layouts/preface.html +22 -0
- data/doc/artifacts.textile +211 -0
- data/doc/building.textile +244 -0
- data/doc/contributing.textile +252 -0
- data/doc/css/default.css +236 -0
- data/doc/css/print.css +101 -0
- data/doc/css/syntax.css +23 -0
- data/doc/download.textile +79 -0
- data/doc/extending.textile +186 -0
- data/doc/images/1442160941-frontcover.jpg +0 -0
- data/doc/images/asf-logo.gif +0 -0
- data/doc/images/asf-logo.png +0 -0
- data/doc/images/buildr-hires.png +0 -0
- data/doc/images/buildr.png +0 -0
- data/doc/images/favicon.png +0 -0
- data/doc/images/growl-icon.tiff +0 -0
- data/doc/images/note.png +0 -0
- data/doc/images/project-structure.png +0 -0
- data/doc/images/tip.png +0 -0
- data/doc/images/zbuildr.png +0 -0
- data/doc/images/zbuildr.tif +0 -0
- data/doc/index.textile +69 -0
- data/doc/installing.textile +266 -0
- data/doc/languages.textile +459 -0
- data/doc/mailing_lists.textile +25 -0
- data/doc/more_stuff.textile +457 -0
- data/doc/packaging.textile +430 -0
- data/doc/preface.textile +54 -0
- data/doc/projects.textile +271 -0
- data/doc/quick_start.textile +210 -0
- data/doc/scripts/buildr-git.rb +512 -0
- data/doc/scripts/gitflow.rb +296 -0
- data/doc/scripts/install-jruby.sh +44 -0
- data/doc/scripts/install-linux.sh +72 -0
- data/doc/scripts/install-osx.sh +52 -0
- data/doc/settings_profiles.textile +280 -0
- data/doc/testing.textile +222 -0
- data/etc/KEYS +151 -0
- data/lib/buildr.rb +36 -0
- data/lib/buildr/core.rb +35 -0
- data/lib/buildr/core/application.rb +656 -0
- data/lib/buildr/core/build.rb +452 -0
- data/lib/buildr/core/checks.rb +254 -0
- data/lib/buildr/core/common.rb +150 -0
- data/lib/buildr/core/compile.rb +608 -0
- data/lib/buildr/core/environment.rb +129 -0
- data/lib/buildr/core/filter.rb +362 -0
- data/lib/buildr/core/generate.rb +195 -0
- data/lib/buildr/core/help.rb +119 -0
- data/lib/buildr/core/osx.rb +46 -0
- data/lib/buildr/core/progressbar.rb +156 -0
- data/lib/buildr/core/project.rb +866 -0
- data/lib/buildr/core/shell.rb +198 -0
- data/lib/buildr/core/test.rb +723 -0
- data/lib/buildr/core/transports.rb +559 -0
- data/lib/buildr/core/util.rb +449 -0
- data/lib/buildr/groovy.rb +19 -0
- data/lib/buildr/groovy/bdd.rb +106 -0
- data/lib/buildr/groovy/compiler.rb +138 -0
- data/lib/buildr/groovy/shell.rb +48 -0
- data/lib/buildr/ide.rb +19 -0
- data/lib/buildr/ide/eclipse.rb +334 -0
- data/lib/buildr/ide/eclipse/java.rb +53 -0
- data/lib/buildr/ide/eclipse/plugin.rb +68 -0
- data/lib/buildr/ide/eclipse/scala.rb +66 -0
- data/lib/buildr/ide/idea.ipr.template +300 -0
- data/lib/buildr/ide/idea.rb +190 -0
- data/lib/buildr/ide/idea7x.ipr.template +290 -0
- data/lib/buildr/ide/idea7x.rb +212 -0
- data/lib/buildr/java.rb +23 -0
- data/lib/buildr/java/ant.rb +94 -0
- data/lib/buildr/java/bdd.rb +459 -0
- data/lib/buildr/java/cobertura.rb +274 -0
- data/lib/buildr/java/commands.rb +213 -0
- data/lib/buildr/java/compiler.rb +349 -0
- data/lib/buildr/java/deprecated.rb +141 -0
- data/lib/buildr/java/emma.rb +244 -0
- data/lib/buildr/java/jruby.rb +117 -0
- data/lib/buildr/java/jtestr_runner.rb.erb +116 -0
- data/lib/buildr/java/org/apache/buildr/JavaTestFilter.class +0 -0
- data/lib/buildr/java/org/apache/buildr/JavaTestFilter.java +137 -0
- data/lib/buildr/java/packaging.rb +716 -0
- data/lib/buildr/java/pom.rb +174 -0
- data/lib/buildr/java/rjb.rb +155 -0
- data/lib/buildr/java/test_result.rb +353 -0
- data/lib/buildr/java/tests.rb +333 -0
- data/lib/buildr/java/version_requirement.rb +172 -0
- data/lib/buildr/packaging.rb +24 -0
- data/lib/buildr/packaging/archive.rb +488 -0
- data/lib/buildr/packaging/artifact.rb +749 -0
- data/lib/buildr/packaging/artifact_namespace.rb +972 -0
- data/lib/buildr/packaging/artifact_search.rb +140 -0
- data/lib/buildr/packaging/gems.rb +102 -0
- data/lib/buildr/packaging/package.rb +238 -0
- data/lib/buildr/packaging/tar.rb +186 -0
- data/lib/buildr/packaging/version_requirement.rb +172 -0
- data/lib/buildr/packaging/zip.rb +73 -0
- data/lib/buildr/packaging/ziptask.rb +316 -0
- data/lib/buildr/resources/buildr.icns +0 -0
- data/lib/buildr/scala.rb +25 -0
- data/lib/buildr/scala/bdd.rb +109 -0
- data/lib/buildr/scala/compiler.rb +195 -0
- data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner$.class +0 -0
- data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner.class +0 -0
- data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner.scala +35 -0
- data/lib/buildr/scala/shell.rb +55 -0
- data/lib/buildr/scala/tests.rb +157 -0
- data/lib/buildr/shell.rb +180 -0
- data/rakelib/checks.rake +57 -0
- data/rakelib/doc.rake +92 -0
- data/rakelib/jekylltask.rb +120 -0
- data/rakelib/package.rake +73 -0
- data/rakelib/release.rake +149 -0
- data/rakelib/rspec.rake +73 -0
- data/rakelib/setup.rake +54 -0
- data/rakelib/stage.rake +213 -0
- data/rakelib/stage.rake~ +213 -0
- data/spec/addon/drb_spec.rb +328 -0
- data/spec/core/application_spec.rb +502 -0
- data/spec/core/build_spec.rb +677 -0
- data/spec/core/checks_spec.rb +519 -0
- data/spec/core/common_spec.rb +670 -0
- data/spec/core/compile_spec.rb +583 -0
- data/spec/core/extension_spec.rb +93 -0
- data/spec/core/generate_spec.rb +33 -0
- data/spec/core/project_spec.rb +762 -0
- data/spec/core/test_spec.rb +1098 -0
- data/spec/core/transport_spec.rb +537 -0
- data/spec/core/util_spec.rb +67 -0
- data/spec/groovy/bdd_spec.rb +80 -0
- data/spec/groovy/compiler_spec.rb +240 -0
- data/spec/ide/eclipse_spec.rb +501 -0
- data/spec/ide/idea7x_spec.rb +84 -0
- data/spec/java/ant_spec.rb +33 -0
- data/spec/java/bdd_spec.rb +382 -0
- data/spec/java/cobertura_spec.rb +85 -0
- data/spec/java/compiler_spec.rb +446 -0
- data/spec/java/emma_spec.rb +119 -0
- data/spec/java/java_spec.rb +124 -0
- data/spec/java/packaging_spec.rb +1134 -0
- data/spec/java/test_coverage_helper.rb +257 -0
- data/spec/java/tests_spec.rb +493 -0
- data/spec/packaging/archive_spec.rb +527 -0
- data/spec/packaging/artifact_namespace_spec.rb +654 -0
- data/spec/packaging/artifact_spec.rb +795 -0
- data/spec/packaging/packaging_helper.rb +63 -0
- data/spec/packaging/packaging_spec.rb +684 -0
- data/spec/sandbox.rb +142 -0
- data/spec/scala/bdd_spec.rb +119 -0
- data/spec/scala/compiler_spec.rb +284 -0
- data/spec/scala/scala.rb +38 -0
- data/spec/scala/tests_spec.rb +261 -0
- data/spec/spec_helpers.rb +340 -0
- data/spec/version_requirement_spec.rb +129 -0
- metadata +383 -0
@@ -0,0 +1,198 @@
|
|
1
|
+
# Licensed to the Apache Software Foundation (ASF) under one or more
|
2
|
+
# contributor license agreements. See the NOTICE file distributed with this
|
3
|
+
# work for additional information regarding copyright ownership. The ASF
|
4
|
+
# licenses this file to you under the Apache License, Version 2.0 (the
|
5
|
+
# "License"); you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
12
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
13
|
+
# License for the specific language governing permissions and limitations under
|
14
|
+
# the License.
|
15
|
+
|
16
|
+
|
17
|
+
require 'buildr/shell'
|
18
|
+
require 'buildr/java/commands'
|
19
|
+
require 'buildr/core/util'
|
20
|
+
|
21
|
+
module Buildr
|
22
|
+
module Shell
|
23
|
+
|
24
|
+
class BeanShell < Base
|
25
|
+
|
26
|
+
include JavaRebel
|
27
|
+
|
28
|
+
VERSION = '2.0b4'
|
29
|
+
|
30
|
+
class << self
|
31
|
+
def version
|
32
|
+
Buildr.settings.build['bsh'] || VERSION
|
33
|
+
end
|
34
|
+
|
35
|
+
def artifact
|
36
|
+
"org.beanshell:bsh:jar:#{version}"
|
37
|
+
end
|
38
|
+
|
39
|
+
def lang
|
40
|
+
:java
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_sym
|
44
|
+
:bsh
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def launch
|
49
|
+
cp = project.compile.dependencies + [project.path_to(:target, :classes), Buildr.artifact(BeanShell.artifact)]
|
50
|
+
Java::Commands.java 'bsh.Console', {
|
51
|
+
:properties => rebel_props(project),
|
52
|
+
:classpath => cp,
|
53
|
+
:java_args => rebel_args
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
end # BeanShell
|
58
|
+
|
59
|
+
|
60
|
+
class JIRB < Base
|
61
|
+
include JavaRebel
|
62
|
+
|
63
|
+
JRUBY_VERSION = '1.3.1'
|
64
|
+
|
65
|
+
class << self
|
66
|
+
def lang
|
67
|
+
:none
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def launch
|
72
|
+
if jruby_home # if JRuby is installed, use it
|
73
|
+
cp = project.compile.dependencies +
|
74
|
+
[project.path_to(:target, :classes)] +
|
75
|
+
Dir.glob("#{jruby_home}#{File::SEPARATOR}lib#{File::SEPARATOR}*.jar")
|
76
|
+
|
77
|
+
props = {
|
78
|
+
'jruby.home' => jruby_home,
|
79
|
+
'jruby.lib' => "#{jruby_home}#{File::SEPARATOR}lib"
|
80
|
+
}
|
81
|
+
|
82
|
+
if not Util.win_os?
|
83
|
+
uname = `uname -m`
|
84
|
+
cpu = if uname =~ /i[34567]86/
|
85
|
+
'i386'
|
86
|
+
elsif uname == 'i86pc'
|
87
|
+
'x86'
|
88
|
+
elsif uname =~ /amd64|x86_64/
|
89
|
+
'amd64'
|
90
|
+
end
|
91
|
+
|
92
|
+
os = `uname -s | tr '[A-Z]' '[a-z]'`
|
93
|
+
path = if os == 'darwin'
|
94
|
+
'darwin'
|
95
|
+
else
|
96
|
+
"#{os}-#{cpu}"
|
97
|
+
end
|
98
|
+
|
99
|
+
props['jna.boot.library.path'] = "#{jruby_home}/lib/native/#{path}"
|
100
|
+
end
|
101
|
+
|
102
|
+
props['jruby.script'] = if Util.win_os? then 'jruby.bat' else 'jruby' end
|
103
|
+
props['jruby.shell'] = if Util.win_os? then 'cmd.exe' else '/bin/sh' end
|
104
|
+
|
105
|
+
args = [
|
106
|
+
"-Xbootclasspath/a:#{Dir.glob("#{jruby_home}#{File::SEPARATOR}lib#{File::SEPARATOR}jruby*.jar").join File::PATH_SEPARATOR}"
|
107
|
+
]
|
108
|
+
|
109
|
+
Java::Commands.java 'org.jruby.Main', "#{jruby_home}#{File::SEPARATOR}bin#{File::SEPARATOR}jirb", {
|
110
|
+
:properties => props.merge(rebel_props(project)),
|
111
|
+
:classpath => cp,
|
112
|
+
:java_args => args + rebel_args
|
113
|
+
}
|
114
|
+
else
|
115
|
+
cp = project.compile.dependencies + [
|
116
|
+
jruby_artifact,
|
117
|
+
project.path_to(:target, :classes)
|
118
|
+
]
|
119
|
+
|
120
|
+
Java::Commands.java 'org.jruby.Main', '--command', 'irb', {
|
121
|
+
:properties => rebel_props(project),
|
122
|
+
:classpath => cp,
|
123
|
+
:java_args => rebel_args
|
124
|
+
}
|
125
|
+
end
|
126
|
+
end
|
127
|
+
private
|
128
|
+
def jruby_home
|
129
|
+
@jruby_home ||= RUBY_PLATFORM =~ /java/ ? Config::CONFIG['prefix'] : ENV['JRUBY_HOME']
|
130
|
+
end
|
131
|
+
|
132
|
+
def jruby_artifact
|
133
|
+
version = Buildr.settings.build['jruby'] || JRUBY_VERSION
|
134
|
+
"org.jruby:jruby-complete:jar:#{version}"
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
|
139
|
+
class Clojure < Base
|
140
|
+
include JavaRebel
|
141
|
+
|
142
|
+
JLINE_VERSION = '0.9.94'
|
143
|
+
|
144
|
+
class << self
|
145
|
+
def lang
|
146
|
+
:none
|
147
|
+
end
|
148
|
+
|
149
|
+
def to_sym
|
150
|
+
:clj # more common than `clojure`
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
# don't build if it's *only* Clojure sources
|
155
|
+
def build?
|
156
|
+
!has_source?(:clojure) or has_source?(:java) or has_source?(:scala) or has_source?(:groovy)
|
157
|
+
end
|
158
|
+
|
159
|
+
def launch
|
160
|
+
fail 'Are we forgetting something? CLOJURE_HOME not set.' unless clojure_home
|
161
|
+
|
162
|
+
cp = project.compile.dependencies +
|
163
|
+
[
|
164
|
+
if build?
|
165
|
+
project.path_to(:target, :classes)
|
166
|
+
else
|
167
|
+
project.path_to(:src, :main, :clojure)
|
168
|
+
end,
|
169
|
+
File.expand_path('clojure.jar', clojure_home),
|
170
|
+
'jline:jline:jar:0.9.94'
|
171
|
+
]
|
172
|
+
|
173
|
+
if build?
|
174
|
+
Java::Commands.java 'jline.ConsoleRunner', 'clojure.lang.Repl', {
|
175
|
+
:properties => rebel_props(project),
|
176
|
+
:classpath => cp,
|
177
|
+
:java_args => rebel_args
|
178
|
+
}
|
179
|
+
else
|
180
|
+
Java::Commands.java 'jline.ConsoleRunner', 'clojure.lang.Repl', :classpath => cp
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
private
|
185
|
+
def clojure_home
|
186
|
+
@home ||= ENV['CLOJURE_HOME']
|
187
|
+
end
|
188
|
+
|
189
|
+
def has_source?(lang)
|
190
|
+
File.exists? project.path_to(:src, :main, lang)
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
Buildr::ShellProviders << Buildr::Shell::BeanShell
|
197
|
+
Buildr::ShellProviders << Buildr::Shell::JIRB
|
198
|
+
Buildr::ShellProviders << Buildr::Shell::Clojure
|
@@ -0,0 +1,723 @@
|
|
1
|
+
# Licensed to the Apache Software Foundation (ASF) under one or more
|
2
|
+
# contributor license agreements. See the NOTICE file distributed with this
|
3
|
+
# work for additional information regarding copyright ownership. The ASF
|
4
|
+
# licenses this file to you under the Apache License, Version 2.0 (the
|
5
|
+
# "License"); you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
12
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
13
|
+
# License for the specific language governing permissions and limitations under
|
14
|
+
# the License.
|
15
|
+
|
16
|
+
|
17
|
+
require 'buildr/core/project'
|
18
|
+
require 'buildr/core/build'
|
19
|
+
require 'buildr/core/compile'
|
20
|
+
|
21
|
+
|
22
|
+
module Buildr
|
23
|
+
|
24
|
+
# The underlying test framework used by TestTask.
|
25
|
+
# To add a new test framework, extend TestFramework::Base and add your framework using:
|
26
|
+
# Buildr::TestFramework << MyFramework
|
27
|
+
module TestFramework
|
28
|
+
|
29
|
+
class << self
|
30
|
+
|
31
|
+
# Returns true if the specified test framework exists.
|
32
|
+
def has?(name)
|
33
|
+
frameworks.any? { |framework| framework.to_sym == name.to_sym }
|
34
|
+
end
|
35
|
+
|
36
|
+
# Select a test framework by its name.
|
37
|
+
def select(name)
|
38
|
+
frameworks.detect { |framework| framework.to_sym == name.to_sym }
|
39
|
+
end
|
40
|
+
|
41
|
+
# Identify which test framework applies for this project.
|
42
|
+
def select_from(project)
|
43
|
+
# Look for a suitable test framework based on the compiled language,
|
44
|
+
# which may return multiple candidates, e.g. JUnit and TestNG for Java.
|
45
|
+
# Pick the one used in the parent project, if not, whichever comes first.
|
46
|
+
candidates = frameworks.select { |framework| framework.applies_to?(project) }
|
47
|
+
parent = project.parent
|
48
|
+
parent && candidates.detect { |framework| framework.to_sym == parent.test.framework } || candidates.first
|
49
|
+
end
|
50
|
+
|
51
|
+
# Adds a test framework to the list of supported frameworks.
|
52
|
+
#
|
53
|
+
# For example:
|
54
|
+
# Buildr::TestFramework << Buildr::JUnit
|
55
|
+
def add(framework)
|
56
|
+
@frameworks ||= []
|
57
|
+
@frameworks |= [framework]
|
58
|
+
end
|
59
|
+
alias :<< :add
|
60
|
+
|
61
|
+
# Returns a list of available test frameworks.
|
62
|
+
def frameworks
|
63
|
+
@frameworks ||= []
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
# Base class for all test frameworks, with common functionality. Extend and over-ride as you see fit
|
69
|
+
# (see JUnit as an example).
|
70
|
+
class Base
|
71
|
+
|
72
|
+
class << self
|
73
|
+
|
74
|
+
# The framework's identifier (e.g. :junit). Inferred from the class name.
|
75
|
+
def to_sym
|
76
|
+
@symbol ||= name.split('::').last.downcase.to_sym
|
77
|
+
end
|
78
|
+
|
79
|
+
# Returns true if this framework applies to the current project. For example, JUnit returns
|
80
|
+
# true if the tests are written in Java.
|
81
|
+
def applies_to?(project)
|
82
|
+
raise 'Not implemented'
|
83
|
+
end
|
84
|
+
|
85
|
+
# Returns a list of dependencies for this framework. Default is an empty list,
|
86
|
+
# override to add dependencies.
|
87
|
+
def dependencies
|
88
|
+
@dependencies ||= []
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
# Construct a new test framework with the specified options. Note that options may
|
94
|
+
# change before the framework is run.
|
95
|
+
def initialize(test_task, options)
|
96
|
+
@options = options
|
97
|
+
@task = test_task
|
98
|
+
end
|
99
|
+
|
100
|
+
# Options for this test framework.
|
101
|
+
attr_reader :options
|
102
|
+
# The test task we belong to
|
103
|
+
attr_reader :task
|
104
|
+
|
105
|
+
# Returns a list of dependenices for this framework. Defaults to calling the #dependencies
|
106
|
+
# method on the class.
|
107
|
+
def dependencies
|
108
|
+
self.class.dependencies
|
109
|
+
end
|
110
|
+
|
111
|
+
# TestTask calls this method to return a list of test names that can be run in this project.
|
112
|
+
# It then applies the include/exclude patterns to arrive at the list of tests that will be
|
113
|
+
# run, and call the #run method with that list.
|
114
|
+
#
|
115
|
+
# This method should return a list suitable for using with the #run method, but also suitable
|
116
|
+
# for the user to manage. For example, JUnit locates all the tests in the test.compile.target
|
117
|
+
# directory, and returns the class names, which are easier to work with than file names.
|
118
|
+
def tests(dependencies)
|
119
|
+
raise 'Not implemented'
|
120
|
+
end
|
121
|
+
|
122
|
+
# TestTask calls this method to run the named (and only those) tests. This method returns
|
123
|
+
# the list of tests that ran successfully.
|
124
|
+
def run(tests, dependencies)
|
125
|
+
raise 'Not implemented'
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
131
|
+
|
132
|
+
|
133
|
+
# The test task controls the entire test lifecycle.
|
134
|
+
#
|
135
|
+
# You can use the test task in three ways. You can access and configure specific test tasks,
|
136
|
+
# e.g. enhance the #compile task, or run code during #setup/#teardown.
|
137
|
+
#
|
138
|
+
# You can use convenient methods that handle the most common settings. For example,
|
139
|
+
# add dependencies using #with, or include only specific tests using #include.
|
140
|
+
#
|
141
|
+
# You can also enhance this task directly. This task will first execute the #compile task, followed
|
142
|
+
# by the #setup task, run the unit tests, any other enhancements, and end by executing #teardown.
|
143
|
+
#
|
144
|
+
# The test framework is determined based on the available test files, for example, if the test
|
145
|
+
# cases are written in Java, then JUnit is selected as the test framework. You can also select
|
146
|
+
# a specific test framework, for example, to use TestNG instead of JUnit:
|
147
|
+
# test.using :testng
|
148
|
+
class TestTask < Rake::Task
|
149
|
+
|
150
|
+
class << self
|
151
|
+
|
152
|
+
# Used by the local test and integration tasks to
|
153
|
+
# a) Find the local project(s),
|
154
|
+
# b) Find all its sub-projects and narrow down to those that have either unit or integration tests,
|
155
|
+
# c) Run all the (either unit or integration) tests, and
|
156
|
+
# d) Ignore failure if necessary.
|
157
|
+
def run_local_tests(integration) #:nodoc:
|
158
|
+
Project.local_projects do |project|
|
159
|
+
# !(foo ^ bar) tests for equality and accepts nil as false (and select is less obfuscated than reject on ^).
|
160
|
+
projects = ([project] + project.projects).select { |project| !(project.test.options[:integration] ^ integration) }
|
161
|
+
projects.each do |project|
|
162
|
+
info "Testing #{project.name}"
|
163
|
+
begin
|
164
|
+
project.test.invoke
|
165
|
+
rescue
|
166
|
+
raise unless Buildr.options.test == :all
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
# Used by the test/integration rule to only run tests that match the specified names.
|
173
|
+
def only_run(tests) #:nodoc:
|
174
|
+
tests = tests.map { |name| name =~ /\*/ ? name : "*#{name}*" }
|
175
|
+
# Since the tests may reside in a sub-project, we need to set the include/exclude pattern on
|
176
|
+
# all sub-projects, but only invoke test on the local project.
|
177
|
+
Project.projects.each { |project| project.test.send :only_run, tests }
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
# Default options already set on each test task.
|
182
|
+
def default_options
|
183
|
+
{ :fail_on_failure=>true, :fork=>:once, :properties=>{}, :environment=>{} }
|
184
|
+
end
|
185
|
+
|
186
|
+
def initialize(*args) #:nodoc:
|
187
|
+
super
|
188
|
+
@dependencies = FileList[]
|
189
|
+
@include = []
|
190
|
+
@exclude = []
|
191
|
+
@forced_need = false
|
192
|
+
parent_task = Project.parent_task(name)
|
193
|
+
if parent_task.respond_to?(:options)
|
194
|
+
@options = OpenObject.new { |hash, key| hash[key] = parent_task.options[key].clone rescue hash[key] = parent_task.options[key] }
|
195
|
+
else
|
196
|
+
@options = OpenObject.new(default_options)
|
197
|
+
end
|
198
|
+
enhance [application.buildfile.name] do
|
199
|
+
run_tests if framework
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
# The dependencies used for running the tests. Includes the compiled files (compile.target)
|
204
|
+
# and their dependencies. Will also include anything you pass to #with, shared between the
|
205
|
+
# testing compile and run dependencies.
|
206
|
+
attr_reader :dependencies
|
207
|
+
|
208
|
+
# *Deprecated*: Use dependencies instead.
|
209
|
+
def classpath
|
210
|
+
Buildr.application.deprecated 'Use dependencies instead.'
|
211
|
+
dependencies
|
212
|
+
end
|
213
|
+
|
214
|
+
# *Deprecated*: Use dependencies= instead.
|
215
|
+
def classpath=(artifacts)
|
216
|
+
Buildr.application.deprecated 'Use dependencies= instead.'
|
217
|
+
self.dependencies = artifacts
|
218
|
+
end
|
219
|
+
|
220
|
+
def execute(args) #:nodoc:
|
221
|
+
if Buildr.options.test == false
|
222
|
+
info "Skipping tests for #{project.name}"
|
223
|
+
return
|
224
|
+
end
|
225
|
+
setup.invoke
|
226
|
+
begin
|
227
|
+
super
|
228
|
+
rescue RuntimeError
|
229
|
+
raise if options[:fail_on_failure]
|
230
|
+
ensure
|
231
|
+
teardown.invoke
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
# :call-seq:
|
236
|
+
# compile(*sources) => CompileTask
|
237
|
+
# compile(*sources) { |task| .. } => CompileTask
|
238
|
+
#
|
239
|
+
# The compile task is similar to the Project's compile task. However, it compiles all
|
240
|
+
# files found in the src/test/{source} directory into the target/test/{code} directory.
|
241
|
+
# This task is executed by the test task before running any tests.
|
242
|
+
#
|
243
|
+
# Once the project definition is complete, all dependencies from the regular
|
244
|
+
# compile task are copied over, so you only need to specify dependencies
|
245
|
+
# specific to your tests. You can do so by calling #with on the test task.
|
246
|
+
# The dependencies used here are also copied over to the junit task.
|
247
|
+
def compile(*sources, &block)
|
248
|
+
@project.task('test:compile').from(sources).enhance &block
|
249
|
+
end
|
250
|
+
|
251
|
+
# :call-seq:
|
252
|
+
# resources(*prereqs) => ResourcesTask
|
253
|
+
# resources(*prereqs) { |task| .. } => ResourcesTask
|
254
|
+
#
|
255
|
+
# Executes by the #compile task to copy resource files over. See Project#resources.
|
256
|
+
def resources(*prereqs, &block)
|
257
|
+
@project.task('test:resources').enhance prereqs, &block
|
258
|
+
end
|
259
|
+
|
260
|
+
# :call-seq:
|
261
|
+
# setup(*prereqs) => task
|
262
|
+
# setup(*prereqs) { |task| .. } => task
|
263
|
+
#
|
264
|
+
# Returns the setup task. The setup task is executed at the beginning of the test task,
|
265
|
+
# after compiling the test files.
|
266
|
+
def setup(*prereqs, &block)
|
267
|
+
@project.task('test:setup').enhance prereqs, &block
|
268
|
+
end
|
269
|
+
|
270
|
+
# :call-seq:
|
271
|
+
# teardown(*prereqs) => task
|
272
|
+
# teardown(*prereqs) { |task| .. } => task
|
273
|
+
#
|
274
|
+
# Returns the teardown task. The teardown task is executed at the end of the test task.
|
275
|
+
def teardown(*prereqs, &block)
|
276
|
+
@project.task('test:teardown').enhance prereqs, &block
|
277
|
+
end
|
278
|
+
|
279
|
+
# :call-seq:
|
280
|
+
# with(*specs) => self
|
281
|
+
#
|
282
|
+
# Specify artifacts (specs, tasks, files, etc) to include in the dependencies list
|
283
|
+
# when compiling and running tests.
|
284
|
+
def with(*artifacts)
|
285
|
+
@dependencies |= Buildr.artifacts(artifacts.flatten).uniq
|
286
|
+
compile.with artifacts
|
287
|
+
self
|
288
|
+
end
|
289
|
+
|
290
|
+
# Returns various test options.
|
291
|
+
attr_reader :options
|
292
|
+
|
293
|
+
# :call-seq:
|
294
|
+
# using(options) => self
|
295
|
+
#
|
296
|
+
# Sets various test options from a hash and returns self. For example:
|
297
|
+
# test.using :fork=>:each, :properties=>{ 'url'=>'http://localhost:8080' }
|
298
|
+
#
|
299
|
+
# Can also be used to select the test framework, or to run these tests as
|
300
|
+
# integration tests. For example:
|
301
|
+
# test.using :testng
|
302
|
+
# test.using :integration
|
303
|
+
#
|
304
|
+
# The :fail_on_failure option specifies whether the task should fail if
|
305
|
+
# any of the tests fail (default), or should report the failures but continue
|
306
|
+
# running the build (when set to false).
|
307
|
+
#
|
308
|
+
# All other options depend on the capability of the test framework. These options
|
309
|
+
# should be used the same way across all frameworks that support them:
|
310
|
+
# * :fork -- Fork once for each project (:once, default), for each test in each
|
311
|
+
# project (:each), or don't fork at all (false).
|
312
|
+
# * :properties -- Properties pass to the test, e.g. in Java as system properties.
|
313
|
+
# * :environment -- Environment variables. This hash is made available in the
|
314
|
+
# form of environment variables.
|
315
|
+
def using(*args)
|
316
|
+
args.pop.each { |key, value| options[key.to_sym] = value } if Hash === args.last
|
317
|
+
args.each do |name|
|
318
|
+
if TestFramework.has?(name)
|
319
|
+
self.framework = name
|
320
|
+
elsif name == :integration
|
321
|
+
options[:integration] = true
|
322
|
+
else
|
323
|
+
Buildr.application.deprecated "Please replace with using(:#{name}=>true)"
|
324
|
+
options[name.to_sym] = true
|
325
|
+
end
|
326
|
+
end
|
327
|
+
self
|
328
|
+
end
|
329
|
+
|
330
|
+
# :call-seq:
|
331
|
+
# include(*names) => self
|
332
|
+
#
|
333
|
+
# Include only the specified tests. Unless specified, the default is to include
|
334
|
+
# all tests identified by the test framework. This method accepts multiple arguments
|
335
|
+
# and returns self.
|
336
|
+
#
|
337
|
+
# Tests are specified by their full name, but you can use glob patterns to select
|
338
|
+
# multiple tests, for example:
|
339
|
+
# test.include 'com.example.FirstTest' # FirstTest only
|
340
|
+
# test.include 'com.example.*' # All tests under com/example
|
341
|
+
# test.include 'com.example.Module*' # All tests starting with Module
|
342
|
+
# test.include '*.{First,Second}Test' # FirstTest, SecondTest
|
343
|
+
def include(*names)
|
344
|
+
@include += names
|
345
|
+
self
|
346
|
+
end
|
347
|
+
|
348
|
+
# :call-seq:
|
349
|
+
# exclude(*names) => self
|
350
|
+
#
|
351
|
+
# Exclude the specified tests. This method accepts multiple arguments and returns self.
|
352
|
+
# See #include for the type of arguments you can use.
|
353
|
+
def exclude(*names)
|
354
|
+
@exclude += names
|
355
|
+
self
|
356
|
+
end
|
357
|
+
|
358
|
+
# *Deprecated*: Use tests instead.
|
359
|
+
def classes
|
360
|
+
Buildr.application.deprecated 'Call tests instead of classes'
|
361
|
+
tests
|
362
|
+
end
|
363
|
+
|
364
|
+
# After running the task, returns all tests selected to run, based on availability and include/exclude pattern.
|
365
|
+
attr_reader :tests
|
366
|
+
# After running the task, returns all the tests that failed, empty array if all tests passed.
|
367
|
+
attr_reader :failed_tests
|
368
|
+
# After running the task, returns all the tests that passed, empty array if no tests passed.
|
369
|
+
attr_reader :passed_tests
|
370
|
+
|
371
|
+
# :call-seq:
|
372
|
+
# framework => symbol
|
373
|
+
#
|
374
|
+
# Returns the test framework, e.g. :junit, :testng.
|
375
|
+
def framework
|
376
|
+
unless @framework
|
377
|
+
# Start with all frameworks that apply (e.g. JUnit and TestNG for Java),
|
378
|
+
# and pick the first (default) one, unless already specified in parent project.
|
379
|
+
candidates = TestFramework.frameworks.select { |cls| cls.applies_to?(@project) }
|
380
|
+
candidate = @project.parent && candidates.detect { |framework| framework.to_sym == @project.parent.test.framework } ||
|
381
|
+
candidates.first
|
382
|
+
self.framework = candidate if candidate
|
383
|
+
end
|
384
|
+
@framework && @framework.class.to_sym
|
385
|
+
end
|
386
|
+
|
387
|
+
# :call-seq:
|
388
|
+
# report_to => file
|
389
|
+
#
|
390
|
+
# Test frameworks that can produce reports, will write them to this directory.
|
391
|
+
#
|
392
|
+
# This is framework dependent, so unless you use the default test framework, call this method
|
393
|
+
# after setting the test framework.
|
394
|
+
def report_to
|
395
|
+
@report_to ||= file(@project.path_to(:reports, framework)=>self)
|
396
|
+
end
|
397
|
+
|
398
|
+
# The path to the file that stores the time stamp of the last successful test run.
|
399
|
+
def last_successful_run_file #:nodoc:
|
400
|
+
File.join(report_to.to_s, 'last_successful_run')
|
401
|
+
end
|
402
|
+
|
403
|
+
# The time stamp of the last successful test run. Or Rake::EARLY if no successful test run recorded.
|
404
|
+
def timestamp #:nodoc:
|
405
|
+
File.exist?(last_successful_run_file) ? File.mtime(last_successful_run_file) : Rake::EARLY
|
406
|
+
end
|
407
|
+
|
408
|
+
# The project this task belongs to.
|
409
|
+
attr_reader :project
|
410
|
+
|
411
|
+
protected
|
412
|
+
|
413
|
+
def associate_with(project)
|
414
|
+
@project = project
|
415
|
+
end
|
416
|
+
|
417
|
+
def framework=(name)
|
418
|
+
cls = TestFramework.select(name) or raise ArgumentError, "No #{name} test framework available. Did you install it?"
|
419
|
+
#cls.inherit_options.reject { |name| options.has_key?(name) }.
|
420
|
+
# each { |name| options[name] = @parent_task.options[name] } if @parent_task.respond_to?(:options)
|
421
|
+
@framework = cls.new(self, options)
|
422
|
+
# Test framework dependency.
|
423
|
+
with @framework.dependencies
|
424
|
+
end
|
425
|
+
|
426
|
+
# :call-seq:
|
427
|
+
# include?(name) => boolean
|
428
|
+
#
|
429
|
+
# Returns true if the specified test name matches the inclusion/exclusion pattern. Used to determine
|
430
|
+
# which tests to execute.
|
431
|
+
def include?(name)
|
432
|
+
(@include.empty? || @include.any? { |pattern| File.fnmatch(pattern, name) }) &&
|
433
|
+
!@exclude.any? { |pattern| File.fnmatch(pattern, name) }
|
434
|
+
end
|
435
|
+
|
436
|
+
# Runs the tests using the selected test framework.
|
437
|
+
def run_tests
|
438
|
+
dependencies = Buildr.artifacts(self.dependencies).map(&:to_s).uniq
|
439
|
+
rm_rf report_to.to_s
|
440
|
+
@tests = @framework.tests(dependencies).select { |test| include?(test) }.sort
|
441
|
+
if @tests.empty?
|
442
|
+
@passed_tests, @failed_tests = [], []
|
443
|
+
else
|
444
|
+
info "Running tests in #{@project.name}"
|
445
|
+
begin
|
446
|
+
# set the baseDir system property if not set
|
447
|
+
@framework.options[:properties] = { 'baseDir' => @project.test.compile.target.to_s }.merge(@framework.options[:properties] || {})
|
448
|
+
@passed_tests = @framework.run(@tests, dependencies)
|
449
|
+
rescue Exception=>ex
|
450
|
+
error "Test framework error: #{ex.message}"
|
451
|
+
error ex.backtrace.join("\n") if Buildr.application.options.trace
|
452
|
+
@passed_tests = []
|
453
|
+
end
|
454
|
+
@failed_tests = @tests - @passed_tests
|
455
|
+
unless @failed_tests.empty?
|
456
|
+
error "The following tests failed:\n#{@failed_tests.join("\n")}"
|
457
|
+
fail 'Tests failed!'
|
458
|
+
end
|
459
|
+
end
|
460
|
+
record_successful_run unless @forced_need
|
461
|
+
end
|
462
|
+
|
463
|
+
# Call this method when a test run is successful to record the current system time.
|
464
|
+
def record_successful_run #:nodoc:
|
465
|
+
mkdir_p report_to.to_s
|
466
|
+
touch last_successful_run_file
|
467
|
+
end
|
468
|
+
|
469
|
+
# Limit running tests to specific list.
|
470
|
+
def only_run(tests)
|
471
|
+
@include = Array(tests)
|
472
|
+
@exclude.clear
|
473
|
+
@forced_need = true
|
474
|
+
end
|
475
|
+
|
476
|
+
def invoke_prerequisites(args, chain) #:nodoc:
|
477
|
+
@prerequisites |= FileList[@dependencies.uniq]
|
478
|
+
super
|
479
|
+
end
|
480
|
+
|
481
|
+
def needed? #:nodoc:
|
482
|
+
latest_prerequisite = @prerequisites.map { |p| application[p, @scope] }.max { |a,b| a.timestamp<=>b.timestamp }
|
483
|
+
needed = (timestamp == Rake::EARLY) || latest_prerequisite.timestamp > timestamp
|
484
|
+
trace "Testing#{needed ? ' ' : ' not '}needed. " +
|
485
|
+
"Latest prerequisite change: #{latest_prerequisite.timestamp} (#{latest_prerequisite.to_s}). " +
|
486
|
+
"Last successful test run: #{timestamp}."
|
487
|
+
return needed || @forced_need || Buildr.options.test == :all
|
488
|
+
end
|
489
|
+
end
|
490
|
+
|
491
|
+
|
492
|
+
# The integration tests task. Buildr has one such task (see Buildr#integration) that runs
|
493
|
+
# all tests marked with :integration=>true, and has a setup/teardown tasks separate from
|
494
|
+
# the unit tests.
|
495
|
+
class IntegrationTestsTask < Rake::Task
|
496
|
+
|
497
|
+
def initialize(*args) #:nodoc:
|
498
|
+
super
|
499
|
+
@setup = task("#{name}:setup")
|
500
|
+
@teardown = task("#{name}:teardown")
|
501
|
+
enhance do
|
502
|
+
info 'Running integration tests...'
|
503
|
+
TestTask.run_local_tests true
|
504
|
+
end
|
505
|
+
end
|
506
|
+
|
507
|
+
def execute(args) #:nodoc:
|
508
|
+
setup.invoke
|
509
|
+
begin
|
510
|
+
super
|
511
|
+
ensure
|
512
|
+
teardown.invoke
|
513
|
+
end
|
514
|
+
end
|
515
|
+
|
516
|
+
# :call-seq:
|
517
|
+
# setup(*prereqs) => task
|
518
|
+
# setup(*prereqs) { |task| .. } => task
|
519
|
+
#
|
520
|
+
# Returns the setup task. The setup task is executed before running the integration tests.
|
521
|
+
def setup(*prereqs, &block)
|
522
|
+
@setup.enhance prereqs, &block
|
523
|
+
end
|
524
|
+
|
525
|
+
# :call-seq:
|
526
|
+
# teardown(*prereqs) => task
|
527
|
+
# teardown(*prereqs) { |task| .. } => task
|
528
|
+
#
|
529
|
+
# Returns the teardown task. The teardown task is executed after running the integration tests.
|
530
|
+
def teardown(*prereqs, &block)
|
531
|
+
@teardown.enhance prereqs, &block
|
532
|
+
end
|
533
|
+
|
534
|
+
end
|
535
|
+
|
536
|
+
|
537
|
+
# Methods added to Project to support compilation and running of tests.
|
538
|
+
module Test
|
539
|
+
|
540
|
+
include Extension
|
541
|
+
|
542
|
+
first_time do
|
543
|
+
desc 'Run all tests'
|
544
|
+
task('test') { TestTask.run_local_tests false }
|
545
|
+
|
546
|
+
# This rule takes a suffix and runs that tests in the current project. For example;
|
547
|
+
# buildr test:MyTest
|
548
|
+
# will run the test com.example.MyTest, if such a test exists for this project.
|
549
|
+
#
|
550
|
+
# If you want to run multiple test, separate them with a comma. You can also use glob
|
551
|
+
# (* and ?) patterns to match multiple tests, see the TestTask#include method.
|
552
|
+
rule /^test:.*$/ do |task|
|
553
|
+
# The map works around a JRuby bug whereby the string looks fine, but fails in fnmatch.
|
554
|
+
TestTask.only_run task.name.scan(/test:(.*)/)[0][0].split(',').map { |t| "#{t}" }
|
555
|
+
task('test').invoke
|
556
|
+
end
|
557
|
+
|
558
|
+
IntegrationTestsTask.define_task('integration')
|
559
|
+
|
560
|
+
# Similar to test:[pattern] but for integration tests.
|
561
|
+
rule /^integration:.*$/ do |task|
|
562
|
+
unless task.name.split(':')[1] =~ /^(setup|teardown)$/
|
563
|
+
# The map works around a JRuby bug whereby the string looks fine, but fails in fnmatch.
|
564
|
+
TestTask.only_run task.name[/integration:(.*)/, 1].split(',').map { |t| "#{t}" }
|
565
|
+
task('integration').invoke
|
566
|
+
end
|
567
|
+
end
|
568
|
+
|
569
|
+
end
|
570
|
+
|
571
|
+
before_define do |project|
|
572
|
+
# Define a recursive test task, and pass it a reference to the project so it can discover all other tasks.
|
573
|
+
test = TestTask.define_task('test')
|
574
|
+
test.send :associate_with, project
|
575
|
+
|
576
|
+
# Similar to the regular resources task but using different paths.
|
577
|
+
resources = ResourcesTask.define_task('test:resources')
|
578
|
+
resources.send :associate_with, project, :test
|
579
|
+
project.path_to(:source, :test, :resources).tap { |dir| resources.from dir if File.exist?(dir) }
|
580
|
+
|
581
|
+
# Similar to the regular compile task but using different paths.
|
582
|
+
compile = CompileTask.define_task('test:compile'=>[project.compile, resources])
|
583
|
+
compile.send :associate_with, project, :test
|
584
|
+
test.enhance [compile]
|
585
|
+
|
586
|
+
# Define these tasks once, otherwise we may get a namespace error.
|
587
|
+
test.setup ; test.teardown
|
588
|
+
end
|
589
|
+
|
590
|
+
after_define do |project|
|
591
|
+
test = project.test
|
592
|
+
# Dependency on compiled tests and resources. Dependencies added using with.
|
593
|
+
test.dependencies.concat [test.compile.target, test.resources.target].compact
|
594
|
+
# Dependency on compiled code, its dependencies and resources.
|
595
|
+
test.with [project.compile.target, project.resources.target].compact
|
596
|
+
test.with project.compile.dependencies
|
597
|
+
# Picking up the test frameworks adds further dependencies.
|
598
|
+
test.framework
|
599
|
+
|
600
|
+
project.build test unless test.options[:integration]
|
601
|
+
|
602
|
+
project.clean do
|
603
|
+
rm_rf test.compile.target.to_s if test.compile.target
|
604
|
+
rm_rf test.report_to.to_s
|
605
|
+
end
|
606
|
+
end
|
607
|
+
|
608
|
+
|
609
|
+
# :call-seq:
|
610
|
+
# test(*prereqs) => TestTask
|
611
|
+
# test(*prereqs) { |task| .. } => TestTask
|
612
|
+
#
|
613
|
+
# Returns the test task. The test task controls the entire test lifecycle.
|
614
|
+
#
|
615
|
+
# You can use the test task in three ways. You can access and configure specific
|
616
|
+
# test tasks, e.g. enhance the compile task by calling test.compile, setup for
|
617
|
+
# the tests by enhancing test.setup and so forth.
|
618
|
+
#
|
619
|
+
# You can use convenient methods that handle the most common settings. For example,
|
620
|
+
# add dependencies using test.with, or include only specific tests using test.include.
|
621
|
+
#
|
622
|
+
# You can also enhance this task directly. This method accepts a list of arguments
|
623
|
+
# that are used as prerequisites and an optional block that will be executed by the
|
624
|
+
# test task.
|
625
|
+
#
|
626
|
+
# This task compiles the project and the tests (in that order) before running any tests.
|
627
|
+
# It execute the setup task, runs all the tests, any enhancements, and ends with the
|
628
|
+
# teardown tasks.
|
629
|
+
def test(*prereqs, &block)
|
630
|
+
task('test').enhance prereqs, &block
|
631
|
+
end
|
632
|
+
|
633
|
+
# :call-seq:
|
634
|
+
# integration { |task| .... }
|
635
|
+
# integration => IntegrationTestTask
|
636
|
+
#
|
637
|
+
# Use this method to return the integration tests task, or enhance it with a block to execute.
|
638
|
+
#
|
639
|
+
# There is one integration tests task you can execute directly, or as a result of running the package
|
640
|
+
# task (or tasks that depend on it, like install and upload). It contains all the tests marked with
|
641
|
+
# :integration=>true, all other tests are considered unit tests and run by the test task before packaging.
|
642
|
+
# So essentially: build=>test=>packaging=>integration=>install/upload.
|
643
|
+
#
|
644
|
+
# You add new tests from projects that define integration tests using the regular test task,
|
645
|
+
# but with the following addition:
|
646
|
+
# test.using :integration
|
647
|
+
#
|
648
|
+
# Use this method to enhance the setup and teardown tasks that are executed before (and after) all
|
649
|
+
# integration tests are run, for example, to start a Web server or create a database.
|
650
|
+
def integration(*deps, &block)
|
651
|
+
Rake::Task['rake:integration'].enhance deps, &block
|
652
|
+
end
|
653
|
+
|
654
|
+
end
|
655
|
+
|
656
|
+
|
657
|
+
# :call-seq:
|
658
|
+
# integration { |task| .... }
|
659
|
+
# integration => IntegrationTestTask
|
660
|
+
#
|
661
|
+
# Use this method to return the integration tests task.
|
662
|
+
def integration(*deps, &block)
|
663
|
+
Rake::Task['rake:integration'].enhance deps, &block
|
664
|
+
end
|
665
|
+
|
666
|
+
class Options
|
667
|
+
|
668
|
+
# Runs tests after the build when true (default). This forces tests to execute
|
669
|
+
# after the build, including when running build related tasks like install, upload and release.
|
670
|
+
#
|
671
|
+
# Set to false to not run any tests. Set to :all to run all tests, ignoring failures.
|
672
|
+
#
|
673
|
+
# This option is set from the environment variable 'test', so you can also do:
|
674
|
+
|
675
|
+
# Returns the test option (environment variable TEST). Possible values are:
|
676
|
+
# * :false -- Do not run any tests (also accepts 'no' and 'skip').
|
677
|
+
# * :true -- Run all tests, stop on failure (default if not set).
|
678
|
+
# * :all -- Run all tests, ignore failures.
|
679
|
+
def test
|
680
|
+
case value = ENV['TEST'] || ENV['test']
|
681
|
+
when /^(no|off|false|skip)$/i
|
682
|
+
false
|
683
|
+
when /^all$/i
|
684
|
+
:all
|
685
|
+
when /^(yes|on|true)$/i, nil
|
686
|
+
true
|
687
|
+
else
|
688
|
+
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 tests and stop at failure."
|
689
|
+
true
|
690
|
+
end
|
691
|
+
end
|
692
|
+
|
693
|
+
# Sets the test option (environment variable TEST). Possible values are true, false or :all.
|
694
|
+
#
|
695
|
+
# You can also set this from the environment variable, e.g.:
|
696
|
+
#
|
697
|
+
# buildr # With tests
|
698
|
+
# buildr test=no # Without tests
|
699
|
+
# buildr test=all # Ignore failures
|
700
|
+
# set TEST=no
|
701
|
+
# buildr # Without tests
|
702
|
+
def test=(flag)
|
703
|
+
ENV['test'] = nil
|
704
|
+
ENV['TEST'] = flag.to_s
|
705
|
+
end
|
706
|
+
|
707
|
+
end
|
708
|
+
|
709
|
+
Buildr.help << <<-HELP
|
710
|
+
To run a full build without running any tests:
|
711
|
+
buildr test=no
|
712
|
+
To run specific test:
|
713
|
+
buildr test:MyTest
|
714
|
+
To run integration tests:
|
715
|
+
buildr integration
|
716
|
+
HELP
|
717
|
+
|
718
|
+
end
|
719
|
+
|
720
|
+
|
721
|
+
class Buildr::Project
|
722
|
+
include Buildr::Test
|
723
|
+
end
|