~~ 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-suites/xqts", then maven will utilize the XQTS to verify VXQuery's passing functions during the build process.

----------------------------------------
$ mkdir -p vxquery-xtest/test-suites
$ cd vxquery-xtest/test-suites
----------------------------------------

    * 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 curl),

----------------------------------------
$ curl -O https://dev.w3.org/2006/xquery-test-suite/PublicPagesStagingArea/XQTS_1_0_3.zip
----------------------------------------

    * unpack it,

----------------------------------------
$ unzip -d xqts XQTS_1_0_3.zip
----------------------------------------

    * go back to the project root,

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

    * run the tests, and

----------------------------------------
sh ./vxquery-xtest/target/appassembler/bin/xtest -catalog vxquery-xtest/test-suites/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-suites/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}}.

