{"id":13651132,"url":"https://github.com/golemfactory/goth","last_synced_at":"2025-10-19T09:31:38.113Z","repository":{"id":40470034,"uuid":"249806436","full_name":"golemfactory/goth","owner":"golemfactory","description":"Golem Test Harness, an integration testing framework for yagna - the (new) Golem Network client.","archived":false,"fork":false,"pushed_at":"2024-10-03T14:22:26.000Z","size":3584,"stargazers_count":10,"open_issues_count":98,"forks_count":4,"subscribers_count":10,"default_branch":"master","last_synced_at":"2024-10-29T14:37:26.585Z","etag":null,"topics":["developer-tools","golem","integration-testing"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/golemfactory.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-03-24T20:05:53.000Z","updated_at":"2024-10-01T17:06:06.000Z","dependencies_parsed_at":"2023-10-13T07:54:17.014Z","dependency_job_id":"b55d922d-1b13-4e49-abb8-21ba89988647","html_url":"https://github.com/golemfactory/goth","commit_stats":{"total_commits":1073,"total_committers":35,"mean_commits":30.65714285714286,"dds":0.6700838769804287,"last_synced_commit":"f9ea7e3f61a1789ceeee99e316a80bad848ddb58"},"previous_names":[],"tags_count":54,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/golemfactory%2Fgoth","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/golemfactory%2Fgoth/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/golemfactory%2Fgoth/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/golemfactory%2Fgoth/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/golemfactory","download_url":"https://codeload.github.com/golemfactory/goth/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":237102587,"owners_count":19255923,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["developer-tools","golem","integration-testing"],"created_at":"2024-08-02T02:00:45.557Z","updated_at":"2025-10-19T09:31:38.108Z","avatar_url":"https://github.com/golemfactory.png","language":"Python","readme":"# Golem Test Harness\n\n![codestyle](https://github.com/golemfactory/goth/workflows/codestyle/badge.svg?event=push)\n![test](https://github.com/golemfactory/goth/workflows/test/badge.svg?event=push)\n[![PyPI version](https://badge.fury.io/py/goth.svg)](https://badge.fury.io/py/goth)\n[![GitHub license](https://img.shields.io/github/license/golemfactory/goth)](https://github.com/golemfactory/goth/blob/master/LICENSE)\n\n`goth` is an integration testing framework intended to aid the development process of [`yagna`](https://github.com/golemfactory/yagna) itself, as well as apps built on top of it.\n\n\n## Dependencies on other Golem projects\n\n- [golemfactory/gnt2](https://github.com/golemfactory/gnt2) - Dockerized environment with Ganache and contracts\n- [golemfactory/pylproxy](https://github.com/golemfactory/pylproxy) - [![PyPI version](https://badge.fury.io/py/pylproxy.svg)](https://badge.fury.io/py/pylproxy) Python proxy for catching http calls between actors (replacement for mitmproxy used previously)\n\n## How it works\n\nKey features:\n- creates a fully local, isolated network of Golem nodes including an Ethereum blockchain (through [`ganache`](https://www.trufflesuite.com/ganache))\n- provides an interface for controlling the local Golem nodes using either `yagna`'s REST API or CLI\n- includes tools for defining complex integration testing scenarios, e.g. HTTP traffic and log assertions\n- configurable through a YAML file as well as using a number of CLI parameters\n\nWithin a single `goth` invocation (i.e. test session) the framework executes all tests which are defined in its given directory tree.\n\nInternally, `goth` uses `pytest`, therefore each integration test is defined as a function with the `test_` prefix in its name.\n\nEvery test run consists of the following steps:\n1. `docker-compose` is used to start the so-called \"static\" containers (e.g. local blockchain, HTTP proxy) and create a common Docker network for all containers participating in the given test.\n2. The test runner creates a number of Yagna containers (as defined in `goth-config.yml`) which are then connected to the `docker-compose` network.\n3. For each Yagna container started an interface object called a `Probe` is created and made available inside the test via the `Runner` object.\n4. The integration test scenario is executed as defined in the test function itself.\n5. Once the test is finished, all previously started Docker containers (both \"static\" and \"dynamic\") are removed and other cleanup is performed before repeating these steps for the next test.\n\n## Requirements\n- Linux (tested on Ubuntu 18.04 and 20.04)\n- Python 3.8+\n- Docker\n\n#### Python 3.8+\nYou can check your currently installed Python version by running:\n```\npython3 --version\n```\n\nIf you don't have Python installed, download the appropriate package and follow instructions from the [releases page](https://www.python.org/downloads/).\n#### Docker\nTo run `goth` you will need to have Docker installed. To install the Docker engine on your system follow these [instructions](https://docs.docker.com/engine/install/).\n\nTo verify your installation you can run the `hello-world` Docker image:\n```\ndocker run hello-world\n```\n\n## Installation\n`goth` is available as a PyPI package:\n```\npip install goth\n```\n\nIt is encouraged to use a Python virtual environment.\n\n## Usage\n\n### Getting a GitHub API token\nWhen starting the local Golem network, `goth` uses the GitHub API to fetch metadata and download artifacts and images. Though all of these assets are public, using this API still requires basic authentication. Therefore, you need to provide `goth` with a personal access token.\n\nTo generate a new token, go to your account's [developer settings](https://github.com/settings/tokens).\n\nYou will need to grant your new token the `public_repo` scope, as well as the `read:packages` scope. The packages scope is required in order to pull Docker images from GitHub.\n\nOnce your token is generated you need to do two things:\n1. Log in to GitHub's Docker registry by calling: `docker login ghcr.io -u {username}`, replacing `{username}` with your GitHub username and pasting in your access token as the password. You only need to do this once on your machine.\n2. Export an environment variable named `GITHUB_TOKEN` and use the access token as its value. This environment variable will need to be available in the shell from which you run `goth`.\n\n### Starting a local network\n\nFirst, create a copy of the default assets:\n```\npython -m goth create-assets your/output/dir\n```\n\nWhere `your/output/dir` is the path to a directory under which the default assets should be created. The path can be relative and it cannot be pointing to an existing directory.\nThese assets do not need to be re-created between test runs.\n\nWith the default assets created you can run the local test network like so:\n\n```\npython -m goth start your/output/dir/goth-config.yml\n```\n\nIf everything went well you should see the following output:\n```\nLocal goth network ready!\n\nYou can now load the requestor configuration variables to your shell:\n\nsource /tmp/goth_interactive.env\n\nAnd then run your requestor agent from that same shell.\n\nPress Ctrl+C at any moment to stop the local network.\n```\n\nThis is a special case of `goth`'s usage. Running this command does not execute a test, but rather sets up a local Golem network which can be used for debugging purposes. The parameters required to connect to the requestor `yagna` node running in this network are output to the file `/tmp/goth_interactive.env` and can be `source`d from your shell.\n\n### Creating and running test cases\nTake a look at the `yagna` integration tests [`README`](https://github.com/golemfactory/yagna/blob/master/goth_tests/README.md) to learn more about writing and launching your own test cases.\n\n### Logs from `goth` tests\nAll containers launched during an integration test record their logs in a pre-determined location. By default, this location is: `$TEMP_DIR/goth-tests`, where `$TEMP_DIR` is the path of the directory used for temporary files.\n\nThis path will depend either on the shell environment or the operating system on which the tests are being run (see [`tempfile.gettempdir`](https://docs.python.org/3/library/tempfile.html) for more details).\n\n#### Log directory structure\n```\n.\n└── goth_20210420_093848+0000\n    ├── runner.log                      # debug console logs from the entire test session\n    ├── test_e2e_vm                     # directory with logs from a single test\n    │   ├── ethereum-mainnet.log\n    │   ├── ethereum-hoodi.log\n    │   ├── ethereum-polygon.log\n    │   ├── provider_1.log              # debug logs from a single yagna node\n    │   ├── provider_1_ya-provider.log  # debug logs from an agent running in a yagna node\n    │   ├── provider_2.log\n    │   ├── provider_2_ya-provider.log\n    │   ├── proxy-nginx.log\n    │   ├── proxy.log                   # HTTP traffic going into the yagna daemons recorded by a \"sniffer\" proxy\n    │   ├── requestor.log\n    │   ├── router.log\n    │   ├── test.log                    # debug console logs from this test case only, duplicated in `runner.log`\n    └── test_e2e_wasi\n        └── ...\n```\n\n### Test configuration\n\n#### `goth-config.yml`\n`goth` can be configured using a YAML file. The default `goth-config.yml` is located in `goth/default-assets/goth-config.yml` and looks something like this:\n```\ndocker-compose:\n\n  docker-dir: \"docker\"                          # Where to look for docker-compose.yml and Dockerfiles\n\n  build-environment:                            # Fields related to building the yagna Docker image\n    # binary-path: ...\n    # deb-path: ...\n    # branch: ...\n    # commit-hash: ...\n    # release-tag: ...\n    # use-prerelease: ...\n\n  compose-log-patterns:                         # Log message patterns used for container ready checks\n    ethereum-mainnet: \".*Wallets supplied.\"\n    ethereum-hoodi: \".*Wallets supplied.\"\n    ethereum-polygon: \".*Wallets supplied.\"\n    ...\n\nkey-dir: \"keys\"                                 # Where to look for pre-funded Ethereum keys\n\nnode-types:                                     # User-defined node types to be used in `nodes`\n  - name: \"Requestor\"\n    class: \"goth.runner.probe.RequestorProbe\"\n\n  - name: \"Provider\"\n    class: \"goth.runner.probe.ProviderProbe\"\n    mount: ...\n\nnodes:                                          # List of yagna nodes to be run in the test\n  - name: \"requestor\"\n    type: \"Requestor\"\n\n  - name: \"provider-1\"\n    type: \"Provider\"\n    use-proxy: True\n```\n\nWhen you generate test assets using the command `python -m goth create-assets your/output/dir`, this default config file will be present in the output location of your choice. You can make changes to that generated file and always fall back to the default one by re-generating the assets.\n\n## Local development setup\n\n### Poetry\n`goth` uses [`poetry`](https://python-poetry.org/) to manage its dependencies and provide a runner for common tasks.\n\nIf you don't have `poetry` available on your system then follow its [installation instructions](https://python-poetry.org/docs/#installation) before proceeding.\nVerify your installation by running:\n```\npoetry --version\n```\n\n### Project dependencies\nTo install the project's dependencies run:\n```\npoetry install\n```\nBy default, `poetry` looks for the required Python version on your `PATH` and creates a virtual environment for the project if there's none active (or already configured by Poetry).\n\nAll of the project's dependencies will be installed to that virtual environment.\n","funding_links":[],"categories":["Apps","Archive"],"sub_categories":["Testing","Apps"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgolemfactory%2Fgoth","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgolemfactory%2Fgoth","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgolemfactory%2Fgoth/lists"}