CORS Functional Tests
=====================
`Cross Origin Resource Sharing `__ is a bit
of a complicated beast. It focuses on the interactions between
* a **user-agent** (typically a web browser),
* a "**source origin**" server (whose code the user-agent is running), and
* some **other server** (for our purposes, usually Swift).
Where it gets hairy is that there may be varying degrees of trust between
these different actors.
Fortunately, Swift `allows per-container configuration
`__ of many CORS options.
However, our normal functional tests only exercise bits and pieces of CORS,
without telling a complete story or performing a true end-to-end test. *These*
tests aim to remedy that.
The tests consist of three parts:
* setup
Create several test containers with well-known names, set appropriate
ACLs and CORS metadata, and upload some test objects.
* serve
Serve a static website on localhost which, on load, will make several
CORS requests and verify expected behavior.
* run
Use Selenium to load the website, wait for and scrape the results, and
output them in `TAP format `__.
Alternatively, open the page in your local browser and manually inspect whether
tests passed or failed.
All of this is orchestrated through ``main.py``. It uses the standard ``OS_*``
environment variables to determine how to connect to Swift:
* ``OS_AUTH_URL`` (or ``ST_AUTH``)
* ``OS_USERNAME`` (or ``ST_USER``)
* ``OS_PASSWORD`` (or ``ST_KEY``)
* ``OS_STORAGE_URL`` (optional)
There are additional environment variables to exercise the S3 API:
* ``S3_ENDPOINT``
* ``S3_USER``
* ``S3_KEY``
.. note::
It is necessary to set `s3_acl = False` in the `[filter:s3api]` section of
your `proxy-server.conf` for all the s3 object tests to pass.
..
TODO: verify that this works with Keystone
Running Tests Manually
----------------------
To inspect the test results in your local browser, run::
$ ./test/cors/main.py --no-run
This will create some test containers and object in Swift, start a simple
static site, and emit a URL to visit to run the tests, like::
Serving test at http://localhost:8000/#OS_AUTH_URL=http://saio/auth/v1.0&OS_USERNAME=test:tester&OS_PASSWORD=testing&OS_STORAGE_URL=http://saio/v1/AUTH_test&S3_ENDPOINT=http://saio&S3_USER=test%3Atester&S3_KEY=testing
.. note::
You can use ``--hostname`` and ``--port`` to adjust the origin used.
Open the link. Toward the top of the page will be a status line; it will cycle
through the following states:
* Loading
* Starting jobs
* Waiting for jobs to finish
* Complete
When complete, it will also include a summary of the number of tests run as
well as pass/fail/skip counts. Below the status line will be a table of
individual tests with status, description, and additional information.
You can also run a single test by adding a ``&test=`` query parameter.
For example::
http://localhost:8000/#OS_AUTH_URL=http://saio/auth/v1.0&OS_USERNAME=test:tester&OS_PASSWORD=testing&OS_STORAGE_URL=http://saio/v1/AUTH_test&test=object%20-%20GET
will just run the test named ``object - GET``.
To stop the server, press ``^C``.
Running Tests with Selenium
---------------------------
`Selenium `__ may be used to automate visiting the
static site, waiting for tests to run, and gathering results. See the
`installation instructions `__
for the Python bindings for more information about setting this up.
.. note::
On Linux, you may want to use ``xvfb-run`` to have browsers use a virtual
display.
When using selenium, the test runner will try to run tests in Firefox, Chrome,
Safari, Edge, and IE if available; if a browser seems to not be available, its
tests will be skipped.
Updating aws-sdk-js
-------------------
There are tests that exercise CORS over the S3 API; these use a vendored
version of `aws-sdk-js `__ that only
covers the S3 service. The current version used is 2.829.0, built on
2021-01-21 by
* visiting https://sdk.amazonaws.com/builder/js/,
* clearing all services,
* explicitly adding AWS.S3,
* clicking "Build" to download,
* saving in the ``test/cors/vendor`` directory, and finally
* updating the version number in ``test/cors/test-s3*.js``.