From 339b38b12367ab9c005e59b64f7fb8c3acc6b6ea Mon Sep 17 00:00:00 2001 From: LaurentDeMontBlanc Date: Mon, 7 Feb 2022 12:32:31 +0100 Subject: [PATCH] added integration tests incl docker-compose and travis-ci setup --- .ci/travis_script.sh | 2 + Makefile | 5 +- docker-compose.yml | 8 +++ integration/README.md | 0 integration/python/Dockerfile | 6 ++ integration/python/src/test_basic.py | 92 ++++++++++++++++++++++++++++ run-integration-test.sh | 37 +++++++++++ 7 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 integration/README.md create mode 100644 integration/python/Dockerfile create mode 100644 integration/python/src/test_basic.py create mode 100755 run-integration-test.sh diff --git a/.ci/travis_script.sh b/.ci/travis_script.sh index 436805c..5cf1d43 100755 --- a/.ci/travis_script.sh +++ b/.ci/travis_script.sh @@ -13,6 +13,8 @@ elif [[ ${PLANETMINT_CI_ABCI} == 'enable' ]]; then docker-compose exec planetmint pytest -v -m abci elif [[ ${PLANETMINT_ACCEPTANCE_TEST} == 'enable' ]]; then ./run-acceptance-test.sh +elif [[ ${PLANETMINT_INTEGRATION_TEST} == 'enable' ]]; then + ./run-integration-test.sh else docker-compose exec planetmint pytest -v --cov=planetmint --cov-report xml:htmlcov/coverage.xml fi diff --git a/Makefile b/Makefile index 7f09890..6e5327f 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: help run start stop logs test test-unit test-unit-watch test-acceptance cov doc doc-acceptance clean reset release dist check-deps clean-build clean-pyc clean-test +.PHONY: help run start stop logs test test-unit test-unit-watch test-acceptance test-integration cov doc doc-acceptance clean reset release dist check-deps clean-build clean-pyc clean-test .DEFAULT_GOAL := help @@ -82,6 +82,9 @@ test-unit-watch: check-deps ## Run all tests and wait. Every time you change cod test-acceptance: check-deps ## Run all acceptance tests @./run-acceptance-test.sh +test-integration: check-deps ## Run all integration tests + @./run-integration-test.sh + cov: check-deps ## Check code coverage and open the result in the browser @$(DC) run --rm planetmint pytest -v --cov=planetmint --cov-report html $(BROWSER) htmlcov/index.html diff --git a/docker-compose.yml b/docker-compose.yml index 01f537d..da89284 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -83,6 +83,14 @@ services: environment: - PLANETMINT_ENDPOINT=planetmint + # Planetmint setup to do integration testing wtih Python + python-integration: + build: + context: . + dockerfile: ./integration/python/Dockerfile + volumes: + - ./integration/python/src:/src + # Build docs only # docker-compose build bdocs # docker-compose up -d bdocs diff --git a/integration/README.md b/integration/README.md new file mode 100644 index 0000000..e69de29 diff --git a/integration/python/Dockerfile b/integration/python/Dockerfile new file mode 100644 index 0000000..109d83f --- /dev/null +++ b/integration/python/Dockerfile @@ -0,0 +1,6 @@ +FROM python:3.9 + +RUN mkdir -p /src +RUN pip install --upgrade \ + pytest~=6.2.5 \ + planetmint-driver~=0.9.0 \ No newline at end of file diff --git a/integration/python/src/test_basic.py b/integration/python/src/test_basic.py new file mode 100644 index 0000000..5cd3b57 --- /dev/null +++ b/integration/python/src/test_basic.py @@ -0,0 +1,92 @@ +# import Planetmint and create object +from planetmint_driver import Planetmint +from planetmint_driver.crypto import generate_keypair +import time + +def test_basic(): + # Setup up connection to Planetmint integration test nodes + pm_itest1_url = 'https://itest1.planetmint.io' + pm_itest2_url = 'https://itest2.planetmint.io' + pm_itest1 = Planetmint(pm_itest1_url) + pm_itest2 = Planetmint(pm_itest2_url) + + # genarate a keypair + alice, bob = generate_keypair(), generate_keypair() + + # create a digital asset for Alice + game_boy_token = { + 'data': { + 'hash': '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', + 'storageID': '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', + }, + } + + # prepare the transaction with the digital asset and issue 10 tokens to bob + prepared_creation_tx = pm_itest1.transactions.prepare( + operation='CREATE', + metadata={ + 'hash': '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', + 'storageID': '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF',}, + signers=alice.public_key, + recipients=[([alice.public_key], 10)], + asset=game_boy_token) + + # fulfill and send the transaction + fulfilled_creation_tx = pm_itest1.transactions.fulfill( + prepared_creation_tx, + private_keys=alice.private_key) + pm_itest1.transactions.send_commit(fulfilled_creation_tx) + time.sleep(4) + + creation_tx_id = fulfilled_creation_tx['id'] + + # retrieve transactions from both planetmint nodes + creation_tx_itest1 = pm_itest1.transactions.retrieve(creation_tx_id) + creation_tx_itest2 = pm_itest2.transactions.retrieve(creation_tx_id) + + # Assert that transaction is stored on both planetmint nodes + assert creation_tx_itest1 == creation_tx_itest2 + + # Transfer + # create the output and inout for the transaction + transfer_asset = {'id': creation_tx_id} + output_index = 0 + output = fulfilled_creation_tx['outputs'][output_index] + transfer_input = {'fulfillment': output['condition']['details'], + 'fulfills': {'output_index': output_index, + 'transaction_id': transfer_asset['id']}, + 'owners_before': output['public_keys']} + + # prepare the transaction and use 3 tokens + prepared_transfer_tx = pm_itest1.transactions.prepare( + operation='TRANSFER', + asset=transfer_asset, + inputs=transfer_input, + metadata={'hash': '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', + 'storageID': '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', }, + recipients=[([alice.public_key], 10)]) + + # fulfill and send the transaction + fulfilled_transfer_tx = pm_itest1.transactions.fulfill( + prepared_transfer_tx, + private_keys=alice.private_key) + sent_transfer_tx = pm_itest1.transactions.send_commit(fulfilled_transfer_tx) + + transfer_tx_id = fulfilled_transfer_tx['id'] + + # retrieve transactions from both planetmint nodes + transfer_tx_itest1 = pm_itest1.transactions.retrieve(transfer_tx_id) + transfer_tx_itest2 = pm_itest2.transactions.retrieve(transfer_tx_id) + + # Assert that transaction is stored on both planetmint nodes + assert transfer_tx_itest1 == transfer_tx_itest2 + + + + + + + + + + diff --git a/run-integration-test.sh b/run-integration-test.sh new file mode 100755 index 0000000..506bc24 --- /dev/null +++ b/run-integration-test.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +# Copyright © 2020 Interplanetary Database Association e.V., +# Planetmint and IPDB software contributors. +# SPDX-License-Identifier: (Apache-2.0 AND CC-BY-4.0) +# Code is Apache-2.0 and docs are CC-BY-4.0 + + +# Set up a Planetmint node and return only when we are able to connect to both +# the Planetmint container *and* the Tendermint container. +setup () { + docker-compose up -d planetmint + + # Try to connect to the containers for maximum three times, and wait + # one second between tries. + for i in $(seq 3); do + if $(docker-compose run --rm curl-client); then + break + else + sleep 1 + fi + done +} + +run_test () { + docker-compose run --rm python-integration pytest /src/test_basic.py +} + +teardown () { + docker-compose down +} + +setup +run_test +exitcode=$? +teardown + +exit $exitcode \ No newline at end of file