<!--
 -
 - Licensed to the Apache Software Foundation (ASF) under one
 - or more contributor license agreements.  See the NOTICE file
 - distributed with this work for additional information
 - regarding copyright ownership.  The ASF licenses this file
 - to you 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.
 -
 -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache.qpid</groupId>
    <artifactId>proton-project</artifactId>
    <version>0.17.0-SNAPSHOT</version>
  </parent>

  <artifactId>proton-tests</artifactId>
  <name>Proton-J Python Tests</name>

  <description>The Proton python system tests execute against the Java implementation, using Maven (via this pom).

To run the tests against proton-j, execute:

mvn test

Example of advanced usage (all of the -D flags are optional):

mvn test \
-Dproton.pythontest.pattern='proton_tests.transport.ClientTransportTest.*' \
-Dproton.pythontest.invocations=20 \
-Dproton.pythontest.always_colorize=true
  </description>

  <properties>
    <testReportOutputDirectory>${basedir}/target/surefire-reports</testReportOutputDirectory>
  </properties>

  <build>
    <!-- System tests are arranged by language, hence the non-default location of the JUnit tests. -->
    <testSourceDirectory>java</testSourceDirectory>
    <resources>
      <resource><directory>resources</directory></resource>
    </resources>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <systemPropertyVariables>
            <protonJythonIgnoreFile>${basedir}/java/pythonTests.ignore</protonJythonIgnoreFile>
            <protonJythonTestRoot>${basedir}/python</protonJythonTestRoot>
            <protonJythonBinding>${basedir}/java/shim/binding</protonJythonBinding>
            <protonJythonShim>${basedir}/java/shim</protonJythonShim>
            <protonJythonTestScript>${basedir}/python/proton-test</protonJythonTestScript>
            <protonJythonTestXmlOutputDirectory>${testReportOutputDirectory}</protonJythonTestXmlOutputDirectory>
            <java.util.logging.config.file>${project.build.outputDirectory}/logging.properties</java.util.logging.config.file>
          </systemPropertyVariables>
         <reportsDirectory>${testReportOutputDirectory}</reportsDirectory>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.6</version>
        <executions>
          <execution>
            <goals>
              <goal>test-jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <dependencies>
    <dependency>
      <groupId>org.apache.qpid</groupId>
      <artifactId>proton-j</artifactId>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.bouncycastle</groupId>
      <artifactId>bcpkix-jdk15on</artifactId>
      <version>1.53</version>
    </dependency>
    <dependency>
        <groupId>org.python</groupId>
        <artifactId>jython-standalone</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>
