//
// Copyright (c) 2016-2017 Eclipse Microprofile Contributors:
// Mark Struberg
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

= Running the Microprofile Fault Tolerance TCK

Any Microprofile 1.1 and higher release must pass this test suite.
The TCK uses `testng`

== Hardware Requirements

All systems should meet the following recommended hardware requirements:

    * CPU running at 2.0 GHz or higher
    * 4 GB of RAM or more
    * Network access to the Internet

== Software Requirements

You can run this TCK on platforms running the Solaris, Linux, Windows, and Mac OS with the following software installed:

    * Maven
    * JDK8+

== Dependencies

To enable the tests in your project you need to add the following dependency to your build:

[source, xml]
----
<dependency>
    <groupId>org.eclipse.microprofile.fault.tolerance</groupId>
    <artifactId>microprofile-fault-tolerance-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

<dependency>
    <groupId>org.eclipse.microprofile.fault.tolerance</groupId>
    <artifactId>microprofile-fault-tolerance-tck</artifactId>
    <version>1.0-SNAPSHOT</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>6.9.9</version>
    <scope>test</scope>
</dependency>
----

== Using a TestNG Test Suite

You can run the tests either as a test suite or via Maven Surefire configuration.  This section is how to do it in a test suite.

=== Declaring the Tests to run

You also need to specify which tests you want to run, e.g. create a file `tck-suite.xml` in your project which contains the following content:
[source, xml]
----
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="microprofile-fault-tolerance-TCK" verbose="2" configfailurepolicy="continue" >

    <test name="microprofile-fault-tolerance 1.0 TCK">
        <packages>
            <package name="org.eclipse.microprofile.fault.tolerance.tck.*">
            </package>
        </packages>
    </test>

</suite>
----

=== Configuration in Apache Maven pom.xml

If you use Apache Maven then the tests are run via the `maven-surefire-plugin`
[source, xml]
----
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <configuration>
                <suiteXmlFiles>
                    <suiteXmlFile>tck-suite.xml</suiteXmlFile>
                </suiteXmlFiles>
            </configuration>
        </plugin>
    </plugins>
</build>
----

== Running as a Scanned Dependency

You can also run the TCK as a scanned dependency.

=== Surefire Configuration in your pom.xml

Once you've added the dependency, you don't need a `tck-suite.xml` you can just scan the dependency for tests.

[source, xml]
----
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <configuration>
                <dependenciesToScan>
                    <dependency>org.eclipse.microprofile.fault.tolerance:microprofile-fault-tolerance-tck</dependency>
                </dependenciesToScan>
            </configuration>
        </plugin>
    </plugins>
</build>
----

== Timeout Configs
We can configure the existing tck test timeouts. With the following configurations, timeouts can be greatly
reduced for use in local executions or in fast CI environments.

The property is a multiplier applied to all timeouts linearly, namely @Timeout annotation values, workload simulations
and test assertions.

.TCK Timeout config
|===
|Property |Default |Unit

|org.eclipse.microprofile.fault.tolerance.tck.timeout.multiplier
|1.0
|Dimensionless double
|===

The property can be set as a System Property when running the TCK.

Example:
[source,xml]
----
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <configuration>
                <dependenciesToScan>
                    <dependency>org.eclipse.microprofile.fault.tolerance:microprofile-fault-tolerance-tck</dependency>
                </dependenciesToScan>
                <systemPropertyVariables>
                    <org.eclipse.microprofile.fault.tolerance.tck.timeout.multiplier>2.0</org.eclipse.microprofile.fault.tolerance.tck.timeout.multiplier>
                </systemPropertyVariables>
            </configuration>
        </plugin>
    </plugins>
</build>
----