<?xml version="1.0" encoding="UTF-8"?>
<!--


    Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>

    ====================================================================
    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.
    ====================================================================

-->

	<!--
		Note that the code that these performance tests are evaluated against
		exist in src/main. The code in that location was copied straight from
		Amazon's website. There have been small modifications to make unit
		testing possible. That code exists with the following license: This
		software code is made available "AS IS" without warranties of any
		kind. You may copy, display, modify and redistribute the software code
		either by itself or as incorporated into your code; provided that you
		do not remove any proprietary notices. Your use of this software code
		is at your own risk and you waive any claim against Amazon Digital
		Services, Inc. or its affiliates with respect to your use of this
		software code. (c) 2006 Amazon Digital Services, Inc. or its
		affiliates.
	-->
<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/maven-v4_0_0.xsd">
  	<modelVersion>4.0.0</modelVersion>
  	<parent>
    		<groupId>org.jclouds</groupId>
    		<artifactId>jclouds-aws-project</artifactId>
    		<version>1.0-beta-5</version>
  	</parent>
  	<artifactId>jclouds-aws-perftest</artifactId>
  	<name>jclouds Performance test verses Amazon samples implementation</name>
  	<description>Performance test verses Amazon samples implementation</description>
  
  	<dependencies>
    		<dependency>
      			<groupId>${project.groupId}</groupId>
      			<artifactId>jclouds-apachehc</artifactId>
      			<version>${project.version}</version>
    		</dependency>
    		<dependency>
      			<groupId>${project.groupId}</groupId>
      			<artifactId>jclouds-aws</artifactId>
      			<version>${project.version}</version>
    		</dependency>
        <dependency>
            <groupId>net.java.dev.jets3t</groupId>
            <artifactId>jets3t</artifactId>
            <version>0.7.1</version>
        </dependency>    
    		<dependency>
      			<groupId>${project.groupId}</groupId>
      			<artifactId>jclouds-enterprise</artifactId>
      			<version>${project.version}</version>
    		</dependency>
    		<dependency>
      			<groupId>${project.groupId}</groupId>
      			<artifactId>jclouds-httpnio</artifactId>
      			<version>${project.version}</version>
    		</dependency>
  	    <dependency>
      			<groupId>${project.groupId}</groupId>
      			<artifactId>jclouds-gae</artifactId>
      			<version>${project.version}</version>
    		</dependency>
        <!-- start gae dependencies -->
        <dependency>
            <groupId>com.google.appengine</groupId>
            <artifactId>appengine-api-stubs</artifactId>
            <version>1.3.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.google.appengine</groupId>
            <artifactId>appengine-local-runtime</artifactId>
            <version>1.3.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>jclouds-core</artifactId>
            <version>${project.version}</version>
            <type>test-jar</type>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.mortbay.jetty</groupId>
                    <artifactId>jetty</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-servlet_2.5_spec</artifactId>
            <version>1.2</version>
            <scope>test</scope>
        </dependency>
        <!-- end gae dependencies -->
    		<dependency>
      			<groupId>${project.groupId}</groupId>
      			<artifactId>jclouds-aws</artifactId>
      			<version>${project.version}</version>
      			<type>test-jar</type>
      			<scope>test</scope>
    		</dependency>
  	</dependencies>
  
  	<scm>
    		<connection>scm:svn:http://jclouds.googlecode.com/svn/trunk</connection>
    		<developerConnection>scm:svn:https://jclouds.googlecode.com/svn/trunk</developerConnection>
    		<url>http://jclouds.googlecode.com/svn/trunk</url>
  	</scm>
    
  	<build>
    		<plugins>
      			<plugin>
        				<artifactId>maven-surefire-plugin</artifactId>
                <executions>
                    <execution>
                        <id>integration</id>
                        <phase>integration-test</phase>
                        <goals>
                            <goal>test</goal>
                        </goals>
                        <configuration>
                            <threadCount>1</threadCount>
                        </configuration>
                    </execution>
                </executions>
      			</plugin>
    		</plugins>
  	</build>
</project>
