PolySwarmPolySwarmPolySwarmPolySwarm
Help

Testing in Linux

概要

ここでは、以下のタイプの Linux ベースの PolySwarm 参加者をテストする方法について説明します。

  • microengines
  • ambassadors
  • arbiters (coming soon)

ここでリストしているコマンドではすべて、以下のように想定しています。

  1. 現行作業ディレクトリーが参加者のルート・ディレクトリーである。
  2. 参加者が、PolySwarm 参加者テンプレート participant-template に基づいて作成されている。

参加者の Docker イメージのビルド

単体テストおよび統合テストのために、以下のように参加者の Docker イメージをビルドする必要があります。

$ docker build -t ${PWD##*/} -f docker/Dockerfile .

これにより、ディレクトリーの名前でタグ付けされた Docker イメージが生成されます (例えば、microengine-eicar)。


Unit Testing

participant-template に基づいて作成された参加者には、一連の単体テストが含まれています。

$ docker-compose -f docker/test-unit.yml up

Supplied unit tests are quite limited and only support microengines. Running unit tests on ambassadors and arbiters will fail unless you supply unit test functions. Unit testing logic is housed in the tests/ folder. Customize the script(s) in there to implement your unit tests.

EICAR 検出マイクロエンジンが EICAR を実際に検出しているかを確認する単体テストの出力例を以下に示します。

$ docker-compose -f docker/test-unit.yml up
Recreating docker_test_engine_eicar_1 ... done
Attaching to docker_test_engine_eicar_1
test_engine_eicar_1  | GLOB sdist-make: /usr/src/app/setup.py
test_engine_eicar_1  | py36 create: /usr/src/app/.tox/py36
test_engine_eicar_1  | py36 installdeps: -rrequirements.txt
test_engine_eicar_1  | py36 inst: /usr/src/app/.tox/dist/polyswarm_eicar-0.1.zip
test_engine_eicar_1  | py36 installed: aiodns==1.1.1,aiohttp==3.5.1,aioredis==1.2.0,aioresponses==0.6.0,aiorwlock==0.6.0,asn1crypto==0.24.0,async-timeout==3.0.1,asynctest==0.12.2,atomicwrites==1.3.0,attrdict==2.0.1,attrs==19.1.0,base58==0.2.5,certifi==2019.3.9,cffi==1.12.2,chardet==3.0.4,click==6.7,coincurve==11.0.0,coverage==4.5.1,cytoolz==0.9.0.1,eth-abi==1.3.0,eth-account==0.3.0,eth-hash==0.2.0,eth-keyfile==0.5.1,eth-keys==0.2.1,eth-rlp==0.1.2,eth-typing==2.1.0,eth-utils==1.4.1,ethereum==2.3.2,future==0.17.1,hexbytes==0.1.0,hiredis==1.0.0,hypothesis==3.82.1,idna==2.7,idna-ssl==1.1.0,lru-dict==1.1.6,malwarerepoclient==0.1,more-itertools==7.0.0,multidict==4.5.2,mypy-extensions==0.4.1,parsimonious==0.8.1,pbkdf2==1.3,pluggy==0.9.0,polyswarm-client==1.4.0,polyswarm-eicar==0.1,py==1.8.0,py-ecc==1.6.0,pycares==3.0.0,pycparser==2.19,pycryptodome==3.8.1,pyethash==0.1.27,pysha3==1.0.2,pytest==3.9.2,pytest-asyncio==0.9.0,pytest-cov==2.6.0,pytest-timeout==1.3.2,python-json-logger==0.1.9,python-magic==0.4.15,PyYAML==5.1,repoze.lru==0.7,requests==2.20.1,rlp==1.1.0,scrypt==0.8.13,six==1.12.0,toml==0.10.0,toolz==0.9.0,tox==3.4.0,typing-extensions==3.7.2,urllib3==1.24.1,virtualenv==16.4.3,web3==4.8.2,websockets==6.0,yara-python==3.7.0,yarl==1.3.0
test_engine_eicar_1  | py36 run-test-pre: PYTHONHASHSEED='1600969341'
test_engine_eicar_1  | py36 runtests: commands[0] | pytest -s
test_engine_eicar_1  | ============================= test session starts ==============================
test_engine_eicar_1  | platform linux -- Python 3.6.8, pytest-3.9.2, py-1.8.0, pluggy-0.9.0
test_engine_eicar_1  | hypothesis profile 'default' -> database=DirectoryBasedExampleDatabase('/usr/src/app/.hypothesis/examples')
test_engine_eicar_1  | rootdir: /usr/src/app, inifile:
test_engine_eicar_1  | plugins: timeout-1.3.2, cov-2.6.0, asyncio-0.9.0, hypothesis-3.82.1
test_engine_eicar_1  | collected 1 item
test_engine_eicar_1  |
test_engine_eicar_1  | tests/test_eicar.py .
test_engine_eicar_1  |
test_engine_eicar_1  | =============================== warnings summary ===============================
test_engine_eicar_1  | /usr/src/app/.tox/py36/lib/python3.6/site-packages/eth_utils/applicators.py:32: DeprecationWarning: combine_argument_formatters(formatter1, formatter2)([item1, item2])has been deprecated and will be removed in a subsequent major version release of the eth-utils library. Update your calls to use apply_formatters_to_sequence([formatter1, formatter2], [item1, item2]) instead.
test_engine_eicar_1  |   "combine_argument_formatters(formatter1, formatter2)([item1, item2])"
test_engine_eicar_1  |
test_engine_eicar_1  | -- Docs: https://docs.pytest.org/en/latest/warnings.html
test_engine_eicar_1  | ===================== 1 passed, 1 warnings in 3.54 seconds =====================
test_engine_eicar_1  | ___________________________________ summary ____________________________________
test_engine_eicar_1  |   py36: commands succeeded
test_engine_eicar_1  |   congratulations :)
docker_test_engine_eicar_1 exited with code 0

Integration Testing

PolySwarm マーケットプレイスは、多数の参加者とテクノロジー (イーサリアム・ノード、IPFS ノード、コントラクト、マイクロエンジン、アンバサダー、評価者、アーティファクトなど) で構成されます。 Testing a single component often demands availability of all of the other components.

The orchestration project makes standing up a complete testnet easy and seamless. True to its name, orchestration orchestrates all the components necessary to stand up and tear down an entire PolySwarm marketplace environment on a local development machine.

以下のように、参加者のディレクトリーの隣に orchestration を複製します。

$ git clone https://github.com/polyswarm/orchestration

orchestration リポジトリー内の以下の docker-compose ファイルがテストに役立ちます。

  • base.yml: testnet のインフラストラクチャーの基礎 (例えば、geth ノードや relays) を定義します。
  • ambassador-eicar.yml: eicar.py を使用してアンバサダー・サービスを定義します。
  • arbiter-verbatim.yml: verbatim.py を使用して評価者サービスを定義します。
  • microengine-eicar.yml: eicar.py を使用してマイクロエンジン・サービスを定義します。
  • microengine-clamav.yml: clamav.py + ClamAV デーモンを使用してマイクロエンジン・サービスを定義します。
  • microengine-multi.yml: multi.py を使用してマイクロエンジン・サービスを定義します。

(オプション) 機能している完全な testnet のプレビュー

Always ensure that you have the latest updates to core PolySwarm Docker images prior to running integration tests. docker-compose ... up commands must always be proceeded with docker-compose ... pull commands.

Create the orchestration_default network, if you haven't already:

$ docker network create orchestration_default

複製した orchestration ディレクトリーで、以下のようにします。

$ docker-compose -f base.yml -f ambassador-eicar.yml -f microengine-eicar.yml -f arbiter-verbatim.yml pull
$ docker-compose -f base.yml -f ambassador-eicar.yml -f microengine-eicar.yml -f arbiter-verbatim.yml up

If you'd like to test out a working "solution" to one of the microengine tutorials, replace, e.g. microengine-eicar.yml with microengine-clamav.yml or microengine-multi.yml.

You'll see output from the following services:

  1. contractor: PolySwarm Nectar (NCT) と BountyRegistry コントラクトを格納して開発 testnet にデプロイします。
  2. polyswarmd: The PolySwarm daemon providing convenient access to the services offered by homechain, sidechain and ipfs. すべての参加者 (アンバサダー、評価者、マイクロエンジン) がこのサービスとやり取りします。
  3. consul: contractor が重要な情報 (デプロイされている BountyRegistry コントラクトのイーサリアム・アドレスなど) を polyswarmd に伝えるために使用するキーと値のストア。
  4. homechain: A geth node running our testnet's "homechain". See Chains: Home vs Side for an explanation of our split-chain design.
  5. sidechain: Another geth instance, this one running our testnet's "sidechain".
  6. ipfs: An IPFS node responsible for hosting all artifacts in our development testnet.
  7. postgres: contractor のデータ・ストア。
  8. deposit_*: 対応する参加者のために relay ノードを使用して NCT を homechain から sidechain に移動する balancemanager インスタンス。
  9. relay[0-2]: ブロックチェーン (例えば、homechainsidechain) で預託されている資金を管理して選択的にリリースする処理を担当するノード。 これらのノードは、参加者がチェーンで資金を簡単に「リレー」するために使用できる「リレー」抽象化 API を提供します。
  10. ambassador-eicar: EICAR ファイル と非 EICAR ファイルに対して報奨金を提示するシンプルなアンバサダー。
  11. microengine-eicar: EICAR ファイルを悪意のあるものと識別し、他のすべてのアーティファクトを無害と識別するシンプルなマイクロエンジン。
  12. arbiter-verbatim: 正確な EICAR 応答を含む、用意された確認・評価の投票を提供するシンプルな評価者。

Browse through the logs to get a sense for what each of these components is doing. Let it run for at least 5 minutes - it can take time to deploy contracts - and then the fun starts :)

When you've seen enough log output, press Ctrl-C to halt the development testnet gracefully.

参加者のテスト

Always ensure that you have the latest updates to core PolySwarm Docker images prior to running integration tests. docker-compose ... up commands must always be proceeded with docker-compose ... pull commands.

We'll use orchestration to start the entire testnet - with a few exceptions:

  1. テストする参加者の競合するバージョンは起動しません。 例えば、カスタム評価者を開発する場合、ストックの評価者からの干渉を受けないようにします。
  2. (カスタムまたはストックの) アンバサダーは、polyswarmd が用意され、ネットワークを監視する準備ができるまで、起動しません。

カスタム・マイクロエンジンのテスト

Step 0: Create the orchestration_default network, if you haven't already:

$ docker network create orchestration_default

Step 1: launch the base network + an arbiter (from the orchestration directory):

$ docker-compose -f base.yml -f arbiter-verbatim.yml pull
$ docker-compose -f base.yml -f arbiter-verbatim.yml up

Step 2: wait for polyswarmd to become available. It will take several minutes for polyswarmd to become available. During this time, you will see many messages like Problem with dial... dial tcp connection refused. and chain for config not available in consul yet. These errors are normal while the testnet is initializing, so have patience.

View polyswarmd logs in a new shell session (from the orchestration directory):

docker-compose -f base.yml logs --follow polyswarmd

In this new shell, wait for polyswarmd:

Attaching to orchestration_polyswarmd_1_c1d732ac5355
polyswarmd_1_c1d732ac5355 | [2019-05-13 20:52:36 +0000] [1] [INFO] Starting gunicorn 19.9.0
polyswarmd_1_c1d732ac5355 | [2019-05-13 20:52:36 +0000] [1] [INFO] Listening at: http://0.0.0.0:31337 (1)
...
polyswarmd_1_c1d732ac5355 | CRITICAL:polyswarmd.wsgi:polyswarmd is ready!
polyswarmd_1_c1d732ac5355 | CRITICAL:polyswarmd.wsgi:polyswarmd is ready!
polyswarmd_1_c1d732ac5355 | CRITICAL:polyswarmd.wsgi:polyswarmd is ready!
polyswarmd_1_c1d732ac5355 | CRITICAL:polyswarmd.wsgi:polyswarmd is ready!

When ready, polyswarmd will print polyswarmd is ready! once for every polyswarmd thread (4 by default).

Step 3: launch your custom microengine (from your microengine's root directory):

$ docker-compose -f docker/test-integration.yml up

Step 4: launch an ambassador that will place bounties on the testnet (in orchestration directory):

$ docker-compose -f ambassador-eicar.yml pull
$ docker-compose -f ambassador-eicar.yml up

Step 5: observe your microengine's output to ensure that your microengine is seeing and responding to the incoming bounties.

カスタム・アンバサダーのテスト

Step 1: launch the base network + an arbiter + a microengine (from the orchestration directory):

$ docker-compose -f base.yml -f arbiter-verbatim.yml -f microengine-eicar.yml pull
$ docker-compose -f base.yml -f arbiter-verbatim.yml -f microengine-eicar.yml up

Step 2: wait for polyswarmd to become available. After several minutes, you should start seeing successful query messages (HTTP status 200) messages to polyswarmd:

INFO:polyswarmd:2018-12-06 05:42:08.396534 GET 200 /nonce 0x05328f171b8c1463eaFDACCA478D9EE6a1d923F8
INFO:geventwebsocket.handler:::ffff:172.19.0.12 - - [2018-12-06 05:42:08] "GET /nonce?account=0x05328f171b8c1463eaFDACCA478D9EE6a1d923F8&chain=home HTTP/1.1" 200 135 0.048543

Step 3: launch your custom ambassador (from your ambassador's root directory):

$ docker-compose -f docker/test-integration.yml up

Step 4: observe your ambassador's terminal output to ensure it's placing bounties correctly.

カスタム評価者のテスト

Arbiter testing instructions coming soon!