@Mojo(name="test",
defaultPhase=INTEGRATION_TEST,
requiresDependencyResolution=RUNTIME)
public class TestMojo
extends org.apache.maven.plugin.AbstractMojo
Executes tests in an OSGi runtime.
The goal launches an OSGi runtime and executes the project's tests in that runtime. The "test runtime" consists of the bundle built in this project and its transitive dependencies, plus some Equinox and test harness bundles. The bundles are resolved from the target platform of the project. Note that the test runtime does typically not contain the entire target platform. If there are implicitly required bundles (e.g. org.eclipse.equinox.ds to make declarative services work), they need to be added manually through an extraRequirements configuration on the target-platform-configuration plugin.
Modifier and Type | Field and Description |
---|---|
private java.lang.String |
appArgLine
Arbitrary applications arguments to set on the command line.
|
private java.lang.String |
application
Eclipse application to be run.
|
private java.lang.String |
argLine
Arbitrary JVM options to set on the command line.
|
private BundleStartLevel[] |
bundleStartLevel
Bundle start level and auto start configuration used by the test runtime.
|
private int |
debugPort
Set this parameter to suspend the test JVM waiting for a client to open a remote debug
session on the specified port.
|
private BundleStartLevel |
defaultStartLevel
The default bundle start level and auto start configuration used by the test runtime for
bundles where the start level/auto start is not configured in
bundleStartLevel . |
private boolean |
deleteOsgiDataDirectory
Whether to recursively delete the directory
osgiDataDirectory before running the
tests. |
private org.apache.maven.model.Dependency[] |
dependencies
Additional dependencies to be added to the test runtime.
|
private DefaultDependencyResolverFactory |
dependencyResolverLocator |
private java.util.Map<java.lang.String,java.lang.String> |
environmentVariables
Additional environments to set for the forked test JVM.
|
private java.lang.String |
excludedGroups
(junit47 provider with JUnit4.8+ only) Excluded groups/categories (comma-separated).
|
private java.util.List<java.lang.String> |
excludes
List of patterns (separated by commas) used to specify the tests that should be excluded in
testing.
|
private java.lang.String[] |
explodedBundles
List of bundles that must be expanded in order to execute the tests.
|
private boolean |
failIfNoTests
If set to "false" the test execution will not fail in case there are no tests found.
|
private int |
forkedProcessTimeoutInSeconds
Kill the forked test process after a certain number of seconds.
|
private org.apache.maven.model.Dependency[] |
frameworkExtensions
List of framework extension bundles to add.
|
private java.lang.String |
groups
(junit47 provider with JUnit4.8+ only) Groups/categories for this test (comma-separated).
|
private java.util.List<java.lang.String> |
includes
List of patterns (separated by commas) used to specify the tests that should be included in
testing.
|
private EquinoxInstallationFactory |
installationFactory |
private EquinoxLauncher |
launcher |
private OsgiBundleProject |
osgiBundle |
private java.io.File |
osgiDataDirectory
OSGi data directory (
osgi.instance.area , aka the workspace) of the Equinox
runtime used to execute tests. |
private ParallelMode |
parallel
(JUnit 4.7 provider) Supports values "classes"/"methods"/"both" to run in separate threads,
as controlled by threadCount.
|
private boolean |
perCoreThreadCount
(JUnit 4.7 provider) Indicates that threadCount is per cpu core.
|
private java.util.List<org.apache.maven.artifact.Artifact> |
pluginArtifacts |
private java.lang.String |
product
Eclipse product to be run, i.e.
|
private java.lang.String |
profileName
p2 profile name of the installation under test.
|
private org.apache.maven.project.MavenProject |
project |
private java.util.Map<java.lang.String,TychoProject> |
projectTypes |
private ProviderHelper |
providerHelper |
private java.lang.String |
providerHint
Normally tycho will automatically determine the test framework provider based on the test
project's classpath.
|
private java.util.Properties |
providerProperties
Use this to specify surefire provider-specific properties.
|
private ProvisionedInstallationBuilderFactory |
provisionedInstallationBuilderFactory |
private boolean |
redirectTestOutputToFile
Set this to "true" to redirect the unit test standard output to a file (found in
reportsDirectory/testName-output.txt).
|
private java.io.File |
reportsDirectory
Base directory where all reports are written to.
|
private RepositoryReferenceTool |
repositoryReferenceTool |
private org.apache.maven.repository.RepositorySystem |
repositorySystem |
private org.apache.maven.artifact.resolver.ResolutionErrorHandler |
resolutionErrorHandler |
private java.lang.String |
runOrder
Defines the order the tests will be run in.
|
private org.apache.maven.execution.MavenSession |
session |
private boolean |
showEclipseLog
Enables -debug -consolelog for the test OSGi runtime
|
private java.lang.Boolean |
skip
Same as
skipTests |
private boolean |
skipExec
Deprecated.
Use skipTests instead.
|
private java.lang.Boolean |
skipTests
Set this to "true" to skip running tests, but still compile them.
|
private java.util.List<java.lang.String> |
suiteXmlFiles
Only supported by the TestNG test provider.
|
private java.io.File |
surefireProperties |
private java.util.Map<java.lang.String,java.lang.String> |
systemProperties
Additional system properties to set for the forked test JVM.
|
private java.lang.String |
test
Specify this parameter if you want to use the test pattern matching notation, Ant pattern
matching, to select tests to run.
|
private java.lang.String |
testClass
Identifies a single test (suite) class to run.
|
private java.io.File |
testClassesDirectory
The directory containing generated test classes of the project being tested.
|
private boolean |
testFailureIgnore
Set this to true to ignore a failure during testing.
|
private java.lang.String |
testRuntime
How to create the OSGi test runtime.
|
private int |
threadCount
(JUnit 4.7 provider) The attribute thread-count allows you to specify how many threads should
be allocated for this execution.
|
private org.apache.maven.toolchain.ToolchainManager |
toolchainManager |
private ToolchainProvider |
toolchainProvider |
private ToolchainProvider.JDKUsage |
useJDK
Which JDK to use for executing tests.
|
private boolean |
useUIHarness
Run tests using UI (true) or headless (false) test harness.
|
private boolean |
useUIThread
Run tests in UI (true) or background (false) thread.
|
private boolean |
useUnlimitedThreads
(JUnit 4.7 provider) Indicates that the thread pool will be unlimited.
|
private java.io.File |
work
Root directory (osgi.install.area) of the Equinox runtime used to execute tests.
|
private DevWorkspaceResolver |
workspaceState |
Constructor and Description |
---|
TestMojo() |
Modifier and Type | Method and Description |
---|---|
private void |
addCustomProfileArg(EquinoxLaunchConfiguration cli) |
(package private) void |
addProgramArgs(EquinoxLaunchConfiguration cli,
java.lang.String... arguments) |
private static void |
appendCommaSeparated(java.lang.StringBuilder sb,
java.lang.String string) |
(package private) LaunchConfiguration |
createCommandLine(EquinoxInstallation testRuntime) |
private EquinoxInstallation |
createEclipseInstallation() |
private EquinoxInstallation |
createProvisionedInstallation() |
private void |
createSurefireProperties(TestFrameworkProvider provider) |
void |
execute() |
private java.lang.String |
getBuildOutputDirectories() |
private ArtifactKey |
getBundleArtifactKey(java.io.File file) |
private java.util.List<java.lang.String> |
getBundlesToExplode() |
private java.util.List<org.apache.maven.model.Dependency> |
getExtraDependencies() |
private java.util.List<java.io.File> |
getFrameworkExtensions() |
private java.util.List<java.lang.String> |
getIUsToInstall(java.util.Set<org.apache.maven.artifact.Artifact> testHarnessArtifacts) |
protected java.util.Properties |
getMergedProviderProperties() |
private java.util.Map<java.lang.String,java.lang.String> |
getMergedProviderPropertiesMap() |
private java.util.Map<java.lang.String,java.lang.String> |
getMergedSystemProperties() |
private BundleProject |
getProjectType() |
private ReactorProject |
getReactorProject() |
private java.util.List<ReactorProject> |
getReactorProjects() |
private java.lang.String |
getTestApplication(EquinoxInstallationDescription testRuntime) |
private java.lang.String |
getTestBundleSymbolicName() |
private java.util.List<org.apache.maven.model.Dependency> |
getTestDependencies() |
protected org.apache.maven.toolchain.Toolchain |
getToolchain() |
protected org.apache.maven.model.Dependency |
newBundleDependency(java.lang.String bundleId) |
private void |
runTest(EquinoxInstallation testRuntime) |
protected org.apache.maven.surefire.util.ScanResult |
scanForTests() |
protected boolean |
shouldSkip() |
(package private) java.lang.String[] |
splitArgLine(java.lang.String argLine) |
private void |
storeProperties(java.util.Map<java.lang.String,java.lang.String> p,
java.io.File file) |
private void |
storeProperties(java.util.Properties p,
java.io.File file) |
@Parameter(defaultValue="${project.build.directory}/work") private java.io.File work
@Parameter(defaultValue="${project.build.directory}/work/data/") private java.io.File osgiDataDirectory
osgi.instance.area
, aka the workspace) of the Equinox
runtime used to execute tests.@Parameter(defaultValue="true") private boolean deleteOsgiDataDirectory
osgiDataDirectory
before running the
tests.@Parameter(property="project", readonly=true) private org.apache.maven.project.MavenProject project
@Parameter(property="debugPort") private int debugPort
@Parameter private java.util.List<java.lang.String> includes
test
parameter is not specified, the
default includes will be
**/Test*.java **/*Test.java **/*TestCase.java
@Parameter private java.util.List<java.lang.String> excludes
test
parameter is not specified, the
default excludes will be **/*$*
(which excludes all inner classes).@Parameter(property="test") private java.lang.String test
**/${test}.java
When used, the includes
and
excludes
patterns parameters are ignored@Deprecated @Parameter(property="maven.test.skipExec") private boolean skipExec
@Parameter(property="skipTests") private java.lang.Boolean skipTests
false
@Parameter(property="maven.test.skip") private java.lang.Boolean skip
skipTests
@Parameter(property="failIfNoTests", defaultValue="true") private boolean failIfNoTests
@Parameter(property="groups") private java.lang.String groups
@Parameter(property="excludedGroups") private java.lang.String excludedGroups
@Parameter(property="maven.test.failure.ignore", defaultValue="false") private boolean testFailureIgnore
@Parameter(property="project.build.outputDirectory") private java.io.File testClassesDirectory
@Parameter(property="tycho.showEclipseLog", defaultValue="false") private boolean showEclipseLog
@Parameter(property="maven.test.redirectTestOutputToFile", defaultValue="false") private boolean redirectTestOutputToFile
@Parameter(defaultValue="${project.build.directory}/surefire-reports") private java.io.File reportsDirectory
@Parameter(defaultValue="${project.build.directory}/surefire.properties") private java.io.File surefireProperties
@Parameter private org.apache.maven.model.Dependency[] dependencies
testRuntime
is
p2Installed
.
Note: This parameter has only limited support for dependencies to artifacts within the
reactor. Therefore it is recommended to specify extraRequirements on the
target-platform-configuration plugin instead. Example:
<plugin> <groupId>org.eclipse.tycho</groupId> <artifactId>target-platform-configuration</artifactId> <version>${tycho-version}</version> <configuration> <dependency-resolution> <extraRequirements> <requirement> <type>eclipse-feature</type> <id>example.project.feature</id> <versionRange>0.0.0</versionRange> </requirement> </extraRequirements> </dependency-resolution> </configuration> </plugin>The dependencies specified as extraRequirements are – together with the dependencies specified in the MANIFEST.MF of the project – transitively resolved against the target platform. The resulting set of bundles is included in the test runtime.
@Parameter private java.lang.String application
@Parameter private java.lang.String product
@Parameter(property="session", readonly=true, required=true) private org.apache.maven.execution.MavenSession session
@Parameter(defaultValue="false") private boolean useUIHarness
@Parameter(defaultValue="true") private boolean useUIThread
@Parameter(property="plugin.artifacts") private java.util.List<org.apache.maven.artifact.Artifact> pluginArtifacts
@Parameter(property="tycho.testArgLine") private java.lang.String argLine
@Parameter private java.lang.String appArgLine
@Parameter(property="surefire.timeout") private int forkedProcessTimeoutInSeconds
@Parameter(property="testClass") private java.lang.String testClass
test
is
specified. Example:
<testClass>foo.bar.FooTest</testClass>
@Parameter private java.util.Map<java.lang.String,java.lang.String> environmentVariables
@Parameter private java.util.Map<java.lang.String,java.lang.String> systemProperties
@Parameter private java.lang.String[] explodedBundles
testRuntime
is p2Installed
.@Parameter private org.apache.maven.model.Dependency[] frameworkExtensions
testRuntime
is p2Installed
.@Parameter private BundleStartLevel[] bundleStartLevel
testRuntime
is p2Installed
. Example:
<bundleStartLevel> <bundle> <id>foo.bar.myplugin</id> <level>6</level> <autoStart>true</autoStart> </bundle> </bundleStartLevel>
@Parameter private BundleStartLevel defaultStartLevel
bundleStartLevel
.
Ignored if testRuntime
is p2Installed
. Example:
<defaultStartLevel> <level>6</level> <autoStart>true</autoStart> </defaultStartLevel>
@Component private org.apache.maven.repository.RepositorySystem repositorySystem
@Component private org.apache.maven.artifact.resolver.ResolutionErrorHandler resolutionErrorHandler
@Component private DefaultDependencyResolverFactory dependencyResolverLocator
@Component(role=TychoProject.class) private java.util.Map<java.lang.String,TychoProject> projectTypes
@Component private EquinoxInstallationFactory installationFactory
@Component private ProvisionedInstallationBuilderFactory provisionedInstallationBuilderFactory
@Component private EquinoxLauncher launcher
@Component(role=TychoProject.class, hint="eclipse-plugin") private OsgiBundleProject osgiBundle
@Parameter private java.lang.String providerHint
@Parameter(defaultValue="filesystem") private java.lang.String runOrder
@Parameter(property="parallel") private ParallelMode parallel
@Parameter(property="perCoreThreadCount", defaultValue="true") private boolean perCoreThreadCount
@Parameter(property="threadCount") private int threadCount
@Parameter(property="useUnlimitedThreads", defaultValue="false") private boolean useUnlimitedThreads
@Parameter private java.util.Properties providerProperties
@Parameter(defaultValue="default") private java.lang.String testRuntime
default
and
p2Installed
. Mode p2Installed
is EXPERIMENTAL - only works
when installing products under test (see below).
default
mode, all necessary files to define the test runtime like
config.ini are generated by tycho. This installation mode has the advantage that the
test runtime is minimal (defined by the transitive dependencies of the test bundle plus and
the test harness) and existing bundle jars are referenced rather than copied for the
installationp2Installed
mode, use p2 director to install test bundle, test harness
bundles and respective dependencies. This installation mode can be used for integration tests
that require a fully p2-provisioned installation. To install a product IU, add it as extra
requirement to the test bundle (see example below). Note that this installation mode comes
with a certain performance overhead for executing the provisioning operations otherwise not
required.<plugin> <groupId>org.eclipse.tycho</groupId> <artifactId>tycho-surefire-plugin</artifactId> <version>${tycho-version}</version> <configuration> <testRuntime>p2Installed</testRuntime> </configuration> </plugin> <plugin> <groupId>org.eclipse.tycho</groupId> <artifactId>target-platform-configuration</artifactId> <version>${tycho-version}</version> <configuration> <dependency-resolution> <extraRequirements> <!-- product IU under test --> <requirement> <type>p2-installable-unit</type> <id>example.product.id</id> <versionRange>0.0.0</versionRange> </requirement> </extraRequirements> </dependency-resolution> </configuration> </plugin>
@Parameter(defaultValue="DefaultProfile") private java.lang.String profileName
testRuntime
is p2Installed
. If tests are installed on
top of an already existing installation in work
, this must match the name of the
existing profile.@Component private org.apache.maven.toolchain.ToolchainManager toolchainManager
@Component private ProviderHelper providerHelper
@Component private DevWorkspaceResolver workspaceState
@Component private RepositoryReferenceTool repositoryReferenceTool
@Component private ToolchainProvider toolchainProvider
@Parameter(defaultValue="SYSTEM") private ToolchainProvider.JDKUsage useJDK
SYSTEM
,
BREE
.
Bundle-RequiredExecutionEnvironment
to lookup the
JDK from
toolchains.xml.
The value of BREE will be matched against the id of the toolchain elements in toolchains.xml.
META-INF/MANIFEST.MF
:
Bundle-RequiredExecutionEnvironment: JavaSE-1.7In toolchains.xml:
<toolchains> <toolchain> <type>jdk</type> <provides> <id>JavaSE-1.7</id> </provides> <configuration> <jdkHome>/path/to/jdk/1.7</jdkHome> </configuration> </toolchain> </toolchains>
@Parameter private java.util.List<java.lang.String> suiteXmlFiles
includes
and excludes
patterns. The path to the suite file(s) could be relative (test bundle classpath) or an
absolute path to xml files outside the test bundle.
<configuration> <suiteXmlFiles> <suiteXmlFile>myTestSuite.xml</suiteXmlFile> </suiteXmlFiles> </configuration>
public void execute() throws org.apache.maven.plugin.MojoExecutionException, org.apache.maven.plugin.MojoFailureException
org.apache.maven.plugin.MojoExecutionException
org.apache.maven.plugin.MojoFailureException
protected boolean shouldSkip()
private ReactorProject getReactorProject()
private java.util.List<ReactorProject> getReactorProjects()
private EquinoxInstallation createProvisionedInstallation() throws org.apache.maven.plugin.MojoExecutionException
org.apache.maven.plugin.MojoExecutionException
private java.util.List<java.lang.String> getIUsToInstall(java.util.Set<org.apache.maven.artifact.Artifact> testHarnessArtifacts)
private BundleProject getProjectType()
private EquinoxInstallation createEclipseInstallation() throws org.apache.maven.plugin.MojoExecutionException
org.apache.maven.plugin.MojoExecutionException
private java.util.List<org.apache.maven.model.Dependency> getExtraDependencies()
private java.lang.String getTestBundleSymbolicName()
private ArtifactKey getBundleArtifactKey(java.io.File file) throws org.apache.maven.plugin.MojoExecutionException
org.apache.maven.plugin.MojoExecutionException
private java.util.List<org.apache.maven.model.Dependency> getTestDependencies()
protected org.apache.maven.model.Dependency newBundleDependency(java.lang.String bundleId)
private void createSurefireProperties(TestFrameworkProvider provider) throws org.apache.maven.plugin.MojoExecutionException
org.apache.maven.plugin.MojoExecutionException
protected java.util.Properties getMergedProviderProperties() throws org.apache.maven.plugin.MojoExecutionException
org.apache.maven.plugin.MojoExecutionException
private java.util.Map<java.lang.String,java.lang.String> getMergedProviderPropertiesMap()
protected org.apache.maven.surefire.util.ScanResult scanForTests()
private void storeProperties(java.util.Map<java.lang.String,java.lang.String> p, java.io.File file) throws org.apache.maven.plugin.MojoExecutionException
org.apache.maven.plugin.MojoExecutionException
private void storeProperties(java.util.Properties p, java.io.File file) throws org.apache.maven.plugin.MojoExecutionException
org.apache.maven.plugin.MojoExecutionException
private void runTest(EquinoxInstallation testRuntime) throws org.apache.maven.plugin.MojoExecutionException, org.apache.maven.plugin.MojoFailureException
org.apache.maven.plugin.MojoExecutionException
org.apache.maven.plugin.MojoFailureException
protected org.apache.maven.toolchain.Toolchain getToolchain() throws org.apache.maven.plugin.MojoExecutionException
org.apache.maven.plugin.MojoExecutionException
LaunchConfiguration createCommandLine(EquinoxInstallation testRuntime) throws java.net.MalformedURLException, org.apache.maven.plugin.MojoExecutionException
java.net.MalformedURLException
org.apache.maven.plugin.MojoExecutionException
private java.util.Map<java.lang.String,java.lang.String> getMergedSystemProperties()
private void addCustomProfileArg(EquinoxLaunchConfiguration cli) throws org.apache.maven.plugin.MojoExecutionException
org.apache.maven.plugin.MojoExecutionException
void addProgramArgs(EquinoxLaunchConfiguration cli, java.lang.String... arguments)
java.lang.String[] splitArgLine(java.lang.String argLine) throws org.apache.maven.plugin.MojoExecutionException
org.apache.maven.plugin.MojoExecutionException
private java.lang.String getTestApplication(EquinoxInstallationDescription testRuntime)
private java.lang.String getBuildOutputDirectories()
private static void appendCommaSeparated(java.lang.StringBuilder sb, java.lang.String string)
private java.util.List<java.lang.String> getBundlesToExplode()
private java.util.List<java.io.File> getFrameworkExtensions() throws org.apache.maven.plugin.MojoExecutionException
org.apache.maven.plugin.MojoExecutionException