# TensorFlow e2e tests

This is a collection of e2e tests that, in various fashion saves a TensorFlow
model, compiles it with IREE and runs/evaluates it on all backends.

## Pre-Requisites

You will need a TensorFlow 2.0+ nightly installed in your python environment:
the python binary in `$PYTHON_BIN` should be able to `import tensorflow` and
that TensorFlow should be version 2.0+. This can be checked with
`tensorflow.version`.

See [Install TensorFlow with pip](https://www.tensorflow.org/install/pip) for
instructions.

## Vulkan setup

By default, tests run on TensorFlow and the IREE CPU interpreter, as it never
needs additional environment setup. If you have your environment setup to use
IREE with Vulkan (see [the doc](../../../docs/vulkan_and_spirv.md)), then you
can enable the backends by setting the environment variable
`IREE_TEST_BACKENDS=tf,iree_interpreter,iree_vulkan`.

You can also pass this as a command line argument when running individual tests:
`--target_backends=tf,iree_interpreter,iree_vulkan`.

## Running tests

```shell
# Run all tests with defaults and output on failure.
bazel test ... --test_output=errors

# Run an individual test interactively.
bazel test simple_arithmetic_test --test_output=streamed

# Run tests with an altered list of backends.
bazel test ... --test_output=errors -- \
    --target_backends=tf,iree_interpreter,iree_vulkan

# (alternative) Run tests with an altered list of backends.
bazel test ... --test_env=IREE_TEST_BACKENDS=tf,iree_interpreter,iree_vulkan \
    --test_output=errors
```

## Test harnesses

### Simple function tests

See `simple_arithmetic_test.py` for some examples of writing a test case that
runs on multiple backends.
