UNDER CONSTRUCTION

The HK2 suite is currently under construction, please do not attempt to
run it yet.  Thanks for your understanding.

11/1/2012

----------------------------------------
Steps for running HK2 Development Tests
----------------------------------------

1. Set the following variables:

APS_HOME to the location of where v2/appserv-tests are checked out
S1AS_HOME to <GlassFish install location>/glassfish6/glassfish

2. Make sure ant is in your path.  

Also, in some cases the ant test clients run out of memory during the test run.  
If you see this problem, add -Xmx999m to the command that starts the ant java vm, e.g :

    % cat `which ant`


    (... towards bottom of ant script)

    "$JAVACMD" -Xmx999m -classpath "$LOCALCLASSPATH" -Dant.home="${ANT_HOME}" $ANT_OPTS org.apache.tools.ant.Main $ANT_ARGS "$@"

3. Install GlassFish by unzipping glassfish.zip for running the tests against Java EE Full Profile, or web.zip for running the tests against the Web Profile.

4. Run the tests.  

  4.1 The "all" target starts the server and the database, runs the tests, and then stops the server and database.  

     % ant all

5. The results should look something like this : 

   [exec] input file=/Volumes/Fantom1/work/v2/appserv-tests/test_resultsValid.xml
     [exec] 
     [exec] ************************
     [exec] PASSED=        <total>
     [exec] ------------  =========
     [exec] FAILED=          0
     [exec] ------------  =========
     [exec] DID NOT RUN=   0
     [exec] ------------  =========
     [exec] Total Expected=<total>
     [exec] ************************
     [exec] 

( <total> is equal to the TOTAL value in the result_count.sh file.  We keep this total count up to date based on the total number of test framework PASS assertions in the set of tests run by the ant all target )

  
6. To start the server and Derby database, and to cleanup resultset, do 

   % ant setup

7. To stop the server and Derby database, and to report the result, do 

   % ant unsetup

Note: partial result will show <total>-<tests-executed> as a DID NOT RUN number

8. Keeping the score...

   8.1 If an assertion is added to a new test, and the status is not populated from this assertion, no extra change is necessary.

   8.2 If a status of the new assertion is reported explicitly via call:

           stat.addStatus("XYZ", stat.PASS);

       the resultCount.sh total need to be incremented by one.

       NOTE: the status counter prefers that each status has its own name, so if "XYZ" had been already used, find a different name. If the same test is executed more than once, add some modifier to the name to make it unique.

   8.3 If a new test suite is added, the resultCount.sh should be incremented by the number of total tests reported by the suite. See the note above for the test reporting rules.

   8.4 If a test needs to be executed against web.zip, it should be referenced from the "test-lite" target, and its count added to the TOTAL_LITE. Otherwise it should be added to the "test-all" target and TOTAL count be updated.

9. Clustered tests

   Clustered tests are not part of this suite and are located under ee/ directory.

   Only ee/timer tests are automated in their own suite at this time.
