Skip to main content

Hivescope: E2E testing library for HiveMind protocol

Project description

Ask DeepWiki

Hivescope

Pytest E2E testing library for HiveMind protocol implementations.

Hivescope provides an in-process simulator for HiveMind network topologies. No real sockets, no running servers, no network processes needed. Tests wire MasterNode, SatelliteNode, and RelayNode objects together directly; every HiveMessage is recorded for inspection.

Used by hivemind-core e2e tests and by hivemind-test-harness for multi-repo topology and stress scenarios.


Install

pip install "hivescope @ git+https://github.com/JarbasHiveMind/hivescope@dev"

With OVOS skill-level testing (live MiniCroft backend):

pip install "hivescope[ovos] @ git+https://github.com/JarbasHiveMind/hivescope@dev"

Quick Start

Minimal handshake test

from hivescope.scenarios import single_satellite
from hivescope.assertions import assert_handshake_complete, assert_encryption_match

def test_handshake():
    builder = single_satellite()
    builder.start_all()
    try:
        master = builder.get_master("M0")
        satellite = builder.get_satellite("S0")
        assert_handshake_complete(master, satellite)
        assert_encryption_match(master, satellite)
    finally:
        builder.stop_all()

Using pytest fixtures

Add to your repo's tests/conftest.py:

pytest_plugins = ['hivescope.pytest_fixtures']

Then use the provided fixtures in tests:

def test_message_forwarded(master_node, satellite_node):
    from ovos_bus_client.message import Message
    satellite_node.send(Message("test:ping", {}))
    master_node.recorder.assert_received("BUS", count=1)

ACL enforcement test

def test_acl_denied(master_node, restricted_satellite):
    from ovos_bus_client.message import Message
    restricted_satellite.send(Message("admin:command", {}))
    master_node.recorder.assert_not_received("BUS")

Key Concepts

TopologyBuilder

Assembles and lifecycle-manages a test topology. All add_* methods return the created node; start_all() / stop_all() start and stop all nodes in dependency order.

builder = TopologyBuilder()
master = builder.add_master("M0")
sat0 = builder.add_satellite("S0", upstream=master)
relay = builder.add_relay("R0", upstream=master)
sat1 = builder.add_satellite("S1", upstream=relay)
builder.start_all()
# ... run tests ...
builder.stop_all()

Preset Scenarios

hivescope.scenarios provides pre-wired topologies for common patterns:

Function Topology
single_satellite() 1 master M0, 1 satellite S0
three_satellites() 1 master M0, satellites S0S2
with_relay() master → relay → satellites
chain_topology() linear relay chain
star_topology(n=5) central master, N satellites
with_acl_enforcement() master with ACL-restricted and admin satellites
hierarchical_hubs(levels=3, sats=2) deeply nested relay tree

All functions return a not-yet-started TopologyBuilder. Call .start_all() before testing and .stop_all() in a finally block (or use the pytest fixtures for automatic teardown).

MessageRecorder

Every node has a .recorder that captures all inbound and outbound HiveMessages.

# Assert a BUS message was received exactly once
master_node.recorder.assert_received("BUS", count=1)

# Assert it was NOT received
master_node.recorder.assert_not_received("PROPAGATE")

# Block until a message arrives (raises TimeoutError on timeout)
master_node.wait_for("HANDSHAKE", timeout=5)

# Inspect recorded messages
for msg in master_node.recorder.messages:
    print(msg.direction, msg.msg_type, msg.peer)

Pytest Fixtures

Enable in conftest.py: pytest_plugins = ['hivescope.pytest_fixtures']

Fixture Scope Yields
topology function Started TopologyBuilder (auto-stopped)
master_node function MasterNode in a started single-satellite topology
satellite_node function SatelliteNode connected to master_node
admin_satellite function Satellite with full permissions
restricted_satellite function Satellite with ACL restrictions

Copy-Paste Templates

templates/ contains ready-to-copy test files. Drop them into tests/e2e/ in your repo:

Template Tests
test_template_handshake.py Cipher/encoding agreement, handshake completion
test_template_routing.py Message routing through master
test_template_acl.py ACL enforcement for restricted vs admin satellites
test_template_binary.py Binary protocol message handling

Configuration

Option Default Purpose
use_loopback=True False Pass to add_master() to use a loopback network transport instead of the default in-process transport
[ovos] extra not installed Enables OvoscopeAgentProtocol backed by a live MiniCroft instance

API Reference

Full public API documentation: docs/index.md


License

AGPL-3.0

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

hivescope-0.5.2a1.tar.gz (50.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

hivescope-0.5.2a1-py3-none-any.whl (49.1 kB view details)

Uploaded Python 3

File details

Details for the file hivescope-0.5.2a1.tar.gz.

File metadata

  • Download URL: hivescope-0.5.2a1.tar.gz
  • Upload date:
  • Size: 50.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for hivescope-0.5.2a1.tar.gz
Algorithm Hash digest
SHA256 8102e3b4ff5f6ffb6e97da2d4cd8e251bc0ac73c2cd102d4a564639812591b9d
MD5 00b8a70ff6f6743d9e646d45d33448fc
BLAKE2b-256 e4b38369166414f4a9dba0e163920318b4d37e62c063e2eb7c9fcd9fc80503d9

See more details on using hashes here.

File details

Details for the file hivescope-0.5.2a1-py3-none-any.whl.

File metadata

  • Download URL: hivescope-0.5.2a1-py3-none-any.whl
  • Upload date:
  • Size: 49.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for hivescope-0.5.2a1-py3-none-any.whl
Algorithm Hash digest
SHA256 0f7cee0a3ab84b5384e679ad5d481b54586e581ee4ab4e1e4bfeaf77e20be112
MD5 cab65068ff1f0b5906d68f6f816e41e0
BLAKE2b-256 9fb275709d668e85965226a95a9998b7cef2ee1832ef4b5138cfa9c7812ac596

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page