Title: Legacy Ant Unit Tests
Cayenne provides a comprehensive suite of unit tests. To execute unit tests
you must first [get Cayenne from SVN](code-repository.html)
, install JDK 1.5 and obtain the latest Ant.

<a name="LegacyAntUnitTests-SummaryofBuildProperties"></a>
## Summary of Build Properties

These properties can be passed to ant build via *-DpropName=value*.


Property | Description
---------|------------
*cayenne.test.connection* | Named connection source (see below)
*test.filter* | Running a subset of tests (see below)
*cayenne.test.schema.skip* | If "true", won't attempt to recreate the test database, i.e. the database must already be present.

<a name="LegacyAntUnitTests-RunningAgainstEmbeddedHSQLDB"></a>
## Running Against Embedded HSQLDB

No extra setup is required. Just run Ant:


    # cd cayenne/cayenne-ant
    # ant test


Optionally you may run JDK 1.4 tests only (e.g. if you don't have JDK 1.5
on your machine):


    # cd cayenne/cayenne-ant
    # ant test-1_4



This will use an embedded HSQLDB. Running tests against your own database
requires a few extra steps described below.

<a name="LegacyAntUnitTests-RunningAgainstaSpecificDatabase"></a>
## Running Against a Specific Database

<a name="LegacyAntUnitTests-Step1:ConfigureOneorMoreDataSources"></a>
#### Step 1: Configure One or More Data Sources

Create a directory *$HOME/.cayenne/* and place a file called
*connection.properties* in this directory. File contents should be
similar to this example:


    example1.cayenne.adapter = org.apache.cayenne.dba.mysql.MySQLAdapter
    example1.jdbc.username = someuser
    example1.jdbc.password = somepasswd
    example1.jdbc.url = jdbc:someurl1
    example1.jdbc.driver = com.xyz.MyDriverClass
    
    example2.cayenne.adapter = org.apache.cayenne.dba.oracle.OracleAdapter
    example2.jdbc.username = someuser
    example2.jdbc.password = somepasswd
    example2.jdbc.url = jdbc:someurl2
    example2.jdbc.driver = com.xyz.MyDriverClass


Each key starts with an identifier for a datasource. In the file above,
"example1" and "example2" are such identifiers. They can be arbitrary
strings without "." (dot) symbols.


<a name="LegacyAntUnitTests-Step2.RunTestsAgainstConfiguredDataSource"></a>
#### Step 2. Run Tests Against Configured Data Source


    # cd cayenne/cayenne-ant
    # ant test -Dcayenne.test.connection=example1


Substitute "example1" with a name of your data source configured in the
previous step. In case of total success, one of the last messages Ant
prints on console is BUILD SUCCESSFUL. If build fails, failure report is
generated in HTML format under
*cayenne/cayenne-ant/build/tests-report-example1/index.html* and can be
viewed using a web browser (again, substitute "example1" in this path with
the name of data source used).

<a name="LegacyAntUnitTests-FilteringTests"></a>
## Filtering Tests

To run only a subset of test cases, Ant-style pattern matching can be used.
A property called *test.filter* defines a set of class files to be run.
For instance to run only tests from the "tools" package, the following
startup parameters can be used:


    # cd cayenne/cayenne-ant
    # ant test -Dcayenne.test.connection=example1 -Dtest.filter="**/tools/*Tst.class"

