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

Running the Test Suite


* Command On *nix Based Systems

----------------------------------------
sh ./vxquery/vxquery-xtest/target/appassembler/bin/xtest
----------------------------------------

* Command On Windows Based Systems

  First navigate to "apache-vxquery-X.Y/vxquery-cli/target/appassembler/bin" and then run the following file.

----------------------------------------
xtest.bat
----------------------------------------

* Command Line Options

----------------------------------------
 -O N            : Optimization Level
 -catalog VAL    : Test Catalog XML
 -exclude VAL    : Exclude filter regular expression
 -htmlreport VAL : HTML Report output file
 -include VAL    : Include filter regular expression
 -keepalive N    : Milliseconds to keep server alive after tests have completed
 -port N         : Port for web server to listen on
 -textreport VAL : Text Report output file
 -threads N      : Number of threads
 -v              : Verbose
 -xmlreport VAL  : XML Report output file
----------------------------------------
 
* Java Options

  The command can be run with Java options to increase the amount of memory to one gigabyte.
  Also helps to use a logging properties file that only output serious errors. This will reduce the
  output to only a few "LINE 7:" lines. Should help with the speed in running the test.

----------------------------------------
JAVA_OPTS="-Xmx1024m -Djava.util.logging.config.file=/path/to/logging.properties"
----------------------------------------
 
* VXQuery Testing Options

  * VXQuery Test Suite

    The VXQuery test suite focuses on parallel processing tests used in our weather benchmark.
  
----------------------------------------
sh ./vxquery-xtest/target/appassembler/bin/xtest -catalog vxquery-xtest/src/test/resources/VXQueryCatalog.xml -htmlreport /tmp/vxquery_report.html
----------------------------------------

    * view the results at {{{file:///tmp/vxquery_report.html}file:///tmp/vxquery_report.html}}.
  
  * XQTS (XQuery Test Suite)
    To run the complete XQTS on VXQuery.
  
    * Create a folder to hold the XQTS. 
      If you use "vxquery-xtest/test-suite/xqts", then maven will utilize the XQTS to verify VXQuery's passing functions during the build process.
    
----------------------------------------
$ mkdir -p vxquery-xtest/test-suite
$ cd vxquery-xtest/test-suite
----------------------------------------
    
    * Get the archive {{{http://dev.w3.org/2006/xquery-test-suite/PublicPagesStagingArea/XQTS_1_0_3.zip}XQTS_1_0_3.zip}} (e.g. using wget),

----------------------------------------
$ wget http://dev.w3.org/2006/xquery-test-suite/PublicPagesStagingArea/XQTS_1_0_3.zip
----------------------------------------

    * unpack it,

----------------------------------------
$ mkdir xqts
$ cd xqts
$ unzip ../XQTS_1_0_3.zip
$ cd ..
----------------------------------------

    * go back to the project root,

----------------------------------------
$ cd ../..
----------------------------------------

    * run the tests, and

----------------------------------------
sh ./vxquery-xtest/target/appassembler/bin/xtest -catalog vxquery-xtest/test-suite/xqts/XQTSCatalog.xml -htmlreport /tmp/full_report.html
----------------------------------------

    * view the results at {{{file:///tmp/full_report.html}file:///tmp/full_report.html}}.

    * Optional: Add JAVA_OPTS for additional java parameters.

  * XQTS (XQuery Test Suite) Option 2
    The following command will run the XQTS for test that are known to pass in VXQuery.
    The command is intend for developer to check their build and ensure all previous test continue to pass.
    All the tests should pass.

    * run the tests, and

----------------------------------------
sh ./vxquery-xtest/target/appassembler/bin/xtest -catalog vxquery-xtest/test-suite/xqts/XQTSCatalog.xml -htmlreport /tmp/previous_report.html  -previous-test-results vxquery-xtest/results/xqts.txt
----------------------------------------

    * view the results at {{{file:///tmp/previous_report.html}file:///tmp/previous_report.html}}.

  