# Local Agent Tests

This folder contains unit and functional (integration with backend) tests for Local Agent.

You'll have to install the extra packages to run the tests:
```
$ source <venv-name>/bin/activate
$ cd /path/to/{repo-base}/local-agent
$ pip install .[test]
```

## Unit Test

Run all the unit tests and show the coverage report.

1. Activate the virtual environment.
2. Execute the coverage tool:
   ```
   cd /path/to/{repo-base}/local-agent/local_agent/tests/unit_tests/
   coverage run --source={LOCAL_AGENT_PACKAGE_PATH}/local_agent/ -m unittest discover && coverage report
   ```
   where {LOCAL_AGENT_PACKAGE_PATH} can be obtained by the following command:
   ```
   $ pip show local-agent | grep -e "^Location" | awk -F " " '{print $2}'
   ```

## Real AMS Test

```Important```: If you're NOT an internal Googler or tester, you won't be able to run this test.

Run the local agent with a real Test Suite Backend (AMS).


1. Backend setup: If you're an internal Googler or tester, please contact the local agent author for the backend deployment; Otherwise, you won't be able to deploy the backend.

2. Edit the local agent config file: filling the ```AMS_HOST``` and ```AMS_PORT``` fields with the AMS configurations. Contact the local agent author if you're not sure about the backend configurations. See ```example_config.yaml``` for references.

3. Activate the virtual environment.

4. Connect your Matter devices with the above mentioned testabilities to the host machine. (You can still run the AMS test without connecting any devices).

5. Start the fake front end process \
Use ```-host [tsb_host]``` and ```-port [tsb_port]``` to indicate the host and port of deployed backend, the fake front end will use ```host=localhost``` and ```port=8000``` if the arguments are not provided. \
For example: \
   Run with real devices
   ```
   python fake_front_end.py
   ```

6. Start the local agent process:
   ```
   local-agent -u [config file location]
   ```
   or just put the config under ```~/.config/google/local_agent_config.yaml```, then start the process parameterlessly:
   ```
   local-agent
   ```

7. The Local Agent should prompt the user for entering the linking code, which is displayed in the console of ```fake_front_end``` process.
