Head back to Documentation

Documentation

QRL Integration Tests

Build Status MIT licensed

This project periodically runs integration tests on a 6 node testnet

How to run integration tests

Clone this repo

You will need at least python 3.5

Installing Docker CE / Docker compose

Follow the corresponding instructions:

OS Link
Windows Docker for Windows
Linux https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/
OSX https://docs.docker.com/docker-for-mac/install/
   
# Install docker compose
bashpip3 install docker-compose

Start Integration Tests

INFO: Make sure you have PYTHONPATH set (e.g. export PYTHONPATH=$(pwd)), otherwise you could receive ModuleNotFoundError

# Run pytest
pytest
# To run a specific scenario use -m flag
pytest -s -m "runfor10minutes"
# To avoid running a scenario
pytest -s  -m "not runfor10minutes"`

How it works (short explanation)

qrlnet

The qrlnet directory contains all the scripts to start a qrl network from scratch.

qrlnet/start_net.sh is the main script. There are a few arguments that are particularly useful:

REPO_XXX # allow for launching this local testnet using source code from a different repo/branch
LOCAL_NET_ONLY # option indicates that nodes should be isolated and should not connect outside the integration test.
INTEGRATION_TESTINPLACE # Indicates that source code should not be retrieved. This is used to run the integration tests locally. In particular as a submodule as it is done in https://github.com/theQRL/QRL

When the script is executed, it will launch several docker-compose nodes/containers.

Each node will run

qrlnet/node_scripts/start.sh

This scripts prepares the container to run a qrl node (user permissions, etc.)

Finally, each node will switch to testuser and start a node

This local network could be used for any purposes.

pytest

At the moment, a few example tests derive from TestLogParser. This base class starts a network and allows for monitoring the logfiles of the running nodes. A few very simple tests like checking that nodes sync or throw exceptions can be done.

However, this is not ideal and are just examples as a proof of concept.

We expect to extend test to go through the grpc API, use direct CLI, interact directly with the network configuration, etc.

Example: Use something similar to

qrlnet/nodes_scripts/docker_helper.py

Using the Docker SDK, it is possible to determine each node IP address based on their name and run commands or scripts directly inside the corresponding containers using

exec_run

https://docker-py.readthedocs.io/en/stable/containers.html

This way it would be possible to test the CLI or node.js apps (wallet/explorer) from inside the container. More complex tests could confirm transfers by running CLI on more than one node.

The Docker SDK could be also use to model network issues/errors. etc.

Limitations

The integration tests have been designed to run primarily in Travis/Ubuntu. We would like to move to CircleCI in near future.

Docker for Mac has some limitations that result in problems when trying to connect from the host to the containers. https://docs.docker.com/docker-for-mac/networking/#known-limitations-use-cases-and-workarounds

Typically in Linux, you can route traffic between your host and each of the containers without trouble using a Bridge. This is unfortunately not possible in OSX.

Still stuck? There's help over on Discord!